CVE-2023-38689: Deserialization of Untrusted Data (CWE-502)
value: Logistics Pipes is a modification (a.k.a. mod) for the computer game Minecraft Java Edition. The mod used Java's `ObjectInputStream#readObject` on untrusted data coming from clients or servers over the network resulting in possible remote code execution when sending specifically crafted network packets after connecting. The affected versions were released between 2013 and 2016 and the issue (back then unknown) was fixed in 2016 by a refactoring of the network IO code.  
The issue is present in all Logistics Pipes versions ranged from 0.7.0.91 prior to 0.10.0.71, which were downloaded from different platforms summing up to multi-million downloads. For Minecraft version 1.7.10 the issue was fixed in build 0.10.0.71. Everybody on Minecraft 1.7.10 should check their version number of Logistics Pipes in their modlist and update, if the version number is smaller than 0.10.0.71. Any newer supported Minecraft version (like 1.12.2) never had a Logistics Pipes version with vulnerable code. The best available workaround for vulnerable versions is to play in singleplayer only or update to newer Minecraft versions and modpacks.
CWE description: The product deserializes untrusted data without sufficiently verifying that the resulting data will be valid.
CVSS v3 base score: 9.8
Published: 2023-08-04T17:15Z
Repository: https://github.com/RS485/LogisticsPipes
Language: Java
Files changed: common/logisticspipes/blocks/stats/TrackingTask.java, common/logisticspipes/config/PlayerConfig.java, common/logisticspipes/interfaces/IClientState.java, common/logisticspipes/network/IReadListObject.java, common/logisticspipes/network/IWriteListObject.java, common/logisticspipes/network/NewGuiHandler.java, common/logisticspipes/network/PacketHandler.java, common/logisticspipes/network/abstractguis/BooleanModuleCoordinatesGuiProvider.java, common/logisticspipes/network/abstractguis/CoordinatesGuiProvider.java, common/logisticspipes/network/abstractguis/CoordinatesPopupGuiProvider.java, common/logisticspipes/network/abstractguis/GuiProvider.java, common/logisticspipes/network/abstractguis/ModuleCoordinatesGuiProvider.java, common/logisticspipes/network/abstractguis/ModuleInHandGuiProvider.java, common/logisticspipes/network/abstractguis/NBTModuleCoordinatesGuiProvider.java, common/logisticspipes/network/abstractguis/UpgradeCoordinatesGuiProvider.java, common/logisticspipes/network/abstractpackets/BitSetCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/BooleanModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/CoordinatesPacket.java, common/logisticspipes/network/abstractpackets/DirectionModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/Integer2CoordinatesPacket.java, common/logisticspipes/network/abstractpackets/Integer2ModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/IntegerCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/IntegerModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/IntegerPacket.java, common/logisticspipes/network/abstractpackets/InventoryModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/ItemPacket.java, common/logisticspipes/network/abstractpackets/ListSyncPacket.java, common/logisticspipes/network/abstractpackets/ModernPacket.java, common/logisticspipes/network/abstractpackets/ModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/NBTCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/NBTModuleCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/RequestPacket.java, common/logisticspipes/network/abstractpackets/SlotPacket.java, common/logisticspipes/network/abstractpackets/StringCoordinatesPacket.java, common/logisticspipes/network/abstractpackets/StringListPacket.java, common/logisticspipes/network/guis/block/AutoCraftingGui.java, common/logisticspipes/network/guis/block/StatisticsGui.java, common/logisticspipes/network/guis/item/ItemAmountSignGui.java, common/logisticspipes/network/guis/module/inhand/CraftingModuleInHand.java, common/logisticspipes/network/guis/module/inpipe/ActiveSupplierSlot.java, common/logisticspipes/network/guis/module/inpipe/AdvancedExtractorModuleSlot.java, common/logisticspipes/network/guis/module/inpipe/ApiaristAnalyzerModuleSlot.java, common/logisticspipes/network/guis/module/inpipe/CCBasedQuickSortSlot.java, common/logisticspipes/network/guis/module/inpipe/CraftingModuleSlot.java, common/logisticspipes/network/guis/module/inpipe/ExtractorModuleSlot.java, common/logisticspipes/network/guis/module/inpipe/ItemSinkSlot.java, common/logisticspipes/network/guis/module/inpipe/ProviderModuleGuiProvider.java, common/logisticspipes/network/packets/ActivateNBTDebug.java, common/logisticspipes/network/packets/BufferTransfer.java, common/logisticspipes/network/packets/CraftingPermissionPacket.java, common/logisticspipes/network/packets/DummyPacket.java, common/logisticspipes/network/packets/NEISetCraftingRecipe.java, common/logisticspipes/network/packets/PlayerConfigToClientPacket.java, common/logisticspipes/network/packets/PlayerConfigToServerPacket.java, common/logisticspipes/network/packets/PlayerListRequest.java, common/logisticspipes/network/packets/RequestUpdateNamesPacket.java, common/logisticspipes/network/packets/UpdateName.java, common/logisticspipes/network/packets/block/AddItemToTrackPacket.java, common/logisticspipes/network/packets/block/CraftingCycleRecipe.java, common/logisticspipes/network/packets/block/CraftingSetType.java, common/logisticspipes/network/packets/block/PowerPacketLaser.java, common/logisticspipes/network/packets/block/PowerProviderLevel.java, common/logisticspipes/network/packets/block/RemoveAmoundTask.java, common/logisticspipes/network/packets/block/RunningCraftingTasks.java, common/logisticspipes/network/packets/block/SecurityStationId.java, common/logisticspipes/network/packets/chassis/ChassisGUI.java, common/logisticspipes/network/packets/chassis/ChestGuiClosed.java, common/logisticspipes/network/packets/chassis/ChestGuiOpened.java, common/logisticspipes/network/packets/chassis/EnableQuickSortMarker.java, common/logisticspipes/network/packets/cpipe/CPipeCleanupStatus.java, common/logisticspipes/network/packets/cpipe/CPipeSatelliteId.java, common/logisticspipes/network/packets/debug/PipeDebugLogAskForTarget.java, common/logisticspipes/network/packets/debug/SendNewLogLine.java, common/logisticspipes/network/packets/debug/SendNewLogWindow.java, common/logisticspipes/network/packets/debug/UpdateStatusEntries.java, common/logisticspipes/network/packets/debuggui/DebugAskForTarget.java, common/logisticspipes/network/packets/debuggui/DebugDataPacket.java, common/logisticspipes/network/packets/debuggui/DebugPanelOpen.java, common/logisticspipes/network/packets/debuggui/DebugTargetResponse.java, common/logisticspipes/network/packets/gui/DummyContainerSlotClick.java, common/logisticspipes/network/packets/gui/FuzzySlotSettingsPacket.java, common/logisticspipes/network/packets/gui/GUIPacket.java, common/logisticspipes/network/packets/gui/GuiReopenPacket.java, common/logisticspipes/network/packets/gui/OpenChatGui.java, common/logisticspipes/network/packets/hud/HUDSettingsPacket.java, common/logisticspipes/network/packets/module/ApiaristAnalyserMode.java, common/logisticspipes/network/packets/module/BeeModuleSetBeePacket.java, common/logisticspipes/network/packets/module/ItemSinkDefaultPacket.java, common/logisticspipes/network/packets/module/ModuleBasedItemSinkList.java, common/logisticspipes/network/packets/module/SupplierPipeLimitedPacket.java, common/logisticspipes/network/packets/modules/CCBasedQuickSortMode.java, common/logisticspipes/network/packets/modules/CCBasedQuickSortSinkSize.java, common/logisticspipes/network/packets/modules/ItemSinkFuzzy.java, common/logisticspipes/network/packets/modules/ProviderModuleMode.java, common/logisticspipes/network/packets/modules/SupplierPipeMode.java, common/logisticspipes/network/packets/multiblock/MultiBlockCoordinatesPacket.java, common/logisticspipes/network/packets/orderer/ComponentList.java, common/logisticspipes/network/packets/orderer/MissingItems.java, common/logisticspipes/network/packets/orderer/OrdererWatchPacket.java, common/logisticspipes/network/packets/pipe/AskForOpenTarget.java, common/logisticspipes/network/packets/pipe/CraftingPipeUpdatePacket.java, common/logisticspipes/network/packets/pipe/FindMostLikelyRecipeComponents.java, common/logisticspipes/network/packets/pipe/ItemAmountSignUpdatePacket.java, common/logisticspipes/network/packets/pipe/ItemBufferSyncPacket.java, common/logisticspipes/network/packets/pipe/MostLikelyRecipeComponentsResponse.java, common/logisticspipes/network/packets/pipe/ParticleFX.java, common/logisticspipes/network/packets/pipe/PipeContentPacket.java, common/logisticspipes/network/packets/pipe/PipeDebugAskForTarget.java, common/logisticspipes/network/packets/pipe/PipeFluidUpdate.java, common/logisticspipes/network/packets/pipe/PipeManagerContentPacket.java, common/logisticspipes/network/packets/pipe/PipeManagerWatchingPacket.java, common/logisticspipes/network/packets/pipe/PipePositionPacket.java, common/logisticspipes/network/packets/pipe/PipeSignTypes.java, common/logisticspipes/network/packets/pipe/PipeTileStatePacket.java, common/logisticspipes/network/packets/pipe/RoutingLaserPacket.java, common/logisticspipes/network/packets/pipe/SlotFinderActivatePacket.java, common/logisticspipes/network/packets/pipe/SlotFinderNumberPacket.java, common/logisticspipes/network/packets/pipe/SlotFinderOpenGuiPacket.java, common/logisticspipes/network/packets/pipe/StatUpdate.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateAskForTarget.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateCanidatePipe.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateClearClient.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugCanidateList.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugClosedSet.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugFilters.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateDoneDebug.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateInitDebug.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateSourcePipe.java, common/logisticspipes/network/packets/routingdebug/RoutingUpdateTargetResponse.java, common/logisticspipes/network/packets/satpipe/SatPipeSetID.java, common/logisticspipes/network/packets/upgrade/SneakyUpgradeSidePacket.java, common/logisticspipes/network/packets/upgrade/ToogleDisconnectionUpgradeSidePacket.java, common/logisticspipes/pipes/basic/CoreRoutedPipe.java, common/logisticspipes/pipes/basic/LogisticsTileGenericPipe.java, common/logisticspipes/pipes/tubes/HSTubeCurve.java, common/logisticspipes/pipes/tubes/HSTubeGain.java, common/logisticspipes/pipes/tubes/HSTubeLine.java, common/logisticspipes/pipes/tubes/HSTubeSCurve.java, common/logisticspipes/pipes/tubes/HSTubeSpeedup.java, common/logisticspipes/pipes/unrouted/PipeItemsBasicTransport.java, common/logisticspipes/proxy/ProxyManager.java, common/logisticspipes/proxy/buildcraft/subproxies/IBCPluggableState.java, common/logisticspipes/proxy/buildcraft/subproxies/IBCRenderState.java, common/logisticspipes/proxy/buildcraft/subproxies/LPBCPipeRenderState.java, common/logisticspipes/proxy/buildcraft/subproxies/LPBCPluggableState.java, common/logisticspipes/renderer/state/ConnectionMatrix.java, common/logisticspipes/renderer/state/PipeRenderState.java, common/logisticspipes/renderer/state/TextureMatrix.java, common/logisticspipes/request/resources/DictResource.java, common/logisticspipes/request/resources/FluidResource.java, common/logisticspipes/request/resources/IResource.java, common/logisticspipes/request/resources/ItemResource.java, common/logisticspipes/request/resources/ResourceNetwork.java, common/logisticspipes/routing/LaserData.java, common/logisticspipes/ticks/ClientPacketBufferHandlerThread.java, common/logisticspipes/ticks/ServerPacketBufferHandlerThread.java, common/network/rs485/logisticspipes/util/LPDataIOWrapper.java, common/network/rs485/logisticspipes/util/LPDataInput.java, common/network/rs485/logisticspipes/util/LPDataOutput.java, test/network/rs485/logisticspipes/util/LPDataIOWrapperTest.java
Commit date: 2016-05-18 13:27:11 +0200
Commit message: Remove IOException escalation


Diff: diff --git a/common/logisticspipes/blocks/stats/TrackingTask.java b/common/logisticspipes/blocks/stats/TrackingTask.java
index 9e700a13..30f897c3 100644
--- a/common/logisticspipes/blocks/stats/TrackingTask.java
+++ b/common/logisticspipes/blocks/stats/TrackingTask.java
@@ -1,9 +1,7 @@
 package logisticspipes.blocks.stats;
 
-import java.io.IOException;
-
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NBTTagCompound;
 
 import logisticspipes.pipes.basic.CoreRoutedPipe;
 import logisticspipes.proxy.SimpleServiceLocator;
@@ -57,17 +55,17 @@ public class TrackingTask {
 		nbt.setIntArray("amountRecorded_B", amountRecorded_B);
 		nbt.setInteger("arrayPos", arrayPos);
 		item.makeNormalStack(1).writeToNBT(nbt);
 	}
 
-	public void writeToLPData(LPDataOutput output) throws IOException {
+	public void writeToLPData(LPDataOutput output) {
 		output.writeLongArray(amountRecorded);
 		output.writeInt(arrayPos);
 		output.writeItemIdentifier(item);
 	}
 
-	public void readFromLPData(LPDataInput input) throws IOException {
+	public void readFromLPData(LPDataInput input) {
 		amountRecorded = input.readLongArray();
 		arrayPos = input.readInt();
 		item = input.readItemIdentifier();
 	}
 }
diff --git a/common/logisticspipes/config/PlayerConfig.java b/common/logisticspipes/config/PlayerConfig.java
index b2da934b..9ab657fc 100644
--- a/common/logisticspipes/config/PlayerConfig.java
+++ b/common/logisticspipes/config/PlayerConfig.java
@@ -53,14 +53,10 @@ public class PlayerConfig {
 	public PlayerConfig(boolean uninitialised, PlayerIdentifier ident) {
 		isUninitialised = uninitialised;
 		playerIdent = ident;
 	}
 
-	public void setUseNewRenderer(boolean flag) {
-		useNewRenderer = flag;
-	}
-
 	public void setUseFallbackRenderer(boolean flag) {
 		useFallbackRenderer = flag;
 	}
 
 	public void setRenderPipeDistance(int dist) {
@@ -73,18 +69,18 @@ public class PlayerConfig {
 
 	public void sendUpdate() {
 		MainProxy.sendPacketToServer(PacketHandler.getPacket(PlayerConfigToServerPacket.class).setConfig(this));
 	}
 
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeBoolean(useNewRenderer);
 		output.writeBoolean(useFallbackRenderer);
 		output.writeInt(renderPipeDistance);
 		output.writeInt(renderPipeContentDistance);
 	}
 
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		useNewRenderer = input.readBoolean();
 		useFallbackRenderer = input.readBoolean();
 		renderPipeDistance = input.readInt();
 		renderPipeContentDistance = input.readInt();
 		isUninitialised = false;
@@ -216,6 +212,10 @@ public class PlayerConfig {
 	}
 
 	public boolean isUseNewRenderer() {
 		return useNewRenderer && SimpleServiceLocator.cclProxy.isActivated();
 	}
+
+	public void setUseNewRenderer(boolean flag) {
+		useNewRenderer = flag;
+	}
 }
diff --git a/common/logisticspipes/interfaces/IClientState.java b/common/logisticspipes/interfaces/IClientState.java
index a89a68a1..d041c012 100644
--- a/common/logisticspipes/interfaces/IClientState.java
+++ b/common/logisticspipes/interfaces/IClientState.java
@@ -1,13 +1,11 @@
 package logisticspipes.interfaces;
 
-import java.io.IOException;
-
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public interface IClientState {
 
-	void writeData(LPDataOutput output) throws IOException;
+	void writeData(LPDataOutput output);
 
-	void readData(LPDataInput input) throws IOException;
+	void readData(LPDataInput input);
 }
diff --git a/common/logisticspipes/network/IReadListObject.java b/common/logisticspipes/network/IReadListObject.java
index dd73290e..43d83d7a 100644
--- a/common/logisticspipes/network/IReadListObject.java
+++ b/common/logisticspipes/network/IReadListObject.java
@@ -1,10 +1,8 @@
 package logisticspipes.network;
 
-import java.io.IOException;
-
 import network.rs485.logisticspipes.util.LPDataInput;
 
 public interface IReadListObject<T> {
 
-	T readObject(LPDataInput input) throws IOException;
+	T readObject(LPDataInput input);
 }
diff --git a/common/logisticspipes/network/IWriteListObject.java b/common/logisticspipes/network/IWriteListObject.java
index c56be532..f4b9c65d 100644
--- a/common/logisticspipes/network/IWriteListObject.java
+++ b/common/logisticspipes/network/IWriteListObject.java
@@ -1,10 +1,8 @@
 package logisticspipes.network;
 
-import java.io.IOException;
-
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public interface IWriteListObject<T> {
 
-	void writeObject(LPDataOutput output, T object) throws IOException;
+	void writeObject(LPDataOutput output, T object);
 }
diff --git a/common/logisticspipes/network/NewGuiHandler.java b/common/logisticspipes/network/NewGuiHandler.java
index 0a8643cf..c85e72e7 100644
--- a/common/logisticspipes/network/NewGuiHandler.java
+++ b/common/logisticspipes/network/NewGuiHandler.java
@@ -34,10 +34,12 @@ import network.rs485.logisticspipes.util.LPDataIOWrapper;
 public class NewGuiHandler {
 
 	public static List<GuiProvider> guilist;
 	public static Map<Class<? extends GuiProvider>, GuiProvider> guimap;
 
+	private NewGuiHandler() { }
+
 	@SuppressWarnings("unchecked")
 	// Suppressed because this cast should never fail.
 	public static <T extends GuiProvider> T getGui(Class<T> clazz) {
 		return (T) NewGuiHandler.guimap.get(clazz).template();
 	}
@@ -62,11 +64,10 @@ public class NewGuiHandler {
 			NewGuiHandler.guimap.put((Class<? extends GuiProvider>) cls, instance);
 			currentid++;
 		}
 	}
 
-	@SneakyThrows(IOException.class)
 	public static void openGui(GuiProvider guiProvider, EntityPlayer oPlayer) {
 		if (!(oPlayer instanceof EntityPlayerMP)) {
 			throw new UnsupportedOperationException("Gui can only be opened on the server side");
 		}
 		EntityPlayerMP player = (EntityPlayerMP) oPlayer;
@@ -94,11 +95,10 @@ public class NewGuiHandler {
 		player.openContainer = container;
 		player.openContainer.windowId = windowId;
 		player.openContainer.addCraftingToCrafters(player);
 	}
 
-	@SneakyThrows(IOException.class)
 	@SideOnly(Side.CLIENT)
 	public static void openGui(GUIPacket packet, EntityPlayer player) {
 		int guiID = packet.getGuiID();
 		GuiProvider provider = NewGuiHandler.guilist.get(guiID).template();
 		LPDataIOWrapper.provideData(packet.getGuiData(), provider::readData);
diff --git a/common/logisticspipes/network/PacketHandler.java b/common/logisticspipes/network/PacketHandler.java
index 6bae39b3..dcea2b66 100644
--- a/common/logisticspipes/network/PacketHandler.java
+++ b/common/logisticspipes/network/PacketHandler.java
@@ -37,15 +37,16 @@ import network.rs485.logisticspipes.util.LPDataInput;
  *  Basically FML SimpleIndexedCodec, except with static registration of LP ModernPackets and short instead of byte discriminator
  */
 @Sharable
 public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, ModernPacket> {
 
+	public static final Map<Integer, StackTraceElement[]> debugMap = new HashMap<>();
+	//TODO correct to work with WeakReference (See FML original)
+	protected static final AttributeKey<ThreadLocal<FMLProxyPacket>> INBOUNDPACKETTRACKER = new AttributeKey<>("lp:inboundpacket");
 	public static List<ModernPacket> packetlist;
 	public static Map<Class<? extends ModernPacket>, ModernPacket> packetmap;
-
 	private static int packetDebugID = 1;
-	public static final Map<Integer, StackTraceElement[]> debugMap = new HashMap<>();
 
 	@SuppressWarnings("unchecked")
 	// Suppressed because this cast should never fail.
 	public static <T extends ModernPacket> T getPacket(Class<T> clazz) {
 		T packet = (T) PacketHandler.packetmap.get(clazz).template();
@@ -58,22 +59,10 @@ public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, ModernP
 			}
 		}
 		return packet;
 	}
 
-	//horrible hack to carry the proper player for the side along...
-	static class InboundModernPacketWrapper {
-
-		final ModernPacket packet;
-		final EntityPlayer player;
-
-		InboundModernPacketWrapper(ModernPacket p, EntityPlayer e) {
-			packet = p;
-			player = e;
-		}
-	}
-
 	/*
 	 * enumerates all ModernPackets, sets their IDs and populate packetlist/packetmap
 	 */
 	@SuppressWarnings("unchecked")
 	@SneakyThrows({ IOException.class, InvocationTargetException.class, IllegalAccessException.class, InstantiationException.class, IllegalArgumentException.class, NoSuchMethodException.class, SecurityException.class })
@@ -95,19 +84,10 @@ public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, ModernP
 			PacketHandler.packetmap.put((Class<? extends ModernPacket>) cls, instance);
 			currentid++;
 		}
 	}
 
-	//TODO correct to work with WeakReference (See FML original)
-	protected static final AttributeKey<ThreadLocal<FMLProxyPacket>> INBOUNDPACKETTRACKER = new AttributeKey<>("lp:inboundpacket");
-
-	@Override
-	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
-		super.handlerAdded(ctx);
-		ctx.attr(PacketHandler.INBOUNDPACKETTRACKER).set(new ThreadLocal<>());
-	}
-
 	//Used to provide the Description packet
 	public static FMLProxyPacket toFMLPacket(ModernPacket msg) throws Exception {
 		return PacketHandler.toFMLPacket(msg, MainProxy.networkChannelName);
 	}
 
@@ -119,10 +99,48 @@ public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, ModernP
 		LPDataIOWrapper.writeData(buffer, msg::writeData);
 
 		return new FMLProxyPacket(buffer, channel);
 	}
 
+	//hacky callback to process packets coming from by the packetbufferhandler decompressors
+	//TODO replace with proper netty implementation
+	public static void onPacketData(final LPDataInput data, final EntityPlayer player) {
+		if (player == null) {
+			return;
+		}
+		final int packetID = data.readShort();
+		final ModernPacket packet = PacketHandler.packetlist.get(packetID).template();
+		packet.setDebugId(data.readInt());
+		packet.readData(data);
+		PacketHandler.onPacketData(packet, player);
+	}
+
+	private static void onPacketData(ModernPacket packet, final EntityPlayer player) {
+		try {
+			packet.processPacket(player);
+			if (LPConstants.DEBUG) {
+				PacketHandler.debugMap.remove(packet.getDebugId());
+			}
+		} catch (DelayPacketException e) {
+			if (packet.retry() && MainProxy.isClient(player.getEntityWorld())) {
+				SimpleServiceLocator.clientBufferHandler.queueFailedPacket(packet, player);
+			} else if (LPConstants.DEBUG) {
+				LogisticsPipes.log.error(packet.getClass().getName());
+				LogisticsPipes.log.error(packet.toString());
+				e.printStackTrace();
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@Override
+	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
+		super.handlerAdded(ctx);
+		ctx.attr(PacketHandler.INBOUNDPACKETTRACKER).set(new ThreadLocal<>());
+	}
+
 	@Override
 	protected final void encode(ChannelHandlerContext ctx, ModernPacket msg, List<Object> out) throws Exception {
 		FMLProxyPacket proxy = PacketHandler.toFMLPacket(msg, ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get());
 		FMLProxyPacket old = ctx.attr(PacketHandler.INBOUNDPACKETTRACKER).get().get();
 		if (old != null) {
@@ -148,37 +166,17 @@ public class PacketHandler extends MessageToMessageCodec<FMLProxyPacket, ModernP
 	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
 		FMLLog.log(Level.ERROR, cause, "LogisticsPipes PacketHandler exception caught");
 		super.exceptionCaught(ctx, cause);
 	}
 
-	//hacky callback to process packets coming from by the packetbufferhandler decompressors
-	//TODO replace with proper netty implementation
-	public static void onPacketData(final LPDataInput data, final EntityPlayer player) throws IOException {
-		if (player == null) {
-			return;
-		}
-		final int packetID = data.readShort();
-		final ModernPacket packet = PacketHandler.packetlist.get(packetID).template();
-		packet.setDebugId(data.readInt());
-		packet.readData(data);
-		PacketHandler.onPacketData(packet, player);
-	}
+	//horrible hack to carry the proper player for the side along...
+	static class InboundModernPacketWrapper {
 
-	private static void onPacketData(ModernPacket packet, final EntityPlayer player) {
-		try {
-			packet.processPacket(player);
-			if (LPConstants.DEBUG) {
-				PacketHandler.debugMap.remove(packet.getDebugId());
-			}
-		} catch (DelayPacketException e) {
-			if (packet.retry() && MainProxy.isClient(player.getEntityWorld())) {
-				SimpleServiceLocator.clientBufferHandler.queueFailedPacket(packet, player);
-			} else if (LPConstants.DEBUG) {
-				LogisticsPipes.log.error(packet.getClass().getName());
-				LogisticsPipes.log.error(packet.toString());
-				e.printStackTrace();
-			}
-		} catch (Exception e) {
-			throw new RuntimeException(e);
+		final ModernPacket packet;
+		final EntityPlayer player;
+
+		InboundModernPacketWrapper(ModernPacket p, EntityPlayer e) {
+			packet = p;
+			player = e;
 		}
 	}
 }
diff --git a/common/logisticspipes/network/abstractguis/BooleanModuleCoordinatesGuiProvider.java b/common/logisticspipes/network/abstractguis/BooleanModuleCoordinatesGuiProvider.java
index cc70c7b5..56dc58f3 100644
--- a/common/logisticspipes/network/abstractguis/BooleanModuleCoordinatesGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/BooleanModuleCoordinatesGuiProvider.java
@@ -1,32 +1,30 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public abstract class BooleanModuleCoordinatesGuiProvider extends ModuleCoordinatesGuiProvider {
 
-	public BooleanModuleCoordinatesGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private boolean flag;
 
+	public BooleanModuleCoordinatesGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(flag);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		flag = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/abstractguis/CoordinatesGuiProvider.java b/common/logisticspipes/network/abstractguis/CoordinatesGuiProvider.java
index 51ec4cda..01aace5e 100644
--- a/common/logisticspipes/network/abstractguis/CoordinatesGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/CoordinatesGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.world.World;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -16,34 +14,34 @@ import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 @ToString
 public abstract class CoordinatesGuiProvider extends GuiProvider {
 
-	public CoordinatesGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private int posX;
 	@Getter
 	@Setter
 	private int posY;
 	@Getter
 	@Setter
 	private int posZ;
 
+	public CoordinatesGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 
 		output.writeInt(posX);
 		output.writeInt(posY);
 		output.writeInt(posZ);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 
 		posX = input.readInt();
 		posY = input.readInt();
 		posZ = input.readInt();
 
diff --git a/common/logisticspipes/network/abstractguis/CoordinatesPopupGuiProvider.java b/common/logisticspipes/network/abstractguis/CoordinatesPopupGuiProvider.java
index 2067595b..0b2de68f 100644
--- a/common/logisticspipes/network/abstractguis/CoordinatesPopupGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/CoordinatesPopupGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.world.World;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -17,34 +15,34 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 
 @ToString
 public abstract class CoordinatesPopupGuiProvider extends PopupGuiProvider {
 
-	public CoordinatesPopupGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private int posX;
 	@Getter
 	@Setter
 	private int posY;
 	@Getter
 	@Setter
 	private int posZ;
 
+	public CoordinatesPopupGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 
 		output.writeInt(posX);
 		output.writeInt(posY);
 		output.writeInt(posZ);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 
 		posX = input.readInt();
 		posY = input.readInt();
 		posZ = input.readInt();
 
diff --git a/common/logisticspipes/network/abstractguis/GuiProvider.java b/common/logisticspipes/network/abstractguis/GuiProvider.java
index 52cc6c9e..39c1d96c 100644
--- a/common/logisticspipes/network/abstractguis/GuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/GuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.Container;
 import net.minecraftforge.common.util.FakePlayer;
 
 import lombok.Getter;
@@ -19,13 +17,13 @@ public abstract class GuiProvider {
 
 	public GuiProvider(int id) {
 		this.id = id;
 	}
 
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	/**
 	 * @return LogisticsBaseGuiScreen
 	 */
 	public abstract Object getClientGui(EntityPlayer player);
diff --git a/common/logisticspipes/network/abstractguis/ModuleCoordinatesGuiProvider.java b/common/logisticspipes/network/abstractguis/ModuleCoordinatesGuiProvider.java
index 3c1cd328..bb33aee1 100644
--- a/common/logisticspipes/network/abstractguis/ModuleCoordinatesGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/ModuleCoordinatesGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.world.World;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -17,31 +15,30 @@ import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public abstract class ModuleCoordinatesGuiProvider extends CoordinatesGuiProvider {
 
-	public ModuleCoordinatesGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private ModulePositionType slot;
-
 	@Getter
 	@Setter
 	private int positionInt;
 
+	public ModuleCoordinatesGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeEnum(slot);
 		output.writeInt(positionInt);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		slot = input.readEnum(ModulePositionType.class);
 		positionInt = input.readInt();
 	}
 
diff --git a/common/logisticspipes/network/abstractguis/ModuleInHandGuiProvider.java b/common/logisticspipes/network/abstractguis/ModuleInHandGuiProvider.java
index fbef54e3..af65cd69 100644
--- a/common/logisticspipes/network/abstractguis/ModuleInHandGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/ModuleInHandGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.ItemStack;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -16,26 +14,26 @@ import logisticspipes.utils.DummyWorldProvider;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public abstract class ModuleInHandGuiProvider extends GuiProvider {
 
-	public ModuleInHandGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private int invSlot;
 
+	public ModuleInHandGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(invSlot);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		invSlot = input.readInt();
 	}
 
 	public final LogisticsModule getLogisticsModule(EntityPlayer player) {
diff --git a/common/logisticspipes/network/abstractguis/NBTModuleCoordinatesGuiProvider.java b/common/logisticspipes/network/abstractguis/NBTModuleCoordinatesGuiProvider.java
index e3c98d55..f5ce8dfd 100644
--- a/common/logisticspipes/network/abstractguis/NBTModuleCoordinatesGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/NBTModuleCoordinatesGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.nbt.NBTTagCompound;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,16 +17,16 @@ public abstract class NBTModuleCoordinatesGuiProvider extends ModuleCoordinatesG
 	public NBTModuleCoordinatesGuiProvider(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeNBTTagCompound(nbt);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		nbt = input.readNBTTagCompound();
 	}
 }
diff --git a/common/logisticspipes/network/abstractguis/UpgradeCoordinatesGuiProvider.java b/common/logisticspipes/network/abstractguis/UpgradeCoordinatesGuiProvider.java
index 777954fa..8a3ce74a 100644
--- a/common/logisticspipes/network/abstractguis/UpgradeCoordinatesGuiProvider.java
+++ b/common/logisticspipes/network/abstractguis/UpgradeCoordinatesGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractguis;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.Slot;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -14,26 +12,26 @@ import logisticspipes.utils.gui.DummyContainer;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public abstract class UpgradeCoordinatesGuiProvider extends CoordinatesPopupGuiProvider {
 
-	public UpgradeCoordinatesGuiProvider(int id) {
-		super(id);
-	}
-
 	@Getter(AccessLevel.PROTECTED)
 	@Setter(AccessLevel.PRIVATE)
 	private int positionInt;
 
+	public UpgradeCoordinatesGuiProvider(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(positionInt);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		positionInt = input.readInt();
 	}
 
 	public UpgradeCoordinatesGuiProvider setSlot(Slot slot) {
diff --git a/common/logisticspipes/network/abstractpackets/BitSetCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/BitSetCoordinatesPacket.java
index d68c5df7..735a2403 100644
--- a/common/logisticspipes/network/abstractpackets/BitSetCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/BitSetCoordinatesPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -18,16 +17,16 @@ public abstract class BitSetCoordinatesPacket extends CoordinatesPacket {
 	public BitSetCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBitSet(getFlags());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setFlags(input.readBitSet());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/BooleanModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/BooleanModuleCoordinatesPacket.java
index 70e94d69..3301e134 100644
--- a/common/logisticspipes/network/abstractpackets/BooleanModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/BooleanModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class BooleanModuleCoordinatesPacket extends ModuleCoordinatesPa
 	public BooleanModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(flag);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		flag = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/CoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/CoordinatesPacket.java
index 7856ef17..e31fb3d9 100644
--- a/common/logisticspipes/network/abstractpackets/CoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/CoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.world.World;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -16,40 +14,34 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 
 @ToString
 public abstract class CoordinatesPacket extends ModernPacket {
 
-	public enum LTGPCompletionCheck {
-		NONE,
-		PIPE,
-		TRANSPORT
-	}
-
-	public CoordinatesPacket(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private int posX;
 	@Getter
 	@Setter
 	private int posY;
 	@Getter
 	@Setter
 	private int posZ;
 
+	public CoordinatesPacket(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 
 		output.writeInt(posX);
 		output.writeInt(posY);
 		output.writeInt(posZ);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 
 		posX = input.readInt();
 		posY = input.readInt();
 		posZ = input.readInt();
 
@@ -171,6 +163,12 @@ public abstract class CoordinatesPacket extends ModernPacket {
 	}
 
 	protected void targetNotFound(String message) {
 		throw new TargetNotFoundException(message, this);
 	}
+
+	public enum LTGPCompletionCheck {
+		NONE,
+		PIPE,
+		TRANSPORT
+	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/DirectionModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/DirectionModuleCoordinatesPacket.java
index 76b2fc9e..caf8ff0e 100644
--- a/common/logisticspipes/network/abstractpackets/DirectionModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/DirectionModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,16 +17,16 @@ public abstract class DirectionModuleCoordinatesPacket extends ModuleCoordinates
 	public DirectionModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeForgeDirection(direction);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		direction = input.readForgeDirection();
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/GenericPacket.java b/common/logisticspipes/network/abstractpackets/GenericPacket.java
deleted file mode 100644
index e19a5190..00000000
--- a/common/logisticspipes/network/abstractpackets/GenericPacket.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package logisticspipes.network.abstractpackets;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-
-import lombok.Getter;
-
-import network.rs485.logisticspipes.util.LPDataInput;
-import network.rs485.logisticspipes.util.LPDataOutput;
-
-public abstract class GenericPacket extends ModernPacket {
-
-	@Getter
-	private Object[] args;
-
-	public GenericPacket(int id) {
-		super(id);
-	}
-
-	@Override
-	public void readData(LPDataInput input) throws IOException {
-		int size = input.readInt();
-		args = new Object[size];
-		for (int i = 0; i < size; i++) {
-			byte[] bytes = input.readByteArray();
-			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
-			ObjectInput in = new ObjectInputStream(bis);
-			try {
-				Object o = in.readObject();
-				args[i] = o;
-			} catch (ClassNotFoundException e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
-	}
-
-	@Override
-	public void writeData(LPDataOutput output) throws IOException {
-		output.writeInt(args.length);
-		for (Object arg : args) {
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			ObjectOutput out = new ObjectOutputStream(bos);
-			out.writeObject(arg);
-			output.writeByteArray(bos.toByteArray());
-		}
-	}
-
-	public GenericPacket setArgs(Object... input) {
-		args = input;
-		return this;
-	}
-}
diff --git a/common/logisticspipes/network/abstractpackets/Integer2CoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/Integer2CoordinatesPacket.java
index 12d71951..f39808c8 100644
--- a/common/logisticspipes/network/abstractpackets/Integer2CoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/Integer2CoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class Integer2CoordinatesPacket extends IntegerCoordinatesPacket
 	public Integer2CoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setInteger2(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(getInteger2());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/Integer2ModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/Integer2ModuleCoordinatesPacket.java
index 1dbc5789..7ca7c6cd 100644
--- a/common/logisticspipes/network/abstractpackets/Integer2ModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/Integer2ModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class Integer2ModuleCoordinatesPacket extends IntegerModuleCoord
 	public Integer2ModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setInteger2(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(getInteger2());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/IntegerCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/IntegerCoordinatesPacket.java
index 3662d124..6f7181ff 100644
--- a/common/logisticspipes/network/abstractpackets/IntegerCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/IntegerCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class IntegerCoordinatesPacket extends CoordinatesPacket {
 	public IntegerCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setInteger(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(getInteger());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/IntegerModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/IntegerModuleCoordinatesPacket.java
index ae2dcefd..5501217d 100644
--- a/common/logisticspipes/network/abstractpackets/IntegerModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/IntegerModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class IntegerModuleCoordinatesPacket extends ModuleCoordinatesPa
 	public IntegerModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setInteger(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(getInteger());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/IntegerPacket.java b/common/logisticspipes/network/abstractpackets/IntegerPacket.java
index 9ba23a8f..9468fa83 100644
--- a/common/logisticspipes/network/abstractpackets/IntegerPacket.java
+++ b/common/logisticspipes/network/abstractpackets/IntegerPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,14 +15,14 @@ public abstract class IntegerPacket extends ModernPacket {
 	public IntegerPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		setInteger(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(getInteger());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/InventoryModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/InventoryModuleCoordinatesPacket.java
index 1d5a7440..9873da4f 100644
--- a/common/logisticspipes/network/abstractpackets/InventoryModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/InventoryModuleCoordinatesPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
 import net.minecraft.inventory.IInventory;
 import net.minecraft.item.ItemStack;
@@ -36,11 +35,11 @@ public abstract class InventoryModuleCoordinatesPacket extends ModuleCoordinates
 	public InventoryModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 
 		if (inventory != null) {
 			output.writeByte(STACK_MARKER);
 			output.writeInt(inventory.getSizeInventory());
@@ -60,11 +59,11 @@ public abstract class InventoryModuleCoordinatesPacket extends ModuleCoordinates
 			throw new IllegalStateException("Wont send packet without content");
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 
 		byte marker = input.readByte();
 		if (marker == STACK_MARKER) {
 			stackList = input.readLinkedList(LPDataInput::readItemStack);
diff --git a/common/logisticspipes/network/abstractpackets/ItemPacket.java b/common/logisticspipes/network/abstractpackets/ItemPacket.java
index f2d812a6..601dfc3d 100644
--- a/common/logisticspipes/network/abstractpackets/ItemPacket.java
+++ b/common/logisticspipes/network/abstractpackets/ItemPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -20,11 +18,11 @@ public abstract class ItemPacket extends CoordinatesPacket {
 	public ItemPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		if (getStack() != null) {
 			output.writeInt(Item.getIdFromItem(getStack().getItem()));
 			output.writeInt(getStack().stackSize);
 			output.writeInt(getStack().getItemDamage());
@@ -33,11 +31,11 @@ public abstract class ItemPacket extends CoordinatesPacket {
 			output.writeInt(0);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 
 		final int itemID = input.readInt();
 		if (itemID != 0) {
 			int stackSize = input.readInt();
diff --git a/common/logisticspipes/network/abstractpackets/ListSyncPacket.java b/common/logisticspipes/network/abstractpackets/ListSyncPacket.java
index 5067f7ad..8d9099a5 100644
--- a/common/logisticspipes/network/abstractpackets/ListSyncPacket.java
+++ b/common/logisticspipes/network/abstractpackets/ListSyncPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
 import java.util.List;
 
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
@@ -28,17 +27,17 @@ public abstract class ListSyncPacket<E> extends CoordinatesPacket implements IWr
 	public ListSyncPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeCollection(list, this);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		list = input.readArrayList(this);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/abstractpackets/ModernPacket.java b/common/logisticspipes/network/abstractpackets/ModernPacket.java
index 4eb601d0..b62ce601 100644
--- a/common/logisticspipes/network/abstractpackets/ModernPacket.java
+++ b/common/logisticspipes/network/abstractpackets/ModernPacket.java
@@ -1,42 +1,36 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public abstract class ModernPacket {
 
-	@Getter
-	@Setter
-	private boolean isChunkDataPacket;
-
-	@Getter
-	@Setter
-	private boolean compressable;
 	/*
 	@Getter
 	protected String channel;
 	 */
 	@Getter
 	private final int id;
-
+	protected int leftRetries = 5;
+	@Getter
+	@Setter
+	private boolean isChunkDataPacket;
+	@Getter
+	@Setter
+	private boolean compressable;
 	@Getter
 	private byte[] data = null;
-
 	@Getter
 	@Setter
 	private int debugId = 0;
 
-	protected int leftRetries = 5;
-
 	public ModernPacket(int id) {
 		//this.channel = LogisticsPipes.LOGISTICS_PIPES_CHANNEL_NAME;
 		this.id = id;
 	}
 
@@ -63,15 +57,15 @@ public abstract class ModernPacket {
 			}
 			data = dataStream.toByteArray();
 		}
 	 */
 
-	public abstract void readData(LPDataInput input) throws IOException;
+	public abstract void readData(LPDataInput input);
 
 	public abstract void processPacket(EntityPlayer player);
 
-	public abstract void writeData(LPDataOutput output) throws IOException;
+	public abstract void writeData(LPDataOutput output);
 
 	public abstract ModernPacket template();
 
 	public boolean retry() {
 		return leftRetries-- > 0;
diff --git a/common/logisticspipes/network/abstractpackets/ModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/ModuleCoordinatesPacket.java
index aaa6c3d8..ad1d415e 100644
--- a/common/logisticspipes/network/abstractpackets/ModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/ModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.world.World;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -26,27 +24,28 @@ public abstract class ModuleCoordinatesPacket extends CoordinatesPacket {
 	private ModulePositionType type;
 
 	@Getter
 	@Setter
 	private int positionInt;
+	private boolean moduleBased = false;
 
 	public ModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(type != null);
 		if (type != null) {
 			output.writeEnum(type);
 			output.writeInt(positionInt);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		if (input.readBoolean()) {
 			type = input.readEnum(ModulePositionType.class);
 			positionInt = input.readInt();
 		}
@@ -66,12 +65,10 @@ public abstract class ModuleCoordinatesPacket extends CoordinatesPacket {
 		positionInt = packet.positionInt;
 		super.setPacketPos(packet);
 		return this;
 	}
 
-	private boolean moduleBased = false;
-
 	@SuppressWarnings("unchecked")
 	public <T> T getLogisticsModule(EntityPlayer player, Class<T> clazz) {
 		LogisticsModule module = null;
 		if (type == ModulePositionType.IN_PIPE) {
 			moduleBased = true;
diff --git a/common/logisticspipes/network/abstractpackets/NBTCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/NBTCoordinatesPacket.java
index e39d449c..a27684a4 100644
--- a/common/logisticspipes/network/abstractpackets/NBTCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/NBTCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.nbt.NBTTagCompound;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,16 +17,16 @@ public abstract class NBTCoordinatesPacket extends CoordinatesPacket {
 	public NBTCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeNBTTagCompound(tag);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		tag = input.readNBTTagCompound();
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/NBTModuleCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/NBTModuleCoordinatesPacket.java
index 56679264..c4e19655 100644
--- a/common/logisticspipes/network/abstractpackets/NBTModuleCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/NBTModuleCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.nbt.NBTTagCompound;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,16 +17,16 @@ public abstract class NBTModuleCoordinatesPacket extends ModuleCoordinatesPacket
 	public NBTModuleCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeNBTTagCompound(tag);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		tag = input.readNBTTagCompound();
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/RequestPacket.java b/common/logisticspipes/network/abstractpackets/RequestPacket.java
index 774b7044..8bda56fe 100644
--- a/common/logisticspipes/network/abstractpackets/RequestPacket.java
+++ b/common/logisticspipes/network/abstractpackets/RequestPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import logisticspipes.network.packets.orderer.RequestSubmitPacket;
 import logisticspipes.utils.item.ItemIdentifierStack;
@@ -28,18 +26,18 @@ public abstract class RequestPacket extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new RequestSubmitPacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeItemIdentifierStack(stack);
 		output.writeInt(dimension);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		stack = input.readItemIdentifierStack();
 		dimension = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/SlotPacket.java b/common/logisticspipes/network/abstractpackets/SlotPacket.java
index e0d668a3..d00db04c 100644
--- a/common/logisticspipes/network/abstractpackets/SlotPacket.java
+++ b/common/logisticspipes/network/abstractpackets/SlotPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.Slot;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -46,16 +44,16 @@ public abstract class SlotPacket extends ModernPacket {
 		setInteger(slot.slotNumber);
 		return this;
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		setInteger(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(getInteger());
 	}
 
 	protected void targetNotFound(String message) {
 		throw new TargetNotFoundException(message, this);
diff --git a/common/logisticspipes/network/abstractpackets/StringCoordinatesPacket.java b/common/logisticspipes/network/abstractpackets/StringCoordinatesPacket.java
index b36e4ebf..57c8b9a2 100644
--- a/common/logisticspipes/network/abstractpackets/StringCoordinatesPacket.java
+++ b/common/logisticspipes/network/abstractpackets/StringCoordinatesPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
-
 import lombok.Getter;
 import lombok.Setter;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -17,16 +15,16 @@ public abstract class StringCoordinatesPacket extends CoordinatesPacket {
 	public StringCoordinatesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeUTF(getString());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setString(input.readUTF());
 	}
 }
diff --git a/common/logisticspipes/network/abstractpackets/StringListPacket.java b/common/logisticspipes/network/abstractpackets/StringListPacket.java
index 88ebd02d..a15b63f9 100644
--- a/common/logisticspipes/network/abstractpackets/StringListPacket.java
+++ b/common/logisticspipes/network/abstractpackets/StringListPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.abstractpackets;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -19,19 +18,19 @@ public abstract class StringListPacket extends ModernPacket {
 	public StringListPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		int size = input.readInt();
 		for (int i = 0; i < size; i++) {
 			getStringList().add(input.readUTF());
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(getStringList().size());
 		for (int i = 0; i < getStringList().size(); i++) {
 			output.writeUTF(getStringList().get(i));
 		}
 	}
diff --git a/common/logisticspipes/network/guis/block/AutoCraftingGui.java b/common/logisticspipes/network/guis/block/AutoCraftingGui.java
index ddef46ec..09562024 100644
--- a/common/logisticspipes/network/guis/block/AutoCraftingGui.java
+++ b/common/logisticspipes/network/guis/block/AutoCraftingGui.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.blocks.crafting.LogisticsCraftingTableTileEntity;
 import logisticspipes.gui.GuiLogisticsCraftingTable;
 import logisticspipes.network.abstractguis.CoordinatesGuiProvider;
@@ -66,11 +64,11 @@ public class AutoCraftingGui extends CoordinatesGuiProvider {
 		dummy.addNormalSlotsForPlayerInventory(8, 135);
 		return dummy;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeItemIdentifier(targetType);
 		output.writeBoolean(isFuzzy);
 		if (isFuzzy) {
 			for (int i = 0; i < 9; i++) {
@@ -81,11 +79,11 @@ public class AutoCraftingGui extends CoordinatesGuiProvider {
 			}
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		targetType = input.readItemIdentifier();
 		if (input.readBoolean()) {
 			for (int i = 0; i < 9; i++) {
 				ignore_dmg[i] = input.readBoolean();
diff --git a/common/logisticspipes/network/guis/block/StatisticsGui.java b/common/logisticspipes/network/guis/block/StatisticsGui.java
index c5afd5b2..c599093c 100644
--- a/common/logisticspipes/network/guis/block/StatisticsGui.java
+++ b/common/logisticspipes/network/guis/block/StatisticsGui.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.guis.block;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.Container;
 
@@ -56,18 +55,18 @@ public class StatisticsGui extends CoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new StatisticsGui(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeCollection(trackingList, (output1, object) -> object.writeToLPData(output1));
 
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		trackingList = input.readArrayList(data1 -> {
 			TrackingTask object = new TrackingTask();
 			object.readFromLPData(data1);
 			return object;
diff --git a/common/logisticspipes/network/guis/item/ItemAmountSignGui.java b/common/logisticspipes/network/guis/item/ItemAmountSignGui.java
index c244430a..4c33fa00 100644
--- a/common/logisticspipes/network/guis/item/ItemAmountSignGui.java
+++ b/common/logisticspipes/network/guis/item/ItemAmountSignGui.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.item;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -49,17 +47,17 @@ public class ItemAmountSignGui extends CoordinatesGuiProvider {
 		dummy.addNormalSlotsForPlayerInventory(0, 0);
 		return dummy;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeForgeDirection(dir);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		dir = input.readForgeDirection();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/guis/module/inhand/CraftingModuleInHand.java b/common/logisticspipes/network/guis/module/inhand/CraftingModuleInHand.java
index e80441fb..18794b0f 100644
--- a/common/logisticspipes/network/guis/module/inhand/CraftingModuleInHand.java
+++ b/common/logisticspipes/network/guis/module/inhand/CraftingModuleInHand.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inhand;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -65,18 +63,18 @@ public class CraftingModuleInHand extends ModuleInHandGuiProvider {
 	public GuiProvider template() {
 		return new CraftingModuleInHand(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeIntArray(amount);
 		output.writeBoolean(cleanupExclude);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		amount = input.readIntArray();
 		cleanupExclude = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/guis/module/inpipe/ActiveSupplierSlot.java b/common/logisticspipes/network/guis/module/inpipe/ActiveSupplierSlot.java
index f8249b32..1dc00e11 100644
--- a/common/logisticspipes/network/guis/module/inpipe/ActiveSupplierSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/ActiveSupplierSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -38,20 +36,20 @@ public class ActiveSupplierSlot extends ModuleCoordinatesGuiProvider {
 	public ActiveSupplierSlot(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(patternUpgarde);
 		output.writeIntArray(slotArray);
 		output.writeBoolean(isLimit);
 		output.writeInt(mode);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		patternUpgarde = input.readBoolean();
 		slotArray = input.readIntArray();
 		isLimit = input.readBoolean();
 		mode = input.readInt();
diff --git a/common/logisticspipes/network/guis/module/inpipe/AdvancedExtractorModuleSlot.java b/common/logisticspipes/network/guis/module/inpipe/AdvancedExtractorModuleSlot.java
index bfc1bde4..e4983f8d 100644
--- a/common/logisticspipes/network/guis/module/inpipe/AdvancedExtractorModuleSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/AdvancedExtractorModuleSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -54,16 +52,16 @@ public class AdvancedExtractorModuleSlot extends ModuleCoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new AdvancedExtractorModuleSlot(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(areItemsIncluded);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		areItemsIncluded = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/guis/module/inpipe/ApiaristAnalyzerModuleSlot.java b/common/logisticspipes/network/guis/module/inpipe/ApiaristAnalyzerModuleSlot.java
index 6c398dd8..beaa65cb 100644
--- a/common/logisticspipes/network/guis/module/inpipe/ApiaristAnalyzerModuleSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/ApiaristAnalyzerModuleSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -48,16 +46,16 @@ public class ApiaristAnalyzerModuleSlot extends ModuleCoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new ApiaristAnalyzerModuleSlot(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(extractorMode);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		extractorMode = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/guis/module/inpipe/CCBasedQuickSortSlot.java b/common/logisticspipes/network/guis/module/inpipe/CCBasedQuickSortSlot.java
index b8448b9d..d556a242 100644
--- a/common/logisticspipes/network/guis/module/inpipe/CCBasedQuickSortSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/CCBasedQuickSortSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -48,16 +46,16 @@ public class CCBasedQuickSortSlot extends ModuleCoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new CCBasedQuickSortSlot(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(timeOut);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		timeOut = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/guis/module/inpipe/CraftingModuleSlot.java b/common/logisticspipes/network/guis/module/inpipe/CraftingModuleSlot.java
index fe3b0fa5..e438353c 100644
--- a/common/logisticspipes/network/guis/module/inpipe/CraftingModuleSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/CraftingModuleSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -99,11 +97,11 @@ public class CraftingModuleSlot extends ModuleCoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new CraftingModuleSlot(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(isAdvancedSat);
 		output.writeInt(liquidCrafter);
 		output.writeIntArray(amount);
 		output.writeBoolean(hasByproductExtractor);
@@ -111,11 +109,11 @@ public class CraftingModuleSlot extends ModuleCoordinatesGuiProvider {
 		output.writeInt(cleanupSize);
 		output.writeBoolean(cleanupExclude);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		isAdvancedSat = input.readBoolean();
 		liquidCrafter = input.readInt();
 		amount = input.readIntArray();
 		hasByproductExtractor = input.readBoolean();
diff --git a/common/logisticspipes/network/guis/module/inpipe/ExtractorModuleSlot.java b/common/logisticspipes/network/guis/module/inpipe/ExtractorModuleSlot.java
index 6b582d9b..7883f403 100644
--- a/common/logisticspipes/network/guis/module/inpipe/ExtractorModuleSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/ExtractorModuleSlot.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -25,17 +23,17 @@ public class ExtractorModuleSlot extends ModuleCoordinatesGuiProvider {
 	public ExtractorModuleSlot(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeForgeDirection(sneakyOrientation);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		sneakyOrientation = input.readForgeDirection();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/guis/module/inpipe/ItemSinkSlot.java b/common/logisticspipes/network/guis/module/inpipe/ItemSinkSlot.java
index 76b38131..4b092400 100644
--- a/common/logisticspipes/network/guis/module/inpipe/ItemSinkSlot.java
+++ b/common/logisticspipes/network/guis/module/inpipe/ItemSinkSlot.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -37,20 +36,20 @@ public class ItemSinkSlot extends ModuleCoordinatesGuiProvider {
 	public ItemSinkSlot(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(isDefaultRoute);
 		output.writeBoolean(hasFuzzyUpgrade);
 		output.writeBitSet(ignoreData);
 		output.writeBitSet(ignoreNBT);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		isDefaultRoute = input.readBoolean();
 		hasFuzzyUpgrade = input.readBoolean();
 		ignoreData = input.readBitSet();
 		ignoreNBT = input.readBitSet();
diff --git a/common/logisticspipes/network/guis/module/inpipe/ProviderModuleGuiProvider.java b/common/logisticspipes/network/guis/module/inpipe/ProviderModuleGuiProvider.java
index efb4143f..ad11d395 100644
--- a/common/logisticspipes/network/guis/module/inpipe/ProviderModuleGuiProvider.java
+++ b/common/logisticspipes/network/guis/module/inpipe/ProviderModuleGuiProvider.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.guis.module.inpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -74,20 +72,20 @@ public class ProviderModuleGuiProvider extends ModuleCoordinatesGuiProvider {
 	public GuiProvider template() {
 		return new ProviderModuleGuiProvider(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(exclude);
 		output.writeInt(extractorMode);
 		output.writeBoolean(isActive);
 		output.writeForgeDirection(sneakyOrientation);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		exclude = input.readBoolean();
 		extractorMode = input.readInt();
 		isActive = input.readBoolean();
 		sneakyOrientation = input.readForgeDirection();
diff --git a/common/logisticspipes/network/packets/ActivateNBTDebug.java b/common/logisticspipes/network/packets/ActivateNBTDebug.java
index 29b9cfdd..22ea74bd 100644
--- a/common/logisticspipes/network/packets/ActivateNBTDebug.java
+++ b/common/logisticspipes/network/packets/ActivateNBTDebug.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.LPConstants;
 import logisticspipes.config.Configs;
 import logisticspipes.nei.LoadingHelper;
@@ -16,11 +14,11 @@ public class ActivateNBTDebug extends ModernPacket {
 	public ActivateNBTDebug(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		try {
 			Class.forName("codechicken.nei.forge.GuiContainerManager");
@@ -34,11 +32,11 @@ public class ActivateNBTDebug extends ModernPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new ActivateNBTDebug(getId());
 	}
diff --git a/common/logisticspipes/network/packets/BufferTransfer.java b/common/logisticspipes/network/packets/BufferTransfer.java
index 812c731a..26a3775f 100644
--- a/common/logisticspipes/network/packets/BufferTransfer.java
+++ b/common/logisticspipes/network/packets/BufferTransfer.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,14 +34,14 @@ public class BufferTransfer extends ModernPacket {
 			SimpleServiceLocator.serverBufferHandler.handlePacket(content, player);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		content = input.readByteArray();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeByteArray(content);
 	}
 }
diff --git a/common/logisticspipes/network/packets/CraftingPermissionPacket.java b/common/logisticspipes/network/packets/CraftingPermissionPacket.java
index 46242cc4..faeb7a77 100644
--- a/common/logisticspipes/network/packets/CraftingPermissionPacket.java
+++ b/common/logisticspipes/network/packets/CraftingPermissionPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
 import java.util.EnumSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -23,11 +22,11 @@ public class CraftingPermissionPacket extends ModernPacket {
 	public CraftingPermissionPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		enumSet = EnumSet.noneOf(CraftingDependency.class);
 		for (CraftingDependency type : CraftingDependency.values()) {
 			if (input.readBoolean()) {
 				enumSet.add(type);
 			}
@@ -38,11 +37,11 @@ public class CraftingPermissionPacket extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		SimpleServiceLocator.craftingPermissionManager.clientSidePermission = enumSet;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		for (CraftingDependency type : CraftingDependency.values()) {
 			output.writeBoolean(enumSet.contains(type));
 		}
 	}
 
diff --git a/common/logisticspipes/network/packets/DummyPacket.java b/common/logisticspipes/network/packets/DummyPacket.java
index e69e9b47..3ace1451 100644
--- a/common/logisticspipes/network/packets/DummyPacket.java
+++ b/common/logisticspipes/network/packets/DummyPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ModernPacket;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
@@ -13,21 +11,21 @@ public class DummyPacket extends ModernPacket {
 	public DummyPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		throw new RuntimeException("This packet should never be used");
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		throw new RuntimeException("This packet should never be used");
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		throw new RuntimeException("This packet should never be used");
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/NEISetCraftingRecipe.java b/common/logisticspipes/network/packets/NEISetCraftingRecipe.java
index 56425d0c..c2241e18 100644
--- a/common/logisticspipes/network/packets/NEISetCraftingRecipe.java
+++ b/common/logisticspipes/network/packets/NEISetCraftingRecipe.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.tileentity.TileEntity;
 
@@ -42,11 +40,11 @@ public class NEISetCraftingRecipe extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new NEISetCraftingRecipe(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 
 		output.writeInt(content.length);
 
 		for (int i = 0; i < content.length; i++) {
@@ -62,11 +60,11 @@ public class NEISetCraftingRecipe extends CoordinatesPacket {
 		}
 		output.writeByte(-1); // mark packet end
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 
 		content = new ItemStack[input.readInt()];
 
 		byte index = input.readByte();
diff --git a/common/logisticspipes/network/packets/PlayerConfigToClientPacket.java b/common/logisticspipes/network/packets/PlayerConfigToClientPacket.java
index 55970f66..4bb99cf0 100644
--- a/common/logisticspipes/network/packets/PlayerConfigToClientPacket.java
+++ b/common/logisticspipes/network/packets/PlayerConfigToClientPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -22,19 +20,19 @@ public class PlayerConfigToClientPacket extends ModernPacket {
 	public PlayerConfigToClientPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		LogisticsPipes.getClientPlayerConfig().readData(input);
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		config.writeData(output);
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/PlayerConfigToServerPacket.java b/common/logisticspipes/network/packets/PlayerConfigToServerPacket.java
index 6c5b7f74..d842089d 100644
--- a/common/logisticspipes/network/packets/PlayerConfigToServerPacket.java
+++ b/common/logisticspipes/network/packets/PlayerConfigToServerPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -23,22 +21,22 @@ public class PlayerConfigToServerPacket extends ModernPacket {
 	public PlayerConfigToServerPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		config = new PlayerConfig(null);
 		config.readData(input);
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		config.applyTo(LogisticsEventListener.getPlayerConfig(PlayerIdentifier.get(player)));
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		config.writeData(output);
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/PlayerListRequest.java b/common/logisticspipes/network/packets/PlayerListRequest.java
index 557ecde7..bdb52f53 100644
--- a/common/logisticspipes/network/packets/PlayerListRequest.java
+++ b/common/logisticspipes/network/packets/PlayerListRequest.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -33,10 +32,10 @@ public class PlayerListRequest extends ModernPacket {
 		MainProxy.sendPacketToPlayer(PacketHandler.getPacket(PlayerList.class)
 				.setStringList(allPlayerEntities.map(entityPlayer -> entityPlayer.getGameProfile().getName()).collect(Collectors.toList())), player);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 }
diff --git a/common/logisticspipes/network/packets/RequestUpdateNamesPacket.java b/common/logisticspipes/network/packets/RequestUpdateNamesPacket.java
index 98f61d84..54af2387 100644
--- a/common/logisticspipes/network/packets/RequestUpdateNamesPacket.java
+++ b/common/logisticspipes/network/packets/RequestUpdateNamesPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -25,11 +24,11 @@ public class RequestUpdateNamesPacket extends ModernPacket {
 	public RequestUpdateNamesPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		//XXX stubbed out. How do you enumerate every item now?
 		//Item[] itemList = Item.itemsList;
@@ -55,11 +54,11 @@ public class RequestUpdateNamesPacket extends ModernPacket {
 		SimpleServiceLocator.clientBufferHandler.setPause(false);
 		FMLClientHandler.instance().getClient().thePlayer.sendChatMessage("Names in send Queue");
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new RequestUpdateNamesPacket(getId());
 	}
diff --git a/common/logisticspipes/network/packets/UpdateName.java b/common/logisticspipes/network/packets/UpdateName.java
index 250a539f..1ddb5477 100644
--- a/common/logisticspipes/network/packets/UpdateName.java
+++ b/common/logisticspipes/network/packets/UpdateName.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -41,17 +39,17 @@ public class UpdateName extends ModernPacket {
 			MainProxy.proxy.updateNames(getIdent(), getName());
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		ident = input.readItemIdentifierStack().getItem();
 		name = input.readUTF();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeItemIdentifierStack(ident.makeStack(0));
 		output.writeUTF(name);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/block/AddItemToTrackPacket.java b/common/logisticspipes/network/packets/block/AddItemToTrackPacket.java
index 803fa3b9..1f410793 100644
--- a/common/logisticspipes/network/packets/block/AddItemToTrackPacket.java
+++ b/common/logisticspipes/network/packets/block/AddItemToTrackPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -41,17 +39,17 @@ public class AddItemToTrackPacket extends CoordinatesPacket {
 			tile.tasks.add(task);
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeItemIdentifier(item);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		item = input.readItemIdentifier();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/block/CraftingCycleRecipe.java b/common/logisticspipes/network/packets/block/CraftingCycleRecipe.java
index d55c2516..90707d99 100644
--- a/common/logisticspipes/network/packets/block/CraftingCycleRecipe.java
+++ b/common/logisticspipes/network/packets/block/CraftingCycleRecipe.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -16,18 +14,18 @@ import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class CraftingCycleRecipe extends CoordinatesPacket {
 
-	public CraftingCycleRecipe(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private boolean down;
 
+	public CraftingCycleRecipe(int id) {
+		super(id);
+	}
+
 	@Override
 	public void processPacket(EntityPlayer player) {
 		TileEntity table = this.getTile(player.getEntityWorld(), TileEntity.class);
 		if (table instanceof LogisticsCraftingTableTileEntity) {
 			((LogisticsCraftingTableTileEntity) table).cycleRecipe(down);
@@ -40,16 +38,16 @@ public class CraftingCycleRecipe extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new CraftingCycleRecipe(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(down);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		down = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/packets/block/CraftingSetType.java b/common/logisticspipes/network/packets/block/CraftingSetType.java
index 96dee2e8..4f122648 100644
--- a/common/logisticspipes/network/packets/block/CraftingSetType.java
+++ b/common/logisticspipes/network/packets/block/CraftingSetType.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -17,18 +15,18 @@ import logisticspipes.utils.item.ItemIdentifier;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class CraftingSetType extends CoordinatesPacket {
 
-	public CraftingSetType(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private ItemIdentifier targetType;
 
+	public CraftingSetType(int id) {
+		super(id);
+	}
+
 	@Override
 	public void processPacket(EntityPlayer player) {
 		TileEntity table = this.getTile(player.getEntityWorld(), TileEntity.class);
 		if (table instanceof LogisticsCraftingTableTileEntity) {
 			((LogisticsCraftingTableTileEntity) table).targetType = targetType;
@@ -43,16 +41,16 @@ public class CraftingSetType extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new CraftingSetType(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeItemIdentifier(targetType);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		targetType = input.readItemIdentifier();
 	}
 }
diff --git a/common/logisticspipes/network/packets/block/PowerPacketLaser.java b/common/logisticspipes/network/packets/block/PowerPacketLaser.java
index 537fa8d9..0d0048d8 100644
--- a/common/logisticspipes/network/packets/block/PowerPacketLaser.java
+++ b/common/logisticspipes/network/packets/block/PowerPacketLaser.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -14,40 +12,35 @@ import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class PowerPacketLaser extends CoordinatesPacket {
 
-	public PowerPacketLaser(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private ForgeDirection dir;
-
 	@Getter
 	@Setter
 	private int color;
-
 	@Getter
 	@Setter
 	private boolean reverse;
-
 	@Getter
 	@Setter
 	private boolean renderBall;
-
 	@Getter
 	@Setter
 	private float length;
-
 	@Getter
 	@Setter
 	private boolean remove = false;
 
+	public PowerPacketLaser(int id) {
+		super(id);
+	}
+
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		length = input.readFloat();
 		dir = input.readForgeDirection();
 		color = input.readInt();
 		reverse = input.readBoolean();
@@ -64,11 +57,11 @@ public class PowerPacketLaser extends CoordinatesPacket {
 			tile.addLaser(dir, getLength(), getColor(), isReverse(), isRenderBall());
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeFloat(length);
 		output.writeForgeDirection(dir);
 		output.writeInt(color);
 		output.writeBoolean(reverse);
diff --git a/common/logisticspipes/network/packets/block/PowerProviderLevel.java b/common/logisticspipes/network/packets/block/PowerProviderLevel.java
index a3667cac..1b00dd65 100644
--- a/common/logisticspipes/network/packets/block/PowerProviderLevel.java
+++ b/common/logisticspipes/network/packets/block/PowerProviderLevel.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.blocks.powertile.LogisticsPowerProviderTileEntity;
 import logisticspipes.network.abstractpackets.CoordinatesPacket;
 import logisticspipes.network.abstractpackets.ModernPacket;
@@ -26,17 +24,17 @@ public class PowerProviderLevel extends CoordinatesPacket {
 		aDouble = d;
 		return this;
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		setDouble(input.readDouble());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeDouble(getDouble());
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/block/RemoveAmoundTask.java b/common/logisticspipes/network/packets/block/RemoveAmoundTask.java
index b5b7a096..d316830c 100644
--- a/common/logisticspipes/network/packets/block/RemoveAmoundTask.java
+++ b/common/logisticspipes/network/packets/block/RemoveAmoundTask.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
 import java.util.Iterator;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -38,17 +37,17 @@ public class RemoveAmoundTask extends CoordinatesPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeItemIdentifier(item);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		item = input.readItemIdentifier();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/block/RunningCraftingTasks.java b/common/logisticspipes/network/packets/block/RunningCraftingTasks.java
index f513d239..a7d86f69 100644
--- a/common/logisticspipes/network/packets/block/RunningCraftingTasks.java
+++ b/common/logisticspipes/network/packets/block/RunningCraftingTasks.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import cpw.mods.fml.client.FMLClientHandler;
 
@@ -31,16 +30,16 @@ public class RunningCraftingTasks extends ModernPacket {
 			((GuiStatistics) FMLClientHandler.instance().getClient().currentScreen).handlePacket_2(getIdentList());
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeCollection(identList, LPDataOutput::writeItemIdentifierStack);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		identList = input.readArrayList(LPDataInput::readItemIdentifierStack);
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/block/SecurityStationId.java b/common/logisticspipes/network/packets/block/SecurityStationId.java
index 05967b09..413b3554 100644
--- a/common/logisticspipes/network/packets/block/SecurityStationId.java
+++ b/common/logisticspipes/network/packets/block/SecurityStationId.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.block;
 
-import java.io.IOException;
 import java.util.UUID;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -36,17 +35,17 @@ public class SecurityStationId extends CoordinatesPacket {
 			tile.setClientUUID(getUuid());
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeLong(uuid.getMostSignificantBits());
 		output.writeLong(uuid.getLeastSignificantBits());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		uuid = new UUID(input.readLong(), input.readLong());
 	}
 }
diff --git a/common/logisticspipes/network/packets/chassis/ChassisGUI.java b/common/logisticspipes/network/packets/chassis/ChassisGUI.java
index db4673bf..840cd529 100644
--- a/common/logisticspipes/network/packets/chassis/ChassisGUI.java
+++ b/common/logisticspipes/network/packets/chassis/ChassisGUI.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.chassis;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -24,17 +22,17 @@ public class ChassisGUI extends CoordinatesPacket {
 	public ChassisGUI(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(buttonID);
 		super.writeData(output);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		buttonID = input.readInt();
 		super.readData(input);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/chassis/ChestGuiClosed.java b/common/logisticspipes/network/packets/chassis/ChestGuiClosed.java
index 1f160263..e64b4bf1 100644
--- a/common/logisticspipes/network/packets/chassis/ChestGuiClosed.java
+++ b/common/logisticspipes/network/packets/chassis/ChestGuiClosed.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.chassis;
 
-import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -17,11 +16,11 @@ public class ChestGuiClosed extends ModernPacket {
 	public ChestGuiClosed(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		List<WeakReference<ModuleQuickSort>> list = LogisticsEventListener.chestQuickSortConnection.get(player);
 		if (list == null || list.isEmpty()) {
@@ -36,11 +35,11 @@ public class ChestGuiClosed extends ModernPacket {
 		}
 		LogisticsEventListener.chestQuickSortConnection.remove(player);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new ChestGuiClosed(getId());
 	}
diff --git a/common/logisticspipes/network/packets/chassis/ChestGuiOpened.java b/common/logisticspipes/network/packets/chassis/ChestGuiOpened.java
index d4d47cae..969de01c 100644
--- a/common/logisticspipes/network/packets/chassis/ChestGuiOpened.java
+++ b/common/logisticspipes/network/packets/chassis/ChestGuiOpened.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.chassis;
 
-import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -19,11 +18,11 @@ public class ChestGuiOpened extends ModernPacket {
 	public ChestGuiOpened(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		List<WeakReference<ModuleQuickSort>> list = LogisticsEventListener.chestQuickSortConnection.get(player);
 		if (list == null || list.isEmpty()) {
@@ -38,11 +37,11 @@ public class ChestGuiOpened extends ModernPacket {
 			module.addWatchingPlayer(player);
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new ChestGuiOpened(getId());
 	}
diff --git a/common/logisticspipes/network/packets/chassis/EnableQuickSortMarker.java b/common/logisticspipes/network/packets/chassis/EnableQuickSortMarker.java
index 3676a321..30c87b5c 100644
--- a/common/logisticspipes/network/packets/chassis/EnableQuickSortMarker.java
+++ b/common/logisticspipes/network/packets/chassis/EnableQuickSortMarker.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.chassis;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ModernPacket;
 import logisticspipes.utils.QuickSortChestMarkerStorage;
 import network.rs485.logisticspipes.util.LPDataInput;
@@ -14,19 +12,19 @@ public class EnableQuickSortMarker extends ModernPacket {
 	public EnableQuickSortMarker(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		QuickSortChestMarkerStorage.getInstance().enable();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new EnableQuickSortMarker(getId());
 	}
diff --git a/common/logisticspipes/network/packets/cpipe/CPipeCleanupStatus.java b/common/logisticspipes/network/packets/cpipe/CPipeCleanupStatus.java
index 16bfbb3a..6842bc3b 100644
--- a/common/logisticspipes/network/packets/cpipe/CPipeCleanupStatus.java
+++ b/common/logisticspipes/network/packets/cpipe/CPipeCleanupStatus.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.cpipe;
 
-import java.io.IOException;
-
 import net.minecraft.client.Minecraft;
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -43,16 +41,16 @@ public class CPipeCleanupStatus extends ModuleCoordinatesPacket {
 			((GuiCraftingPipe) Minecraft.getMinecraft().currentScreen).onCleanupModeChange();
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(mode);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		mode = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/packets/cpipe/CPipeSatelliteId.java b/common/logisticspipes/network/packets/cpipe/CPipeSatelliteId.java
index 59d51ebf..14368b28 100644
--- a/common/logisticspipes/network/packets/cpipe/CPipeSatelliteId.java
+++ b/common/logisticspipes/network/packets/cpipe/CPipeSatelliteId.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.cpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -27,17 +25,17 @@ public class CPipeSatelliteId extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new CPipeSatelliteId(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(pipeId);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		pipeId = input.readInt();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/debug/PipeDebugLogAskForTarget.java b/common/logisticspipes/network/packets/debug/PipeDebugLogAskForTarget.java
index e7a46a0e..08c66ae1 100644
--- a/common/logisticspipes/network/packets/debug/PipeDebugLogAskForTarget.java
+++ b/common/logisticspipes/network/packets/debug/PipeDebugLogAskForTarget.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.MovingObjectPosition;
 import net.minecraft.util.MovingObjectPosition.MovingObjectType;
 import cpw.mods.fml.client.FMLClientHandler;
 
@@ -18,22 +16,22 @@ public class PipeDebugLogAskForTarget extends ModernPacket {
 	public PipeDebugLogAskForTarget(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		MovingObjectPosition box = FMLClientHandler.instance().getClient().objectMouseOver;
 		if (box != null && box.typeOfHit == MovingObjectType.BLOCK) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(PipeDebugLogResponse.class).setPosX(box.blockX).setPosY(box.blockY).setPosZ(box.blockZ));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new PipeDebugLogAskForTarget(getId());
 	}
diff --git a/common/logisticspipes/network/packets/debug/SendNewLogLine.java b/common/logisticspipes/network/packets/debug/SendNewLogLine.java
index 98041a2f..82ac1e4b 100644
--- a/common/logisticspipes/network/packets/debug/SendNewLogLine.java
+++ b/common/logisticspipes/network/packets/debug/SendNewLogLine.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -25,22 +23,22 @@ public class SendNewLogLine extends ModernPacket {
 	public SendNewLogLine(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		windowID = input.readInt();
 		line = input.readUTF();
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		LogWindow.getWindow(windowID).newLine(line);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(windowID);
 		output.writeUTF(line);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/debug/SendNewLogWindow.java b/common/logisticspipes/network/packets/debug/SendNewLogWindow.java
index 5dba058a..32b2a02b 100644
--- a/common/logisticspipes/network/packets/debug/SendNewLogWindow.java
+++ b/common/logisticspipes/network/packets/debug/SendNewLogWindow.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -25,22 +23,22 @@ public class SendNewLogWindow extends ModernPacket {
 	public SendNewLogWindow(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		windowID = input.readInt();
 		title = input.readUTF();
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		LogWindow.getWindow(windowID).setTitle(title);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(windowID);
 		output.writeUTF(title);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/debug/UpdateStatusEntries.java b/common/logisticspipes/network/packets/debug/UpdateStatusEntries.java
index 46c92031..8f6aaa1f 100644
--- a/common/logisticspipes/network/packets/debug/UpdateStatusEntries.java
+++ b/common/logisticspipes/network/packets/debug/UpdateStatusEntries.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.debug;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -29,16 +28,16 @@ public class UpdateStatusEntries extends ModernPacket {
 	public UpdateStatusEntries(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		windowID = input.readInt();
 		status = input.readArrayList(new IReadListObject<StatusEntry>() {
 
 			@Override
-			public StatusEntry readObject(LPDataInput input) throws IOException {
+			public StatusEntry readObject(LPDataInput input) {
 				StatusEntry status = new StatusEntry();
 				status.name = input.readUTF();
 				if (input.readBoolean()) {
 					status.subEntry = input.readArrayList(this);
 				}
@@ -51,16 +50,16 @@ public class UpdateStatusEntries extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		LogWindow.getWindow(windowID).updateStatus(status);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(windowID);
 		output.writeCollection(status, new IWriteListObject<StatusEntry>() {
 
 			@Override
-			public void writeObject(LPDataOutput output, StatusEntry entry) throws IOException {
+			public void writeObject(LPDataOutput output, StatusEntry entry) {
 				output.writeUTF(entry.name);
 				output.writeBoolean(entry.subEntry != null);
 				if (entry.subEntry != null) {
 					output.writeCollection(entry.subEntry, this);
 				}
diff --git a/common/logisticspipes/network/packets/debuggui/DebugAskForTarget.java b/common/logisticspipes/network/packets/debuggui/DebugAskForTarget.java
index 82934b1b..342a8b19 100644
--- a/common/logisticspipes/network/packets/debuggui/DebugAskForTarget.java
+++ b/common/logisticspipes/network/packets/debuggui/DebugAskForTarget.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debuggui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.MovingObjectPosition;
 import cpw.mods.fml.client.FMLClientHandler;
 
 import logisticspipes.network.PacketHandler;
@@ -17,28 +15,28 @@ public class DebugAskForTarget extends ModernPacket {
 	public DebugAskForTarget(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		MovingObjectPosition box = FMLClientHandler.instance().getClient().objectMouseOver;
 		if (box == null) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(DebugTargetResponse.class).setMode(DebugTargetResponse.TargetMode.None));
 		} else if (box.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(DebugTargetResponse.class).setMode(DebugTargetResponse.TargetMode.Block)
-					.setAdditions(new Object[] { box.blockX, box.blockY, box.blockZ }));
+					.setAdditions(new int[] { box.blockX, box.blockY, box.blockZ }));
 		} else if (box.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(DebugTargetResponse.class).setMode(DebugTargetResponse.TargetMode.Entity)
-					.setAdditions(new Object[] { box.entityHit.getEntityId() }));
+					.setAdditions(new int[] { box.entityHit.getEntityId() }));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new DebugAskForTarget(getId());
 	}
diff --git a/common/logisticspipes/network/packets/debuggui/DebugDataPacket.java b/common/logisticspipes/network/packets/debuggui/DebugDataPacket.java
index f6b37265..519d814a 100644
--- a/common/logisticspipes/network/packets/debuggui/DebugDataPacket.java
+++ b/common/logisticspipes/network/packets/debuggui/DebugDataPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debuggui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -25,22 +23,22 @@ public class DebugDataPacket extends ModernPacket {
 	public DebugDataPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		payload = input.readByteArray();
 		identifier = input.readInt();
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		DebugGuiController.instance().handleDataPacket(payload, identifier, player);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeByteArray(payload);
 		output.writeInt(identifier);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/debuggui/DebugPanelOpen.java b/common/logisticspipes/network/packets/debuggui/DebugPanelOpen.java
index e32cca69..86ca17b9 100644
--- a/common/logisticspipes/network/packets/debuggui/DebugPanelOpen.java
+++ b/common/logisticspipes/network/packets/debuggui/DebugPanelOpen.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.debuggui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -30,17 +28,17 @@ public class DebugPanelOpen extends ModernPacket {
 	public ModernPacket template() {
 		return new DebugPanelOpen(getId());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		setName(input.readUTF());
 		setIdentification(input.readInt());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeUTF(getName());
 		output.writeInt(getIdentification());
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/debuggui/DebugTargetResponse.java b/common/logisticspipes/network/packets/debuggui/DebugTargetResponse.java
index 7b94505a..8f50f71a 100644
--- a/common/logisticspipes/network/packets/debuggui/DebugTargetResponse.java
+++ b/common/logisticspipes/network/packets/debuggui/DebugTargetResponse.java
@@ -1,15 +1,7 @@
 package logisticspipes.network.packets.debuggui;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-
 import net.minecraft.block.Block;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.ChatComponentText;
@@ -27,54 +19,35 @@ import logisticspipes.utils.string.ChatColor;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class DebugTargetResponse extends ModernPacket {
 
-	public DebugTargetResponse(int id) {
-		super(id);
-	}
-
-	public enum TargetMode {
-		Block,
-		Entity,
-		None
-	}
-
 	@Getter
 	@Setter
 	private TargetMode mode;
-
 	@Getter
 	@Setter
-	private Object[] additions = new Object[0];
+	private int[] additions = new int[0];
+
+	public DebugTargetResponse(int id) {
+		super(id);
+	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		mode = TargetMode.values()[input.readByte()];
-		int size = input.readInt();
-		additions = new Object[size];
-		for (int i = 0; i < size; i++) {
-			byte[] bytes = input.readByteArray();
-			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
-			ObjectInput in = new ObjectInputStream(bis);
-			try {
-				Object o = in.readObject();
-				additions[i] = o;
-			} catch (ClassNotFoundException e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
+		additions = input.readIntArray();
 	}
 
 	@Override
 	public void processPacket(final EntityPlayer player) {
 		if (mode == TargetMode.None) {
 			player.addChatComponentMessage(new ChatComponentText(ChatColor.RED + "No Target Found"));
 		} else if (mode == TargetMode.Block) {
-			int x = (Integer) additions[0];
-			int y = (Integer) additions[1];
-			int z = (Integer) additions[2];
+			int x = additions[0];
+			int y = additions[1];
+			int z = additions[2];
 			player.addChatComponentMessage(new ChatComponentText("Checking Block at: x:" + x + " y:" + y + " z:" + z));
 			Block id = player.worldObj.getBlock(x, y, z);
 			player.addChatComponentMessage(new ChatComponentText("Found Block with Id: " + id.getClass()));
 			final TileEntity tile = player.worldObj.getTileEntity(x, y, z);
 			if (tile == null) {
@@ -92,11 +65,11 @@ public class DebugTargetResponse extends ModernPacket {
 								+ ChatColor.AQUA + "? " + ChatColor.RESET + "<" + ChatColor.GREEN + "yes" + ChatColor.RESET + "/" + ChatColor.RED + "no"
 								+ ChatColor.RESET + ">"));
 				MainProxy.sendPacketToPlayer(PacketHandler.getPacket(OpenChatGui.class), player);
 			}
 		} else if (mode == TargetMode.Entity) {
-			int entityId = (Integer) additions[0];
+			int entityId = additions[0];
 			final Entity entity = player.worldObj.getEntityByID(entityId);
 			if (entity == null) {
 				player.addChatComponentMessage(new ChatComponentText(ChatColor.RED + "No Entity found"));
 			} else {
 				LPChatListener.addTask(() -> {
@@ -114,20 +87,13 @@ public class DebugTargetResponse extends ModernPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeByte(mode.ordinal());
-		output.writeInt(additions.length);
-		for (Object addition : additions) {
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			ObjectOutput out = null;
-			out = new ObjectOutputStream(bos);
-			out.writeObject(addition);
-			output.writeByteArray(bos.toByteArray());
-		}
+		output.writeIntArray(additions);
 	}
 
 	@Override
 	public ModernPacket template() {
 		return new DebugTargetResponse(getId());
@@ -135,6 +101,12 @@ public class DebugTargetResponse extends ModernPacket {
 
 	@Override
 	public boolean isCompressable() {
 		return true;
 	}
+
+	public enum TargetMode {
+		Block,
+		Entity,
+		None
+	}
 }
diff --git a/common/logisticspipes/network/packets/gui/DummyContainerSlotClick.java b/common/logisticspipes/network/packets/gui/DummyContainerSlotClick.java
index 264504d3..1db98db3 100644
--- a/common/logisticspipes/network/packets/gui/DummyContainerSlotClick.java
+++ b/common/logisticspipes/network/packets/gui/DummyContainerSlotClick.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.gui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.inventory.Slot;
 import net.minecraft.item.ItemStack;
 
@@ -36,11 +34,11 @@ public class DummyContainerSlotClick extends ModernPacket {
 	public DummyContainerSlotClick(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		slotId = input.readInt();
 		stack = input.readItemIdentifierStack().makeNormalStack();
 		button = input.readInt();
 	}
 
@@ -54,11 +52,11 @@ public class DummyContainerSlotClick extends ModernPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(slotId);
 		output.writeItemIdentifierStack(ItemIdentifierStack.getFromStack(stack));
 		output.writeInt(button);
 	}
 
diff --git a/common/logisticspipes/network/packets/gui/FuzzySlotSettingsPacket.java b/common/logisticspipes/network/packets/gui/FuzzySlotSettingsPacket.java
index 8b0f61a5..61fdc9f6 100644
--- a/common/logisticspipes/network/packets/gui/FuzzySlotSettingsPacket.java
+++ b/common/logisticspipes/network/packets/gui/FuzzySlotSettingsPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.gui;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -26,11 +25,11 @@ public class FuzzySlotSettingsPacket extends ModernPacket {
 	public FuzzySlotSettingsPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		slotNumber = input.readInt();
 		flags = input.readBitSet();
 	}
 
 	@Override
@@ -39,11 +38,11 @@ public class FuzzySlotSettingsPacket extends ModernPacket {
 			((IFuzzySlot) player.openContainer.getSlot(slotNumber)).getFuzzyFlags().loadFromBitSet(flags);
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(slotNumber);
 		output.writeBitSet(flags);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/gui/GUIPacket.java b/common/logisticspipes/network/packets/gui/GUIPacket.java
index 195f3aad..b54dddb9 100644
--- a/common/logisticspipes/network/packets/gui/GUIPacket.java
+++ b/common/logisticspipes/network/packets/gui/GUIPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.gui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -39,11 +37,11 @@ public class GUIPacket extends ModernPacket {
 	public GUIPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		guiID = input.readInt();
 		windowID = input.readInt();
 		guiData = input.readByteArray();
 	}
 
@@ -52,11 +50,11 @@ public class GUIPacket extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		NewGuiHandler.openGui(this, player);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(guiID);
 		output.writeInt(windowID);
 		output.writeByteArray(guiData);
 	}
 
diff --git a/common/logisticspipes/network/packets/gui/GuiReopenPacket.java b/common/logisticspipes/network/packets/gui/GuiReopenPacket.java
index f134409a..9d5402bb 100644
--- a/common/logisticspipes/network/packets/gui/GuiReopenPacket.java
+++ b/common/logisticspipes/network/packets/gui/GuiReopenPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.gui;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -17,26 +15,26 @@ public class GuiReopenPacket extends CoordinatesPacket {
 
 	@Getter
 	@Setter
 	private int guiID;
 
+	public GuiReopenPacket(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(getGuiID());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		guiID = input.readInt();
 	}
 
-	public GuiReopenPacket(int id) {
-		super(id);
-	}
-
 	@Override
 	public void processPacket(EntityPlayer player) {
 		player.openGui(LogisticsPipes.instance, getGuiID(), player.worldObj, getPosX(), getPosY(), getPosZ());
 	}
 
diff --git a/common/logisticspipes/network/packets/gui/OpenChatGui.java b/common/logisticspipes/network/packets/gui/OpenChatGui.java
index 0bcb115b..0eeef657 100644
--- a/common/logisticspipes/network/packets/gui/OpenChatGui.java
+++ b/common/logisticspipes/network/packets/gui/OpenChatGui.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.gui;
 
-import java.io.IOException;
-
 import net.minecraft.client.gui.GuiChat;
 import net.minecraft.entity.player.EntityPlayer;
 import cpw.mods.fml.client.FMLClientHandler;
 
 import logisticspipes.asm.ClientSideOnlyMethodContent;
@@ -16,20 +14,20 @@ public class OpenChatGui extends ModernPacket {
 	public OpenChatGui(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	@ClientSideOnlyMethodContent
 	public void processPacket(EntityPlayer player) {
 		FMLClientHandler.instance().getClient().displayGuiScreen(new GuiChat());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new OpenChatGui(getId());
 	}
diff --git a/common/logisticspipes/network/packets/hud/HUDSettingsPacket.java b/common/logisticspipes/network/packets/hud/HUDSettingsPacket.java
index 40a6e50d..65e91553 100644
--- a/common/logisticspipes/network/packets/hud/HUDSettingsPacket.java
+++ b/common/logisticspipes/network/packets/hud/HUDSettingsPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.hud;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.ChatComponentTranslation;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -97,18 +95,18 @@ public class HUDSettingsPacket extends ModernPacket {
 			player.inventoryContainer.detectAndSendChanges();
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		buttonId = input.readInt();
 		state = input.readBoolean();
 		slot = input.readInt();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(buttonId);
 		output.writeBoolean(state);
 		output.writeInt(slot);
 	}
 }
diff --git a/common/logisticspipes/network/packets/module/ApiaristAnalyserMode.java b/common/logisticspipes/network/packets/module/ApiaristAnalyserMode.java
index 1e3440be..b87c136c 100644
--- a/common/logisticspipes/network/packets/module/ApiaristAnalyserMode.java
+++ b/common/logisticspipes/network/packets/module/ApiaristAnalyserMode.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.module;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,16 +34,16 @@ public class ApiaristAnalyserMode extends ModuleCoordinatesPacket {
 		}
 		module.setExtractMode(mode);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(mode);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		mode = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/packets/module/BeeModuleSetBeePacket.java b/common/logisticspipes/network/packets/module/BeeModuleSetBeePacket.java
index 4dd36d78..d0afda52 100644
--- a/common/logisticspipes/network/packets/module/BeeModuleSetBeePacket.java
+++ b/common/logisticspipes/network/packets/module/BeeModuleSetBeePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.module;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -65,11 +63,11 @@ public class BeeModuleSetBeePacket extends ModuleCoordinatesPacket {
 				break;
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(integer2);
 		output.writeInt(integer3);
 		output.writeInt(integer4);
 		if (string1 == null) {
@@ -77,11 +75,11 @@ public class BeeModuleSetBeePacket extends ModuleCoordinatesPacket {
 		}
 		output.writeUTF(string1);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		integer2 = input.readInt();
 		integer3 = input.readInt();
 		integer4 = input.readInt();
 		string1 = input.readUTF();
diff --git a/common/logisticspipes/network/packets/module/ItemSinkDefaultPacket.java b/common/logisticspipes/network/packets/module/ItemSinkDefaultPacket.java
index 71f4f58e..2b002d85 100644
--- a/common/logisticspipes/network/packets/module/ItemSinkDefaultPacket.java
+++ b/common/logisticspipes/network/packets/module/ItemSinkDefaultPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.module;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -22,17 +20,17 @@ public class ItemSinkDefaultPacket extends ModuleCoordinatesPacket {
 	public ItemSinkDefaultPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(isDefault);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		isDefault = input.readBoolean();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/module/ModuleBasedItemSinkList.java b/common/logisticspipes/network/packets/module/ModuleBasedItemSinkList.java
index 6f482a1b..a01a5f25 100644
--- a/common/logisticspipes/network/packets/module/ModuleBasedItemSinkList.java
+++ b/common/logisticspipes/network/packets/module/ModuleBasedItemSinkList.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.module;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.nbt.NBTTagCompound;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -41,16 +39,16 @@ public class ModuleBasedItemSinkList extends ModuleCoordinatesPacket {
 			module.listChanged();
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeNBTTagCompound(nbt);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		nbt = input.readNBTTagCompound();
 	}
 }
diff --git a/common/logisticspipes/network/packets/module/SupplierPipeLimitedPacket.java b/common/logisticspipes/network/packets/module/SupplierPipeLimitedPacket.java
index af1c9db6..e1a22191 100644
--- a/common/logisticspipes/network/packets/module/SupplierPipeLimitedPacket.java
+++ b/common/logisticspipes/network/packets/module/SupplierPipeLimitedPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.module;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import cpw.mods.fml.client.FMLClientHandler;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -53,16 +51,16 @@ public class SupplierPipeLimitedPacket extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new SupplierPipeLimitedPacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(isLimited);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		isLimited = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/packets/modules/CCBasedQuickSortMode.java b/common/logisticspipes/network/packets/modules/CCBasedQuickSortMode.java
index 020b6361..dff182d2 100644
--- a/common/logisticspipes/network/packets/modules/CCBasedQuickSortMode.java
+++ b/common/logisticspipes/network/packets/modules/CCBasedQuickSortMode.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.modules;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,16 +34,16 @@ public class CCBasedQuickSortMode extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new CCBasedQuickSortMode(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(timeOut);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		timeOut = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/packets/modules/CCBasedQuickSortSinkSize.java b/common/logisticspipes/network/packets/modules/CCBasedQuickSortSinkSize.java
index 514beede..78c1824e 100644
--- a/common/logisticspipes/network/packets/modules/CCBasedQuickSortSinkSize.java
+++ b/common/logisticspipes/network/packets/modules/CCBasedQuickSortSinkSize.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.modules;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,16 +34,16 @@ public class CCBasedQuickSortSinkSize extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new CCBasedQuickSortSinkSize(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(sinkSize);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		sinkSize = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/packets/modules/ItemSinkFuzzy.java b/common/logisticspipes/network/packets/modules/ItemSinkFuzzy.java
index 94cc94df..0347f868 100644
--- a/common/logisticspipes/network/packets/modules/ItemSinkFuzzy.java
+++ b/common/logisticspipes/network/packets/modules/ItemSinkFuzzy.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.modules;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -53,11 +52,11 @@ public class ItemSinkFuzzy extends ModuleCoordinatesPacket {
 			module.setIgnoreData(ignoreData);
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(pos);
 		if (pos != -1) {
 			output.writeBoolean(isNBT);
 		} else {
@@ -65,11 +64,11 @@ public class ItemSinkFuzzy extends ModuleCoordinatesPacket {
 			output.writeBitSet(ignoreNBT);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		pos = input.readInt();
 		if (pos != -1) {
 			isNBT = input.readBoolean();
 		} else {
diff --git a/common/logisticspipes/network/packets/modules/ProviderModuleMode.java b/common/logisticspipes/network/packets/modules/ProviderModuleMode.java
index 35a61756..a536e754 100644
--- a/common/logisticspipes/network/packets/modules/ProviderModuleMode.java
+++ b/common/logisticspipes/network/packets/modules/ProviderModuleMode.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.modules;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,16 +34,16 @@ public class ProviderModuleMode extends ModuleCoordinatesPacket {
 		}
 		module.setExtractionMode(mode);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(mode);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		mode = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/packets/modules/SupplierPipeMode.java b/common/logisticspipes/network/packets/modules/SupplierPipeMode.java
index 93d3545f..5a7f433b 100644
--- a/common/logisticspipes/network/packets/modules/SupplierPipeMode.java
+++ b/common/logisticspipes/network/packets/modules/SupplierPipeMode.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.modules;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import cpw.mods.fml.client.FMLClientHandler;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -47,17 +45,17 @@ public class SupplierPipeMode extends IntegerModuleCoordinatesPacket {
 			((GuiSupplierPipe) FMLClientHandler.instance().getClient().currentScreen).refreshMode();
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		hasPatternUpgrade = input.readBoolean();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(hasPatternUpgrade);
 	}
 
 }
diff --git a/common/logisticspipes/network/packets/multiblock/MultiBlockCoordinatesPacket.java b/common/logisticspipes/network/packets/multiblock/MultiBlockCoordinatesPacket.java
index 0d209236..c67ce1c3 100644
--- a/common/logisticspipes/network/packets/multiblock/MultiBlockCoordinatesPacket.java
+++ b/common/logisticspipes/network/packets/multiblock/MultiBlockCoordinatesPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.multiblock;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -25,28 +24,28 @@ public class MultiBlockCoordinatesPacket extends CoordinatesPacket {
 
 	@Getter
 	@Setter
 	private List<CoreMultiBlockPipe.SubBlockTypeForShare> subTypes;
 
+	public MultiBlockCoordinatesPacket(int id) {
+		super(id);
+	}
+
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeCollection(targetPos, LPDataOutput::writeLPPosition);
 		output.writeCollection(subTypes, LPDataOutput::writeEnum);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		targetPos = input.readSet(LPDataInput::readLPPosition);
 		subTypes = input.readArrayList(data1 -> data1.readEnum(CoreMultiBlockPipe.SubBlockTypeForShare.class));
 	}
 
-	public MultiBlockCoordinatesPacket(int id) {
-		super(id);
-	}
-
 	@Override
 	public void processPacket(EntityPlayer player) {
 		LogisticsTileGenericSubMultiBlock block = this.getTile(player.getEntityWorld(), LogisticsTileGenericSubMultiBlock.class);
 		block.setPosition(targetPos, subTypes);
 	}
diff --git a/common/logisticspipes/network/packets/orderer/ComponentList.java b/common/logisticspipes/network/packets/orderer/ComponentList.java
index 95ccfeba..b0095c11 100644
--- a/common/logisticspipes/network/packets/orderer/ComponentList.java
+++ b/common/logisticspipes/network/packets/orderer/ComponentList.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.orderer;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.ChatComponentText;
@@ -58,18 +57,18 @@ public class ComponentList extends ModernPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeCollection(used, LPDataOutput::writeResource);
 		output.writeCollection(missing, LPDataOutput::writeResource);
 		// ToDo: ???
 		output.writeByte(0);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		used = input.readArrayList(LPDataInput::readResource);
 		missing = input.readArrayList(LPDataInput::readResource);
 	}
 }
diff --git a/common/logisticspipes/network/packets/orderer/MissingItems.java b/common/logisticspipes/network/packets/orderer/MissingItems.java
index 5104d021..314fdcdd 100644
--- a/common/logisticspipes/network/packets/orderer/MissingItems.java
+++ b/common/logisticspipes/network/packets/orderer/MissingItems.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.orderer;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.ChatComponentText;
@@ -61,16 +60,16 @@ public class MissingItems extends ModernPacket {
 			player.addChatComponentMessage(new ChatComponentText(ChatColor.GREEN + "Request successful!"));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeCollection(items, LPDataOutput::writeResource);
 		output.writeBoolean(isFlag());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		items = input.readArrayList(LPDataInput::readResource);
 		setFlag(input.readBoolean());
 	}
 }
diff --git a/common/logisticspipes/network/packets/orderer/OrdererWatchPacket.java b/common/logisticspipes/network/packets/orderer/OrdererWatchPacket.java
index 8c9d89c7..267e9c88 100644
--- a/common/logisticspipes/network/packets/orderer/OrdererWatchPacket.java
+++ b/common/logisticspipes/network/packets/orderer/OrdererWatchPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.orderer;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -29,18 +27,18 @@ public class OrdererWatchPacket extends IntegerCoordinatesPacket {
 	public OrdererWatchPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeResource(stack);
 		output.writeLinkedLogisticsOrderList(orders);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		stack = input.readResource();
 		orders = input.readLinkedLogisticsOrderList();
 	}
 
diff --git a/common/logisticspipes/network/packets/pipe/AskForOpenTarget.java b/common/logisticspipes/network/packets/pipe/AskForOpenTarget.java
index ba04ee70..bdaa45c8 100644
--- a/common/logisticspipes/network/packets/pipe/AskForOpenTarget.java
+++ b/common/logisticspipes/network/packets/pipe/AskForOpenTarget.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.MovingObjectPosition;
 import net.minecraft.util.MovingObjectPosition.MovingObjectType;
 import cpw.mods.fml.client.FMLClientHandler;
 
@@ -18,11 +16,11 @@ public class AskForOpenTarget extends ModernPacket {
 	public AskForOpenTarget(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		MovingObjectPosition box = FMLClientHandler.instance().getClient().objectMouseOver;
 		if (box.typeOfHit == MovingObjectType.BLOCK) {
@@ -30,11 +28,11 @@ public class AskForOpenTarget extends ModernPacket {
 					PacketHandler.getPacket(SlotFinderActivatePacket.class).setTagetPosX(box.blockX).setTagetPosY(box.blockY).setTagetPosZ(box.blockZ));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new AskForOpenTarget(getId());
 	}
diff --git a/common/logisticspipes/network/packets/pipe/CraftingPipeUpdatePacket.java b/common/logisticspipes/network/packets/pipe/CraftingPipeUpdatePacket.java
index 6227e2ec..15752613 100644
--- a/common/logisticspipes/network/packets/pipe/CraftingPipeUpdatePacket.java
+++ b/common/logisticspipes/network/packets/pipe/CraftingPipeUpdatePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -52,22 +50,22 @@ public class CraftingPipeUpdatePacket extends ModuleCoordinatesPacket {
 		}
 		module.handleCraftingUpdatePacket(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeIntArray(amount);
 		output.writeIntArray(liquidSatelliteIdArray);
 		output.writeInt(liquidSatelliteId);
 		output.writeInt(satelliteId);
 		output.writeIntArray(advancedSatelliteIdArray);
 		output.writeInt(priority);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		amount = input.readIntArray();
 		liquidSatelliteIdArray = input.readIntArray();
 		liquidSatelliteId = input.readInt();
 		satelliteId = input.readInt();
diff --git a/common/logisticspipes/network/packets/pipe/FindMostLikelyRecipeComponents.java b/common/logisticspipes/network/packets/pipe/FindMostLikelyRecipeComponents.java
index 4f2dbbf6..71b1c9fe 100644
--- a/common/logisticspipes/network/packets/pipe/FindMostLikelyRecipeComponents.java
+++ b/common/logisticspipes/network/packets/pipe/FindMostLikelyRecipeComponents.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.TreeSet;
 
@@ -96,21 +95,21 @@ public class FindMostLikelyRecipeComponents extends CoordinatesPacket {
 		}
 		MainProxy.sendPacketToPlayer(PacketHandler.getPacket(MostLikelyRecipeComponentsResponse.class).setResponse(list), player);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		content = input.readArrayList(input1 -> {
 			GuiRecipeImport.Canidates can = new GuiRecipeImport.Canidates(new TreeSet<>());
 			can.order = input1.readArrayList(LPDataInput::readItemIdentifierStack);
 			return can;
 		});
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeCollection(content, (data, object) -> data.writeCollection(object.order,
 				(IWriteListObject<ItemIdentifierStack>) LPDataOutput::writeItemIdentifierStack));
 	}
 
diff --git a/common/logisticspipes/network/packets/pipe/ItemAmountSignUpdatePacket.java b/common/logisticspipes/network/packets/pipe/ItemAmountSignUpdatePacket.java
index 5038c2fe..b404e422 100644
--- a/common/logisticspipes/network/packets/pipe/ItemAmountSignUpdatePacket.java
+++ b/common/logisticspipes/network/packets/pipe/ItemAmountSignUpdatePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -42,19 +40,19 @@ public class ItemAmountSignUpdatePacket extends Integer2CoordinatesPacket {
 		((ItemAmountPipeSign) sign).amount = getInteger2();
 		((ItemAmountPipeSign) sign).itemTypeInv.setInventorySlotContents(0, stack);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		if (input.readBoolean()) {
 			stack = input.readItemIdentifierStack();
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		if (stack == null) {
 			output.writeBoolean(false);
 		} else {
 			output.writeBoolean(true);
diff --git a/common/logisticspipes/network/packets/pipe/ItemBufferSyncPacket.java b/common/logisticspipes/network/packets/pipe/ItemBufferSyncPacket.java
index a20e9e1f..5367b99c 100644
--- a/common/logisticspipes/network/packets/pipe/ItemBufferSyncPacket.java
+++ b/common/logisticspipes/network/packets/pipe/ItemBufferSyncPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ListSyncPacket;
 import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import logisticspipes.transport.LPTravelingItem.LPTravelingItemServer;
@@ -24,17 +22,16 @@ public class ItemBufferSyncPacket
 		super(id);
 	}
 
 	@Override
 	public void writeObject(LPDataOutput output,
-			Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> object) throws IOException {
+			Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> object) {
 		output.writeItemIdentifierStack(object.getValue1());
 	}
 
 	@Override
-	public Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> readObject(LPDataInput input)
-			throws IOException {
+	public Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> readObject(LPDataInput input) {
 		return new Triplet<>(input.readItemIdentifierStack(), null, null);
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
diff --git a/common/logisticspipes/network/packets/pipe/MostLikelyRecipeComponentsResponse.java b/common/logisticspipes/network/packets/pipe/MostLikelyRecipeComponentsResponse.java
index b6be1031..08af5592 100644
--- a/common/logisticspipes/network/packets/pipe/MostLikelyRecipeComponentsResponse.java
+++ b/common/logisticspipes/network/packets/pipe/MostLikelyRecipeComponentsResponse.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.entity.player.EntityPlayer;
@@ -29,11 +28,11 @@ public class MostLikelyRecipeComponentsResponse extends ModernPacket {
 	public MostLikelyRecipeComponentsResponse(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		response = input.readArrayList(LPDataInput::readInt);
 	}
 
 	@Override
 	@ClientSideOnlyMethodContent
@@ -59,11 +58,11 @@ public class MostLikelyRecipeComponentsResponse extends ModernPacket {
 		if (importGui == null) return;
 		importGui.handleProposePacket(response);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeCollection(response, LPDataOutput::writeInt);
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/pipe/ParticleFX.java b/common/logisticspipes/network/packets/pipe/ParticleFX.java
index 0b34cbed..ad2d87b8 100644
--- a/common/logisticspipes/network/packets/pipe/ParticleFX.java
+++ b/common/logisticspipes/network/packets/pipe/ParticleFX.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.entity.player.EntityPlayer;
@@ -19,26 +18,26 @@ import logisticspipes.pipefxhandlers.PipeFXRenderHandler;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class ParticleFX extends CoordinatesPacket {
 
-	public ParticleFX(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	@NonNull
 	private Collection<ParticleCount> particles;
 
+	public ParticleFX(int id) {
+		super(id);
+	}
+
 	@Override
 	public ModernPacket template() {
 		return new ParticleFX(getId());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		int nparticles = input.readInt();
 		particles = new ArrayList<>(nparticles);
 		for (int i = 0; i < nparticles; i++) {
 			int particle = input.readByte();
@@ -46,11 +45,11 @@ public class ParticleFX extends CoordinatesPacket {
 			particles.add(new ParticleCount(Particles.values()[particle], amount));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(particles.size());
 		for (ParticleCount pc : particles) {
 			output.writeByte(pc.getParticle().ordinal());
 			output.writeInt(pc.getAmount());
diff --git a/common/logisticspipes/network/packets/pipe/PipeContentPacket.java b/common/logisticspipes/network/packets/pipe/PipeContentPacket.java
index db17380d..85f14a26 100644
--- a/common/logisticspipes/network/packets/pipe/PipeContentPacket.java
+++ b/common/logisticspipes/network/packets/pipe/PipeContentPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.lang.ref.WeakReference;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -16,23 +15,23 @@ import logisticspipes.utils.tuples.Pair;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class PipeContentPacket extends ModernPacket {
 
-	public PipeContentPacket(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private ItemIdentifierStack item;
 	@Getter
 	@Setter
 	private int travelId;
 
+	public PipeContentPacket(int id) {
+		super(id);
+	}
+
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		item = input.readItemIdentifierStack();
 		travelId = input.readInt();
 	}
 
 	@Override
@@ -52,11 +51,11 @@ public class PipeContentPacket extends ModernPacket {
 			content.setItem(item);
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeItemIdentifierStack(item);
 		output.writeInt(travelId);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/pipe/PipeDebugAskForTarget.java b/common/logisticspipes/network/packets/pipe/PipeDebugAskForTarget.java
index c24e8803..2826034e 100644
--- a/common/logisticspipes/network/packets/pipe/PipeDebugAskForTarget.java
+++ b/common/logisticspipes/network/packets/pipe/PipeDebugAskForTarget.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.ChatComponentText;
 import net.minecraft.util.MovingObjectPosition;
 import net.minecraft.util.MovingObjectPosition.MovingObjectType;
@@ -29,11 +27,11 @@ public class PipeDebugAskForTarget extends ModernPacket {
 	public PipeDebugAskForTarget(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		isServer = input.readBoolean();
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
@@ -54,11 +52,11 @@ public class PipeDebugAskForTarget extends ModernPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeBoolean(isServer);
 	}
 
 	@Override
 	public ModernPacket template() {
diff --git a/common/logisticspipes/network/packets/pipe/PipeFluidUpdate.java b/common/logisticspipes/network/packets/pipe/PipeFluidUpdate.java
index f12a0c27..8d8c0285 100644
--- a/common/logisticspipes/network/packets/pipe/PipeFluidUpdate.java
+++ b/common/logisticspipes/network/packets/pipe/PipeFluidUpdate.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 import net.minecraftforge.fluids.FluidRegistry;
@@ -19,33 +18,32 @@ import logisticspipes.transport.PipeFluidTransportLogistics;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class PipeFluidUpdate extends CoordinatesPacket {
 
-	public PipeFluidUpdate(int id) {
-		super(id);
-	}
-
 	@Getter(value = AccessLevel.PRIVATE)
 	@Setter
 	private FluidStack[] renderCache = new FluidStack[ForgeDirection.values().length];
-
 	private BitSet bits = new BitSet();
 
+	public PipeFluidUpdate(int id) {
+		super(id);
+	}
+
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		bits = input.readBitSet();
 		for (int i = 0; i < renderCache.length; i++) {
 			if (bits.get(i)) {
 				renderCache[i] = new FluidStack(FluidRegistry.getFluid(input.readInt()), input.readInt(), input.readNBTTagCompound());
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		for (int i = 0; i < renderCache.length; i++) {
 			bits.set(i, renderCache[i] != null);
 		}
 		output.writeBitSet(bits);
diff --git a/common/logisticspipes/network/packets/pipe/PipeManagerContentPacket.java b/common/logisticspipes/network/packets/pipe/PipeManagerContentPacket.java
index df2d8df1..1d894877 100644
--- a/common/logisticspipes/network/packets/pipe/PipeManagerContentPacket.java
+++ b/common/logisticspipes/network/packets/pipe/PipeManagerContentPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -47,21 +46,21 @@ public class PipeManagerContentPacket extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new PipeManagerContentPacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		for (LogisticsOrder order : manager) {
 			output.writeByte(1);
 			output.writeOrderInfo(order);
 		}
 		output.writeByte(0);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		clientOrder = new LinkedList<>();
 		while (input.readByte() == 1) {
 			clientOrder.add(input.readOrderInfo());
 		}
diff --git a/common/logisticspipes/network/packets/pipe/PipeManagerWatchingPacket.java b/common/logisticspipes/network/packets/pipe/PipeManagerWatchingPacket.java
index ecd00115..5e2c313d 100644
--- a/common/logisticspipes/network/packets/pipe/PipeManagerWatchingPacket.java
+++ b/common/logisticspipes/network/packets/pipe/PipeManagerWatchingPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -42,16 +40,16 @@ public class PipeManagerWatchingPacket extends CoordinatesPacket {
 	public ModernPacket template() {
 		return new PipeManagerWatchingPacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeBoolean(start);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		start = input.readBoolean();
 	}
 }
diff --git a/common/logisticspipes/network/packets/pipe/PipePositionPacket.java b/common/logisticspipes/network/packets/pipe/PipePositionPacket.java
index 005d9a21..b38b7053 100644
--- a/common/logisticspipes/network/packets/pipe/PipePositionPacket.java
+++ b/common/logisticspipes/network/packets/pipe/PipePositionPacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -47,22 +45,22 @@ public class PipePositionPacket extends CoordinatesPacket {
 		}
 		tile.pipe.transport.handleItemPositionPacket(travelId, input, output, speed, position, yaw);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(travelId);
 		output.writeFloat(speed);
 		output.writeFloat(position);
 		output.writeForgeDirection(input);
 		output.writeForgeDirection(this.output);
 		output.writeFloat(yaw);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		travelId = input.readInt();
 		speed = input.readFloat();
 		position = input.readFloat();
 		this.input = input.readForgeDirection();
diff --git a/common/logisticspipes/network/packets/pipe/PipeSignTypes.java b/common/logisticspipes/network/packets/pipe/PipeSignTypes.java
index cb4e31a4..6dde2d47 100644
--- a/common/logisticspipes/network/packets/pipe/PipeSignTypes.java
+++ b/common/logisticspipes/network/packets/pipe/PipeSignTypes.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -15,35 +14,35 @@ import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class PipeSignTypes extends CoordinatesPacket {
 
-	public PipeSignTypes(int id) {
-		super(id);
-	}
-
 	@Getter
 	@Setter
 	private List<Integer> types;
 
+	public PipeSignTypes(int id) {
+		super(id);
+	}
+
 	@Override
 	public void processPacket(EntityPlayer player) {
 		LogisticsTileGenericPipe pipe = this.getPipe(player.getEntityWorld(), LTGPCompletionCheck.PIPE);
 		if (pipe == null || !pipe.isInitialized()) {
 			return;
 		}
 		((CoreRoutedPipe) pipe.pipe).handleSignPacket(types);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeCollection(types, LPDataOutput::writeInt);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		types = input.readArrayList(LPDataInput::readInt);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/pipe/PipeTileStatePacket.java b/common/logisticspipes/network/packets/pipe/PipeTileStatePacket.java
index 5688cc17..34245705 100644
--- a/common/logisticspipes/network/packets/pipe/PipeTileStatePacket.java
+++ b/common/logisticspipes/network/packets/pipe/PipeTileStatePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -49,28 +47,24 @@ public class PipeTileStatePacket extends CoordinatesPacket {
 	public void processPacket(EntityPlayer player) {
 		LogisticsTileGenericPipe pipe = this.getPipe(player.getEntityWorld());
 		if (pipe == null) {
 			return;
 		}
-		try {
-			LPDataIOWrapper.provideData(bytesRenderState, pipe.renderState::readData);
-			LPDataIOWrapper.provideData(bytesCoreState, pipe.coreState::readData);
-			LPDataIOWrapper.provideData(bytesBCPluggableState, pipe.bcPlugableState::readData);
-			pipe.afterStateUpdated();
-			LPDataIOWrapper.provideData(bytesPipe, pipe.pipe::readData);
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
+		LPDataIOWrapper.provideData(bytesRenderState, pipe.renderState::readData);
+		LPDataIOWrapper.provideData(bytesCoreState, pipe.coreState::readData);
+		LPDataIOWrapper.provideData(bytesBCPluggableState, pipe.bcPlugableState::readData);
+		pipe.afterStateUpdated();
+		LPDataIOWrapper.provideData(bytesPipe, pipe.pipe::readData);
 	}
 
 	@Override
 	public ModernPacket template() {
 		return new PipeTileStatePacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 
 		IClientState[] clientStates = new IClientState[] { renderState, coreState, bcPluggableState, pipe };
 		byte[][] clientStateBuffers = new byte[][] { bytesRenderState, bytesCoreState, bytesBCPluggableState, bytesPipe };
 		for (int i = 0; i < clientStates.length; i++) {
@@ -78,11 +72,11 @@ public class PipeTileStatePacket extends CoordinatesPacket {
 			output.writeByteArray(clientStateBuffers[i]);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 
 		bytesRenderState = input.readByteArray();
 		bytesCoreState = input.readByteArray();
 		bytesBCPluggableState = input.readByteArray();
diff --git a/common/logisticspipes/network/packets/pipe/RoutingLaserPacket.java b/common/logisticspipes/network/packets/pipe/RoutingLaserPacket.java
index 4561cb36..b1e741fd 100644
--- a/common/logisticspipes/network/packets/pipe/RoutingLaserPacket.java
+++ b/common/logisticspipes/network/packets/pipe/RoutingLaserPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
@@ -24,11 +23,11 @@ public class RoutingLaserPacket extends ModernPacket {
 	public RoutingLaserPacket(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		while (input.readBoolean()) {
 			lasers.add(new LaserData().readData(input));
 		}
 	}
 
@@ -36,11 +35,11 @@ public class RoutingLaserPacket extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		LogisticsHUDRenderer.instance().setLasers(getLasers());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		for (LaserData laser : lasers) {
 			output.writeBoolean(true);
 			laser.writeData(output);
 		}
 		output.writeBoolean(false);
diff --git a/common/logisticspipes/network/packets/pipe/SlotFinderActivatePacket.java b/common/logisticspipes/network/packets/pipe/SlotFinderActivatePacket.java
index b26428d9..0f571cc9 100644
--- a/common/logisticspipes/network/packets/pipe/SlotFinderActivatePacket.java
+++ b/common/logisticspipes/network/packets/pipe/SlotFinderActivatePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -36,20 +34,20 @@ public class SlotFinderActivatePacket extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new SlotFinderActivatePacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(tagetPosX);
 		output.writeInt(tagetPosY);
 		output.writeInt(tagetPosZ);
 		output.writeInt(slot);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		tagetPosX = input.readInt();
 		tagetPosY = input.readInt();
 		tagetPosZ = input.readInt();
 		slot = input.readInt();
diff --git a/common/logisticspipes/network/packets/pipe/SlotFinderNumberPacket.java b/common/logisticspipes/network/packets/pipe/SlotFinderNumberPacket.java
index 8239c8ac..3ebc1f1a 100644
--- a/common/logisticspipes/network/packets/pipe/SlotFinderNumberPacket.java
+++ b/common/logisticspipes/network/packets/pipe/SlotFinderNumberPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.inventory.IInventory;
@@ -125,21 +124,21 @@ public class SlotFinderNumberPacket extends ModuleCoordinatesPacket {
 			}
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(inventorySlot);
 		output.writeInt(slot);
 		output.writeInt(pipePosX);
 		output.writeInt(pipePosY);
 		output.writeInt(pipePosZ);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		inventorySlot = input.readInt();
 		slot = input.readInt();
 		pipePosX = input.readInt();
 		pipePosY = input.readInt();
diff --git a/common/logisticspipes/network/packets/pipe/SlotFinderOpenGuiPacket.java b/common/logisticspipes/network/packets/pipe/SlotFinderOpenGuiPacket.java
index 8101fa58..fcbfbc55 100644
--- a/common/logisticspipes/network/packets/pipe/SlotFinderOpenGuiPacket.java
+++ b/common/logisticspipes/network/packets/pipe/SlotFinderOpenGuiPacket.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.Iterator;
 
 import net.minecraft.block.Block;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.IInventory;
@@ -120,16 +119,16 @@ public class SlotFinderOpenGuiPacket extends ModuleCoordinatesPacket {
 	public ModernPacket template() {
 		return new SlotFinderOpenGuiPacket(getId());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeInt(slot);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		slot = input.readInt();
 	}
 }
diff --git a/common/logisticspipes/network/packets/pipe/StatUpdate.java b/common/logisticspipes/network/packets/pipe/StatUpdate.java
index 3e4101b0..76a5bdc3 100644
--- a/common/logisticspipes/network/packets/pipe/StatUpdate.java
+++ b/common/logisticspipes/network/packets/pipe/StatUpdate.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.pipe;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Setter;
@@ -73,11 +72,11 @@ public class StatUpdate extends CoordinatesPacket {
 		}
 		server_routing_table_size = numentries;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		initData();
 		super.writeData(output);
 		output.writeInt(stat_session_sent);
 		output.writeInt(stat_session_recieved);
 		output.writeInt(stat_session_relayed);
@@ -86,11 +85,11 @@ public class StatUpdate extends CoordinatesPacket {
 		output.writeLong(stat_lifetime_relayed);
 		output.writeInt(server_routing_table_size);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		stat_session_sent = input.readInt();
 		stat_session_recieved = input.readInt();
 		stat_session_relayed = input.readInt();
 		stat_lifetime_sent = input.readLong();
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateAskForTarget.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateAskForTarget.java
index 62c80107..c596b468 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateAskForTarget.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateAskForTarget.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.MovingObjectPosition;
 import net.minecraft.util.MovingObjectPosition.MovingObjectType;
 import cpw.mods.fml.client.FMLClientHandler;
 
@@ -20,29 +18,29 @@ public class RoutingUpdateAskForTarget extends ModernPacket {
 	public RoutingUpdateAskForTarget(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	@ClientSideOnlyMethodContent
 	public void processPacket(EntityPlayer player) {
 		MovingObjectPosition box = FMLClientHandler.instance().getClient().objectMouseOver;
 		if (box == null) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(RoutingUpdateTargetResponse.class).setMode(TargetMode.None));
 		} else if (box.typeOfHit == MovingObjectType.BLOCK) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(RoutingUpdateTargetResponse.class).setMode(TargetMode.Block)
-					.setAdditions(new Object[] { box.blockX, box.blockY, box.blockZ }));
+					.setAdditions(new int[] { box.blockX, box.blockY, box.blockZ }));
 		} else if (box.typeOfHit == MovingObjectType.ENTITY) {
 			MainProxy.sendPacketToServer(PacketHandler.getPacket(RoutingUpdateTargetResponse.class).setMode(TargetMode.Entity)
-					.setAdditions(new Object[] { box.entityHit.getEntityId() }));
+					.setAdditions(new int[] { box.entityHit.getEntityId() }));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new RoutingUpdateAskForTarget(getId());
 	}
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateCanidatePipe.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateCanidatePipe.java
index 5c2958d3..a5d084c4 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateCanidatePipe.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateCanidatePipe.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -38,14 +36,14 @@ public class RoutingUpdateCanidatePipe extends ModernPacket {
 	public boolean isCompressable() {
 		return true;
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		exitRoute = input.readExitRoute(MainProxy.getClientMainWorld());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeExitRoute(exitRoute);
 	}
 }
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateClearClient.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateClearClient.java
index 491df04a..4c7683c1 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateClearClient.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateClearClient.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ModernPacket;
 import logisticspipes.routing.debug.ClientViewController;
 import network.rs485.logisticspipes.util.LPDataInput;
@@ -14,19 +12,19 @@ public class RoutingUpdateClearClient extends ModernPacket {
 	public RoutingUpdateClearClient(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().clear();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new RoutingUpdateClearClient(getId());
 	}
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugCanidateList.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugCanidateList.java
index ccf7084e..a98cc2e3 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugCanidateList.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugCanidateList.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -23,11 +21,11 @@ public class RoutingUpdateDebugCanidateList extends ModernPacket {
 	public RoutingUpdateDebugCanidateList(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		msg = new ExitRoute[input.readInt()];
 		for (int i = 0; i < msg.length; i++) {
 			msg[i] = input.readExitRoute(MainProxy.getClientMainWorld());
 		}
 	}
@@ -36,11 +34,11 @@ public class RoutingUpdateDebugCanidateList extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().updateList(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(msg.length);
 		for (ExitRoute element : msg) {
 			output.writeExitRoute(element);
 		}
 	}
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugClosedSet.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugClosedSet.java
index 60fdce52..2c5fbc63 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugClosedSet.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugClosedSet.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
 import java.util.EnumSet;
 
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
@@ -28,22 +27,22 @@ public class RoutingUpdateDebugClosedSet extends ModernPacket {
 	public RoutingUpdateDebugClosedSet(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		set = input.readEnumSet(PipeRoutingConnectionType.class);
 		pos = input.readLPPosition();
 	}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().handlePacket(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeEnumSet(set, PipeRoutingConnectionType.class);
 		output.writeLPPosition(pos);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugFilters.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugFilters.java
index a854bcb1..aaab7468 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugFilters.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDebugFilters.java
@@ -1,8 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.EnumMap;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
@@ -33,11 +32,11 @@ public class RoutingUpdateDebugFilters extends ModernPacket {
 	public RoutingUpdateDebugFilters(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		pos = input.readLPPosition();
 		filterPositions = new EnumMap<>(PipeRoutingConnectionType.class);
 		short id;
 		while ((id = input.readShort()) != -1) {
 			PipeRoutingConnectionType type = PipeRoutingConnectionType.values[id];
@@ -58,11 +57,11 @@ public class RoutingUpdateDebugFilters extends ModernPacket {
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().handlePacket(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeLPPosition(pos);
 		for (PipeRoutingConnectionType type : filters.keySet()) {
 			output.writeShort(type.ordinal());
 			for (List<IFilter> linkedFilter : filters.get(type)) {
 				output.writeShort(linkedFilter.size());
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDoneDebug.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDoneDebug.java
index 391b4876..516aaa92 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDoneDebug.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateDoneDebug.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ModernPacket;
 import logisticspipes.routing.debug.ClientViewController;
 import network.rs485.logisticspipes.util.LPDataInput;
@@ -14,19 +12,19 @@ public class RoutingUpdateDoneDebug extends ModernPacket {
 	public RoutingUpdateDoneDebug(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().done(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new RoutingUpdateDoneDebug(getId());
 	}
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateInitDebug.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateInitDebug.java
index 0a28ca71..8dc7c42d 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateInitDebug.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateInitDebug.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import logisticspipes.network.abstractpackets.ModernPacket;
 import logisticspipes.routing.debug.ClientViewController;
 import network.rs485.logisticspipes.util.LPDataInput;
@@ -14,19 +12,19 @@ public class RoutingUpdateInitDebug extends ModernPacket {
 	public RoutingUpdateInitDebug(int id) {
 		super(id);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public void processPacket(EntityPlayer player) {
 		ClientViewController.instance().init(this);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
 	public ModernPacket template() {
 		return new RoutingUpdateInitDebug(getId());
 	}
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateSourcePipe.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateSourcePipe.java
index 53122020..833230dc 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateSourcePipe.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateSourcePipe.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -38,14 +36,14 @@ public class RoutingUpdateSourcePipe extends ModernPacket {
 	public boolean isCompressable() {
 		return true;
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		exitRoute = input.readExitRoute(MainProxy.getClientMainWorld());
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeExitRoute(exitRoute);
 	}
 }
diff --git a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateTargetResponse.java b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateTargetResponse.java
index 756f9940..e5c1aa8e 100644
--- a/common/logisticspipes/network/packets/routingdebug/RoutingUpdateTargetResponse.java
+++ b/common/logisticspipes/network/packets/routingdebug/RoutingUpdateTargetResponse.java
@@ -1,15 +1,7 @@
 package logisticspipes.network.packets.routingdebug;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-
 import net.minecraft.block.Block;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.ChatComponentText;
 
@@ -29,54 +21,35 @@ import logisticspipes.utils.string.ChatColor;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class RoutingUpdateTargetResponse extends ModernPacket {
 
-	public RoutingUpdateTargetResponse(int id) {
-		super(id);
-	}
-
-	public enum TargetMode {
-		Block,
-		Entity,
-		None
-	}
-
 	@Getter
 	@Setter
 	private TargetMode mode;
-
 	@Getter
 	@Setter
-	private Object[] additions = new Object[0];
+	private int[] additions = new int[0];
+
+	public RoutingUpdateTargetResponse(int id) {
+		super(id);
+	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		mode = TargetMode.values()[input.readByte()];
-		int size = input.readInt();
-		additions = new Object[size];
-		for (int i = 0; i < size; i++) {
-			byte[] bytes = input.readByteArray();
-			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
-			ObjectInput in = new ObjectInputStream(bis);
-			try {
-				Object o = in.readObject();
-				additions[i] = o;
-			} catch (ClassNotFoundException e) {
-				throw new UnsupportedOperationException(e);
-			}
-		}
+		additions = input.readIntArray();
 	}
 
 	@Override
 	public void processPacket(final EntityPlayer player) {
 		if (mode == TargetMode.None) {
 			player.addChatMessage(new ChatComponentText(ChatColor.RED + "No Target Found"));
 		} else if (mode == TargetMode.Block) {
-			int x = (Integer) additions[0];
-			int y = (Integer) additions[1];
-			int z = (Integer) additions[2];
+			int x = additions[0];
+			int y = additions[1];
+			int z = additions[2];
 			player.addChatMessage(new ChatComponentText("Checking Block at: x:" + x + " y:" + y + " z:" + z));
 			Block id = player.worldObj.getBlock(x, y, z);
 			player.addChatMessage(new ChatComponentText("Found Block with Id: " + Block.getIdFromBlock(id)));
 			final TileEntity tile = player.worldObj.getTileEntity(x, y, z);
 			if (tile == null) {
@@ -101,19 +74,13 @@ public class RoutingUpdateTargetResponse extends ModernPacket {
 			player.addChatMessage(new ChatComponentText(ChatColor.RED + "Entity not allowed"));
 		}
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeByte(mode.ordinal());
-		output.writeInt(additions.length);
-		for (Object addition : additions) {
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			ObjectOutput out = new ObjectOutputStream(bos);
-			out.writeObject(addition);
-			output.writeByteArray(bos.toByteArray());
-		}
+		output.writeIntArray(additions);
 	}
 
 	@Override
 	public ModernPacket template() {
 		return new RoutingUpdateTargetResponse(getId());
@@ -121,6 +88,12 @@ public class RoutingUpdateTargetResponse extends ModernPacket {
 
 	@Override
 	public boolean isCompressable() {
 		return true;
 	}
+
+	public enum TargetMode {
+		Block,
+		Entity,
+		None
+	}
 }
diff --git a/common/logisticspipes/network/packets/satpipe/SatPipeSetID.java b/common/logisticspipes/network/packets/satpipe/SatPipeSetID.java
index 301593bd..ada4fb57 100644
--- a/common/logisticspipes/network/packets/satpipe/SatPipeSetID.java
+++ b/common/logisticspipes/network/packets/satpipe/SatPipeSetID.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.satpipe;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 
 import lombok.Getter;
 import lombok.Setter;
 
@@ -15,31 +13,31 @@ import logisticspipes.pipes.basic.LogisticsTileGenericPipe;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class SatPipeSetID extends CoordinatesPacket {
 
+	@Getter
+	@Setter
+	private int satID;
+
 	public SatPipeSetID(int id) {
 		super(id);
 	}
 
 	@Override
 	public ModernPacket template() {
 		return new SatPipeSetID(getId());
 	}
 
-	@Getter
-	@Setter
-	private int satID;
-
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(satID);
 		super.writeData(output);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		satID = input.readInt();
 		super.readData(input);
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/upgrade/SneakyUpgradeSidePacket.java b/common/logisticspipes/network/packets/upgrade/SneakyUpgradeSidePacket.java
index e961fe8f..ab0ffdae 100644
--- a/common/logisticspipes/network/packets/upgrade/SneakyUpgradeSidePacket.java
+++ b/common/logisticspipes/network/packets/upgrade/SneakyUpgradeSidePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.upgrade;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NBTTagCompound;
 import net.minecraftforge.common.util.ForgeDirection;
 
@@ -37,17 +35,17 @@ public class SneakyUpgradeSidePacket extends SlotPacket {
 		stack.getTagCompound().setString(SneakyUpgradeConfig.SIDE_KEY, SneakyUpgradeConfig.Sides.getNameForDirection(side));
 		slot.putStack(stack);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeForgeDirection(side);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		side = input.readForgeDirection();
 	}
 
 	@Override
diff --git a/common/logisticspipes/network/packets/upgrade/ToogleDisconnectionUpgradeSidePacket.java b/common/logisticspipes/network/packets/upgrade/ToogleDisconnectionUpgradeSidePacket.java
index 6da5b1e3..15c83623 100644
--- a/common/logisticspipes/network/packets/upgrade/ToogleDisconnectionUpgradeSidePacket.java
+++ b/common/logisticspipes/network/packets/upgrade/ToogleDisconnectionUpgradeSidePacket.java
@@ -1,9 +1,7 @@
 package logisticspipes.network.packets.upgrade;
 
-import java.io.IOException;
-
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NBTTagCompound;
 import net.minecraftforge.common.util.ForgeDirection;
 
@@ -44,17 +42,17 @@ public class ToogleDisconnectionUpgradeSidePacket extends SlotPacket {
 
 		slot.putStack(stack);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		super.writeData(output);
 		output.writeForgeDirection(side);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		super.readData(input);
 		side = input.readForgeDirection();
 	}
 
 	@Override
diff --git a/common/logisticspipes/pipes/basic/CoreRoutedPipe.java b/common/logisticspipes/pipes/basic/CoreRoutedPipe.java
index 17d9a348..cc3714f5 100644
--- a/common/logisticspipes/pipes/basic/CoreRoutedPipe.java
+++ b/common/logisticspipes/pipes/basic/CoreRoutedPipe.java
@@ -5,11 +5,10 @@
  * http://www.mod-buildcraft.com/MMPL-1.0.txt
  */
 
 package logisticspipes.pipes.basic;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -130,75 +129,53 @@ import network.rs485.logisticspipes.world.WorldCoordinatesWrapper;
 
 @CCType(name = "LogisticsPipes:Normal")
 public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 		implements IClientState, IRequestItems, ITrackStatistics, IWorldProvider, IWatchingHandler, IPipeServiceProvider, IQueueCCEvent, ILPPositionProvider {
 
-	public enum ItemSendMode {
-		Normal,
-		Fast
-	}
-
-	protected boolean stillNeedReplace = true;
-	private boolean recheckConnections = false;
-
-	protected IRouter router;
-	protected String routerId;
-	protected Object routerIdLock = new Object();
 	private static int pipecount = 0;
-	protected int _delayOffset = 0;
-
+	public final PlayerCollectionList watchers = new PlayerCollectionList();
+	protected final PriorityBlockingQueue<ItemRoutingInformation> _inTransitToMe = new PriorityBlockingQueue<>(10,
+			new ItemRoutingInformation.DelayComparator());
+	protected final LinkedList<Triplet<IRoutedItem, ForgeDirection, ItemSendMode>> _sendQueue = new LinkedList<>();
+	protected final Map<ItemIdentifier, Queue<Pair<Integer, ItemRoutingInformation>>> queuedDataForUnroutedItems = Collections.synchronizedMap(new TreeMap<>());
 	public boolean _textureBufferPowered;
-
-	protected boolean _initialInit = true;
-
-	private boolean enabled = true;
-	private boolean preventRemove = false;
-	private boolean destroyByPlayer = false;
-	private PowerSupplierHandler powerHandler = new PowerSupplierHandler(this);
-
 	public long delayTo = 0;
 	public int repeatFor = 0;
-
-	protected RouteLayer _routeLayer;
-	protected TransportLayer _transportLayer;
-	protected final PriorityBlockingQueue<ItemRoutingInformation> _inTransitToMe = new PriorityBlockingQueue<>(10,
-			new ItemRoutingInformation.DelayComparator());
-
-	protected UpgradeManager upgradeManager = new UpgradeManager(this);
-	protected LogisticsItemOrderManager _orderItemManager = null;
-
-	@Getter
-	private List<IOrderInfoProvider> clientSideOrderManager = new ArrayList<>();
-
 	public int stat_session_sent;
 	public int stat_session_recieved;
 	public int stat_session_relayed;
-
 	public long stat_lifetime_sent;
 	public long stat_lifetime_recieved;
 	public long stat_lifetime_relayed;
-
 	public int server_routing_table_size = 0;
-
-	protected final LinkedList<Triplet<IRoutedItem, ForgeDirection, ItemSendMode>> _sendQueue = new LinkedList<>();
-
-	protected final Map<ItemIdentifier, Queue<Pair<Integer, ItemRoutingInformation>>> queuedDataForUnroutedItems = Collections.synchronizedMap(new TreeMap<>());
-
-	public final PlayerCollectionList watchers = new PlayerCollectionList();
-
+	public boolean globalIgnoreConnectionDisconnection = false;
+	protected boolean stillNeedReplace = true;
+	protected IRouter router;
+	protected String routerId;
+	protected Object routerIdLock = new Object();
+	protected int _delayOffset = 0;
+	protected boolean _initialInit = true;
+	protected RouteLayer _routeLayer;
+	protected TransportLayer _transportLayer;
+	protected UpgradeManager upgradeManager = new UpgradeManager(this);
+	protected LogisticsItemOrderManager _orderItemManager = null;
 	protected List<IInventory> _cachedAdjacentInventories;
-
 	protected ForgeDirection pointedDirection = ForgeDirection.UNKNOWN;
 	//public BaseRoutingLogic logic;
 	// from BaseRoutingLogic
 	protected int throttleTime = 20;
+	protected IPipeSign[] signItem = new IPipeSign[6];
+	private boolean recheckConnections = false;
+	private boolean enabled = true;
+	private boolean preventRemove = false;
+	private boolean destroyByPlayer = false;
+	private PowerSupplierHandler powerHandler = new PowerSupplierHandler(this);
+	@Getter
+	private List<IOrderInfoProvider> clientSideOrderManager = new ArrayList<>();
 	private int throttleTimeLeft = 20 + new Random().nextInt(Configs.LOGISTICS_DETECTION_FREQUENCY);
-
 	private int[] queuedParticles = new int[Particles.values().length];
 	private boolean hasQueuedParticles = false;
-
-	protected IPipeSign[] signItem = new IPipeSign[6];
 	private boolean isOpaqueClientSide = false;
 
 	private CacheHolder cacheHolder;
 
 	public CoreRoutedPipe(Item item) {
@@ -1028,12 +1005,10 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 	@Override
 	public final boolean canPipeConnect(TileEntity tile, ForgeDirection dir) {
 		return canPipeConnect(tile, dir, false);
 	}
 
-	public boolean globalIgnoreConnectionDisconnection = false;
-
 	@Override
 	public final boolean canPipeConnect(TileEntity tile, ForgeDirection dir, boolean ignoreSystemDisconnection) {
 		ForgeDirection side = OrientationsUtil.getOrientationOfTilewithTile(container, tile);
 		if (isSideBlocked(side, ignoreSystemDisconnection)) {
 			return false;
@@ -1070,22 +1045,22 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 
 	public void insetSecurityID(UUID id) {
 		getOriginalUpgradeManager().insetSecurityID(id);
 	}
 
-	/* Power System */
-
 	public List<Pair<ILogisticsPowerProvider, List<IFilter>>> getRoutedPowerProviders() {
 		if (MainProxy.isClient(getWorld())) {
 			return null;
 		}
 		if (stillNeedReplace) {
 			return null;
 		}
 		return getRouter().getPowerProvider();
 	}
 
+	/* Power System */
+
 	@Override
 	public boolean useEnergy(int amount) {
 		return useEnergy(amount, null, true);
 	}
 
@@ -1376,25 +1351,25 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 			return null;
 		}
 		return router.getId().toString();
 	}
 
-	@CCCommand(description = "Sets the TurtleConnect flag for this Turtle on this LogisticsPipe")
+	@CCCommand(description = "Returns the TurtleConnect flag for this Turtle on this LogisticsPipe")
 	@CCDirectCall
-	public void setTurtleConnect(Boolean flag) {
+	public boolean getTurtleConnect() {
 		if (container instanceof LogisticsTileGenericPipe) {
-			container.setTurtleConnect(flag);
+			return container.getTurtleConnect();
 		}
+		return false;
 	}
 
-	@CCCommand(description = "Returns the TurtleConnect flag for this Turtle on this LogisticsPipe")
+	@CCCommand(description = "Sets the TurtleConnect flag for this Turtle on this LogisticsPipe")
 	@CCDirectCall
-	public boolean getTurtleConnect() {
+	public void setTurtleConnect(Boolean flag) {
 		if (container instanceof LogisticsTileGenericPipe) {
-			return container.getTurtleConnect();
+			container.setTurtleConnect(flag);
 		}
-		return false;
 	}
 
 	@CCCommand(description = "Returns true if the computer is allowed to interact with the connected pipe.", needPermission = false)
 	public boolean canAccess() {
 		ISecurityProvider sec = getSecurityProvider();
@@ -1741,16 +1716,16 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 		}
 		return null;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeBoolean(isOpaque());
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		isOpaqueClientSide = input.readBoolean();
 	}
 
 	@Override
 	public boolean isOpaque() {
@@ -1839,6 +1814,11 @@ public abstract class CoreRoutedPipe extends CoreUnroutedPipe
 
 	@Override
 	public IHighlightPlacementRenderer getHighlightRenderer() {
 		return LogisticsRenderPipe.secondRenderer;
 	}
+
+	public enum ItemSendMode {
+		Normal,
+		Fast
+	}
 }
diff --git a/common/logisticspipes/pipes/basic/LogisticsTileGenericPipe.java b/common/logisticspipes/pipes/basic/LogisticsTileGenericPipe.java
index e83d8a14..43d39b87 100644
--- a/common/logisticspipes/pipes/basic/LogisticsTileGenericPipe.java
+++ b/common/logisticspipes/pipes/basic/LogisticsTileGenericPipe.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.basic;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -92,37 +91,42 @@ import network.rs485.logisticspipes.world.WorldCoordinatesWrapper;
 		"buildcraft.api.transport.IPipeTile", "buildcraft.api.transport.IPipeConnection" })
 public class LogisticsTileGenericPipe extends TileEntity
 		implements IOCTile, ILPPipeTile, IPipeInformationProvider, IItemDuct, ManagedPeripheral, Environment, SidedEnvironment, IFluidHandler, IPipeTile,
 		ILogicControllerTile, IPipeConnection {
 
+	public final PipeRenderState renderState;
+	public final CoreState coreState = new CoreState();
+	public final IBCTilePart tilePart;
+	public final IBCPluggableState bcPlugableState;
+	public final ITDPart tdPart;
 	public Object OPENPERIPHERAL_IGNORE; //Tell OpenPeripheral to ignore this class
-
 	public Set<DoubleCoordinates> subMultiBlock = new HashSet<>();
-
 	public boolean[] turtleConnect = new boolean[7];
-
-	private LogisticsTileRenderController renderController;
-
 	@ModDependentField(modId = LPConstants.computerCraftModID)
 	public HashMap<IComputerAccess, ForgeDirection> connections;
-
 	@ModDependentField(modId = LPConstants.computerCraftModID)
 	public IComputerAccess currentPC;
-
 	@ModDependentField(modId = LPConstants.openComputersModID)
 	public Node node;
+	public LogicController logicController = new LogicController();
+	public boolean[] pipeConnectionsBuffer = new boolean[6];
+	public boolean[] pipeBCConnectionsBuffer = new boolean[6];
+	public boolean[] pipeTDConnectionsBuffer = new boolean[6];
+	public CoreUnroutedPipe pipe;
+	private LogisticsTileRenderController renderController;
 	private boolean addedToNetwork = false;
-
 	private boolean sendInitPacket = true;
-
-	public LogicController logicController = new LogicController();
-
-	public final PipeRenderState renderState;
-	public final CoreState coreState = new CoreState();
-	public final IBCTilePart tilePart;
-	public final IBCPluggableState bcPlugableState;
-	public final ITDPart tdPart;
+	@Getter
+	private boolean initialized = false;
+	private boolean deletePipe = false;
+	private TileBuffer[] tileBuffer;
+	private boolean sendClientUpdate = false;
+	private boolean blockNeighborChange = false;
+	private boolean refreshRenderState = false;
+	private boolean pipeBound = false;
+	@SideOnly(Side.CLIENT)
+	private AxisAlignedBB renderBox;
 
 	public LogisticsTileGenericPipe() {
 		if (SimpleServiceLocator.ccProxy.isCC()) {
 			connections = new HashMap<>();
 		}
@@ -312,10 +316,12 @@ public class LogisticsTileGenericPipe extends TileEntity
 				turtleConnect[i] = false;
 			}
 		}
 	}
 
+	/* IPipeInformationProvider */
+
 	@Override
 	public void writeToNBT(NBTTagCompound nbt) {
 		super.writeToNBT(nbt);
 
 		/*
@@ -437,18 +443,18 @@ public class LogisticsTileGenericPipe extends TileEntity
 
 	public void handleMesssage(int computerId, Object message, int sourceId) {
 		SimpleServiceLocator.ccProxy.handleMesssage(computerId, message, this, sourceId);
 	}
 
-	public void setTurtleConnect(boolean flag) {
-		SimpleServiceLocator.ccProxy.setTurtleConnect(flag, this);
-	}
-
 	public boolean getTurtleConnect() {
 		return SimpleServiceLocator.ccProxy.getTurtleConnect(this);
 	}
 
+	public void setTurtleConnect(boolean flag) {
+		SimpleServiceLocator.ccProxy.setTurtleConnect(flag, this);
+	}
+
 	public int getLastCCID() {
 		return SimpleServiceLocator.ccProxy.getLastCCID(this);
 	}
 
 	@Override
@@ -476,12 +482,10 @@ public class LogisticsTileGenericPipe extends TileEntity
 			renderController = new LogisticsTileRenderController(this);
 		}
 		return renderController;
 	}
 
-	/* IPipeInformationProvider */
-
 	@Override
 	public boolean isCorrect(ConnectionPipeType type) {
 		return true;
 	}
 
@@ -630,10 +634,12 @@ public class LogisticsTileGenericPipe extends TileEntity
 	}
 
 	@Override
 	@ModDependentMethod(modId = LPConstants.openComputersModID)
 	public void onConnect(Node node1) {}
+	//public int redstoneInput = 0;
+	//public int[] redstoneInputSide = new int[ForgeDirection.VALID_DIRECTIONS.length];
 
 	@Override
 	@ModDependentMethod(modId = LPConstants.openComputersModID)
 	public void onDisconnect(Node node1) {}
 
@@ -675,45 +681,10 @@ public class LogisticsTileGenericPipe extends TileEntity
 	@Override
 	public Object getOCNode() {
 		return node();
 	}
 
-	@Getter
-	private boolean initialized = false;
-
-	public boolean[] pipeConnectionsBuffer = new boolean[6];
-	public boolean[] pipeBCConnectionsBuffer = new boolean[6];
-	public boolean[] pipeTDConnectionsBuffer = new boolean[6];
-
-	public CoreUnroutedPipe pipe;
-	//public int redstoneInput = 0;
-	//public int[] redstoneInputSide = new int[ForgeDirection.VALID_DIRECTIONS.length];
-
-	private boolean deletePipe = false;
-	private TileBuffer[] tileBuffer;
-	private boolean sendClientUpdate = false;
-	private boolean blockNeighborChange = false;
-	private boolean refreshRenderState = false;
-	private boolean pipeBound = false;
-
-	public class CoreState implements IClientState {
-
-		public int pipeId = -1;
-
-		@Override
-		public void writeData(LPDataOutput output) throws IOException {
-			output.writeInt(pipeId);
-
-		}
-
-		@Override
-		public void readData(LPDataInput input) throws IOException {
-			pipeId = input.readInt();
-
-		}
-	}
-
 	public void initialize(CoreUnroutedPipe pipe) {
 		blockType = getBlockType();
 
 		if (pipe == null) {
 			LogisticsPipes.log.log(Level.WARN, "Pipe failed to initialize at {0},{1},{2}, deleting", xCoord, yCoord, zCoord);
@@ -1089,13 +1060,10 @@ public class LogisticsTileGenericPipe extends TileEntity
 		super.setWorldObj(world);
 		tilePart.setWorldObj_LP(world);
 		tdPart.setWorldObj_LP(world);
 	}
 
-	@SideOnly(Side.CLIENT)
-	private AxisAlignedBB renderBox;
-
 	@SideOnly(Side.CLIENT)
 	@Override
 	public AxisAlignedBB getRenderBoundingBox() {
 		if (renderBox != null) {
 			return renderBox;
@@ -1153,6 +1121,23 @@ public class LogisticsTileGenericPipe extends TileEntity
 
 	@Override
 	public Stream<TileEntity> getPartsOfPipe() {
 		return this.subMultiBlock.stream().map(pos -> pos.getTileEntity(worldObj));
 	}
+
+	public class CoreState implements IClientState {
+
+		public int pipeId = -1;
+
+		@Override
+		public void writeData(LPDataOutput output) {
+			output.writeInt(pipeId);
+
+		}
+
+		@Override
+		public void readData(LPDataInput input) {
+			pipeId = input.readInt();
+
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/tubes/HSTubeCurve.java b/common/logisticspipes/pipes/tubes/HSTubeCurve.java
index fa6495d5..f25d67f0 100644
--- a/common/logisticspipes/pipes/tubes/HSTubeCurve.java
+++ b/common/logisticspipes/pipes/tubes/HSTubeCurve.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.tubes;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.nbt.NBTTagCompound;
@@ -32,88 +31,29 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 import network.rs485.logisticspipes.world.DoubleCoordinatesType;
 
 public class HSTubeCurve extends CoreMultiBlockPipe {
 
-	@AllArgsConstructor
-	public enum CurveOrientation implements ITubeOrientation {
-		//@formatter:off
-		// Name: Placement from  _ TurnDirection
-		NORTH_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(2, 0, 2), ForgeDirection.NORTH, ForgeDirection.EAST),
-		NORTH_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
-		WEST_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(2, 0, -2), ForgeDirection.WEST, ForgeDirection.NORTH),
-		WEST_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST, ForgeDirection.SOUTH),
-		SOUTH_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(-2, 0, -2), ForgeDirection.SOUTH, ForgeDirection.WEST),
-		SOUTH_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH, ForgeDirection.EAST),
-		EAST_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(-2, 0, 2), ForgeDirection.EAST, ForgeDirection.SOUTH),
-		EAST_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH);
-		//@formatter:on
-		@Getter
-		TurnDirection renderOrientation;
-		@Getter
-		DoubleCoordinates offset;
-		@Getter
-		ForgeDirection from;
-		@Getter
-		ForgeDirection looking;
-
-		@Override
-		public void rotatePositions(IPositionRotateble set) {
-			renderOrientation.rotatePositions(set);
-		}
-
-		@Override
-		public void setOnPipe(CoreMultiBlockPipe pipe) {
-			((HSTubeCurve) pipe).orientation = this;
-		}
-	}
-
-	@AllArgsConstructor
-	public enum TurnDirection implements ITubeRenderOrientation {
-		//@formatter:off
-		NORTH_EAST(ForgeDirection.NORTH, ForgeDirection.EAST),
-		EAST_SOUTH(ForgeDirection.EAST, ForgeDirection.SOUTH),
-		SOUTH_WEST(ForgeDirection.SOUTH, ForgeDirection.WEST),
-		WEST_NORTH(ForgeDirection.WEST, ForgeDirection.NORTH);
-		//@formatter:on
-		@Getter
-		ForgeDirection dir1;
-		ForgeDirection dir2;
-
-		public void rotatePositions(IPositionRotateble set) {
-			if (this == WEST_NORTH) {
-				return;
-			} else if (this == NORTH_EAST) {
-				set.rotateRight();
-			} else if (this == EAST_SOUTH) {
-				set.rotateLeft();
-				set.rotateLeft();
-			} else if (this == SOUTH_WEST) {
-				set.rotateLeft();
-			}
-		}
-	}
-
 	@Getter
 	private CurveOrientation orientation;
 
 	public HSTubeCurve(Item item) {
 		super(new PipeMultiBlockTransportLogistics(), item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		if (orientation == null) {
 			output.writeBoolean(false);
 		} else {
 			output.writeBoolean(true);
 			output.writeEnum(orientation);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		if (input.readBoolean()) {
 			orientation = input.readEnum(CurveOrientation.class);
 		}
 	}
 
@@ -397,6 +337,65 @@ public class HSTubeCurve extends CoreMultiBlockPipe {
 
 	@Override
 	public boolean isHSTube() {
 		return true;
 	}
+
+	@AllArgsConstructor
+	public enum CurveOrientation implements ITubeOrientation {
+		//@formatter:off
+		// Name: Placement from  _ TurnDirection
+		NORTH_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(2, 0, 2), ForgeDirection.NORTH, ForgeDirection.EAST),
+		NORTH_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
+		WEST_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(2, 0, -2), ForgeDirection.WEST, ForgeDirection.NORTH),
+		WEST_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST, ForgeDirection.SOUTH),
+		SOUTH_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(-2, 0, -2), ForgeDirection.SOUTH, ForgeDirection.WEST),
+		SOUTH_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH, ForgeDirection.EAST),
+		EAST_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(-2, 0, 2), ForgeDirection.EAST, ForgeDirection.SOUTH),
+		EAST_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH);
+		//@formatter:on
+		@Getter
+		TurnDirection renderOrientation;
+		@Getter
+		DoubleCoordinates offset;
+		@Getter
+		ForgeDirection from;
+		@Getter
+		ForgeDirection looking;
+
+		@Override
+		public void rotatePositions(IPositionRotateble set) {
+			renderOrientation.rotatePositions(set);
+		}
+
+		@Override
+		public void setOnPipe(CoreMultiBlockPipe pipe) {
+			((HSTubeCurve) pipe).orientation = this;
+		}
+	}
+
+	@AllArgsConstructor
+	public enum TurnDirection implements ITubeRenderOrientation {
+		//@formatter:off
+		NORTH_EAST(ForgeDirection.NORTH, ForgeDirection.EAST),
+		EAST_SOUTH(ForgeDirection.EAST, ForgeDirection.SOUTH),
+		SOUTH_WEST(ForgeDirection.SOUTH, ForgeDirection.WEST),
+		WEST_NORTH(ForgeDirection.WEST, ForgeDirection.NORTH);
+		//@formatter:on
+		@Getter
+		ForgeDirection dir1;
+		ForgeDirection dir2;
+
+		public void rotatePositions(IPositionRotateble set) {
+			if (this == WEST_NORTH) {
+				return;
+			} else if (this == NORTH_EAST) {
+				set.rotateRight();
+			} else if (this == EAST_SOUTH) {
+				set.rotateLeft();
+				set.rotateLeft();
+			} else if (this == SOUTH_WEST) {
+				set.rotateLeft();
+			}
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/tubes/HSTubeGain.java b/common/logisticspipes/pipes/tubes/HSTubeGain.java
index 0703967f..a6ce2114 100644
--- a/common/logisticspipes/pipes/tubes/HSTubeGain.java
+++ b/common/logisticspipes/pipes/tubes/HSTubeGain.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.tubes;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import net.minecraft.entity.player.EntityPlayer;
@@ -30,86 +29,30 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 import network.rs485.logisticspipes.world.DoubleCoordinatesType;
 
 public class HSTubeGain extends CoreMultiBlockPipe {
 
-	public enum TubeGainOrientation implements ITubeOrientation {
-		NORTH(TubeGainRenderOrientation.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
-		SOUTH(TubeGainRenderOrientation.SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
-		EAST(TubeGainRenderOrientation.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
-		WEST(TubeGainRenderOrientation.WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);
-
-		@Getter
-		TubeGainRenderOrientation renderOrientation;
-		@Getter
-		DoubleCoordinates offset;
-		@Getter
-		ForgeDirection dir;
-
-		TubeGainOrientation(TubeGainRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
-			renderOrientation = render;
-			offset = off;
-			this.dir = dir;
-		}
-
-		@Override
-		public void rotatePositions(IPositionRotateble set) {
-			renderOrientation.rotateOrientation(set);
-		}
-
-		@Override
-		public void setOnPipe(CoreMultiBlockPipe pipe) {
-			((HSTubeGain) pipe).orientation = this;
-		}
-	}
-
-	public enum TubeGainRenderOrientation implements ITubeRenderOrientation {
-		NORTH(ForgeDirection.NORTH),
-		SOUTH(ForgeDirection.SOUTH),
-		WEST(ForgeDirection.WEST),
-		EAST(ForgeDirection.EAST);
-
-		@Getter
-		private ForgeDirection dir;
-
-		TubeGainRenderOrientation(ForgeDirection dir) {
-			this.dir = dir;
-		}
-
-		public void rotateOrientation(IPositionRotateble set) {
-			if (this == EAST) {
-				set.rotateRight();
-			} else if (this == WEST) {
-				set.rotateLeft();
-			} else if (this == SOUTH) {
-				set.rotateLeft();
-				set.rotateLeft();
-			}
-		}
-	}
-
 	@Getter
 	private TubeGainOrientation orientation;
-
 	private List<AxisAlignedBB> boxes = null;
 
 	public HSTubeGain(Item item) {
 		super(new PipeMultiBlockTransportLogistics(), item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		if (orientation == null) {
 			output.writeBoolean(false);
 		} else {
 			output.writeBoolean(true);
 			output.writeEnum(orientation);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		if (input.readBoolean()) {
 			orientation = input.readEnum(TubeGainOrientation.class);
 		}
 	}
 
@@ -412,6 +355,61 @@ public class HSTubeGain extends CoreMultiBlockPipe {
 
 	@Override
 	public boolean isHSTube() {
 		return true;
 	}
+
+	public enum TubeGainOrientation implements ITubeOrientation {
+		NORTH(TubeGainRenderOrientation.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
+		SOUTH(TubeGainRenderOrientation.SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
+		EAST(TubeGainRenderOrientation.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
+		WEST(TubeGainRenderOrientation.WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);
+
+		@Getter
+		TubeGainRenderOrientation renderOrientation;
+		@Getter
+		DoubleCoordinates offset;
+		@Getter
+		ForgeDirection dir;
+
+		TubeGainOrientation(TubeGainRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
+			renderOrientation = render;
+			offset = off;
+			this.dir = dir;
+		}
+
+		@Override
+		public void rotatePositions(IPositionRotateble set) {
+			renderOrientation.rotateOrientation(set);
+		}
+
+		@Override
+		public void setOnPipe(CoreMultiBlockPipe pipe) {
+			((HSTubeGain) pipe).orientation = this;
+		}
+	}
+
+	public enum TubeGainRenderOrientation implements ITubeRenderOrientation {
+		NORTH(ForgeDirection.NORTH),
+		SOUTH(ForgeDirection.SOUTH),
+		WEST(ForgeDirection.WEST),
+		EAST(ForgeDirection.EAST);
+
+		@Getter
+		private ForgeDirection dir;
+
+		TubeGainRenderOrientation(ForgeDirection dir) {
+			this.dir = dir;
+		}
+
+		public void rotateOrientation(IPositionRotateble set) {
+			if (this == EAST) {
+				set.rotateRight();
+			} else if (this == WEST) {
+				set.rotateLeft();
+			} else if (this == SOUTH) {
+				set.rotateLeft();
+				set.rotateLeft();
+			}
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/tubes/HSTubeLine.java b/common/logisticspipes/pipes/tubes/HSTubeLine.java
index 3e95d338..a20d42d4 100644
--- a/common/logisticspipes/pipes/tubes/HSTubeLine.java
+++ b/common/logisticspipes/pipes/tubes/HSTubeLine.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.tubes;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.nbt.NBTTagCompound;
@@ -26,77 +25,29 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 import network.rs485.logisticspipes.world.DoubleCoordinatesType;
 
 public class HSTubeLine extends CoreMultiBlockPipe {
 
-	public enum TubeLineOrientation implements ITubeOrientation {
-		NORTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
-		SOUTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
-		EAST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
-		WEST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);
-
-		@Getter
-		TubeLineRenderOrientation renderOrientation;
-		@Getter
-		DoubleCoordinates offset;
-		@Getter
-		ForgeDirection dir;
-
-		TubeLineOrientation(TubeLineRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
-			renderOrientation = render;
-			offset = off;
-			this.dir = dir;
-		}
-
-		@Override
-		public void rotatePositions(IPositionRotateble set) {
-			renderOrientation.rotateOrientation(set);
-		}
-
-		@Override
-		public void setOnPipe(CoreMultiBlockPipe pipe) {
-			((HSTubeLine) pipe).orientation = this;
-		}
-	}
-
-	public enum TubeLineRenderOrientation implements ITubeRenderOrientation {
-		NORTH_SOUTH(ForgeDirection.NORTH),
-		EAST_WEST(ForgeDirection.EAST);
-
-		@Getter
-		private ForgeDirection dir;
-
-		TubeLineRenderOrientation(ForgeDirection dir) {
-			this.dir = dir;
-		}
-
-		public void rotateOrientation(IPositionRotateble set) {
-			if (this == EAST_WEST) {
-				set.rotateLeft();
-			}
-		}
-	}
-
 	@Getter
 	private TubeLineOrientation orientation;
 
 	public HSTubeLine(Item item) {
 		super(new PipeMultiBlockTransportLogistics(), item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		if (orientation == null) {
 			output.writeBoolean(false);
 		} else {
 			output.writeBoolean(true);
 			output.writeEnum(orientation);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		if (input.readBoolean()) {
 			orientation = input.readEnum(TubeLineOrientation.class);
 		}
 	}
 
@@ -215,6 +166,54 @@ public class HSTubeLine extends CoreMultiBlockPipe {
 
 	@Override
 	public boolean isHSTube() {
 		return true;
 	}
+
+	public enum TubeLineOrientation implements ITubeOrientation {
+		NORTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
+		SOUTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
+		EAST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
+		WEST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);
+
+		@Getter
+		TubeLineRenderOrientation renderOrientation;
+		@Getter
+		DoubleCoordinates offset;
+		@Getter
+		ForgeDirection dir;
+
+		TubeLineOrientation(TubeLineRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
+			renderOrientation = render;
+			offset = off;
+			this.dir = dir;
+		}
+
+		@Override
+		public void rotatePositions(IPositionRotateble set) {
+			renderOrientation.rotateOrientation(set);
+		}
+
+		@Override
+		public void setOnPipe(CoreMultiBlockPipe pipe) {
+			((HSTubeLine) pipe).orientation = this;
+		}
+	}
+
+	public enum TubeLineRenderOrientation implements ITubeRenderOrientation {
+		NORTH_SOUTH(ForgeDirection.NORTH),
+		EAST_WEST(ForgeDirection.EAST);
+
+		@Getter
+		private ForgeDirection dir;
+
+		TubeLineRenderOrientation(ForgeDirection dir) {
+			this.dir = dir;
+		}
+
+		public void rotateOrientation(IPositionRotateble set) {
+			if (this == EAST_WEST) {
+				set.rotateLeft();
+			}
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/tubes/HSTubeSCurve.java b/common/logisticspipes/pipes/tubes/HSTubeSCurve.java
index 29362523..7b2008d5 100644
--- a/common/logisticspipes/pipes/tubes/HSTubeSCurve.java
+++ b/common/logisticspipes/pipes/tubes/HSTubeSCurve.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.tubes;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import net.minecraft.entity.player.EntityPlayer;
@@ -33,89 +32,30 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 import network.rs485.logisticspipes.world.DoubleCoordinatesType;
 
 public class HSTubeSCurve extends CoreMultiBlockPipe {
 
-	@AllArgsConstructor
-	public enum CurveSOrientation implements ITubeOrientation {
-		//@formatter:off
-		// Name: Placement from  _ TurnDirection
-		NORTH_EAST(TurnSDirection.NORTH_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.EAST),
-		NORTH_WEST(TurnSDirection.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
-		EAST_SOUTH(TurnSDirection.EAST_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.SOUTH),
-		EAST_NORTH(TurnSDirection.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH),
-		SOUTH_WEST(TurnSDirection.NORTH_INV, new DoubleCoordinates(-1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.WEST),
-		SOUTH_EAST(TurnSDirection.NORTH, new DoubleCoordinates(1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.EAST),
-		WEST_NORTH(TurnSDirection.EAST_INV, new DoubleCoordinates(-3, 0, -1), ForgeDirection.WEST, ForgeDirection.NORTH),
-		WEST_SOUTH(TurnSDirection.EAST, new DoubleCoordinates(-3, 0, 1), ForgeDirection.WEST, ForgeDirection.SOUTH);
-		//@formatter:on
-
-		@Getter
-		TurnSDirection renderOrientation;
-		@Getter
-		DoubleCoordinates offset;
-		@Getter
-		ForgeDirection dir;
-		@Getter
-		ForgeDirection looking;
-
-		@Override
-		public void rotatePositions(IPositionRotateble set) {
-			renderOrientation.rotatePositions(set);
-		}
-
-		@Override
-		public void setOnPipe(CoreMultiBlockPipe pipe) {
-			((HSTubeSCurve) pipe).orientation = this;
-		}
-	}
-
-	@AllArgsConstructor
-	public enum TurnSDirection implements ITubeRenderOrientation {
-		//@formatter:off
-		NORTH(ForgeDirection.NORTH),
-		EAST(ForgeDirection.EAST),
-		NORTH_INV(ForgeDirection.SOUTH),
-		EAST_INV(ForgeDirection.WEST);
-		//@formatter:on
-
-		@Getter
-		private ForgeDirection dir1;
-
-		public void rotatePositions(IPositionRotateble set) {
-			if (this == NORTH) {
-				set.mirrorX();
-			} else if (this == EAST) {
-				set.mirrorX();
-				set.rotateRight();
-			} else if (this == EAST_INV) {
-				set.rotateRight();
-			}
-		}
-	}
-
 	@Getter
 	private CurveSOrientation orientation;
-
 	private List<AxisAlignedBB> boxes = null;
 
 	public HSTubeSCurve(Item item) {
 		super(new PipeMultiBlockTransportLogistics(), item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		if (orientation == null) {
 			output.writeBoolean(false);
 		} else {
 			output.writeBoolean(true);
 			output.writeEnum(orientation);
 		}
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		if (input.readBoolean()) {
 			orientation = input.readEnum(CurveSOrientation.class);
 		}
 	}
 
@@ -454,6 +394,64 @@ public class HSTubeSCurve extends CoreMultiBlockPipe {
 
 	@Override
 	public boolean isHSTube() {
 		return true;
 	}
+
+	@AllArgsConstructor
+	public enum CurveSOrientation implements ITubeOrientation {
+		//@formatter:off
+		// Name: Placement from  _ TurnDirection
+		NORTH_EAST(TurnSDirection.NORTH_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.EAST),
+		NORTH_WEST(TurnSDirection.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
+		EAST_SOUTH(TurnSDirection.EAST_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.SOUTH),
+		EAST_NORTH(TurnSDirection.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH),
+		SOUTH_WEST(TurnSDirection.NORTH_INV, new DoubleCoordinates(-1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.WEST),
+		SOUTH_EAST(TurnSDirection.NORTH, new DoubleCoordinates(1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.EAST),
+		WEST_NORTH(TurnSDirection.EAST_INV, new DoubleCoordinates(-3, 0, -1), ForgeDirection.WEST, ForgeDirection.NORTH),
+		WEST_SOUTH(TurnSDirection.EAST, new DoubleCoordinates(-3, 0, 1), ForgeDirection.WEST, ForgeDirection.SOUTH);
+		//@formatter:on
+
+		@Getter
+		TurnSDirection renderOrientation;
+		@Getter
+		DoubleCoordinates offset;
+		@Getter
+		ForgeDirection dir;
+		@Getter
+		ForgeDirection looking;
+
+		@Override
+		public void rotatePositions(IPositionRotateble set) {
+			renderOrientation.rotatePositions(set);
+		}
+
+		@Override
+		public void setOnPipe(CoreMultiBlockPipe pipe) {
+			((HSTubeSCurve) pipe).orientation = this;
+		}
+	}
+
+	@AllArgsConstructor
+	public enum TurnSDirection implements ITubeRenderOrientation {
+		//@formatter:off
+		NORTH(ForgeDirection.NORTH),
+		EAST(ForgeDirection.EAST),
+		NORTH_INV(ForgeDirection.SOUTH),
+		EAST_INV(ForgeDirection.WEST);
+		//@formatter:on
+
+		@Getter
+		private ForgeDirection dir1;
+
+		public void rotatePositions(IPositionRotateble set) {
+			if (this == NORTH) {
+				set.mirrorX();
+			} else if (this == EAST) {
+				set.mirrorX();
+				set.rotateRight();
+			} else if (this == EAST_INV) {
+				set.rotateRight();
+			}
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/tubes/HSTubeSpeedup.java b/common/logisticspipes/pipes/tubes/HSTubeSpeedup.java
index 1dd22007..678b2819 100644
--- a/common/logisticspipes/pipes/tubes/HSTubeSpeedup.java
+++ b/common/logisticspipes/pipes/tubes/HSTubeSpeedup.java
@@ -1,8 +1,7 @@
 package logisticspipes.pipes.tubes;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.nbt.NBTTagCompound;
@@ -34,49 +33,10 @@ import network.rs485.logisticspipes.world.CoordinateUtils;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 import network.rs485.logisticspipes.world.DoubleCoordinatesType;
 
 public class HSTubeSpeedup extends CoreMultiBlockPipe {
 
-	@AllArgsConstructor
-	public enum SpeedupDirection implements ITubeRenderOrientation, ITubeOrientation {
-		//@formatter:off
-		NORTH(ForgeDirection.NORTH),
-		SOUTH(ForgeDirection.SOUTH),
-		EAST(ForgeDirection.EAST),
-		WEST(ForgeDirection.WEST);
-		//@formatter:on
-		@Getter
-		ForgeDirection dir1;
-
-		@Override
-		public void rotatePositions(IPositionRotateble set) {
-			if (this == SOUTH) {
-				set.rotateLeft();
-				set.rotateLeft();
-			} else if (this == EAST) {
-				set.rotateRight();
-			} else if (this == WEST) {
-				set.rotateLeft();
-			}
-		}
-
-		@Override
-		public ITubeRenderOrientation getRenderOrientation() {
-			return this;
-		}
-
-		@Override
-		public DoubleCoordinates getOffset() {
-			return new DoubleCoordinates(0, 0, 0);
-		}
-
-		@Override
-		public void setOnPipe(CoreMultiBlockPipe pipe) {
-			((HSTubeSpeedup) pipe).orientation = this;
-		}
-	}
-
 	@Getter
 	private SpeedupDirection orientation;
 
 	public HSTubeSpeedup(Item item) {
 		super(new PipeMultiBlockTransportLogistics() {
@@ -113,16 +73,16 @@ public class HSTubeSpeedup extends CoreMultiBlockPipe {
 
 		}, item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeEnum(orientation);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		orientation = input.readEnum(SpeedupDirection.class);
 	}
 
 	@Override
 	public LPPositionSet<DoubleCoordinatesType<SubBlockTypeForShare>> getSubBlocks() {
@@ -307,6 +267,45 @@ public class HSTubeSpeedup extends CoreMultiBlockPipe {
 
 	@Override
 	public boolean isHSTube() {
 		return true;
 	}
+
+	@AllArgsConstructor
+	public enum SpeedupDirection implements ITubeRenderOrientation, ITubeOrientation {
+		//@formatter:off
+		NORTH(ForgeDirection.NORTH),
+		SOUTH(ForgeDirection.SOUTH),
+		EAST(ForgeDirection.EAST),
+		WEST(ForgeDirection.WEST);
+		//@formatter:on
+		@Getter
+		ForgeDirection dir1;
+
+		@Override
+		public void rotatePositions(IPositionRotateble set) {
+			if (this == SOUTH) {
+				set.rotateLeft();
+				set.rotateLeft();
+			} else if (this == EAST) {
+				set.rotateRight();
+			} else if (this == WEST) {
+				set.rotateLeft();
+			}
+		}
+
+		@Override
+		public ITubeRenderOrientation getRenderOrientation() {
+			return this;
+		}
+
+		@Override
+		public DoubleCoordinates getOffset() {
+			return new DoubleCoordinates(0, 0, 0);
+		}
+
+		@Override
+		public void setOnPipe(CoreMultiBlockPipe pipe) {
+			((HSTubeSpeedup) pipe).orientation = this;
+		}
+	}
 }
diff --git a/common/logisticspipes/pipes/unrouted/PipeItemsBasicTransport.java b/common/logisticspipes/pipes/unrouted/PipeItemsBasicTransport.java
index d64a94c8..f3b83cbb 100644
--- a/common/logisticspipes/pipes/unrouted/PipeItemsBasicTransport.java
+++ b/common/logisticspipes/pipes/unrouted/PipeItemsBasicTransport.java
@@ -1,9 +1,7 @@
 package logisticspipes.pipes.unrouted;
 
-import java.io.IOException;
-
 import net.minecraft.item.Item;
 import net.minecraftforge.common.util.ForgeDirection;
 
 import logisticspipes.pipes.basic.CoreUnroutedPipe;
 import logisticspipes.renderer.LogisticsRenderPipe;
@@ -18,14 +16,14 @@ public class PipeItemsBasicTransport extends CoreUnroutedPipe {
 	public PipeItemsBasicTransport(Item item) {
 		super(new PipeTransportLogistics(false), item);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {}
+	public void writeData(LPDataOutput output) {}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {}
+	public void readData(LPDataInput input) {}
 
 	@Override
 	public int getIconIndex(ForgeDirection direction) {
 		return Textures.LOGISTICSPIPE_BASIC_TRANSPORT_TEXTURE.normal;
 	}
diff --git a/common/logisticspipes/proxy/ProxyManager.java b/common/logisticspipes/proxy/ProxyManager.java
index dc4f2aaf..722f6f6d 100644
--- a/common/logisticspipes/proxy/ProxyManager.java
+++ b/common/logisticspipes/proxy/ProxyManager.java
@@ -1,8 +1,7 @@
 package logisticspipes.proxy;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -152,11 +151,11 @@ public class ProxyManager {
 					@Override public boolean hasGate(ForgeDirection orientation) {return false;}
 					@Override public IBCRenderState getBCRenderState() {
 						return new IBCRenderState() {
 							@Override public boolean needsRenderUpdate() {return false;}
 							@Override public boolean isDirty() {return false;}
-							@Override public void writeData_LP(LPDataOutput output) throws IOException {
+							@Override public void writeData_LP(LPDataOutput output)  {
 								output.writeBoolean(false);
 							}
 							@Override public void readData_LP(LPDataInput input) {}
 							@Override public void clean() {}
 						};
@@ -172,12 +171,12 @@ public class ProxyManager {
 							@Override public Object getOriginal() {return null;}
 						};
 					}
 					@Override public IBCPluggableState getBCPlugableState() {
 						return new IBCPluggableState() {
-							@Override public void writeData(LPDataOutput output) throws IOException {}
-							@Override public void readData(LPDataInput input) throws IOException {}
+							@Override public void writeData(LPDataOutput output)  {}
+							@Override public void readData(LPDataInput input)  {}
 							@Override public boolean isDirty(boolean clean) {return false;}
 						};
 					}
 					@Override public boolean hasEnabledFacade(ForgeDirection dir) {return false;}
 					@Override public IBCPipePluggable getBCPipePluggable(ForgeDirection sideHit) {
diff --git a/common/logisticspipes/proxy/buildcraft/subproxies/IBCPluggableState.java b/common/logisticspipes/proxy/buildcraft/subproxies/IBCPluggableState.java
index 05f02c65..c60b675a 100644
--- a/common/logisticspipes/proxy/buildcraft/subproxies/IBCPluggableState.java
+++ b/common/logisticspipes/proxy/buildcraft/subproxies/IBCPluggableState.java
@@ -1,18 +1,16 @@
 package logisticspipes.proxy.buildcraft.subproxies;
 
-import java.io.IOException;
-
 import logisticspipes.interfaces.IClientState;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public interface IBCPluggableState extends IClientState {
 
 	@Override
-	void writeData(LPDataOutput output) throws IOException;
+	void writeData(LPDataOutput output);
 
 	@Override
-	void readData(LPDataInput input) throws IOException;
+	void readData(LPDataInput input);
 
 	boolean isDirty(boolean clean);
 }
diff --git a/common/logisticspipes/proxy/buildcraft/subproxies/IBCRenderState.java b/common/logisticspipes/proxy/buildcraft/subproxies/IBCRenderState.java
index c656826c..be4dec0c 100644
--- a/common/logisticspipes/proxy/buildcraft/subproxies/IBCRenderState.java
+++ b/common/logisticspipes/proxy/buildcraft/subproxies/IBCRenderState.java
@@ -1,20 +1,18 @@
 package logisticspipes.proxy.buildcraft.subproxies;
 
-import java.io.IOException;
-
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public interface IBCRenderState {
 
 	boolean needsRenderUpdate();
 
 	boolean isDirty();
 
-	void writeData_LP(LPDataOutput output) throws IOException;
+	void writeData_LP(LPDataOutput output);
 
-	void readData_LP(LPDataInput input) throws IOException;
+	void readData_LP(LPDataInput input);
 
 	void clean();
 
 }
diff --git a/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPipeRenderState.java b/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPipeRenderState.java
index cf2d76b1..4c6cd227 100644
--- a/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPipeRenderState.java
+++ b/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPipeRenderState.java
@@ -1,28 +1,26 @@
 package logisticspipes.proxy.buildcraft.subproxies;
 
-import java.io.IOException;
-
 import buildcraft.transport.PipeRenderState;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class LPBCPipeRenderState extends PipeRenderState implements IBCRenderState {
 
 	@Override
-	public void writeData_LP(LPDataOutput output) throws IOException {
+	public void writeData_LP(LPDataOutput output) {
 		output.writeBoolean(true);
 		ByteBuf buf = Unpooled.buffer(128);
 		writeData(buf);
 		output.writeByteBuf(buf);
 	}
 
 	@Override
-	public void readData_LP(LPDataInput input) throws IOException {
+	public void readData_LP(LPDataInput input) {
 		if (input.readBoolean()) {
 			ByteBuf buf = input.readByteBuf();
 			readData(buf);
 		}
 	}
diff --git a/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPluggableState.java b/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPluggableState.java
index 9fc79cf6..1381d07b 100644
--- a/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPluggableState.java
+++ b/common/logisticspipes/proxy/buildcraft/subproxies/LPBCPluggableState.java
@@ -1,38 +1,35 @@
 package logisticspipes.proxy.buildcraft.subproxies;
 
-import java.io.IOException;
 import java.util.Arrays;
 
 import buildcraft.transport.PipePluggableState;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-import lombok.SneakyThrows;
 
 import network.rs485.logisticspipes.util.LPDataIOWrapper;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class LPBCPluggableState extends PipePluggableState implements IBCPluggableState {
 
 	private byte[] oldBuffer;
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		ByteBuf buf = Unpooled.buffer(128);
 		this.writeData(buf);
 		output.writeByteBuf(buf);
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		ByteBuf buf = input.readByteBuf();
 		this.readData(buf);
 	}
 
 	@Override
-	@SneakyThrows({ IOException.class })
 	public boolean isDirty(boolean clean) {
 		byte[] newBytes = LPDataIOWrapper.collectData(this::writeData);
 		boolean result = !Arrays.equals(newBytes, oldBuffer);
 		if (clean && result) {
 			oldBuffer = newBytes;
diff --git a/common/logisticspipes/renderer/state/ConnectionMatrix.java b/common/logisticspipes/renderer/state/ConnectionMatrix.java
index cedd27e4..dab6e19b 100644
--- a/common/logisticspipes/renderer/state/ConnectionMatrix.java
+++ b/common/logisticspipes/renderer/state/ConnectionMatrix.java
@@ -1,9 +1,7 @@
 package logisticspipes.renderer.state;
 
-import java.io.IOException;
-
 import net.minecraftforge.common.util.ForgeDirection;
 
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
@@ -72,17 +70,17 @@ public class ConnectionMatrix {
 
 	public void clean() {
 		dirty = false;
 	}
 
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeByte(mask);
 		output.writeByte(isBCPipeMask);
 		output.writeByte(isTDPipeMask);
 	}
 
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		byte newMask = input.readByte();
 
 		if (newMask != mask) {
 			mask = newMask;
 			dirty = true;
diff --git a/common/logisticspipes/renderer/state/PipeRenderState.java b/common/logisticspipes/renderer/state/PipeRenderState.java
index 375a1901..0797c1f6 100644
--- a/common/logisticspipes/renderer/state/PipeRenderState.java
+++ b/common/logisticspipes/renderer/state/PipeRenderState.java
@@ -1,8 +1,7 @@
 package logisticspipes.renderer.state;
 
-import java.io.IOException;
 import java.util.List;
 
 import net.minecraft.util.IIcon;
 import cpw.mods.fml.relauncher.Side;
 import cpw.mods.fml.relauncher.SideOnly;
@@ -56,18 +55,18 @@ public class PipeRenderState implements IClientState {
 	public boolean needsRenderUpdate() {
 		return pipeConnectionMatrix.isDirty() || textureMatrix.isDirty() || bcRenderState.needsRenderUpdate();
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		pipeConnectionMatrix.writeData(output);
 		textureMatrix.writeData(output);
 		bcRenderState.writeData_LP(output); //Always needs to be last. Different length depending on proxy loading state.
 	}
 
 	@Override
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		pipeConnectionMatrix.readData(input);
 		textureMatrix.readData(input);
 		bcRenderState.readData_LP(input); //Always needs to be last. Different length depending on proxy loading state.
 	}
 }
diff --git a/common/logisticspipes/renderer/state/TextureMatrix.java b/common/logisticspipes/renderer/state/TextureMatrix.java
index 4f89e6f1..bb3c5090 100644
--- a/common/logisticspipes/renderer/state/TextureMatrix.java
+++ b/common/logisticspipes/renderer/state/TextureMatrix.java
@@ -1,9 +1,7 @@
 package logisticspipes.renderer.state;
 
-import java.io.IOException;
-
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Getter;
 
 import logisticspipes.config.Configs;
@@ -110,11 +108,11 @@ public class TextureMatrix {
 
 	public void clean() {
 		dirty = false;
 	}
 
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		for (int iconIndexe : iconIndexes) {
 			output.writeByte(iconIndexe);
 		}
 		output.writeInt(textureIndex);
 		output.writeBoolean(isRouted);
@@ -124,11 +122,11 @@ public class TextureMatrix {
 		output.writeBoolean(hasPower);
 		output.writeBoolean(isFluid);
 		output.writeForgeDirection(pointedOrientation);
 	}
 
-	public void readData(LPDataInput input) throws IOException {
+	public void readData(LPDataInput input) {
 		for (int i = 0; i < iconIndexes.length; i++) {
 			int icon = input.readByte();
 			if (iconIndexes[i] != icon) {
 				iconIndexes[i] = icon;
 				dirty = true;
diff --git a/common/logisticspipes/request/resources/DictResource.java b/common/logisticspipes/request/resources/DictResource.java
index b62b8118..560228c7 100644
--- a/common/logisticspipes/request/resources/DictResource.java
+++ b/common/logisticspipes/request/resources/DictResource.java
@@ -1,8 +1,7 @@
 package logisticspipes.request.resources;
 
-import java.io.IOException;
 import java.util.BitSet;
 
 import net.minecraft.item.ItemStack;
 
 import com.google.common.base.Objects;
@@ -15,39 +14,39 @@ import logisticspipes.utils.string.ChatColor;
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class DictResource implements IResource {
 
-	public ItemIdentifierStack stack;
 	private final IRequestItems requester;
-
+	public ItemIdentifierStack stack;
 	//match all items with same oredict name
 	public boolean use_od = false;
 	//match all items with same id
 	public boolean ignore_dmg = false;
 	//match all items with same id and damage
 	public boolean ignore_nbt = false;
 	//match all items with same oredict prefix
 	public boolean use_category = false;
+	private Object ccObject;
 
 	public DictResource(ItemIdentifierStack stack, IRequestItems requester) {
 		this.stack = stack;
 		this.requester = requester;
 	}
 
-	public DictResource(LPDataInput input) throws IOException {
+	public DictResource(LPDataInput input) {
 		stack = input.readItemIdentifierStack();
 		requester = null;
 		BitSet bits = input.readBitSet();
 		use_od = bits.get(0);
 		ignore_dmg = bits.get(1);
 		ignore_nbt = bits.get(2);
 		use_category = bits.get(3);
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeItemIdentifierStack(stack);
 		BitSet bits = new BitSet();
 		bits.set(0, use_od);
 		bits.set(1, ignore_dmg);
 		bits.set(2, ignore_nbt);
@@ -159,20 +158,18 @@ public class DictResource implements IResource {
 		clone.ignore_nbt = ignore_nbt;
 		clone.use_category = use_category;
 		return clone;
 	}
 
-	private Object ccObject;
-
 	@Override
-	public void setCCType(Object type) {
-		ccObject = type;
+	public Object getCCType() {
+		return ccObject;
 	}
 
 	@Override
-	public Object getCCType() {
-		return ccObject;
+	public void setCCType(Object type) {
+		ccObject = type;
 	}
 
 	@Override
 	public String getDisplayText(ColorCode code) {
 		StringBuilder builder = new StringBuilder();
diff --git a/common/logisticspipes/request/resources/FluidResource.java b/common/logisticspipes/request/resources/FluidResource.java
index c1493350..f4aea0ce 100644
--- a/common/logisticspipes/request/resources/FluidResource.java
+++ b/common/logisticspipes/request/resources/FluidResource.java
@@ -1,9 +1,7 @@
 package logisticspipes.request.resources;
 
-import java.io.IOException;
-
 import logisticspipes.interfaces.routing.IRequestFluid;
 import logisticspipes.routing.IRouter;
 import logisticspipes.utils.FluidIdentifier;
 import logisticspipes.utils.item.ItemIdentifier;
 import logisticspipes.utils.item.ItemIdentifierStack;
@@ -12,27 +10,28 @@ import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class FluidResource implements IResource {
 
 	private final FluidIdentifier liquid;
-	private int amount;
 	private final IRequestFluid target;
+	private int amount;
+	private Object ccObject;
 
 	public FluidResource(FluidIdentifier liquid, int amount, IRequestFluid target) {
 		this.liquid = liquid;
 		this.amount = amount;
 		this.target = target;
 	}
 
-	public FluidResource(LPDataInput input) throws IOException {
+	public FluidResource(LPDataInput input) {
 		liquid = FluidIdentifier.get(input.readItemIdentifier());
 		amount = input.readInt();
 		target = null;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeItemIdentifier(liquid.getItemIdentifier());
 		output.writeInt(amount);
 	}
 
 	@Override
@@ -86,20 +85,18 @@ public class FluidResource implements IResource {
 	@Override
 	public IResource copyForDisplayWith(int amount) {
 		return new FluidResource(liquid, amount, null);
 	}
 
-	private Object ccObject;
-
 	@Override
-	public void setCCType(Object type) {
-		ccObject = type;
+	public Object getCCType() {
+		return ccObject;
 	}
 
 	@Override
-	public Object getCCType() {
-		return ccObject;
+	public void setCCType(Object type) {
+		ccObject = type;
 	}
 
 	@Override
 	public String getDisplayText(ColorCode code) {
 		StringBuilder builder = new StringBuilder();
diff --git a/common/logisticspipes/request/resources/IResource.java b/common/logisticspipes/request/resources/IResource.java
index bd32163d..ed65cc0e 100644
--- a/common/logisticspipes/request/resources/IResource.java
+++ b/common/logisticspipes/request/resources/IResource.java
@@ -1,9 +1,7 @@
 package logisticspipes.request.resources;
 
-import java.io.IOException;
-
 import cpw.mods.fml.relauncher.Side;
 import cpw.mods.fml.relauncher.SideOnly;
 
 import logisticspipes.proxy.computers.interfaces.ILPCCTypeHolder;
 import logisticspipes.routing.IRouter;
@@ -16,37 +14,37 @@ import network.rs485.logisticspipes.util.LPDataOutput;
  */
 public interface IResource extends ILPCCTypeHolder {
 
 	ItemIdentifier getAsItem();
 
-	/**
-	 * Settings only apply for the normal Item Implementation.
-	 */
-	enum MatchSettings {
-		NORMAL,
-		WITHOUT_NBT
-	}
-
 	int getRequestedAmount();
 
 	IRouter getRouter();
 
 	boolean matches(ItemIdentifier itemType, MatchSettings settings);
 
 	IResource clone(int multiplier);
 
-	void writeData(LPDataOutput output) throws IOException;
+	void writeData(LPDataOutput output);
 
 	boolean mergeForDisplay(IResource resource, int withAmount); //Amount overrides existing amount inside the resource
 
 	IResource copyForDisplayWith(int amount);
 
 	@SideOnly(Side.CLIENT)
 	String getDisplayText(ColorCode missing);
 
 	ItemIdentifierStack getDisplayItem();
 
+	/**
+	 * Settings only apply for the normal Item Implementation.
+	 */
+	enum MatchSettings {
+		NORMAL,
+		WITHOUT_NBT
+	}
+
 	enum ColorCode {
 		NONE,
 		MISSING,
 		SUCCESS
 	}
diff --git a/common/logisticspipes/request/resources/ItemResource.java b/common/logisticspipes/request/resources/ItemResource.java
index ff50d520..047432e5 100644
--- a/common/logisticspipes/request/resources/ItemResource.java
+++ b/common/logisticspipes/request/resources/ItemResource.java
@@ -1,9 +1,7 @@
 package logisticspipes.request.resources;
 
-import java.io.IOException;
-
 import logisticspipes.interfaces.routing.IRequestItems;
 import logisticspipes.routing.IRouter;
 import logisticspipes.utils.item.ItemIdentifier;
 import logisticspipes.utils.item.ItemIdentifierStack;
 import logisticspipes.utils.string.ChatColor;
@@ -12,23 +10,24 @@ import network.rs485.logisticspipes.util.LPDataOutput;
 
 public class ItemResource implements IResource {
 
 	private final ItemIdentifierStack stack;
 	private final IRequestItems requester;
+	private Object ccObject;
 
 	public ItemResource(ItemIdentifierStack stack, IRequestItems requester) {
 		this.stack = stack;
 		this.requester = requester;
 	}
 
-	public ItemResource(LPDataInput input) throws IOException {
+	public ItemResource(LPDataInput input) {
 		stack = input.readItemIdentifierStack();
 		requester = null;
 	}
 
 	@Override
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeItemIdentifierStack(stack);
 	}
 
 	@Override
 	public ItemIdentifier getAsItem() {
@@ -91,20 +90,18 @@ public class ItemResource implements IResource {
 		ItemIdentifierStack stack = this.stack.clone();
 		stack.setStackSize(amount);
 		return new ItemResource(stack, requester);
 	}
 
-	private Object ccObject;
-
 	@Override
-	public void setCCType(Object type) {
-		ccObject = type;
+	public Object getCCType() {
+		return ccObject;
 	}
 
 	@Override
-	public Object getCCType() {
-		return ccObject;
+	public void setCCType(Object type) {
+		ccObject = type;
 	}
 
 	@Override
 	public String getDisplayText(ColorCode code) {
 		StringBuilder builder = new StringBuilder();
diff --git a/common/logisticspipes/request/resources/ResourceNetwork.java b/common/logisticspipes/request/resources/ResourceNetwork.java
index 0dc23dcb..b1a93c28 100644
--- a/common/logisticspipes/request/resources/ResourceNetwork.java
+++ b/common/logisticspipes/request/resources/ResourceNetwork.java
@@ -1,39 +1,37 @@
 package logisticspipes.request.resources;
 
-import java.io.IOException;
-
 import network.rs485.logisticspipes.util.LPDataInput;
 import network.rs485.logisticspipes.util.LPDataOutput;
 
 public enum ResourceNetwork {
 	DictResource(DictResource.class) {
 		@Override
-		protected IResource readData(LPDataInput input) throws IOException {
+		protected IResource readData(LPDataInput input) {
 			return new DictResource(input);
 		}
 	},
 	ItemResource(ItemResource.class) {
 		@Override
-		protected IResource readData(LPDataInput input) throws IOException {
+		protected IResource readData(LPDataInput input) {
 			return new ItemResource(input);
 		}
 	},
 	FluidResource(FluidResource.class) {
 		@Override
-		protected IResource readData(LPDataInput input) throws IOException {
+		protected IResource readData(LPDataInput input) {
 			return new FluidResource(input);
 		}
 	};
 
 	private final Class<? extends IResource> clazz;
 
 	ResourceNetwork(Class<? extends IResource> clazz) {
 		this.clazz = clazz;
 	}
 
-	public static void writeResource(LPDataOutput output, IResource resource) throws IOException {
+	public static void writeResource(LPDataOutput output, IResource resource) {
 		if (resource == null) {
 			output.writeInt(-1);
 			return;
 		}
 		ResourceNetwork[] values = ResourceNetwork.values();
@@ -45,15 +43,15 @@ public enum ResourceNetwork {
 			}
 		}
 		throw new UnsupportedOperationException(resource.getClass().toString());
 	}
 
-	public static IResource readResource(LPDataInput input) throws IOException {
+	public static IResource readResource(LPDataInput input) {
 		int id = input.readInt();
 		if (id == -1) {
 			return null;
 		}
 		return ResourceNetwork.values()[id].readData(input);
 	}
 
-	protected abstract IResource readData(LPDataInput input) throws IOException;
+	protected abstract IResource readData(LPDataInput input);
 }
diff --git a/common/logisticspipes/routing/LaserData.java b/common/logisticspipes/routing/LaserData.java
index eaeec233..59639f96 100644
--- a/common/logisticspipes/routing/LaserData.java
+++ b/common/logisticspipes/routing/LaserData.java
@@ -1,8 +1,7 @@
 package logisticspipes.routing;
 
-import java.io.IOException;
 import java.util.EnumSet;
 
 import net.minecraftforge.common.util.ForgeDirection;
 
 import lombok.Data;
@@ -32,11 +31,11 @@ public class LaserData {
 	private EnumSet<PipeRoutingConnectionType> connectionType;
 	private boolean finalPipe = true;
 	private boolean startPipe = false;
 	private int length = 1;
 
-	public void writeData(LPDataOutput output) throws IOException {
+	public void writeData(LPDataOutput output) {
 		output.writeInt(posX);
 		output.writeInt(posY);
 		output.writeInt(posZ);
 		output.writeByte(dir.ordinal());
 		output.writeBoolean(finalPipe);
@@ -45,11 +44,11 @@ public class LaserData {
 		for (PipeRoutingConnectionType type : PipeRoutingConnectionType.values()) {
 			output.writeBoolean(connectionType.contains(type));
 		}
 	}
 
-	public LaserData readData(LPDataInput input) throws IOException {
+	public LaserData readData(LPDataInput input) {
 		posX = input.readInt();
 		posY = input.readInt();
 		posZ = input.readInt();
 		dir = ForgeDirection.values()[input.readByte()];
 		finalPipe = input.readBoolean();
diff --git a/common/logisticspipes/ticks/ClientPacketBufferHandlerThread.java b/common/logisticspipes/ticks/ClientPacketBufferHandlerThread.java
index c089ab34..baa1fdc6 100644
--- a/common/logisticspipes/ticks/ClientPacketBufferHandlerThread.java
+++ b/common/logisticspipes/ticks/ClientPacketBufferHandlerThread.java
@@ -21,10 +21,69 @@ import logisticspipes.proxy.MainProxy;
 import logisticspipes.utils.tuples.Pair;
 import network.rs485.logisticspipes.util.LPDataIOWrapper;
 
 public class ClientPacketBufferHandlerThread {
 
+	private final ClientCompressorThread clientCompressorThread = new ClientCompressorThread();
+	private final ClientDecompressorThread clientDecompressorThread = new ClientDecompressorThread();
+
+	public ClientPacketBufferHandlerThread() {}
+
+	private static byte[] compress(byte[] content) {
+		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+		try {
+			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
+			gzipOutputStream.write(content);
+			gzipOutputStream.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return byteArrayOutputStream.toByteArray();
+	}
+
+	private static byte[] decompress(byte[] contentBytes) {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		try {
+			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
+			int buffer = 0;
+			while ((buffer = gzip.read()) != -1) {
+				out.write(buffer);
+			}
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return out.toByteArray();
+	}
+
+	public void clientTick(ClientTickEvent event) {
+		if (event.phase != Phase.END) {
+			return;
+		}
+		clientDecompressorThread.clientTickEnd();
+	}
+
+	public void setPause(boolean flag) {
+		clientCompressorThread.setPause(flag);
+	}
+
+	public void addPacketToCompressor(ModernPacket packet) {
+		clientCompressorThread.addPacketToCompressor(packet);
+	}
+
+	public void handlePacket(byte[] content) {
+		clientDecompressorThread.handlePacket(content);
+	}
+
+	public void clear() {
+		clientCompressorThread.clear();
+		clientDecompressorThread.clear();
+	}
+
+	public void queueFailedPacket(ModernPacket packet, EntityPlayer player) {
+		clientDecompressorThread.queueFailedPacket(packet, player);
+	}
+
 	private class ClientCompressorThread extends Thread {
 
 		//list of C->S packets to be serialized and compressed
 		private final LinkedList<ModernPacket> clientList = new LinkedList<>();
 		//serialized but still uncompressed C->S data
@@ -43,50 +102,46 @@ public class ClientPacketBufferHandlerThread {
 		}
 
 		@Override
 		public void run() {
 			while (true) {
-				try {
-					synchronized (clientList) {
-						if (!pause && clientList.size() > 0) {
-							clientBuffer = LPDataIOWrapper.collectData(output -> {
-								output.writeBytes(clientBuffer);
-								clearLock.lock();
-								try {
-									for (ModernPacket packet : clientList) {
-										output.writeShort(packet.getId());
-										output.writeInt(packet.getDebugId());
-										packet.writeData(output);
-									}
-								} finally {
-									clientList.clear();
-									clearLock.unlock();
+				synchronized (clientList) {
+					if (!pause && clientList.size() > 0) {
+						clientBuffer = LPDataIOWrapper.collectData(output -> {
+							output.writeBytes(clientBuffer);
+							clearLock.lock();
+							try {
+								for (ModernPacket packet : clientList) {
+									output.writeShort(packet.getId());
+									output.writeInt(packet.getDebugId());
+									packet.writeData(output);
 								}
-							});
-						}
+							} finally {
+								clientList.clear();
+								clearLock.unlock();
+							}
+						});
 					}
-					//Send Content
-					if (clientBuffer.length > 0) {
-						while (clientBuffer.length > 1024 * 32) {
-							byte[] sendbuffer = Arrays.copyOf(clientBuffer, 1024 * 32);
-							clientBuffer = Arrays.copyOfRange(clientBuffer, 1024 * 32, clientBuffer.length);
-							byte[] compressed = ClientPacketBufferHandlerThread.compress(sendbuffer);
-							MainProxy.sendPacketToServer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed));
-						}
-						byte[] sendbuffer = clientBuffer;
-						clientBuffer = new byte[] {};
+				}
+				//Send Content
+				if (clientBuffer.length > 0) {
+					while (clientBuffer.length > 1024 * 32) {
+						byte[] sendbuffer = Arrays.copyOf(clientBuffer, 1024 * 32);
+						clientBuffer = Arrays.copyOfRange(clientBuffer, 1024 * 32, clientBuffer.length);
 						byte[] compressed = ClientPacketBufferHandlerThread.compress(sendbuffer);
 						MainProxy.sendPacketToServer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed));
 					}
-				} catch (IOException e) {
-					e.printStackTrace();
+					byte[] sendbuffer = clientBuffer;
+					clientBuffer = new byte[] {};
+					byte[] compressed = ClientPacketBufferHandlerThread.compress(sendbuffer);
+					MainProxy.sendPacketToServer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed));
 				}
 				synchronized (clientList) {
 					while (pause || clientList.size() == 0) {
 						try {
 							clientList.wait();
-						} catch (InterruptedException e) {}
+						} catch (InterruptedException ignored) { }
 					}
 				}
 				if (clear) {
 					clear = false;
 					clientBuffer = new byte[] {};
@@ -124,41 +179,34 @@ public class ClientPacketBufferHandlerThread {
 				}
 			}.start();
 		}
 	}
 
-	private final ClientCompressorThread clientCompressorThread = new ClientCompressorThread();
-
 	private class ClientDecompressorThread extends Thread {
 
 		//Received compressed S->C data
 		private final LinkedList<byte[]> queue = new LinkedList<>();
-		//decompressed serialized S->C data
-		private byte[] ByteBuffer = new byte[] {};
 		//FIFO for deserialized S->C packets, decompressor adds, tickEnd removes
 		private final LinkedList<Pair<EntityPlayer, byte[]>> PacketBuffer = new LinkedList<>();
 		private final ReentrantLock packetBufferLock = new ReentrantLock();
 		//List of packets that that should be reattempted to apply in the next tick
 		private final LinkedList<Pair<EntityPlayer, ModernPacket>> retryPackets = new LinkedList<>();
+		//decompressed serialized S->C data
+		private byte[] ByteBuffer = new byte[] {};
 		//Clear content on next tick
 		private boolean clear = false;
 
 		public ClientDecompressorThread() {
 			super("LogisticsPipes Packet Decompressor Client");
 			setDaemon(true);
 			start();
 		}
 
 		private void handlePacketData(final Pair<EntityPlayer, byte[]> playerDataPair) {
-			try {
-				LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
-					PacketHandler.onPacketData(input, playerDataPair.getValue1());
-				});
-			} catch (IOException e) {
-				System.err.println("IO Error in handlePacketData for player " + playerDataPair.getValue1().getCommandSenderName());
-				e.printStackTrace();
-			}
+			LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
+				PacketHandler.onPacketData(input, playerDataPair.getValue1());
+			});
 		}
 
 		public void clientTickEnd() {
 			Pair<EntityPlayer, byte[]> part = null;
 			while (true) {
@@ -218,11 +266,11 @@ public class ClientPacketBufferHandlerThread {
 				}
 				synchronized (queue) {
 					while (queue.size() == 0) {
 						try {
 							queue.wait();
-						} catch (InterruptedException e) { }
+						} catch (InterruptedException ignored) { }
 					}
 				}
 				if (clear) {
 					clear = false;
 					ByteBuffer = new byte[] {};
@@ -245,64 +293,6 @@ public class ClientPacketBufferHandlerThread {
 
 		public void queueFailedPacket(ModernPacket packet, EntityPlayer player) {
 			retryPackets.add(new Pair<>(player, packet));
 		}
 	}
-
-	private final ClientDecompressorThread clientDecompressorThread = new ClientDecompressorThread();
-
-	public ClientPacketBufferHandlerThread() {}
-
-	public void clientTick(ClientTickEvent event) {
-		if (event.phase != Phase.END) {
-			return;
-		}
-		clientDecompressorThread.clientTickEnd();
-	}
-
-	public void setPause(boolean flag) {
-		clientCompressorThread.setPause(flag);
-	}
-
-	public void addPacketToCompressor(ModernPacket packet) {
-		clientCompressorThread.addPacketToCompressor(packet);
-	}
-
-	public void handlePacket(byte[] content) {
-		clientDecompressorThread.handlePacket(content);
-	}
-
-	private static byte[] compress(byte[] content) {
-		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-		try {
-			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
-			gzipOutputStream.write(content);
-			gzipOutputStream.close();
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		return byteArrayOutputStream.toByteArray();
-	}
-
-	private static byte[] decompress(byte[] contentBytes) {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		try {
-			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
-			int buffer = 0;
-			while ((buffer = gzip.read()) != -1) {
-				out.write(buffer);
-			}
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		return out.toByteArray();
-	}
-
-	public void clear() {
-		clientCompressorThread.clear();
-		clientDecompressorThread.clear();
-	}
-
-	public void queueFailedPacket(ModernPacket packet, EntityPlayer player) {
-		clientDecompressorThread.queueFailedPacket(packet, player);
-	}
 }
diff --git a/common/logisticspipes/ticks/ServerPacketBufferHandlerThread.java b/common/logisticspipes/ticks/ServerPacketBufferHandlerThread.java
index 3bda77d2..a38d70b9 100644
--- a/common/logisticspipes/ticks/ServerPacketBufferHandlerThread.java
+++ b/common/logisticspipes/ticks/ServerPacketBufferHandlerThread.java
@@ -24,10 +24,71 @@ import logisticspipes.proxy.MainProxy;
 import logisticspipes.utils.tuples.Pair;
 import network.rs485.logisticspipes.util.LPDataIOWrapper;
 
 public class ServerPacketBufferHandlerThread {
 
+	private final ServerCompressorThread serverCompressorThread = new ServerCompressorThread();
+	private final ServerDecompressorThread serverDecompressorThread = new ServerDecompressorThread();
+
+	public ServerPacketBufferHandlerThread() {}
+
+	private static byte[] compress(byte[] content) {
+		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+		try {
+			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
+			gzipOutputStream.write(content);
+			gzipOutputStream.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return byteArrayOutputStream.toByteArray();
+	}
+
+	private static byte[] decompress(byte[] contentBytes) {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		try {
+			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
+			int buffer = 0;
+			while ((buffer = gzip.read()) != -1) {
+				out.write(buffer);
+			}
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return out.toByteArray();
+	}
+
+	public void serverTick(ServerTickEvent event) {
+		if (event.phase != Phase.END) {
+			return;
+		}
+		serverDecompressorThread.serverTickEnd();
+	}
+
+	public void setPause(boolean flag) {
+		serverCompressorThread.setPause(flag);
+	}
+
+	public void addPacketToCompressor(ModernPacket packet, EntityPlayer player) {
+		serverCompressorThread.addPacketToCompressor(packet, player);
+	}
+
+	public void handlePacket(byte[] content, EntityPlayer player) {
+		serverDecompressorThread.handlePacket(content, player);
+	}
+
+	public void clear(final EntityPlayer player) {
+		new Thread() {
+
+			@Override
+			public void run() {
+				serverCompressorThread.clear(player);
+				serverDecompressorThread.clear(player);
+			}
+		}.start();
+	}
+
 	private class ServerCompressorThread extends Thread {
 
 		//Map of Players to lists of S->C packets to be serialized and compressed
 		private final HashMap<EntityPlayer, LinkedList<ModernPacket>> serverList = new HashMap<>();
 		//Map of Players to serialized but still uncompressed S->C data
@@ -44,57 +105,53 @@ public class ServerPacketBufferHandlerThread {
 		}
 
 		@Override
 		public void run() {
 			while (true) {
-				try {
-					synchronized (serverList) {
-						if (!pause) {
-							for (Entry<EntityPlayer, LinkedList<ModernPacket>> playerPacketEntry : serverList.entrySet()) {
-								EntityPlayer player = playerPacketEntry.getKey();
-								serverBuffer.put(player, LPDataIOWrapper.collectData(output -> {
-									if (serverBuffer.containsKey(player)) {
-										output.writeBytes(serverBuffer.get(player));
-									}
+				synchronized (serverList) {
+					if (!pause) {
+						for (Entry<EntityPlayer, LinkedList<ModernPacket>> playerPacketEntry : serverList.entrySet()) {
+							EntityPlayer player = playerPacketEntry.getKey();
+							serverBuffer.put(player, LPDataIOWrapper.collectData(output -> {
+								if (serverBuffer.containsKey(player)) {
+									output.writeBytes(serverBuffer.get(player));
+								}
 
-									LinkedList<ModernPacket> packets = playerPacketEntry.getValue();
-									try {
-										for (ModernPacket packet : packets) {
-											output.writeShort(packet.getId());
-											output.writeInt(packet.getDebugId());
-											packet.writeData(output);
-										}
-									} finally {
-										packets.clear();
+								LinkedList<ModernPacket> packets = playerPacketEntry.getValue();
+								try {
+									for (ModernPacket packet : packets) {
+										output.writeShort(packet.getId());
+										output.writeInt(packet.getDebugId());
+										packet.writeData(output);
 									}
-								}));
-							}
-							serverList.clear();
+								} finally {
+									packets.clear();
+								}
+							}));
 						}
+						serverList.clear();
 					}
-					//Send Content
-					for (Entry<EntityPlayer, byte[]> player : serverBuffer.entrySet()) {
-						while (player.getValue().length > 32 * 1024) {
-							byte[] sendbuffer = Arrays.copyOf(player.getValue(), 1024 * 32);
-							byte[] newbuffer = Arrays.copyOfRange(player.getValue(), 1024 * 32, player.getValue().length);
-							player.setValue(newbuffer);
-							byte[] compressed = ServerPacketBufferHandlerThread.compress(sendbuffer);
-							MainProxy.sendPacketToPlayer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed), player.getKey());
-						}
-						byte[] sendbuffer = player.getValue();
+				}
+				//Send Content
+				for (Entry<EntityPlayer, byte[]> player : serverBuffer.entrySet()) {
+					while (player.getValue().length > 32 * 1024) {
+						byte[] sendbuffer = Arrays.copyOf(player.getValue(), 1024 * 32);
+						byte[] newbuffer = Arrays.copyOfRange(player.getValue(), 1024 * 32, player.getValue().length);
+						player.setValue(newbuffer);
 						byte[] compressed = ServerPacketBufferHandlerThread.compress(sendbuffer);
 						MainProxy.sendPacketToPlayer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed), player.getKey());
 					}
-				} catch (IOException e) {
-					e.printStackTrace();
+					byte[] sendbuffer = player.getValue();
+					byte[] compressed = ServerPacketBufferHandlerThread.compress(sendbuffer);
+					MainProxy.sendPacketToPlayer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed), player.getKey());
 				}
 				serverBuffer.clear();
 				synchronized (serverList) {
 					while (pause || serverList.size() == 0) {
 						try {
 							serverList.wait();
-						} catch (InterruptedException e) {}
+						} catch (InterruptedException ignored) { }
 					}
 				}
 				synchronized (playersToClear) {
 					EntityPlayer player = null;
 					do {
@@ -138,12 +195,10 @@ public class ServerPacketBufferHandlerThread {
 				playersToClear.add(player);
 			}
 		}
 	}
 
-	private final ServerCompressorThread serverCompressorThread = new ServerCompressorThread();
-
 	private class ServerDecompressorThread extends Thread {
 
 		//Map of Player to received compressed C->S data
 		private final HashMap<EntityPlayer, LinkedList<byte[]>> queue = new HashMap<>();
 		//Map of Player to decompressed serialized C->S data
@@ -159,18 +214,13 @@ public class ServerPacketBufferHandlerThread {
 			setDaemon(true);
 			start();
 		}
 
 		private void handlePacketData(final Pair<EntityPlayer, byte[]> playerDataPair) {
-			try {
-				LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
-					PacketHandler.onPacketData(input, playerDataPair.getValue1());
-				});
-			} catch (IOException e) {
-				System.err.println("IO Error in handlePacketData for player " + playerDataPair.getValue1().getCommandSenderName());
-				e.printStackTrace();
-			}
+			LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
+				PacketHandler.onPacketData(input, playerDataPair.getValue1());
+			});
 		}
 
 		public void serverTickEnd() {
 			Pair<EntityPlayer, byte[]> part = null;
 			while (true) {
@@ -260,11 +310,11 @@ public class ServerPacketBufferHandlerThread {
 
 				synchronized (queue) {
 					while (queue.size() == 0) {
 						try {
 							queue.wait();
-						} catch (InterruptedException e) {}
+						} catch (InterruptedException ignored) { }
 					}
 				}
 				synchronized (playersToClear) {
 					EntityPlayer player = null;
 					do {
@@ -296,66 +346,6 @@ public class ServerPacketBufferHandlerThread {
 			synchronized (playersToClear) {
 				playersToClear.add(player);
 			}
 		}
 	}
-
-	private final ServerDecompressorThread serverDecompressorThread = new ServerDecompressorThread();
-
-	public ServerPacketBufferHandlerThread() {}
-
-	public void serverTick(ServerTickEvent event) {
-		if (event.phase != Phase.END) {
-			return;
-		}
-		serverDecompressorThread.serverTickEnd();
-	}
-
-	public void setPause(boolean flag) {
-		serverCompressorThread.setPause(flag);
-	}
-
-	public void addPacketToCompressor(ModernPacket packet, EntityPlayer player) {
-		serverCompressorThread.addPacketToCompressor(packet, player);
-	}
-
-	public void handlePacket(byte[] content, EntityPlayer player) {
-		serverDecompressorThread.handlePacket(content, player);
-	}
-
-	private static byte[] compress(byte[] content) {
-		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-		try {
-			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
-			gzipOutputStream.write(content);
-			gzipOutputStream.close();
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		return byteArrayOutputStream.toByteArray();
-	}
-
-	private static byte[] decompress(byte[] contentBytes) {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		try {
-			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
-			int buffer = 0;
-			while ((buffer = gzip.read()) != -1) {
-				out.write(buffer);
-			}
-		} catch (IOException e) {
-			throw new RuntimeException(e);
-		}
-		return out.toByteArray();
-	}
-
-	public void clear(final EntityPlayer player) {
-		new Thread() {
-
-			@Override
-			public void run() {
-				serverCompressorThread.clear(player);
-				serverDecompressorThread.clear(player);
-			}
-		}.start();
-	}
 }
diff --git a/common/network/rs485/logisticspipes/util/LPDataIOWrapper.java b/common/network/rs485/logisticspipes/util/LPDataIOWrapper.java
index 353af4c0..71ffc948 100644
--- a/common/network/rs485/logisticspipes/util/LPDataIOWrapper.java
+++ b/common/network/rs485/logisticspipes/util/LPDataIOWrapper.java
@@ -87,30 +87,21 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		} else {
 			return new LPDataIOWrapper(buffer);
 		}
 	}
 
-	private void unsetBuffer() {
-		if (localBuffer.hasMemoryAddress()) {
-			if (--reference < 1) {
-				BUFFER_WRAPPER_MAP.remove(localBuffer.memoryAddress());
-			}
-		}
-		localBuffer = null;
-	}
-
-	public static void provideData(byte[] data, LPDataInputConsumer dataInputConsumer) throws IOException {
+	public static void provideData(byte[] data, LPDataInputConsumer dataInputConsumer) {
 		ByteBuf dataBuffer = wrappedBuffer(data);
 		LPDataIOWrapper lpData = getInstance(dataBuffer);
 
 		dataInputConsumer.accept(lpData);
 
 		lpData.unsetBuffer();
 		dataBuffer.release();
 	}
 
-	public static byte[] collectData(LPDataOutputConsumer dataOutputConsumer) throws IOException {
+	public static byte[] collectData(LPDataOutputConsumer dataOutputConsumer) {
 		ByteBuf dataBuffer = buffer();
 		LPDataIOWrapper lpData = getInstance(dataBuffer);
 
 		dataOutputConsumer.accept(lpData);
 
@@ -121,38 +112,47 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 
 		dataBuffer.release();
 		return data;
 	}
 
-	public static void provideData(ByteBuf dataBuffer, LPDataInputConsumer dataInputConsumer) throws IOException {
+	public static void provideData(ByteBuf dataBuffer, LPDataInputConsumer dataInputConsumer) {
 		LPDataIOWrapper lpData = getInstance(dataBuffer);
 
 		dataInputConsumer.accept(lpData);
 
 		lpData.unsetBuffer();
 	}
 
-	public static void writeData(ByteBuf dataBuffer, LPDataOutputConsumer dataOutputConsumer) throws IOException {
+	public static void writeData(ByteBuf dataBuffer, LPDataOutputConsumer dataOutputConsumer) {
 		LPDataIOWrapper lpData = getInstance(dataBuffer);
 
 		dataOutputConsumer.accept(lpData);
 
 		lpData.unsetBuffer();
 	}
 
+	private void unsetBuffer() {
+		if (localBuffer.hasMemoryAddress()) {
+			if (--reference < 1) {
+				BUFFER_WRAPPER_MAP.remove(localBuffer.memoryAddress());
+			}
+		}
+		localBuffer = null;
+	}
+
 	@Override
-	public void writeByteArray(byte[] arr) throws IOException {
+	public void writeByteArray(byte[] arr) {
 		if (arr == null) {
 			writeInt(-1);
 		} else {
 			writeInt(arr.length);
 			writeBytes(arr);
 		}
 	}
 
 	@Override
-	public byte[] readByteArray() throws IOException {
+	public byte[] readByteArray() {
 		final int length = readInt();
 		if (length == -1) {
 			return null;
 		}
 
@@ -203,11 +203,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 	public void writeBoolean(boolean b) {
 		localBuffer.writeBoolean(b);
 	}
 
 	@Override
-	public void writeUTF(String s) throws IOException {
+	public void writeUTF(String s) {
 		if (s == null) {
 			writeInt(-1);
 		} else {
 			writeByteArray(s.getBytes(UTF_8));
 		}
@@ -221,11 +221,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 			writeByte(direction.ordinal());
 		}
 	}
 
 	@Override
-	public void writeExitRoute(ExitRoute route) throws IOException {
+	public void writeExitRoute(ExitRoute route) {
 		writeIRouter(route.destination);
 		writeIRouter(route.root);
 		writeForgeDirection(route.exitOrientation);
 		writeForgeDirection(route.insertOrientation);
 		writeEnumSet(route.connectionDetails, PipeRoutingConnectionType.class);
@@ -255,11 +255,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		writeDouble(pos.getYCoord());
 		writeDouble(pos.getZCoord());
 	}
 
 	@Override
-	public <T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) throws IOException {
+	public <T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) {
 		T[] parts = clazz.getEnumConstants();
 		final int length = parts.length / 8 + (parts.length % 8 == 0 ? 0 : 1);
 		byte[] set = new byte[length];
 
 		for (T part : parts) {
@@ -270,29 +270,34 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		writeByteArray(set);
 	}
 
 	@Override
-	public void writeBitSet(BitSet bits) throws IOException {
+	public void writeBitSet(BitSet bits) {
 		if (bits == null) {
 			throw new NullPointerException("BitSet may not be null");
 		}
 		writeByteArray(bits.toByteArray());
 	}
 
 	@Override
-	public void writeNBTTagCompound(NBTTagCompound tag) throws IOException {
+	public void writeNBTTagCompound(NBTTagCompound tag) {
 		if (tag == null) {
 			writeByte(0);
 		} else {
 			writeByte(1);
-			CompressedStreamTools.write(tag, new ByteBufOutputStream(localBuffer));
+			try {
+				CompressedStreamTools.write(tag, new ByteBufOutputStream(localBuffer));
+			} catch (IOException e) {
+
+				e.printStackTrace();
+			}
 		}
 	}
 
 	@Override
-	public void writeBooleanArray(boolean[] arr) throws IOException {
+	public void writeBooleanArray(boolean[] arr) {
 		if (arr == null) {
 			writeInt(-1);
 		} else if (arr.length == 0) {
 			writeInt(0);
 			writeByteArray(null);
@@ -317,11 +322,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 			}
 		}
 	}
 
 	@Override
-	public void writeItemStack(ItemStack itemstack) throws IOException {
+	public void writeItemStack(ItemStack itemstack) {
 		if (itemstack == null) {
 			writeInt(0);
 		} else {
 			writeInt(Item.getIdFromItem(itemstack.getItem()));
 			writeInt(itemstack.stackSize);
@@ -329,32 +334,32 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 			writeNBTTagCompound(itemstack.getTagCompound());
 		}
 	}
 
 	@Override
-	public void writeItemIdentifier(ItemIdentifier item) throws IOException {
+	public void writeItemIdentifier(ItemIdentifier item) {
 		if (item == null) {
 			writeInt(0);
 		} else {
 			writeInt(Item.getIdFromItem(item.item));
 			writeInt(item.itemDamage);
 			writeNBTTagCompound(item.tag);
 		}
 	}
 
 	@Override
-	public void writeItemIdentifierStack(ItemIdentifierStack stack) throws IOException {
+	public void writeItemIdentifierStack(ItemIdentifierStack stack) {
 		if (stack == null) {
 			writeInt(-1);
 		} else {
 			writeInt(stack.getStackSize());
 			writeItemIdentifier(stack.getItem());
 		}
 	}
 
 	@Override
-	public <T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) throws IOException {
+	public <T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) {
 		if (collection == null) {
 			writeInt(-1);
 		} else {
 			writeInt(collection.size());
 			for (T obj : collection) {
@@ -362,11 +367,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 			}
 		}
 	}
 
 	@Override
-	public void writeOrderInfo(IOrderInfoProvider order) throws IOException {
+	public void writeOrderInfo(IOrderInfoProvider order) {
 		writeItemIdentifierStack(order.getAsDisplayItem());
 		writeInt(order.getRouterId());
 		writeBoolean(order.isFinished());
 		writeBoolean(order.isInProgress());
 		writeEnum(order.getType());
@@ -380,11 +385,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 	public <T extends Enum<T>> void writeEnum(T obj) {
 		writeInt(obj.ordinal());
 	}
 
 	@Override
-	public void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) throws IOException {
+	public void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) {
 		writeCollection(orderList, LPDataOutput::writeOrderInfo);
 		writeCollection(orderList.getSubOrders(), LPDataOutput::writeLinkedLogisticsOrderList);
 	}
 
 	@Override
@@ -408,16 +413,16 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 			}
 		}
 	}
 
 	@Override
-	public void writeResource(IResource res) throws IOException {
+	public void writeResource(IResource res) {
 		ResourceNetwork.writeResource(this, res);
 	}
 
 	@Override
-	public void writeBytes(byte[] arr) throws IOException {
+	public void writeBytes(byte[] arr) {
 		localBuffer.writeBytes(arr);
 	}
 
 	@Override
 	public byte readByte() {
@@ -453,11 +458,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 	public boolean readBoolean() {
 		return localBuffer.readBoolean();
 	}
 
 	@Override
-	public String readUTF() throws IOException {
+	public String readUTF() {
 		byte[] arr = readByteArray();
 		if (arr == null) {
 			return null;
 		} else {
 			return new String(arr, UTF_8);
@@ -473,11 +478,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		return ForgeDirection.values()[b];
 	}
 
 	@Override
-	public ExitRoute readExitRoute(World world) throws IOException {
+	public ExitRoute readExitRoute(World world) {
 		IRouter destination = readIRouter(world);
 		IRouter root = readIRouter(world);
 		ForgeDirection exitOri = readForgeDirection();
 		ForgeDirection insertOri = readForgeDirection();
 		EnumSet<PipeRoutingConnectionType> connectionDetails = readEnumSet(PipeRoutingConnectionType.class);
@@ -511,11 +516,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 	public DoubleCoordinates readLPPosition() {
 		return new DoubleCoordinates(localBuffer.readDouble(), localBuffer.readDouble(), localBuffer.readDouble());
 	}
 
 	@Override
-	public <T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) throws IOException {
+	public <T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) {
 		EnumSet<T> types = EnumSet.noneOf(clazz);
 		byte[] arr = readByteArray();
 		if (arr != null) {
 			T[] parts = clazz.getEnumConstants();
 			for (T part : parts) {
@@ -526,31 +531,36 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		return types;
 	}
 
 	@Override
-	public BitSet readBitSet() throws IOException {
+	public BitSet readBitSet() {
 		byte[] arr = readByteArray();
 		if (arr == null) {
 			return new BitSet();
 		} else {
 			return BitSet.valueOf(arr);
 		}
 	}
 
 	@Override
-	public NBTTagCompound readNBTTagCompound() throws IOException {
+	public NBTTagCompound readNBTTagCompound() {
 		boolean isEmpty = (readByte() == 0);
 		if (isEmpty) {
 			return null;
 		}
 
-		return CompressedStreamTools.func_152456_a(new ByteBufInputStream(localBuffer), NBTSizeTracker.field_152451_a);
+		try {
+			return CompressedStreamTools.func_152456_a(new ByteBufInputStream(localBuffer), NBTSizeTracker.field_152451_a);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
 	}
 
 	@Override
-	public boolean[] readBooleanArray() throws IOException {
+	public boolean[] readBooleanArray() {
 		final int bitCount = localBuffer.readInt();
 		if (bitCount == -1) {
 			return null;
 		}
 
@@ -579,18 +589,18 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		IntStream.range(0, length).forEach(i -> arr[i] = localBuffer.readInt());
 		return arr;
 	}
 
 	@Override
-	public byte[] readBytes(int length) throws IOException {
+	public byte[] readBytes(int length) {
 		byte[] arr = new byte[length];
 		localBuffer.readBytes(arr, 0, length);
 		return arr;
 	}
 
 	@Override
-	public ItemStack readItemStack() throws IOException {
+	public ItemStack readItemStack() {
 		final int itemId = readInt();
 		if (itemId == 0) {
 			return null;
 		}
 
@@ -600,11 +610,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		stack.setTagCompound(readNBTTagCompound());
 		return stack;
 	}
 
 	@Override
-	public ItemIdentifier readItemIdentifier() throws IOException {
+	public ItemIdentifier readItemIdentifier() {
 		final int itemId = readInt();
 		if (itemId == 0) {
 			return null;
 		}
 
@@ -612,22 +622,22 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		NBTTagCompound tag = readNBTTagCompound();
 		return ItemIdentifier.get(Item.getItemById(itemId), damage, tag);
 	}
 
 	@Override
-	public ItemIdentifierStack readItemIdentifierStack() throws IOException {
+	public ItemIdentifierStack readItemIdentifierStack() {
 		int stacksize = readInt();
 		if (stacksize == -1) {
 			return null;
 		}
 
 		ItemIdentifier item = readItemIdentifier();
 		return new ItemIdentifierStack(item, stacksize);
 	}
 
 	@Override
-	public <T> ArrayList<T> readArrayList(IReadListObject<T> reader) throws IOException {
+	public <T> ArrayList<T> readArrayList(IReadListObject<T> reader) {
 		int size = readInt();
 		if (size == -1) {
 			return null;
 		}
 
@@ -637,11 +647,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		return list;
 	}
 
 	@Override
-	public <T> LinkedList<T> readLinkedList(IReadListObject<T> reader) throws IOException {
+	public <T> LinkedList<T> readLinkedList(IReadListObject<T> reader) {
 		int size = readInt();
 		if (size == -1) {
 			return null;
 		}
 
@@ -651,11 +661,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		return list;
 	}
 
 	@Override
-	public <T> Set<T> readSet(IReadListObject<T> handler) throws IOException {
+	public <T> Set<T> readSet(IReadListObject<T> handler) {
 		int size = readInt();
 		if (size == -1) {
 			return null;
 		}
 
@@ -665,11 +675,11 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		}
 		return set;
 	}
 
 	@Override
-	public IOrderInfoProvider readOrderInfo() throws IOException {
+	public IOrderInfoProvider readOrderInfo() {
 		ItemIdentifierStack stack = readItemIdentifierStack();
 		int routerId = localBuffer.readInt();
 		boolean isFinished = localBuffer.readBoolean();
 		boolean inProgress = localBuffer.readBoolean();
 		IOrderInfoProvider.ResourceType type = readEnum(IOrderInfoProvider.ResourceType.class);
@@ -684,30 +694,30 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 	public <T extends Enum<T>> T readEnum(Class<T> clazz) {
 		return clazz.getEnumConstants()[localBuffer.readInt()];
 	}
 
 	@Override
-	public LinkedLogisticsOrderList readLinkedLogisticsOrderList() throws IOException {
+	public LinkedLogisticsOrderList readLinkedLogisticsOrderList() {
 		LinkedLogisticsOrderList list = new LinkedLogisticsOrderList();
 
 		List<IOrderInfoProvider> orderInfoProviders = readArrayList(LPDataInput::readOrderInfo);
 		if (orderInfoProviders == null) {
-			throw new IOException("Expected order info provider list");
+			throw new NullPointerException("Expected order info provider list");
 		}
 		list.addAll(orderInfoProviders);
 
 		List<LinkedLogisticsOrderList> orderLists = readArrayList(LPDataInput::readLinkedLogisticsOrderList);
 		if (orderLists == null) {
-			throw new IOException("Expected logistics order list");
+			throw new NullPointerException("Expected logistics order list");
 		}
 		list.getSubOrders().addAll(orderLists);
 
 		return list;
 	}
 
 	@Override
-	public ByteBuf readByteBuf() throws IOException {
+	public ByteBuf readByteBuf() {
 		byte[] arr = readByteArray();
 		if (arr == null) {
 			throw new NullPointerException("Buffer may not be null, but read null");
 		} else {
 			return wrappedBuffer(arr);
@@ -725,9 +735,9 @@ public final class LPDataIOWrapper implements LPDataInput, LPDataOutput {
 		IntStream.range(0, length).forEach(i -> arr[i] = localBuffer.readLong());
 		return arr;
 	}
 
 	@Override
-	public IResource readResource() throws IOException {
+	public IResource readResource() {
 		return ResourceNetwork.readResource(this);
 	}
 }
diff --git a/common/network/rs485/logisticspipes/util/LPDataInput.java b/common/network/rs485/logisticspipes/util/LPDataInput.java
index c114653d..b6a85070 100644
--- a/common/network/rs485/logisticspipes/util/LPDataInput.java
+++ b/common/network/rs485/logisticspipes/util/LPDataInput.java
@@ -18,11 +18,10 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
 package network.rs485.logisticspipes.util;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.EnumSet;
 import java.util.LinkedList;
 import java.util.Set;
@@ -44,99 +43,99 @@ import logisticspipes.utils.item.ItemIdentifier;
 import logisticspipes.utils.item.ItemIdentifierStack;
 import network.rs485.logisticspipes.world.DoubleCoordinates;
 
 public interface LPDataInput {
 
-	byte[] readByteArray() throws IOException;
+	byte[] readByteArray();
 
 	/**
 	 * @see java.io.DataInput#readByte()
 	 */
-	byte readByte() throws IOException;
+	byte readByte();
 
 	/**
 	 * @see java.io.DataInput#readShort()
 	 */
-	short readShort() throws IOException;
+	short readShort();
 
 	/**
 	 * @see java.io.DataInput#readInt()
 	 */
-	int readInt() throws IOException;
+	int readInt();
 
 	/**
 	 * @see java.io.DataInput#readLong()
 	 */
-	long readLong() throws IOException;
+	long readLong();
 
 	/**
 	 * @see java.io.DataInput#readFloat()
 	 */
-	float readFloat() throws IOException;
+	float readFloat();
 
 	/**
 	 * @see java.io.DataInput#readDouble()
 	 */
-	double readDouble() throws IOException;
+	double readDouble();
 
 	/**
 	 * @see java.io.DataInput#readBoolean()
 	 */
-	boolean readBoolean() throws IOException;
+	boolean readBoolean();
 
 	/**
 	 * @see java.io.DataInput#readUTF()
 	 */
-	String readUTF() throws IOException;
+	String readUTF();
 
-	ForgeDirection readForgeDirection() throws IOException;
+	ForgeDirection readForgeDirection();
 
-	ExitRoute readExitRoute(World world) throws IOException;
+	ExitRoute readExitRoute(World world);
 
 	/**
 	 * @return ServerRouter or ClientRouter depending where we are
 	 */
-	IRouter readIRouter(World world) throws IOException;
+	IRouter readIRouter(World world);
 
-	DoubleCoordinates readLPPosition() throws IOException;
+	DoubleCoordinates readLPPosition();
 
-	<T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) throws IOException;
+	<T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz);
 
-	BitSet readBitSet() throws IOException;
+	BitSet readBitSet();
 
-	NBTTagCompound readNBTTagCompound() throws IOException;
+	NBTTagCompound readNBTTagCompound();
 
-	boolean[] readBooleanArray() throws IOException;
+	boolean[] readBooleanArray();
 
-	int[] readIntArray() throws IOException;
+	int[] readIntArray();
 
-	byte[] readBytes(int length) throws IOException;
+	byte[] readBytes(int length);
 
-	ItemIdentifier readItemIdentifier() throws IOException;
+	ItemIdentifier readItemIdentifier();
 
-	ItemIdentifierStack readItemIdentifierStack() throws IOException;
+	ItemIdentifierStack readItemIdentifierStack();
 
-	ItemStack readItemStack() throws IOException;
+	ItemStack readItemStack();
 
-	<T> ArrayList<T> readArrayList(IReadListObject<T> reader) throws IOException;
+	<T> ArrayList<T> readArrayList(IReadListObject<T> reader);
 
-	<T> LinkedList<T> readLinkedList(IReadListObject<T> reader) throws IOException;
+	<T> LinkedList<T> readLinkedList(IReadListObject<T> reader);
 
-	<T> Set<T> readSet(IReadListObject<T> handler) throws IOException;
+	<T> Set<T> readSet(IReadListObject<T> handler);
 
-	IOrderInfoProvider readOrderInfo() throws IOException;
+	IOrderInfoProvider readOrderInfo();
 
-	<T extends Enum<T>> T readEnum(Class<T> clazz) throws IOException;
+	<T extends Enum<T>> T readEnum(Class<T> clazz);
 
-	LinkedLogisticsOrderList readLinkedLogisticsOrderList() throws IOException;
+	LinkedLogisticsOrderList readLinkedLogisticsOrderList();
 
-	ByteBuf readByteBuf() throws IOException;
+	ByteBuf readByteBuf();
 
-	long[] readLongArray() throws IOException;
+	long[] readLongArray();
 
-	IResource readResource() throws IOException;
+	IResource readResource();
 
 	interface LPDataInputConsumer {
 
-		void accept(LPDataInput dataInput) throws IOException;
+		void accept(LPDataInput dataInput);
 	}
 }
diff --git a/common/network/rs485/logisticspipes/util/LPDataOutput.java b/common/network/rs485/logisticspipes/util/LPDataOutput.java
index f1ff8153..08ab4454 100644
--- a/common/network/rs485/logisticspipes/util/LPDataOutput.java
+++ b/common/network/rs485/logisticspipes/util/LPDataOutput.java
@@ -18,11 +18,10 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
 package network.rs485.logisticspipes.util;
 
-import java.io.IOException;
 import java.util.BitSet;
 import java.util.Collection;
 import java.util.EnumSet;
 
 import net.minecraft.item.ItemStack;
@@ -44,95 +43,95 @@ import network.rs485.logisticspipes.world.DoubleCoordinates;
 public interface LPDataOutput {
 
 	/**
 	 * @see java.io.DataOutput#writeByte(int)
 	 */
-	void writeByte(int b) throws IOException;
+	void writeByte(int b);
 
-	void writeByte(byte b) throws IOException;
+	void writeByte(byte b);
 
 	/**
 	 * @see java.io.DataOutput#writeShort(int)
 	 */
-	void writeShort(int s) throws IOException;
+	void writeShort(int s);
 
-	void writeShort(short s) throws IOException;
+	void writeShort(short s);
 
 	/**
 	 * @see java.io.DataOutput#writeInt(int)
 	 */
-	void writeInt(int i) throws IOException;
+	void writeInt(int i);
 
 	/**
 	 * @see java.io.DataOutput#writeLong(long)
 	 */
-	void writeLong(long l) throws IOException;
+	void writeLong(long l);
 
 	/**
 	 * @see java.io.DataOutput#writeFloat(float)
 	 */
-	void writeFloat(float f) throws IOException;
+	void writeFloat(float f);
 
 	/**
 	 * @see java.io.DataOutput#writeDouble(double)
 	 */
-	void writeDouble(double d) throws IOException;
+	void writeDouble(double d);
 
 	/**
 	 * @see java.io.DataOutput#writeBoolean(boolean)
 	 */
-	void writeBoolean(boolean b) throws IOException;
+	void writeBoolean(boolean b);
 
 	/**
 	 * Uses UTF-8 and not UTF-16.
 	 *
 	 * @see java.io.DataOutput#writeUTF(String)
 	 */
-	void writeUTF(String s) throws IOException;
+	void writeUTF(String s);
 
-	void writeByteArray(byte[] arr) throws IOException;
+	void writeByteArray(byte[] arr);
 
-	void writeByteBuf(ByteBuf buffer) throws IOException;
+	void writeByteBuf(ByteBuf buffer);
 
-	void writeIntArray(int[] arr) throws IOException;
+	void writeIntArray(int[] arr);
 
-	void writeLongArray(long[] arr) throws IOException;
+	void writeLongArray(long[] arr);
 
-	void writeBooleanArray(boolean[] arr) throws IOException;
+	void writeBooleanArray(boolean[] arr);
 
-	void writeForgeDirection(ForgeDirection direction) throws IOException;
+	void writeForgeDirection(ForgeDirection direction);
 
-	void writeExitRoute(ExitRoute route) throws IOException;
+	void writeExitRoute(ExitRoute route);
 
-	void writeIRouter(IRouter router) throws IOException;
+	void writeIRouter(IRouter router);
 
-	void writeLPPosition(DoubleCoordinates pos) throws IOException;
+	void writeLPPosition(DoubleCoordinates pos);
 
-	<T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) throws IOException;
+	<T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz);
 
-	void writeBitSet(BitSet bits) throws IOException;
+	void writeBitSet(BitSet bits);
 
-	void writeNBTTagCompound(NBTTagCompound tag) throws IOException;
+	void writeNBTTagCompound(NBTTagCompound tag);
 
-	void writeItemStack(ItemStack itemstack) throws IOException;
+	void writeItemStack(ItemStack itemstack);
 
-	void writeItemIdentifier(ItemIdentifier item) throws IOException;
+	void writeItemIdentifier(ItemIdentifier item);
 
-	void writeItemIdentifierStack(ItemIdentifierStack stack) throws IOException;
+	void writeItemIdentifierStack(ItemIdentifierStack stack);
 
-	<T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) throws IOException;
+	<T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler);
 
-	void writeOrderInfo(IOrderInfoProvider order) throws IOException;
+	void writeOrderInfo(IOrderInfoProvider order);
 
-	<T extends Enum<T>> void writeEnum(T obj) throws IOException;
+	<T extends Enum<T>> void writeEnum(T obj);
 
-	void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) throws IOException;
+	void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList);
 
-	void writeResource(IResource res) throws IOException;
+	void writeResource(IResource res);
 
-	void writeBytes(byte[] arr) throws IOException;
+	void writeBytes(byte[] arr);
 
 	interface LPDataOutputConsumer {
 
-		void accept(LPDataOutput dataOutput) throws IOException;
+		void accept(LPDataOutput dataOutput);
 	}
 }
diff --git a/test/network/rs485/logisticspipes/util/LPDataIOWrapperTest.java b/test/network/rs485/logisticspipes/util/LPDataIOWrapperTest.java
index 5ad24649..c4d208c6 100644
--- a/test/network/rs485/logisticspipes/util/LPDataIOWrapperTest.java
+++ b/test/network/rs485/logisticspipes/util/LPDataIOWrapperTest.java
@@ -616,22 +616,24 @@ public class LPDataIOWrapperTest {
 	public void testArrayList() throws Exception {
 		ArrayList<String> arrayList = new ArrayList<>();
 		arrayList.add("drölf");
 		arrayList.add("text");
 
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(arrayList, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(arrayList,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(arrayList, input.readArrayList(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());
 		});
 	}
 
 	@Test
 	public void testNullArrayList() throws Exception {
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(null, input.readArrayList(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());
@@ -642,22 +644,24 @@ public class LPDataIOWrapperTest {
 	public void testLinkedList() throws Exception {
 		LinkedList<String> linkedList = new LinkedList<>();
 		linkedList.add("drölf");
 		linkedList.add("text");
 
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(linkedList, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(linkedList,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(linkedList, input.readLinkedList(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());
 		});
 	}
 
 	@Test
 	public void testNullLinkedList() throws Exception {
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(null, input.readLinkedList(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());
@@ -668,22 +672,24 @@ public class LPDataIOWrapperTest {
 	public void testSet() throws Exception {
 		HashSet<String> set = new HashSet<>();
 		set.add("drölf");
 		set.add("text");
 
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(set, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(set,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(set, input.readSet(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());
 		});
 	}
 
 	@Test
 	public void testNullSet() throws Exception {
-		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
+		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
+				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
 
 		LPDataIOWrapper.provideData(data, input -> {
 			assertEquals(null, input.readSet(LPDataInput::readUTF));
 
 			assertEquals(BUFFER_EMPTY_MSG, 0, ((LPDataIOWrapper) input).localBuffer.readableBytes());

Vulnerable code: import java.io.IOException;

	public void writeToLPData(LPDataOutput output) throws IOException {
	public void readFromLPData(LPDataInput input) throws IOException {
	public void setUseNewRenderer(boolean flag) {
		useNewRenderer = flag;
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	void writeData(LPDataOutput output) throws IOException;
	void readData(LPDataInput input) throws IOException;
import java.io.IOException;

	T readObject(LPDataInput input) throws IOException;
import java.io.IOException;

	void writeObject(LPDataOutput output, T object) throws IOException;
	@SneakyThrows(IOException.class)
	@SneakyThrows(IOException.class)

	public static final Map<Integer, StackTraceElement[]> debugMap = new HashMap<>();
	//horrible hack to carry the proper player for the side along...
	static class InboundModernPacketWrapper {

		final ModernPacket packet;
		final EntityPlayer player;

		InboundModernPacketWrapper(ModernPacket p, EntityPlayer e) {
			packet = p;
			player = e;
		}
	}

	//TODO correct to work with WeakReference (See FML original)
	protected static final AttributeKey<ThreadLocal<FMLProxyPacket>> INBOUNDPACKETTRACKER = new AttributeKey<>("lp:inboundpacket");

	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		super.handlerAdded(ctx);
		ctx.attr(PacketHandler.INBOUNDPACKETTRACKER).set(new ThreadLocal<>());
	}

	//hacky callback to process packets coming from by the packetbufferhandler decompressors
	//TODO replace with proper netty implementation
	public static void onPacketData(final LPDataInput data, final EntityPlayer player) throws IOException {
		if (player == null) {
			return;
		}
		final int packetID = data.readShort();
		final ModernPacket packet = PacketHandler.packetlist.get(packetID).template();
		packet.setDebugId(data.readInt());
		packet.readData(data);
		PacketHandler.onPacketData(packet, player);
	}
	private static void onPacketData(ModernPacket packet, final EntityPlayer player) {
		try {
			packet.processPacket(player);
			if (LPConstants.DEBUG) {
				PacketHandler.debugMap.remove(packet.getDebugId());
			}
		} catch (DelayPacketException e) {
			if (packet.retry() && MainProxy.isClient(player.getEntityWorld())) {
				SimpleServiceLocator.clientBufferHandler.queueFailedPacket(packet, player);
			} else if (LPConstants.DEBUG) {
				LogisticsPipes.log.error(packet.getClass().getName());
				LogisticsPipes.log.error(packet.toString());
				e.printStackTrace();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
import java.io.IOException;

	public BooleanModuleCoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public CoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public CoordinatesPopupGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {}
	public void readData(LPDataInput input) throws IOException {}
import java.io.IOException;

	public ModuleCoordinatesGuiProvider(int id) {
		super(id);
	}


	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public ModuleInHandGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public UpgradeCoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public enum LTGPCompletionCheck {
		NONE,
		PIPE,
		TRANSPORT
	}

	public CoordinatesPacket(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
package logisticspipes.network.abstractpackets;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

import lombok.Getter;

import network.rs485.logisticspipes.util.LPDataInput;
import network.rs485.logisticspipes.util.LPDataOutput;

public abstract class GenericPacket extends ModernPacket {

	@Getter
	private Object[] args;

	public GenericPacket(int id) {
		super(id);
	}

	@Override
	public void readData(LPDataInput input) throws IOException {
		int size = input.readInt();
		args = new Object[size];
		for (int i = 0; i < size; i++) {
			byte[] bytes = input.readByteArray();
			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
			ObjectInput in = new ObjectInputStream(bis);
			try {
				Object o = in.readObject();
				args[i] = o;
			} catch (ClassNotFoundException e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	@Override
	public void writeData(LPDataOutput output) throws IOException {
		output.writeInt(args.length);
		for (Object arg : args) {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutput out = new ObjectOutputStream(bos);
			out.writeObject(arg);
			output.writeByteArray(bos.toByteArray());
		}
	}

	public GenericPacket setArgs(Object... input) {
		args = input;
		return this;
	}
}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	@Getter
	@Setter
	private boolean isChunkDataPacket;

	@Getter
	@Setter
	private boolean compressable;


	protected int leftRetries = 5;

	public abstract void readData(LPDataInput input) throws IOException;
	public abstract void writeData(LPDataOutput output) throws IOException;
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
	private boolean moduleBased = false;

import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public CraftingCycleRecipe(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public CraftingSetType(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public PowerPacketLaser(int id) {
		super(id);
	}






	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
			public StatusEntry readObject(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
			public void writeObject(LPDataOutput output, StatusEntry entry) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
					.setAdditions(new Object[] { box.blockX, box.blockY, box.blockZ }));
					.setAdditions(new Object[] { box.entityHit.getEntityId() }));
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

	public DebugTargetResponse(int id) {
		super(id);
	}

	public enum TargetMode {
		Block,
		Entity,
		None
	}


	private Object[] additions = new Object[0];
	public void readData(LPDataInput input) throws IOException {
		int size = input.readInt();
		additions = new Object[size];
		for (int i = 0; i < size; i++) {
			byte[] bytes = input.readByteArray();
			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
			ObjectInput in = new ObjectInputStream(bis);
			try {
				Object o = in.readObject();
				additions[i] = o;
			} catch (ClassNotFoundException e) {
				throw new UnsupportedOperationException(e);
			}
		}
			int x = (Integer) additions[0];
			int y = (Integer) additions[1];
			int z = (Integer) additions[2];
			int entityId = (Integer) additions[0];
	public void writeData(LPDataOutput output) throws IOException {
		output.writeInt(additions.length);
		for (Object addition : additions) {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutput out = null;
			out = new ObjectOutputStream(bos);
			out.writeObject(addition);
			output.writeByteArray(bos.toByteArray());
		}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
	public GuiReopenPacket(int id) {
		super(id);
	}

import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
	public MultiBlockCoordinatesPacket(int id) {
		super(id);
	}

import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

			Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> object) throws IOException {
	public Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> readObject(LPDataInput input)
			throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public ParticleFX(int id) {
		super(id);
	}

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public PipeContentPacket(int id) {
		super(id);
	}

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public PipeFluidUpdate(int id) {
		super(id);
	}


	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public PipeSignTypes(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

		try {
			LPDataIOWrapper.provideData(bytesRenderState, pipe.renderState::readData);
			LPDataIOWrapper.provideData(bytesCoreState, pipe.coreState::readData);
			LPDataIOWrapper.provideData(bytesBCPluggableState, pipe.bcPlugableState::readData);
			pipe.afterStateUpdated();
			LPDataIOWrapper.provideData(bytesPipe, pipe.pipe::readData);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
					.setAdditions(new Object[] { box.blockX, box.blockY, box.blockZ }));
					.setAdditions(new Object[] { box.entityHit.getEntityId() }));
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;
	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {}
	public void writeData(LPDataOutput output) throws IOException {}
import java.io.IOException;

	public void readData(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

	public RoutingUpdateTargetResponse(int id) {
		super(id);
	}

	public enum TargetMode {
		Block,
		Entity,
		None
	}


	private Object[] additions = new Object[0];
	public void readData(LPDataInput input) throws IOException {
		int size = input.readInt();
		additions = new Object[size];
		for (int i = 0; i < size; i++) {
			byte[] bytes = input.readByteArray();
			ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
			ObjectInput in = new ObjectInputStream(bis);
			try {
				Object o = in.readObject();
				additions[i] = o;
			} catch (ClassNotFoundException e) {
				throw new UnsupportedOperationException(e);
			}
		}
			int x = (Integer) additions[0];
			int y = (Integer) additions[1];
			int z = (Integer) additions[2];
	public void writeData(LPDataOutput output) throws IOException {
		output.writeInt(additions.length);
		for (Object addition : additions) {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutput out = new ObjectOutputStream(bos);
			out.writeObject(addition);
			output.writeByteArray(bos.toByteArray());
		}
import java.io.IOException;

	@Getter
	@Setter
	private int satID;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public enum ItemSendMode {
		Normal,
		Fast
	}

	protected boolean stillNeedReplace = true;
	private boolean recheckConnections = false;

	protected IRouter router;
	protected String routerId;
	protected Object routerIdLock = new Object();
	protected int _delayOffset = 0;


	protected boolean _initialInit = true;

	private boolean enabled = true;
	private boolean preventRemove = false;
	private boolean destroyByPlayer = false;
	private PowerSupplierHandler powerHandler = new PowerSupplierHandler(this);


	protected RouteLayer _routeLayer;
	protected TransportLayer _transportLayer;
	protected final PriorityBlockingQueue<ItemRoutingInformation> _inTransitToMe = new PriorityBlockingQueue<>(10,
			new ItemRoutingInformation.DelayComparator());

	protected UpgradeManager upgradeManager = new UpgradeManager(this);
	protected LogisticsItemOrderManager _orderItemManager = null;

	@Getter
	private List<IOrderInfoProvider> clientSideOrderManager = new ArrayList<>();




	protected final LinkedList<Triplet<IRoutedItem, ForgeDirection, ItemSendMode>> _sendQueue = new LinkedList<>();

	protected final Map<ItemIdentifier, Queue<Pair<Integer, ItemRoutingInformation>>> queuedDataForUnroutedItems = Collections.synchronizedMap(new TreeMap<>());

	public final PlayerCollectionList watchers = new PlayerCollectionList();




	protected IPipeSign[] signItem = new IPipeSign[6];
	public boolean globalIgnoreConnectionDisconnection = false;

	/* Power System */

	@CCCommand(description = "Sets the TurtleConnect flag for this Turtle on this LogisticsPipe")
	public void setTurtleConnect(Boolean flag) {
			container.setTurtleConnect(flag);
	@CCCommand(description = "Returns the TurtleConnect flag for this Turtle on this LogisticsPipe")
	public boolean getTurtleConnect() {
			return container.getTurtleConnect();
		return false;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;



	private LogisticsTileRenderController renderController;





	public LogicController logicController = new LogicController();

	public final PipeRenderState renderState;
	public final CoreState coreState = new CoreState();
	public final IBCTilePart tilePart;
	public final IBCPluggableState bcPlugableState;
	public final ITDPart tdPart;
	public void setTurtleConnect(boolean flag) {
		SimpleServiceLocator.ccProxy.setTurtleConnect(flag, this);
	}

	/* IPipeInformationProvider */

	@Getter
	private boolean initialized = false;

	public boolean[] pipeConnectionsBuffer = new boolean[6];
	public boolean[] pipeBCConnectionsBuffer = new boolean[6];
	public boolean[] pipeTDConnectionsBuffer = new boolean[6];

	public CoreUnroutedPipe pipe;
	//public int redstoneInput = 0;
	//public int[] redstoneInputSide = new int[ForgeDirection.VALID_DIRECTIONS.length];

	private boolean deletePipe = false;
	private TileBuffer[] tileBuffer;
	private boolean sendClientUpdate = false;
	private boolean blockNeighborChange = false;
	private boolean refreshRenderState = false;
	private boolean pipeBound = false;

	public class CoreState implements IClientState {

		public int pipeId = -1;

		@Override
		public void writeData(LPDataOutput output) throws IOException {
			output.writeInt(pipeId);

		}

		@Override
		public void readData(LPDataInput input) throws IOException {
			pipeId = input.readInt();

		}
	}

	@SideOnly(Side.CLIENT)
	private AxisAlignedBB renderBox;

import java.io.IOException;
	@AllArgsConstructor
	public enum CurveOrientation implements ITubeOrientation {
		//@formatter:off
		// Name: Placement from  _ TurnDirection
		NORTH_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(2, 0, 2), ForgeDirection.NORTH, ForgeDirection.EAST),
		NORTH_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
		WEST_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(2, 0, -2), ForgeDirection.WEST, ForgeDirection.NORTH),
		WEST_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST, ForgeDirection.SOUTH),
		SOUTH_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(-2, 0, -2), ForgeDirection.SOUTH, ForgeDirection.WEST),
		SOUTH_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH, ForgeDirection.EAST),
		EAST_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(-2, 0, 2), ForgeDirection.EAST, ForgeDirection.SOUTH),
		EAST_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH);
		//@formatter:on
		@Getter
		TurnDirection renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection from;
		@Getter
		ForgeDirection looking;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotatePositions(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeCurve) pipe).orientation = this;
		}
	}

	@AllArgsConstructor
	public enum TurnDirection implements ITubeRenderOrientation {
		//@formatter:off
		NORTH_EAST(ForgeDirection.NORTH, ForgeDirection.EAST),
		EAST_SOUTH(ForgeDirection.EAST, ForgeDirection.SOUTH),
		SOUTH_WEST(ForgeDirection.SOUTH, ForgeDirection.WEST),
		WEST_NORTH(ForgeDirection.WEST, ForgeDirection.NORTH);
		//@formatter:on
		@Getter
		ForgeDirection dir1;
		ForgeDirection dir2;

		public void rotatePositions(IPositionRotateble set) {
			if (this == WEST_NORTH) {
				return;
			} else if (this == NORTH_EAST) {
				set.rotateRight();
			} else if (this == EAST_SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			} else if (this == SOUTH_WEST) {
				set.rotateLeft();
			}
		}
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public enum TubeGainOrientation implements ITubeOrientation {
		NORTH(TubeGainRenderOrientation.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
		SOUTH(TubeGainRenderOrientation.SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
		EAST(TubeGainRenderOrientation.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
		WEST(TubeGainRenderOrientation.WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);

		@Getter
		TubeGainRenderOrientation renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;

		TubeGainOrientation(TubeGainRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
			renderOrientation = render;
			offset = off;
			this.dir = dir;
		}

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotateOrientation(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeGain) pipe).orientation = this;
		}
	}

	public enum TubeGainRenderOrientation implements ITubeRenderOrientation {
		NORTH(ForgeDirection.NORTH),
		SOUTH(ForgeDirection.SOUTH),
		WEST(ForgeDirection.WEST),
		EAST(ForgeDirection.EAST);

		@Getter
		private ForgeDirection dir;

		TubeGainRenderOrientation(ForgeDirection dir) {
			this.dir = dir;
		}

		public void rotateOrientation(IPositionRotateble set) {
			if (this == EAST) {
				set.rotateRight();
			} else if (this == WEST) {
				set.rotateLeft();
			} else if (this == SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			}
		}
	}


	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public enum TubeLineOrientation implements ITubeOrientation {
		NORTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
		SOUTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
		EAST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
		WEST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);

		@Getter
		TubeLineRenderOrientation renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;

		TubeLineOrientation(TubeLineRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
			renderOrientation = render;
			offset = off;
			this.dir = dir;
		}

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotateOrientation(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeLine) pipe).orientation = this;
		}
	}

	public enum TubeLineRenderOrientation implements ITubeRenderOrientation {
		NORTH_SOUTH(ForgeDirection.NORTH),
		EAST_WEST(ForgeDirection.EAST);

		@Getter
		private ForgeDirection dir;

		TubeLineRenderOrientation(ForgeDirection dir) {
			this.dir = dir;
		}

		public void rotateOrientation(IPositionRotateble set) {
			if (this == EAST_WEST) {
				set.rotateLeft();
			}
		}
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	@AllArgsConstructor
	public enum CurveSOrientation implements ITubeOrientation {
		//@formatter:off
		// Name: Placement from  _ TurnDirection
		NORTH_EAST(TurnSDirection.NORTH_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.EAST),
		NORTH_WEST(TurnSDirection.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
		EAST_SOUTH(TurnSDirection.EAST_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.SOUTH),
		EAST_NORTH(TurnSDirection.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH),
		SOUTH_WEST(TurnSDirection.NORTH_INV, new DoubleCoordinates(-1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.WEST),
		SOUTH_EAST(TurnSDirection.NORTH, new DoubleCoordinates(1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.EAST),
		WEST_NORTH(TurnSDirection.EAST_INV, new DoubleCoordinates(-3, 0, -1), ForgeDirection.WEST, ForgeDirection.NORTH),
		WEST_SOUTH(TurnSDirection.EAST, new DoubleCoordinates(-3, 0, 1), ForgeDirection.WEST, ForgeDirection.SOUTH);
		//@formatter:on

		@Getter
		TurnSDirection renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;
		@Getter
		ForgeDirection looking;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotatePositions(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeSCurve) pipe).orientation = this;
		}
	}

	@AllArgsConstructor
	public enum TurnSDirection implements ITubeRenderOrientation {
		//@formatter:off
		NORTH(ForgeDirection.NORTH),
		EAST(ForgeDirection.EAST),
		NORTH_INV(ForgeDirection.SOUTH),
		EAST_INV(ForgeDirection.WEST);
		//@formatter:on

		@Getter
		private ForgeDirection dir1;

		public void rotatePositions(IPositionRotateble set) {
			if (this == NORTH) {
				set.mirrorX();
			} else if (this == EAST) {
				set.mirrorX();
				set.rotateRight();
			} else if (this == EAST_INV) {
				set.rotateRight();
			}
		}
	}


	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	@AllArgsConstructor
	public enum SpeedupDirection implements ITubeRenderOrientation, ITubeOrientation {
		//@formatter:off
		NORTH(ForgeDirection.NORTH),
		SOUTH(ForgeDirection.SOUTH),
		EAST(ForgeDirection.EAST),
		WEST(ForgeDirection.WEST);
		//@formatter:on
		@Getter
		ForgeDirection dir1;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			if (this == SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			} else if (this == EAST) {
				set.rotateRight();
			} else if (this == WEST) {
				set.rotateLeft();
			}
		}

		@Override
		public ITubeRenderOrientation getRenderOrientation() {
			return this;
		}

		@Override
		public DoubleCoordinates getOffset() {
			return new DoubleCoordinates(0, 0, 0);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeSpeedup) pipe).orientation = this;
		}
	}

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {}
	public void readData(LPDataInput input) throws IOException {}
import java.io.IOException;
							@Override public void writeData_LP(LPDataOutput output) throws IOException {
							@Override public void writeData(LPDataOutput output) throws IOException {}
							@Override public void readData(LPDataInput input) throws IOException {}
import java.io.IOException;

	void writeData(LPDataOutput output) throws IOException;
	void readData(LPDataInput input) throws IOException;
import java.io.IOException;

	void writeData_LP(LPDataOutput output) throws IOException;
	void readData_LP(LPDataInput input) throws IOException;
import java.io.IOException;

	public void writeData_LP(LPDataOutput output) throws IOException {
	public void readData_LP(LPDataInput input) throws IOException {
import java.io.IOException;
import lombok.SneakyThrows;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
	@SneakyThrows({ IOException.class })
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;

	public void writeData(LPDataOutput output) throws IOException {
	public void readData(LPDataInput input) throws IOException {
import java.io.IOException;
	public ItemIdentifierStack stack;

	public DictResource(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
	private Object ccObject;

	public void setCCType(Object type) {
		ccObject = type;
	public Object getCCType() {
		return ccObject;
import java.io.IOException;

	private int amount;
	public FluidResource(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
	private Object ccObject;

	public void setCCType(Object type) {
		ccObject = type;
	public Object getCCType() {
		return ccObject;
import java.io.IOException;

	/**
	 * Settings only apply for the normal Item Implementation.
	 */
	enum MatchSettings {
		NORMAL,
		WITHOUT_NBT
	}

	void writeData(LPDataOutput output) throws IOException;
import java.io.IOException;

	public ItemResource(LPDataInput input) throws IOException {
	public void writeData(LPDataOutput output) throws IOException {
	private Object ccObject;

	public void setCCType(Object type) {
		ccObject = type;
	public Object getCCType() {
		return ccObject;
import java.io.IOException;

		protected IResource readData(LPDataInput input) throws IOException {
		protected IResource readData(LPDataInput input) throws IOException {
		protected IResource readData(LPDataInput input) throws IOException {
	public static void writeResource(LPDataOutput output, IResource resource) throws IOException {
	public static IResource readResource(LPDataInput input) throws IOException {
	protected abstract IResource readData(LPDataInput input) throws IOException;
import java.io.IOException;
	public void writeData(LPDataOutput output) throws IOException {
	public LaserData readData(LPDataInput input) throws IOException {
				try {
					synchronized (clientList) {
						if (!pause && clientList.size() > 0) {
							clientBuffer = LPDataIOWrapper.collectData(output -> {
								output.writeBytes(clientBuffer);
								clearLock.lock();
								try {
									for (ModernPacket packet : clientList) {
										output.writeShort(packet.getId());
										output.writeInt(packet.getDebugId());
										packet.writeData(output);
									}
								} finally {
									clientList.clear();
									clearLock.unlock();
							});
						}
					//Send Content
					if (clientBuffer.length > 0) {
						while (clientBuffer.length > 1024 * 32) {
							byte[] sendbuffer = Arrays.copyOf(clientBuffer, 1024 * 32);
							clientBuffer = Arrays.copyOfRange(clientBuffer, 1024 * 32, clientBuffer.length);
							byte[] compressed = ClientPacketBufferHandlerThread.compress(sendbuffer);
							MainProxy.sendPacketToServer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed));
						}
						byte[] sendbuffer = clientBuffer;
						clientBuffer = new byte[] {};
				} catch (IOException e) {
					e.printStackTrace();
						} catch (InterruptedException e) {}
	private final ClientCompressorThread clientCompressorThread = new ClientCompressorThread();

		//decompressed serialized S->C data
		private byte[] ByteBuffer = new byte[] {};
			try {
				LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
					PacketHandler.onPacketData(input, playerDataPair.getValue1());
				});
			} catch (IOException e) {
				System.err.println("IO Error in handlePacketData for player " + playerDataPair.getValue1().getCommandSenderName());
				e.printStackTrace();
			}
						} catch (InterruptedException e) { }

	private final ClientDecompressorThread clientDecompressorThread = new ClientDecompressorThread();

	public ClientPacketBufferHandlerThread() {}

	public void clientTick(ClientTickEvent event) {
		if (event.phase != Phase.END) {
			return;
		}
		clientDecompressorThread.clientTickEnd();
	}

	public void setPause(boolean flag) {
		clientCompressorThread.setPause(flag);
	}

	public void addPacketToCompressor(ModernPacket packet) {
		clientCompressorThread.addPacketToCompressor(packet);
	}

	public void handlePacket(byte[] content) {
		clientDecompressorThread.handlePacket(content);
	}

	private static byte[] compress(byte[] content) {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		try {
			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
			gzipOutputStream.write(content);
			gzipOutputStream.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return byteArrayOutputStream.toByteArray();
	}

	private static byte[] decompress(byte[] contentBytes) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
			int buffer = 0;
			while ((buffer = gzip.read()) != -1) {
				out.write(buffer);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return out.toByteArray();
	}

	public void clear() {
		clientCompressorThread.clear();
		clientDecompressorThread.clear();
	}

	public void queueFailedPacket(ModernPacket packet, EntityPlayer player) {
		clientDecompressorThread.queueFailedPacket(packet, player);
	}
				try {
					synchronized (serverList) {
						if (!pause) {
							for (Entry<EntityPlayer, LinkedList<ModernPacket>> playerPacketEntry : serverList.entrySet()) {
								EntityPlayer player = playerPacketEntry.getKey();
								serverBuffer.put(player, LPDataIOWrapper.collectData(output -> {
									if (serverBuffer.containsKey(player)) {
										output.writeBytes(serverBuffer.get(player));
									}
									LinkedList<ModernPacket> packets = playerPacketEntry.getValue();
									try {
										for (ModernPacket packet : packets) {
											output.writeShort(packet.getId());
											output.writeInt(packet.getDebugId());
											packet.writeData(output);
										}
									} finally {
										packets.clear();
								}));
							}
							serverList.clear();
					//Send Content
					for (Entry<EntityPlayer, byte[]> player : serverBuffer.entrySet()) {
						while (player.getValue().length > 32 * 1024) {
							byte[] sendbuffer = Arrays.copyOf(player.getValue(), 1024 * 32);
							byte[] newbuffer = Arrays.copyOfRange(player.getValue(), 1024 * 32, player.getValue().length);
							player.setValue(newbuffer);
							byte[] compressed = ServerPacketBufferHandlerThread.compress(sendbuffer);
							MainProxy.sendPacketToPlayer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed), player.getKey());
						}
						byte[] sendbuffer = player.getValue();
				} catch (IOException e) {
					e.printStackTrace();
						} catch (InterruptedException e) {}
	private final ServerCompressorThread serverCompressorThread = new ServerCompressorThread();

			try {
				LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
					PacketHandler.onPacketData(input, playerDataPair.getValue1());
				});
			} catch (IOException e) {
				System.err.println("IO Error in handlePacketData for player " + playerDataPair.getValue1().getCommandSenderName());
				e.printStackTrace();
			}
						} catch (InterruptedException e) {}

	private final ServerDecompressorThread serverDecompressorThread = new ServerDecompressorThread();

	public ServerPacketBufferHandlerThread() {}

	public void serverTick(ServerTickEvent event) {
		if (event.phase != Phase.END) {
			return;
		}
		serverDecompressorThread.serverTickEnd();
	}

	public void setPause(boolean flag) {
		serverCompressorThread.setPause(flag);
	}

	public void addPacketToCompressor(ModernPacket packet, EntityPlayer player) {
		serverCompressorThread.addPacketToCompressor(packet, player);
	}

	public void handlePacket(byte[] content, EntityPlayer player) {
		serverDecompressorThread.handlePacket(content, player);
	}

	private static byte[] compress(byte[] content) {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		try {
			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
			gzipOutputStream.write(content);
			gzipOutputStream.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return byteArrayOutputStream.toByteArray();
	}

	private static byte[] decompress(byte[] contentBytes) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
			int buffer = 0;
			while ((buffer = gzip.read()) != -1) {
				out.write(buffer);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return out.toByteArray();
	}

	public void clear(final EntityPlayer player) {
		new Thread() {

			@Override
			public void run() {
				serverCompressorThread.clear(player);
				serverDecompressorThread.clear(player);
			}
		}.start();
	}
	private void unsetBuffer() {
		if (localBuffer.hasMemoryAddress()) {
			if (--reference < 1) {
				BUFFER_WRAPPER_MAP.remove(localBuffer.memoryAddress());
			}
		}
		localBuffer = null;
	}

	public static void provideData(byte[] data, LPDataInputConsumer dataInputConsumer) throws IOException {
	public static byte[] collectData(LPDataOutputConsumer dataOutputConsumer) throws IOException {
	public static void provideData(ByteBuf dataBuffer, LPDataInputConsumer dataInputConsumer) throws IOException {
	public static void writeData(ByteBuf dataBuffer, LPDataOutputConsumer dataOutputConsumer) throws IOException {
	public void writeByteArray(byte[] arr) throws IOException {
	public byte[] readByteArray() throws IOException {
	public void writeUTF(String s) throws IOException {
	public void writeExitRoute(ExitRoute route) throws IOException {
	public <T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) throws IOException {
	public void writeBitSet(BitSet bits) throws IOException {
	public void writeNBTTagCompound(NBTTagCompound tag) throws IOException {
			CompressedStreamTools.write(tag, new ByteBufOutputStream(localBuffer));
	public void writeBooleanArray(boolean[] arr) throws IOException {
	public void writeItemStack(ItemStack itemstack) throws IOException {
	public void writeItemIdentifier(ItemIdentifier item) throws IOException {
	public void writeItemIdentifierStack(ItemIdentifierStack stack) throws IOException {
	public <T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) throws IOException {
	public void writeOrderInfo(IOrderInfoProvider order) throws IOException {
	public void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) throws IOException {
	public void writeResource(IResource res) throws IOException {
	public void writeBytes(byte[] arr) throws IOException {
	public String readUTF() throws IOException {
	public ExitRoute readExitRoute(World world) throws IOException {
	public <T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) throws IOException {
	public BitSet readBitSet() throws IOException {
	public NBTTagCompound readNBTTagCompound() throws IOException {
		return CompressedStreamTools.func_152456_a(new ByteBufInputStream(localBuffer), NBTSizeTracker.field_152451_a);
	public boolean[] readBooleanArray() throws IOException {
	public byte[] readBytes(int length) throws IOException {
	public ItemStack readItemStack() throws IOException {
	public ItemIdentifier readItemIdentifier() throws IOException {
	public ItemIdentifierStack readItemIdentifierStack() throws IOException {
	public <T> ArrayList<T> readArrayList(IReadListObject<T> reader) throws IOException {
	public <T> LinkedList<T> readLinkedList(IReadListObject<T> reader) throws IOException {
	public <T> Set<T> readSet(IReadListObject<T> handler) throws IOException {
	public IOrderInfoProvider readOrderInfo() throws IOException {
	public LinkedLogisticsOrderList readLinkedLogisticsOrderList() throws IOException {
			throw new IOException("Expected order info provider list");
			throw new IOException("Expected logistics order list");
	public ByteBuf readByteBuf() throws IOException {
	public IResource readResource() throws IOException {
import java.io.IOException;
	byte[] readByteArray() throws IOException;
	byte readByte() throws IOException;
	short readShort() throws IOException;
	int readInt() throws IOException;
	long readLong() throws IOException;
	float readFloat() throws IOException;
	double readDouble() throws IOException;
	boolean readBoolean() throws IOException;
	String readUTF() throws IOException;
	ForgeDirection readForgeDirection() throws IOException;
	ExitRoute readExitRoute(World world) throws IOException;
	IRouter readIRouter(World world) throws IOException;
	DoubleCoordinates readLPPosition() throws IOException;
	<T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) throws IOException;
	BitSet readBitSet() throws IOException;
	NBTTagCompound readNBTTagCompound() throws IOException;
	boolean[] readBooleanArray() throws IOException;
	int[] readIntArray() throws IOException;
	byte[] readBytes(int length) throws IOException;
	ItemIdentifier readItemIdentifier() throws IOException;
	ItemIdentifierStack readItemIdentifierStack() throws IOException;
	ItemStack readItemStack() throws IOException;
	<T> ArrayList<T> readArrayList(IReadListObject<T> reader) throws IOException;
	<T> LinkedList<T> readLinkedList(IReadListObject<T> reader) throws IOException;
	<T> Set<T> readSet(IReadListObject<T> handler) throws IOException;
	IOrderInfoProvider readOrderInfo() throws IOException;
	<T extends Enum<T>> T readEnum(Class<T> clazz) throws IOException;
	LinkedLogisticsOrderList readLinkedLogisticsOrderList() throws IOException;
	ByteBuf readByteBuf() throws IOException;
	long[] readLongArray() throws IOException;
	IResource readResource() throws IOException;
		void accept(LPDataInput dataInput) throws IOException;
import java.io.IOException;
	void writeByte(int b) throws IOException;
	void writeByte(byte b) throws IOException;
	void writeShort(int s) throws IOException;
	void writeShort(short s) throws IOException;
	void writeInt(int i) throws IOException;
	void writeLong(long l) throws IOException;
	void writeFloat(float f) throws IOException;
	void writeDouble(double d) throws IOException;
	void writeBoolean(boolean b) throws IOException;
	void writeUTF(String s) throws IOException;
	void writeByteArray(byte[] arr) throws IOException;
	void writeByteBuf(ByteBuf buffer) throws IOException;
	void writeIntArray(int[] arr) throws IOException;
	void writeLongArray(long[] arr) throws IOException;
	void writeBooleanArray(boolean[] arr) throws IOException;
	void writeForgeDirection(ForgeDirection direction) throws IOException;
	void writeExitRoute(ExitRoute route) throws IOException;
	void writeIRouter(IRouter router) throws IOException;
	void writeLPPosition(DoubleCoordinates pos) throws IOException;
	<T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) throws IOException;
	void writeBitSet(BitSet bits) throws IOException;
	void writeNBTTagCompound(NBTTagCompound tag) throws IOException;
	void writeItemStack(ItemStack itemstack) throws IOException;
	void writeItemIdentifier(ItemIdentifier item) throws IOException;
	void writeItemIdentifierStack(ItemIdentifierStack stack) throws IOException;
	<T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) throws IOException;
	void writeOrderInfo(IOrderInfoProvider order) throws IOException;
	<T extends Enum<T>> void writeEnum(T obj) throws IOException;
	void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) throws IOException;
	void writeResource(IResource res) throws IOException;
	void writeBytes(byte[] arr) throws IOException;
		void accept(LPDataOutput dataOutput) throws IOException;
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(arrayList, LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(linkedList, LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(set, LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null, LPDataOutput::writeUTF));
Fixed code: 	public void writeToLPData(LPDataOutput output) {
	public void readFromLPData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	public void setUseNewRenderer(boolean flag) {
		useNewRenderer = flag;
	}
	void writeData(LPDataOutput output);
	void readData(LPDataInput input);
	T readObject(LPDataInput input);
	void writeObject(LPDataOutput output, T object);
	private NewGuiHandler() { }

	public static final Map<Integer, StackTraceElement[]> debugMap = new HashMap<>();
	//TODO correct to work with WeakReference (See FML original)
	protected static final AttributeKey<ThreadLocal<FMLProxyPacket>> INBOUNDPACKETTRACKER = new AttributeKey<>("lp:inboundpacket");
	//hacky callback to process packets coming from by the packetbufferhandler decompressors
	//TODO replace with proper netty implementation
	public static void onPacketData(final LPDataInput data, final EntityPlayer player) {
		if (player == null) {
			return;
		}
		final int packetID = data.readShort();
		final ModernPacket packet = PacketHandler.packetlist.get(packetID).template();
		packet.setDebugId(data.readInt());
		packet.readData(data);
		PacketHandler.onPacketData(packet, player);
	}

	private static void onPacketData(ModernPacket packet, final EntityPlayer player) {
		try {
			packet.processPacket(player);
			if (LPConstants.DEBUG) {
				PacketHandler.debugMap.remove(packet.getDebugId());
			}
		} catch (DelayPacketException e) {
			if (packet.retry() && MainProxy.isClient(player.getEntityWorld())) {
				SimpleServiceLocator.clientBufferHandler.queueFailedPacket(packet, player);
			} else if (LPConstants.DEBUG) {
				LogisticsPipes.log.error(packet.getClass().getName());
				LogisticsPipes.log.error(packet.toString());
				e.printStackTrace();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		super.handlerAdded(ctx);
		ctx.attr(PacketHandler.INBOUNDPACKETTRACKER).set(new ThreadLocal<>());
	}

	//horrible hack to carry the proper player for the side along...
	static class InboundModernPacketWrapper {
		final ModernPacket packet;
		final EntityPlayer player;

		InboundModernPacketWrapper(ModernPacket p, EntityPlayer e) {
			packet = p;
			player = e;
	public BooleanModuleCoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public CoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public CoordinatesPopupGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
	public ModuleCoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public ModuleInHandGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public UpgradeCoordinatesGuiProvider(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public CoordinatesPacket(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	public enum LTGPCompletionCheck {
		NONE,
		PIPE,
		TRANSPORT
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	protected int leftRetries = 5;
	@Getter
	@Setter
	private boolean isChunkDataPacket;
	@Getter
	@Setter
	private boolean compressable;
	public abstract void readData(LPDataInput input);
	public abstract void writeData(LPDataOutput output);
	private boolean moduleBased = false;
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public CraftingCycleRecipe(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public CraftingSetType(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public PowerPacketLaser(int id) {
		super(id);
	}

	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
			public StatusEntry readObject(LPDataInput input) {
	public void writeData(LPDataOutput output) {
			public void writeObject(LPDataOutput output, StatusEntry entry) {
	public void readData(LPDataInput input) {}
					.setAdditions(new int[] { box.blockX, box.blockY, box.blockZ }));
					.setAdditions(new int[] { box.entityHit.getEntityId() }));
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	private int[] additions = new int[0];

	public DebugTargetResponse(int id) {
		super(id);
	}
	public void readData(LPDataInput input) {
		additions = input.readIntArray();
			int x = additions[0];
			int y = additions[1];
			int z = additions[2];
			int entityId = additions[0];
	public void writeData(LPDataOutput output) {
		output.writeIntArray(additions);

	public enum TargetMode {
		Block,
		Entity,
		None
	}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public GuiReopenPacket(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public MultiBlockCoordinatesPacket(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
			Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> object) {
	public Triplet<ItemIdentifierStack, Pair<Integer /* Time */, Integer /* BufferCounter */>, LPTravelingItemServer> readObject(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public ParticleFX(int id) {
		super(id);
	}

	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public PipeContentPacket(int id) {
		super(id);
	}

	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public PipeFluidUpdate(int id) {
		super(id);
	}

	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public PipeSignTypes(int id) {
		super(id);
	}

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
		LPDataIOWrapper.provideData(bytesRenderState, pipe.renderState::readData);
		LPDataIOWrapper.provideData(bytesCoreState, pipe.coreState::readData);
		LPDataIOWrapper.provideData(bytesBCPluggableState, pipe.bcPlugableState::readData);
		pipe.afterStateUpdated();
		LPDataIOWrapper.provideData(bytesPipe, pipe.pipe::readData);
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void readData(LPDataInput input) {}
					.setAdditions(new int[] { box.blockX, box.blockY, box.blockZ }));
					.setAdditions(new int[] { box.entityHit.getEntityId() }));
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	private int[] additions = new int[0];

	public RoutingUpdateTargetResponse(int id) {
		super(id);
	}
	public void readData(LPDataInput input) {
		additions = input.readIntArray();
			int x = additions[0];
			int y = additions[1];
			int z = additions[2];
	public void writeData(LPDataOutput output) {
		output.writeIntArray(additions);

	public enum TargetMode {
		Block,
		Entity,
		None
	}
	@Getter
	@Setter
	private int satID;

	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public final PlayerCollectionList watchers = new PlayerCollectionList();
	protected final PriorityBlockingQueue<ItemRoutingInformation> _inTransitToMe = new PriorityBlockingQueue<>(10,
			new ItemRoutingInformation.DelayComparator());
	protected final LinkedList<Triplet<IRoutedItem, ForgeDirection, ItemSendMode>> _sendQueue = new LinkedList<>();
	protected final Map<ItemIdentifier, Queue<Pair<Integer, ItemRoutingInformation>>> queuedDataForUnroutedItems = Collections.synchronizedMap(new TreeMap<>());
	public boolean globalIgnoreConnectionDisconnection = false;
	protected boolean stillNeedReplace = true;
	protected IRouter router;
	protected String routerId;
	protected Object routerIdLock = new Object();
	protected int _delayOffset = 0;
	protected boolean _initialInit = true;
	protected RouteLayer _routeLayer;
	protected TransportLayer _transportLayer;
	protected UpgradeManager upgradeManager = new UpgradeManager(this);
	protected LogisticsItemOrderManager _orderItemManager = null;
	protected IPipeSign[] signItem = new IPipeSign[6];
	private boolean recheckConnections = false;
	private boolean enabled = true;
	private boolean preventRemove = false;
	private boolean destroyByPlayer = false;
	private PowerSupplierHandler powerHandler = new PowerSupplierHandler(this);
	@Getter
	private List<IOrderInfoProvider> clientSideOrderManager = new ArrayList<>();
	/* Power System */

	@CCCommand(description = "Returns the TurtleConnect flag for this Turtle on this LogisticsPipe")
	public boolean getTurtleConnect() {
			return container.getTurtleConnect();
		return false;
	@CCCommand(description = "Sets the TurtleConnect flag for this Turtle on this LogisticsPipe")
	public void setTurtleConnect(Boolean flag) {
			container.setTurtleConnect(flag);
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	public enum ItemSendMode {
		Normal,
		Fast
	}
	public final PipeRenderState renderState;
	public final CoreState coreState = new CoreState();
	public final IBCTilePart tilePart;
	public final IBCPluggableState bcPlugableState;
	public final ITDPart tdPart;
	public LogicController logicController = new LogicController();
	public boolean[] pipeConnectionsBuffer = new boolean[6];
	public boolean[] pipeBCConnectionsBuffer = new boolean[6];
	public boolean[] pipeTDConnectionsBuffer = new boolean[6];
	public CoreUnroutedPipe pipe;
	private LogisticsTileRenderController renderController;
	@Getter
	private boolean initialized = false;
	private boolean deletePipe = false;
	private TileBuffer[] tileBuffer;
	private boolean sendClientUpdate = false;
	private boolean blockNeighborChange = false;
	private boolean refreshRenderState = false;
	private boolean pipeBound = false;
	@SideOnly(Side.CLIENT)
	private AxisAlignedBB renderBox;
	/* IPipeInformationProvider */

	public void setTurtleConnect(boolean flag) {
		SimpleServiceLocator.ccProxy.setTurtleConnect(flag, this);
	}

	//public int redstoneInput = 0;
	//public int[] redstoneInputSide = new int[ForgeDirection.VALID_DIRECTIONS.length];

	public class CoreState implements IClientState {

		public int pipeId = -1;

		@Override
		public void writeData(LPDataOutput output) {
			output.writeInt(pipeId);

		}

		@Override
		public void readData(LPDataInput input) {
			pipeId = input.readInt();

		}
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	@AllArgsConstructor
	public enum CurveOrientation implements ITubeOrientation {
		//@formatter:off
		// Name: Placement from  _ TurnDirection
		NORTH_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(2, 0, 2), ForgeDirection.NORTH, ForgeDirection.EAST),
		NORTH_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
		WEST_WEST_NORTH(TurnDirection.WEST_NORTH, new DoubleCoordinates(2, 0, -2), ForgeDirection.WEST, ForgeDirection.NORTH),
		WEST_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST, ForgeDirection.SOUTH),
		SOUTH_SOUTH_WEST(TurnDirection.SOUTH_WEST, new DoubleCoordinates(-2, 0, -2), ForgeDirection.SOUTH, ForgeDirection.WEST),
		SOUTH_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH, ForgeDirection.EAST),
		EAST_EAST_SOUTH(TurnDirection.EAST_SOUTH, new DoubleCoordinates(-2, 0, 2), ForgeDirection.EAST, ForgeDirection.SOUTH),
		EAST_NORTH_EAST(TurnDirection.NORTH_EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH);
		//@formatter:on
		@Getter
		TurnDirection renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection from;
		@Getter
		ForgeDirection looking;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotatePositions(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeCurve) pipe).orientation = this;
		}
	}

	@AllArgsConstructor
	public enum TurnDirection implements ITubeRenderOrientation {
		//@formatter:off
		NORTH_EAST(ForgeDirection.NORTH, ForgeDirection.EAST),
		EAST_SOUTH(ForgeDirection.EAST, ForgeDirection.SOUTH),
		SOUTH_WEST(ForgeDirection.SOUTH, ForgeDirection.WEST),
		WEST_NORTH(ForgeDirection.WEST, ForgeDirection.NORTH);
		//@formatter:on
		@Getter
		ForgeDirection dir1;
		ForgeDirection dir2;

		public void rotatePositions(IPositionRotateble set) {
			if (this == WEST_NORTH) {
				return;
			} else if (this == NORTH_EAST) {
				set.rotateRight();
			} else if (this == EAST_SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			} else if (this == SOUTH_WEST) {
				set.rotateLeft();
			}
		}
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	public enum TubeGainOrientation implements ITubeOrientation {
		NORTH(TubeGainRenderOrientation.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
		SOUTH(TubeGainRenderOrientation.SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
		EAST(TubeGainRenderOrientation.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
		WEST(TubeGainRenderOrientation.WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);

		@Getter
		TubeGainRenderOrientation renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;

		TubeGainOrientation(TubeGainRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
			renderOrientation = render;
			offset = off;
			this.dir = dir;
		}

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotateOrientation(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeGain) pipe).orientation = this;
		}
	}

	public enum TubeGainRenderOrientation implements ITubeRenderOrientation {
		NORTH(ForgeDirection.NORTH),
		SOUTH(ForgeDirection.SOUTH),
		WEST(ForgeDirection.WEST),
		EAST(ForgeDirection.EAST);

		@Getter
		private ForgeDirection dir;

		TubeGainRenderOrientation(ForgeDirection dir) {
			this.dir = dir;
		}

		public void rotateOrientation(IPositionRotateble set) {
			if (this == EAST) {
				set.rotateRight();
			} else if (this == WEST) {
				set.rotateLeft();
			} else if (this == SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			}
		}
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	public enum TubeLineOrientation implements ITubeOrientation {
		NORTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH),
		SOUTH(TubeLineRenderOrientation.NORTH_SOUTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.SOUTH),
		EAST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST),
		WEST(TubeLineRenderOrientation.EAST_WEST, new DoubleCoordinates(0, 0, 0), ForgeDirection.WEST);

		@Getter
		TubeLineRenderOrientation renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;

		TubeLineOrientation(TubeLineRenderOrientation render, DoubleCoordinates off, ForgeDirection dir) {
			renderOrientation = render;
			offset = off;
			this.dir = dir;
		}

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotateOrientation(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeLine) pipe).orientation = this;
		}
	}

	public enum TubeLineRenderOrientation implements ITubeRenderOrientation {
		NORTH_SOUTH(ForgeDirection.NORTH),
		EAST_WEST(ForgeDirection.EAST);

		@Getter
		private ForgeDirection dir;

		TubeLineRenderOrientation(ForgeDirection dir) {
			this.dir = dir;
		}

		public void rotateOrientation(IPositionRotateble set) {
			if (this == EAST_WEST) {
				set.rotateLeft();
			}
		}
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	@AllArgsConstructor
	public enum CurveSOrientation implements ITubeOrientation {
		//@formatter:off
		// Name: Placement from  _ TurnDirection
		NORTH_EAST(TurnSDirection.NORTH_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.EAST),
		NORTH_WEST(TurnSDirection.NORTH, new DoubleCoordinates(0, 0, 0), ForgeDirection.NORTH, ForgeDirection.WEST),
		EAST_SOUTH(TurnSDirection.EAST_INV, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.SOUTH),
		EAST_NORTH(TurnSDirection.EAST, new DoubleCoordinates(0, 0, 0), ForgeDirection.EAST, ForgeDirection.NORTH),
		SOUTH_WEST(TurnSDirection.NORTH_INV, new DoubleCoordinates(-1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.WEST),
		SOUTH_EAST(TurnSDirection.NORTH, new DoubleCoordinates(1, 0, 3), ForgeDirection.SOUTH, ForgeDirection.EAST),
		WEST_NORTH(TurnSDirection.EAST_INV, new DoubleCoordinates(-3, 0, -1), ForgeDirection.WEST, ForgeDirection.NORTH),
		WEST_SOUTH(TurnSDirection.EAST, new DoubleCoordinates(-3, 0, 1), ForgeDirection.WEST, ForgeDirection.SOUTH);
		//@formatter:on

		@Getter
		TurnSDirection renderOrientation;
		@Getter
		DoubleCoordinates offset;
		@Getter
		ForgeDirection dir;
		@Getter
		ForgeDirection looking;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			renderOrientation.rotatePositions(set);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeSCurve) pipe).orientation = this;
		}
	}

	@AllArgsConstructor
	public enum TurnSDirection implements ITubeRenderOrientation {
		//@formatter:off
		NORTH(ForgeDirection.NORTH),
		EAST(ForgeDirection.EAST),
		NORTH_INV(ForgeDirection.SOUTH),
		EAST_INV(ForgeDirection.WEST);
		//@formatter:on

		@Getter
		private ForgeDirection dir1;

		public void rotatePositions(IPositionRotateble set) {
			if (this == NORTH) {
				set.mirrorX();
			} else if (this == EAST) {
				set.mirrorX();
				set.rotateRight();
			} else if (this == EAST_INV) {
				set.rotateRight();
			}
		}
	}
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {

	@AllArgsConstructor
	public enum SpeedupDirection implements ITubeRenderOrientation, ITubeOrientation {
		//@formatter:off
		NORTH(ForgeDirection.NORTH),
		SOUTH(ForgeDirection.SOUTH),
		EAST(ForgeDirection.EAST),
		WEST(ForgeDirection.WEST);
		//@formatter:on
		@Getter
		ForgeDirection dir1;

		@Override
		public void rotatePositions(IPositionRotateble set) {
			if (this == SOUTH) {
				set.rotateLeft();
				set.rotateLeft();
			} else if (this == EAST) {
				set.rotateRight();
			} else if (this == WEST) {
				set.rotateLeft();
			}
		}

		@Override
		public ITubeRenderOrientation getRenderOrientation() {
			return this;
		}

		@Override
		public DoubleCoordinates getOffset() {
			return new DoubleCoordinates(0, 0, 0);
		}

		@Override
		public void setOnPipe(CoreMultiBlockPipe pipe) {
			((HSTubeSpeedup) pipe).orientation = this;
		}
	}
	public void writeData(LPDataOutput output) {}
	public void readData(LPDataInput input) {}
							@Override public void writeData_LP(LPDataOutput output)  {
							@Override public void writeData(LPDataOutput output)  {}
							@Override public void readData(LPDataInput input)  {}
	void writeData(LPDataOutput output);
	void readData(LPDataInput input);
	void writeData_LP(LPDataOutput output);
	void readData_LP(LPDataInput input);
	public void writeData_LP(LPDataOutput output) {
	public void readData_LP(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public void readData(LPDataInput input) {
	public ItemIdentifierStack stack;
	private Object ccObject;
	public DictResource(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public Object getCCType() {
		return ccObject;
	public void setCCType(Object type) {
		ccObject = type;
	private int amount;
	private Object ccObject;
	public FluidResource(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public Object getCCType() {
		return ccObject;
	public void setCCType(Object type) {
		ccObject = type;
	void writeData(LPDataOutput output);
	/**
	 * Settings only apply for the normal Item Implementation.
	 */
	enum MatchSettings {
		NORMAL,
		WITHOUT_NBT
	}

	private Object ccObject;
	public ItemResource(LPDataInput input) {
	public void writeData(LPDataOutput output) {
	public Object getCCType() {
		return ccObject;
	public void setCCType(Object type) {
		ccObject = type;
		protected IResource readData(LPDataInput input) {
		protected IResource readData(LPDataInput input) {
		protected IResource readData(LPDataInput input) {
	public static void writeResource(LPDataOutput output, IResource resource) {
	public static IResource readResource(LPDataInput input) {
	protected abstract IResource readData(LPDataInput input);
	public void writeData(LPDataOutput output) {
	public LaserData readData(LPDataInput input) {
	private final ClientCompressorThread clientCompressorThread = new ClientCompressorThread();
	private final ClientDecompressorThread clientDecompressorThread = new ClientDecompressorThread();

	public ClientPacketBufferHandlerThread() {}

	private static byte[] compress(byte[] content) {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		try {
			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
			gzipOutputStream.write(content);
			gzipOutputStream.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return byteArrayOutputStream.toByteArray();
	}

	private static byte[] decompress(byte[] contentBytes) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
			int buffer = 0;
			while ((buffer = gzip.read()) != -1) {
				out.write(buffer);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return out.toByteArray();
	}

	public void clientTick(ClientTickEvent event) {
		if (event.phase != Phase.END) {
			return;
		}
		clientDecompressorThread.clientTickEnd();
	}

	public void setPause(boolean flag) {
		clientCompressorThread.setPause(flag);
	}

	public void addPacketToCompressor(ModernPacket packet) {
		clientCompressorThread.addPacketToCompressor(packet);
	}

	public void handlePacket(byte[] content) {
		clientDecompressorThread.handlePacket(content);
	}

	public void clear() {
		clientCompressorThread.clear();
		clientDecompressorThread.clear();
	}

	public void queueFailedPacket(ModernPacket packet, EntityPlayer player) {
		clientDecompressorThread.queueFailedPacket(packet, player);
	}

				synchronized (clientList) {
					if (!pause && clientList.size() > 0) {
						clientBuffer = LPDataIOWrapper.collectData(output -> {
							output.writeBytes(clientBuffer);
							clearLock.lock();
							try {
								for (ModernPacket packet : clientList) {
									output.writeShort(packet.getId());
									output.writeInt(packet.getDebugId());
									packet.writeData(output);
							} finally {
								clientList.clear();
								clearLock.unlock();
							}
						});
				}
				//Send Content
				if (clientBuffer.length > 0) {
					while (clientBuffer.length > 1024 * 32) {
						byte[] sendbuffer = Arrays.copyOf(clientBuffer, 1024 * 32);
						clientBuffer = Arrays.copyOfRange(clientBuffer, 1024 * 32, clientBuffer.length);
					byte[] sendbuffer = clientBuffer;
					clientBuffer = new byte[] {};
					byte[] compressed = ClientPacketBufferHandlerThread.compress(sendbuffer);
					MainProxy.sendPacketToServer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed));
						} catch (InterruptedException ignored) { }
		//decompressed serialized S->C data
		private byte[] ByteBuffer = new byte[] {};
			LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
				PacketHandler.onPacketData(input, playerDataPair.getValue1());
			});
						} catch (InterruptedException ignored) { }
	private final ServerCompressorThread serverCompressorThread = new ServerCompressorThread();
	private final ServerDecompressorThread serverDecompressorThread = new ServerDecompressorThread();

	public ServerPacketBufferHandlerThread() {}

	private static byte[] compress(byte[] content) {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		try {
			GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
			gzipOutputStream.write(content);
			gzipOutputStream.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return byteArrayOutputStream.toByteArray();
	}

	private static byte[] decompress(byte[] contentBytes) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		try {
			GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(contentBytes));
			int buffer = 0;
			while ((buffer = gzip.read()) != -1) {
				out.write(buffer);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return out.toByteArray();
	}

	public void serverTick(ServerTickEvent event) {
		if (event.phase != Phase.END) {
			return;
		}
		serverDecompressorThread.serverTickEnd();
	}

	public void setPause(boolean flag) {
		serverCompressorThread.setPause(flag);
	}

	public void addPacketToCompressor(ModernPacket packet, EntityPlayer player) {
		serverCompressorThread.addPacketToCompressor(packet, player);
	}

	public void handlePacket(byte[] content, EntityPlayer player) {
		serverDecompressorThread.handlePacket(content, player);
	}

	public void clear(final EntityPlayer player) {
		new Thread() {

			@Override
			public void run() {
				serverCompressorThread.clear(player);
				serverDecompressorThread.clear(player);
			}
		}.start();
	}

				synchronized (serverList) {
					if (!pause) {
						for (Entry<EntityPlayer, LinkedList<ModernPacket>> playerPacketEntry : serverList.entrySet()) {
							EntityPlayer player = playerPacketEntry.getKey();
							serverBuffer.put(player, LPDataIOWrapper.collectData(output -> {
								if (serverBuffer.containsKey(player)) {
									output.writeBytes(serverBuffer.get(player));
								}
								LinkedList<ModernPacket> packets = playerPacketEntry.getValue();
								try {
									for (ModernPacket packet : packets) {
										output.writeShort(packet.getId());
										output.writeInt(packet.getDebugId());
										packet.writeData(output);
								} finally {
									packets.clear();
								}
							}));
						serverList.clear();
				}
				//Send Content
				for (Entry<EntityPlayer, byte[]> player : serverBuffer.entrySet()) {
					while (player.getValue().length > 32 * 1024) {
						byte[] sendbuffer = Arrays.copyOf(player.getValue(), 1024 * 32);
						byte[] newbuffer = Arrays.copyOfRange(player.getValue(), 1024 * 32, player.getValue().length);
						player.setValue(newbuffer);
					byte[] sendbuffer = player.getValue();
					byte[] compressed = ServerPacketBufferHandlerThread.compress(sendbuffer);
					MainProxy.sendPacketToPlayer(PacketHandler.getPacket(BufferTransfer.class).setContent(compressed), player.getKey());
						} catch (InterruptedException ignored) { }
			LPDataIOWrapper.provideData(playerDataPair.getValue2(), input -> {
				PacketHandler.onPacketData(input, playerDataPair.getValue1());
			});
						} catch (InterruptedException ignored) { }
	public static void provideData(byte[] data, LPDataInputConsumer dataInputConsumer) {
	public static byte[] collectData(LPDataOutputConsumer dataOutputConsumer) {
	public static void provideData(ByteBuf dataBuffer, LPDataInputConsumer dataInputConsumer) {
	public static void writeData(ByteBuf dataBuffer, LPDataOutputConsumer dataOutputConsumer) {
	private void unsetBuffer() {
		if (localBuffer.hasMemoryAddress()) {
			if (--reference < 1) {
				BUFFER_WRAPPER_MAP.remove(localBuffer.memoryAddress());
			}
		}
		localBuffer = null;
	}

	public void writeByteArray(byte[] arr) {
	public byte[] readByteArray() {
	public void writeUTF(String s) {
	public void writeExitRoute(ExitRoute route) {
	public <T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz) {
	public void writeBitSet(BitSet bits) {
	public void writeNBTTagCompound(NBTTagCompound tag) {
			try {
				CompressedStreamTools.write(tag, new ByteBufOutputStream(localBuffer));
			} catch (IOException e) {

				e.printStackTrace();
			}
	public void writeBooleanArray(boolean[] arr) {
	public void writeItemStack(ItemStack itemstack) {
	public void writeItemIdentifier(ItemIdentifier item) {
	public void writeItemIdentifierStack(ItemIdentifierStack stack) {
	public <T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler) {
	public void writeOrderInfo(IOrderInfoProvider order) {
	public void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList) {
	public void writeResource(IResource res) {
	public void writeBytes(byte[] arr) {
	public String readUTF() {
	public ExitRoute readExitRoute(World world) {
	public <T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz) {
	public BitSet readBitSet() {
	public NBTTagCompound readNBTTagCompound() {
		try {
			return CompressedStreamTools.func_152456_a(new ByteBufInputStream(localBuffer), NBTSizeTracker.field_152451_a);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	public boolean[] readBooleanArray() {
	public byte[] readBytes(int length) {
	public ItemStack readItemStack() {
	public ItemIdentifier readItemIdentifier() {
	public ItemIdentifierStack readItemIdentifierStack() {
	public <T> ArrayList<T> readArrayList(IReadListObject<T> reader) {
	public <T> LinkedList<T> readLinkedList(IReadListObject<T> reader) {
	public <T> Set<T> readSet(IReadListObject<T> handler) {
	public IOrderInfoProvider readOrderInfo() {
	public LinkedLogisticsOrderList readLinkedLogisticsOrderList() {
			throw new NullPointerException("Expected order info provider list");
			throw new NullPointerException("Expected logistics order list");
	public ByteBuf readByteBuf() {
	public IResource readResource() {
	byte[] readByteArray();
	byte readByte();
	short readShort();
	int readInt();
	long readLong();
	float readFloat();
	double readDouble();
	boolean readBoolean();
	String readUTF();
	ForgeDirection readForgeDirection();
	ExitRoute readExitRoute(World world);
	IRouter readIRouter(World world);
	DoubleCoordinates readLPPosition();
	<T extends Enum<T>> EnumSet<T> readEnumSet(Class<T> clazz);
	BitSet readBitSet();
	NBTTagCompound readNBTTagCompound();
	boolean[] readBooleanArray();
	int[] readIntArray();
	byte[] readBytes(int length);
	ItemIdentifier readItemIdentifier();
	ItemIdentifierStack readItemIdentifierStack();
	ItemStack readItemStack();
	<T> ArrayList<T> readArrayList(IReadListObject<T> reader);
	<T> LinkedList<T> readLinkedList(IReadListObject<T> reader);
	<T> Set<T> readSet(IReadListObject<T> handler);
	IOrderInfoProvider readOrderInfo();
	<T extends Enum<T>> T readEnum(Class<T> clazz);
	LinkedLogisticsOrderList readLinkedLogisticsOrderList();
	ByteBuf readByteBuf();
	long[] readLongArray();
	IResource readResource();
		void accept(LPDataInput dataInput);
	void writeByte(int b);
	void writeByte(byte b);
	void writeShort(int s);
	void writeShort(short s);
	void writeInt(int i);
	void writeLong(long l);
	void writeFloat(float f);
	void writeDouble(double d);
	void writeBoolean(boolean b);
	void writeUTF(String s);
	void writeByteArray(byte[] arr);
	void writeByteBuf(ByteBuf buffer);
	void writeIntArray(int[] arr);
	void writeLongArray(long[] arr);
	void writeBooleanArray(boolean[] arr);
	void writeForgeDirection(ForgeDirection direction);
	void writeExitRoute(ExitRoute route);
	void writeIRouter(IRouter router);
	void writeLPPosition(DoubleCoordinates pos);
	<T extends Enum<T>> void writeEnumSet(EnumSet<T> types, Class<T> clazz);
	void writeBitSet(BitSet bits);
	void writeNBTTagCompound(NBTTagCompound tag);
	void writeItemStack(ItemStack itemstack);
	void writeItemIdentifier(ItemIdentifier item);
	void writeItemIdentifierStack(ItemIdentifierStack stack);
	<T> void writeCollection(Collection<T> collection, IWriteListObject<T> handler);
	void writeOrderInfo(IOrderInfoProvider order);
	<T extends Enum<T>> void writeEnum(T obj);
	void writeLinkedLogisticsOrderList(LinkedLogisticsOrderList orderList);
	void writeResource(IResource res);
	void writeBytes(byte[] arr);
		void accept(LPDataOutput dataOutput);
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(arrayList,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(linkedList,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(set,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));
		byte[] data = LPDataIOWrapper.collectData(output -> output.writeCollection(null,
				(logisticspipes.network.IWriteListObject<String>) LPDataOutput::writeUTF));