--- a/net/minecraft/world/entity/vehicle/ContainerEntity.java
+++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java
@@ -59,10 +59,9 @@
             if (this.getLootTableSeed() != 0L) {
                 nbt.putLong("LootTableSeed", this.getLootTableSeed());
             }
-        } else {
-            ContainerHelper.saveAllItems(nbt, this.getItemStacks());
         }
 
+        ContainerHelper.saveAllItems(nbt, this.getItemStacks()); // Paper - always save the items, table may still remain
     }
 
     default void readChestVehicleSaveData(CompoundTag nbt) {
@@ -70,10 +69,9 @@
         if (nbt.contains("LootTable", 8)) {
             this.setLootTable(new ResourceLocation(nbt.getString("LootTable")));
             this.setLootTableSeed(nbt.getLong("LootTableSeed"));
-        } else {
-            ContainerHelper.loadAllItems(nbt, this.getItemStacks());
         }
 
+        ContainerHelper.loadAllItems(nbt, this.getItemStacks()); // Paper - always load the items, table may still remain
     }
 
     default void chestVehicleDestroyed(DamageSource source, Level world, Entity vehicle) {
@@ -96,13 +94,13 @@
 
     default void unpackChestVehicleLootTable(@Nullable Player player) {
         MinecraftServer minecraftServer = this.level().getServer();
-        if (this.getLootTable() != null && minecraftServer != null) {
+        if (this.getLootableData().shouldReplenish(player) && minecraftServer != null) { // Paper
             LootTable lootTable = minecraftServer.getLootData().getLootTable(this.getLootTable());
             if (player != null) {
                 CriteriaTriggers.GENERATE_LOOT.trigger((ServerPlayer)player, this.getLootTable());
             }
 
-            this.setLootTable((ResourceLocation)null);
+            this.getLootableData().processRefill(player); // Paper
             LootParams.Builder builder = (new LootParams.Builder((ServerLevel)this.level())).withParameter(LootContextParams.ORIGIN, this.position());
             if (player != null) {
                 builder.withLuck(player.getLuck()).withParameter(LootContextParams.THIS_ENTITY, player);
@@ -176,4 +174,13 @@
     default boolean isChestVehicleStillValid(Player player) {
         return !this.isRemoved() && this.position().closerThan(player.position(), 8.0D);
     }
+    // Paper start
+    default Entity getEntity() {
+        throw new UnsupportedOperationException();
+    }
+
+    default com.destroystokyo.paper.loottable.PaperLootableInventoryData getLootableData() {
+        throw new UnsupportedOperationException();
+    }
+    // Paper end
 }
