diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/IMatteryDrive.java b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/IMatteryDrive.java
index 24f7a6455..0e548877b 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/IMatteryDrive.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/IMatteryDrive.java
@@ -1,5 +1,6 @@
 package ru.dbotthepony.mc.otm.capability.drive;
 
+import net.minecraft.MethodsReturnNonnullByDefault;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
@@ -7,11 +8,16 @@ import net.minecraftforge.common.util.INBTSerializable;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
 import java.util.List;
 import java.util.UUID;
 import java.util.function.Predicate;
 
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
 public interface IMatteryDrive {
+	record StoredStack(ItemStack stack, UUID id) {};
+
 	List<StoredStack> getItems();
 
 	boolean isDirty();
@@ -22,32 +28,27 @@ public interface IMatteryDrive {
 	 * @param item
 	 * @return all items belonging to passed class
 	 */
-	@Nonnull
-	List<StoredStack> findItems(@Nonnull Item item);
+	List<StoredStack> findItems(Item item);
 
 	/**
 	 * @param stack
 	 * @return all items that match this itemstack
 	 */
-	@Nonnull
-	List<StoredStack> findItems(@Nonnull ItemStack stack);
+	List<StoredStack> findItems(ItemStack stack);
 
 	@Nullable
-	StoredStack getItem(int id);
+	StoredStack getItem(UUID id);
 
 	int getStoredCount();
 	int getCapacity();
 
-	@Nonnull
-	ItemStack insertItem(@Nonnull ItemStack item, boolean simulate);
+	ItemStack insertItem(ItemStack item, boolean simulate);
 
-	@Nonnull
-	default ItemStack extractItem(int id, int amount, boolean simulate) {
+	default ItemStack extractItem(UUID id, int amount, boolean simulate) {
 		return extractItem(id, amount, true, simulate);
 	}
 
-	@Nonnull
-	ItemStack extractItem(int id, int amount, boolean obey_stack_size, boolean simulate);
+	ItemStack extractItem(UUID id, int amount, boolean obey_stack_size, boolean simulate);
 
 	// not extending INBTSerializable to avoid serializing it as forgecaps
 	CompoundTag serializeNBT();
diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java
index c56923b10..b8f723cda 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java
@@ -16,18 +16,13 @@ import java.util.*;
 
 public class MatteryDrive implements IMatteryDrive {
 	protected final HashMap<Item, List<StoredStack>> items = new HashMap<>();
-	protected final HashMap<Integer, StoredStack> items_by_id = new HashMap<>();
+	protected final HashMap<UUID, StoredStack> items_by_id = new HashMap<>();
 
 	protected boolean dirty = false;
 	protected int different_stacks = 0;
 	protected int stored = 0;
 	protected int max_different_stacks;
 	protected int capacity;
-	protected int next_item_id = 0;
-
-	protected int getNextID() {
-		return next_item_id++;
-	}
 
 	public MatteryDrive(int capacity, int max_different_stacks) {
 		this.capacity = capacity;
@@ -122,7 +117,7 @@ public class MatteryDrive implements IMatteryDrive {
 
 	@Nullable
 	@Override
-	public StoredStack getItem(int id) {
+	public StoredStack getItem(UUID id) {
 		return items_by_id.get(id);
 	}
 
@@ -158,7 +153,7 @@ public class MatteryDrive implements IMatteryDrive {
 			different_stacks++;
 			var copy = item.copy();
 			copy.setCount(max_insert);
-			var state = new StoredStack(copy, getNextID());
+			var state = new StoredStack(copy, UUID.randomUUID());
 			listing.add(state);
 			items_by_id.put(state.id(), state);
 			markDirty();
@@ -171,7 +166,7 @@ public class MatteryDrive implements IMatteryDrive {
 
 	@Nonnull
 	@Override
-	public ItemStack extractItem(int id, int amount, boolean obey_stack_size, boolean simulate) {
+	public ItemStack extractItem(UUID id, int amount, boolean obey_stack_size, boolean simulate) {
 		var get = items_by_id.get(id);
 
 		if (get == null)
@@ -204,7 +199,6 @@ public class MatteryDrive implements IMatteryDrive {
 	public CompoundTag serializeNBT() {
 		final var compound = new CompoundTag();
 
-		compound.putInt("next_item_id", next_item_id);
 		compound.putInt("capacity", capacity);
 		compound.putInt("max_different_stacks", max_different_stacks);
 
@@ -224,7 +218,7 @@ public class MatteryDrive implements IMatteryDrive {
 				stack_list.add(stack_nbt);
 
 				stack_nbt.putInt("count", stack.stack().getCount());
-				stack_nbt.putInt("id", stack.id());
+				stack_nbt.putLongArray("id", new long[] { stack.id().getMostSignificantBits(), stack.id().getLeastSignificantBits() });
 
 				if (stack.stack().getTag() != null) {
 					stack_nbt.put("data", stack.stack().getTag());
@@ -244,7 +238,6 @@ public class MatteryDrive implements IMatteryDrive {
 		stored = 0;
 		different_stacks = 0;
 
-		next_item_id = nbt.getInt("next_item_id");
 		capacity = nbt.getInt("capacity");
 		max_different_stacks = nbt.getInt("max_different_stacks");
 
@@ -263,7 +256,7 @@ public class MatteryDrive implements IMatteryDrive {
 					for (var _stack : stack_list) {
 						if (_stack instanceof CompoundTag stack) {
 							var count = stack.getInt("count");
-							var id = stack.getInt("id");
+							var id = stack.getLongArray("id");
 							var data = stack.get("data");
 
 							var itemstack = new ItemStack(item, count);
@@ -274,7 +267,7 @@ public class MatteryDrive implements IMatteryDrive {
 
 							stored += count;
 							different_stacks += 1;
-							var state = new StoredStack(itemstack, id);
+							var state = new StoredStack(itemstack, id.length == 2 ? new UUID(id[0], id[1]) : UUID.randomUUID());
 							map_list.add(state);
 							items_by_id.put(state.id(), state);
 						}
diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/StoredStack.java b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/StoredStack.java
deleted file mode 100644
index 036a509b4..000000000
--- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/StoredStack.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ru.dbotthepony.mc.otm.capability.drive;
-
-import net.minecraft.world.item.ItemStack;
-
-import java.util.UUID;
-
-public record StoredStack(ItemStack stack, int id) {
-}
diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java
index 483b9c278..9fb84618f 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java
@@ -3,19 +3,16 @@ package ru.dbotthepony.mc.otm.menu;
 import net.minecraft.world.SimpleContainer;
 import net.minecraft.world.entity.player.Inventory;
 import net.minecraft.world.entity.player.Player;
-import net.minecraft.world.inventory.MenuType;
 import net.minecraft.world.item.ItemStack;
 import ru.dbotthepony.mc.otm.Registry;
 import ru.dbotthepony.mc.otm.block.entity.BlockEntityDriveViewer;
-import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered;
 import ru.dbotthepony.mc.otm.capability.MatteryCapability;
 import ru.dbotthepony.mc.otm.capability.drive.IMatteryDrive;
-import ru.dbotthepony.mc.otm.capability.drive.NetworkedItemView;
+import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView;
 import ru.dbotthepony.mc.otm.menu.data.UUIDDataContainer;
 import ru.dbotthepony.mc.otm.menu.slot.MatterySlot;
 
 import javax.annotation.Nullable;
-import java.util.UUID;
 
 public class DriveViewerMenu extends PoweredMatteryMenu {
 	public UUIDDataContainer view_uuid;
diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/NetworkedItemView.java b/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java
similarity index 91%
rename from src/main/java/ru/dbotthepony/mc/otm/capability/drive/NetworkedItemView.java
rename to src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java
index 2a5057cc8..9637d803a 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/NetworkedItemView.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java
@@ -1,4 +1,4 @@
-package ru.dbotthepony.mc.otm.capability.drive;
+package ru.dbotthepony.mc.otm.menu.data;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.network.FriendlyByteBuf;
@@ -11,7 +11,6 @@ import net.minecraftforge.fmllegacy.network.PacketDistributor;
 import ru.dbotthepony.mc.otm.OverdriveThatMatters;
 import ru.dbotthepony.mc.otm.network.MatteryNetworking;
 
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -19,9 +18,9 @@ import java.util.UUID;
 import java.util.function.Supplier;
 
 public class NetworkedItemView {
-	record TrackedState(int id, int id_upstream, ItemStack stack) {
-		TrackedState(int id, ItemStack stack) {
-			this(id, 0, stack);
+	public record ViewedItem(int id, ItemStack stack, UUID id_upstream) {
+		public ViewedItem(int id, ItemStack stack) {
+			this(id, stack, null);
 		}
 	}
 
@@ -112,7 +111,7 @@ public class NetworkedItemView {
 					throw new IllegalStateException("Item tracker " + id + " already has stack with id of " + stack_id);
 				}
 
-				get.state.put(stack_id, new TrackedState(stack_id, stack));
+				get.state.put(stack_id, new ViewedItem(stack_id, stack));
 				get.clearCache();
 			});
 		}
@@ -194,11 +193,14 @@ public class NetworkedItemView {
 	public final boolean remote;
 	protected int next_stack_id = 0;
 
-	protected final HashMap<Integer, TrackedState> state = new HashMap<>();
-	protected final HashMap<Integer, TrackedState> upstream_state = new HashMap<>();
+	protected final HashMap<Integer, ViewedItem> state = new HashMap<>();
+	protected final HashMap<UUID, ViewedItem> upstream_state = new HashMap<>();
 	protected final ArrayList<Object> backlog = new ArrayList<>();
 
+	// normally, filled only on server
 	private static final HashMap<UUID, NetworkedItemView> TRACKERS_LOCAL = new HashMap<>();
+
+	// normally, filled only on client
 	private static final HashMap<UUID, NetworkedItemView> TRACKERS_REMOTE = new HashMap<>();
 
 	public static NetworkedItemView getLocal(UUID id) {
@@ -248,11 +250,11 @@ public class NetworkedItemView {
 		return view_cache = list;
 	}
 
-	public void addItem(ItemStack stack, int id_upstream) {
+	public void addItem(ItemStack stack, UUID id_upstream) {
 		if (upstream_state.containsKey(id_upstream))
 			throw new IllegalStateException("Already tracking ItemStack with upstream id " + id_upstream + "!");
 
-		var state = new TrackedState(next_stack_id++, id_upstream, stack);
+		var state = new ViewedItem(next_stack_id++, stack, id_upstream);
 		this.state.put(state.id, state);
 		this.upstream_state.put(id_upstream, state);
 
@@ -263,7 +265,7 @@ public class NetworkedItemView {
 		clearCache();
 	}
 
-	public void changeItem(int id_upstream, int new_count) {
+	public void changeItem(UUID id_upstream, int new_count) {
 		var get = upstream_state.get(id_upstream);
 
 		if (get == null)
@@ -278,7 +280,7 @@ public class NetworkedItemView {
 		clearCache();
 	}
 
-	public void removeItem(int id_upstream) {
+	public void removeItem(UUID id_upstream) {
 		var get = upstream_state.get(id_upstream);
 
 		if (get == null)
@@ -295,7 +297,6 @@ public class NetworkedItemView {
 	}
 
 	public void clear() {
-		OverdriveThatMatters.LOGGER.info("Clear called");
 		clearCache();
 		upstream_state.clear();
 		state.clear();
@@ -322,7 +323,6 @@ public class NetworkedItemView {
 
 		for (var packet : backlog) {
 			MatteryNetworking.CHANNEL.send(consumer, packet);
-			OverdriveThatMatters.LOGGER.info("Send packet {}", packet);
 		}
 
 		backlog.clear();
diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java
index e237282be..028d88c26 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java
@@ -5,7 +5,7 @@ import net.minecraftforge.fmllegacy.network.NetworkDirection;
 import net.minecraftforge.fmllegacy.network.NetworkRegistry;
 import net.minecraftforge.fmllegacy.network.simple.SimpleChannel;
 import ru.dbotthepony.mc.otm.OverdriveThatMatters;
-import ru.dbotthepony.mc.otm.capability.drive.NetworkedItemView;
+import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView;
 import ru.dbotthepony.mc.otm.network.android.*;
 
 import java.util.Optional;