diff --git a/examples/client_custom_packets/client_custom_packets.js b/examples/client_custom_packets/client_custom_packets.js
index 991d660..11c353e 100644
--- a/examples/client_custom_packets/client_custom_packets.js
+++ b/examples/client_custom_packets/client_custom_packets.js
@@ -9,17 +9,47 @@ var customPackets={
   "1.8": {
     "play": {
       "toClient": {
-        "my_custom_packet": {
-          "id": "0x7A",
-          "fields": [
-            {
-              "name": "age",
-              "type": "i64"
-            },
-            {
-              "name": "time",
-              "type": "i64"
-            }
+        "types": {
+          "packet_custom_name": [
+            "container",[
+              {
+                "name": "age",
+                "type": "i64"
+              },
+              {
+                "name": "time",
+                "type": "i64"
+              }
+            ]
+          ],
+          "packet": [
+            "container",
+            [
+              {
+                "name": "name",
+                "type": [
+                  "mapper",
+                  {
+                    "type": "varint",
+                    "mappings": {
+                      "0x7A": "custom_name"
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "params",
+                "type": [
+                  "switch",
+                  {
+                    "compareTo": "name",
+                    "fields": {
+                      "custom_name": "packet_custom_name"
+                    }
+                  }
+                ]
+              }
+            ]
           ]
         }
       }
@@ -51,6 +81,6 @@ client.on('login',function(){
 
 });
 
-client.on('my_custom_packet',function(packet){
+client.on('custom_name',function(packet){
   console.log(packet);
 });
diff --git a/package.json b/package.json
index 5c66aa4..a8faece 100644
--- a/package.json
+++ b/package.json
@@ -43,14 +43,16 @@
   },
   "dependencies": {
     "buffer-equal": "1.0.0",
-    "minecraft-data": "^1.0.3",
+    "endian-toggle": "0.0.0",
+    "lodash.get": "^4.1.2",
+    "lodash.merge": "^4.3.0",
+    "minecraft-data": "~1.1.0",
     "prismarine-nbt": "0.2.1",
     "protodef": "^1.1.1",
     "readable-stream": "^2.0.5",
     "ursa-purejs": "0.0.3",
     "uuid-1345": "^0.99.6",
-    "yggdrasil": "0.1.0",
-    "endian-toggle": "0.0.0"
+    "yggdrasil": "0.1.0"
   },
   "optionalDependencies": {
     "ursa": "~0.9.1"
diff --git a/src/transforms/serializer.js b/src/transforms/serializer.js
index 98fdb30..7756451 100644
--- a/src/transforms/serializer.js
+++ b/src/transforms/serializer.js
@@ -4,59 +4,35 @@ const Parser = require("protodef").Parser;
 
 const minecraft = require("../datatypes/minecraft");
 const states = require("../states");
+const merge=require("lodash.merge");
+const get=require("lodash.get");
 
-function createProtocol(types,packets)
+function recursiveAddTypes(protocol,protocolData,path)
+{
+  if(protocolData===undefined)
+    return;
+  if(protocolData.types)
+    protocol.addTypes(protocolData.types);
+  recursiveAddTypes(protocol,get(protocolData,path.shift()),path);
+}
+
+function createProtocol(state,direction,version,customPackets)
 {
   const proto = new ProtoDef();
-  proto.addType("string",["pstring",{
-    countType:"varint"
-  }]);
   proto.addTypes(minecraft);
-  proto.addTypes(types);
-
-  Object.keys(packets).forEach(function(name) {
-    proto.addType("packet_"+name,["container",packets[name].fields]);
-  });
-
-  proto.addType("packet",["container", [
-    { "name": "name", "type":["mapper",{"type": "varint" ,
-      "mappings":Object.keys(packets).reduce(function(acc,name){
-        acc[parseInt(packets[name].id)]=name;
-        return acc;
-      },{})
-    }]},
-    { "name": "params", "type": ["switch", {
-      "compareTo": "name",
-      "fields": Object.keys(packets).reduce(function(acc,name){
-        acc[name]="packet_"+name;
-        return acc;
-      },{})
-    }]}
-  ]]);
+  const mcData=require("minecraft-data")(version);
+  recursiveAddTypes(proto,merge(mcData.protocol,get(customPackets,[mcData.version.majorVersion])),[state,direction]);
   return proto;
 }
 
 function createSerializer({ state = states.HANDSHAKING, isServer = false , version,customPackets} = {})
 {
-  const mcData=require("minecraft-data")(version);
-  const direction = !isServer ? 'toServer' : 'toClient';
-  const packets = mcData.protocol.states[state][direction];
-  const v=mcData.version.majorVersion;
-  if(customPackets && customPackets[v] && customPackets[v][state] && customPackets[v][state][direction]) Object.keys(customPackets[v][state][direction]).forEach(name => packets[name]=customPackets[v][state][direction][name]);
-  const proto=createProtocol(mcData.protocol.types,packets);
-  return new Serializer(proto,"packet");
+  return new Serializer(createProtocol(state,!isServer ? "toServer" : "toClient",version,customPackets),"packet");
 }
 
-function createDeserializer({ state = states.HANDSHAKING, isServer = false,
-  packetsToParse = {"packet": true}, version,customPackets } = {})
+function createDeserializer({ state = states.HANDSHAKING, isServer = false,version,customPackets } = {})
 {
-  const mcData=require("minecraft-data")(version);
-  const direction = isServer ? "toServer" : "toClient";
-  const packets = mcData.protocol.states[state][direction];
-  const v=mcData.version.majorVersion;
-  if(customPackets &&  customPackets[v][state] && customPackets[v][state][direction]) Object.keys(customPackets[v][state][direction]).forEach(name => packets[name]=customPackets[v][state][direction][name]);
-  const proto=createProtocol(mcData.protocol.types,packets);
-  return new Parser(proto,"packet");
+  return new Parser(createProtocol(state,isServer ? "toServer" : "toClient",version,customPackets),"packet");
 }
 
 module.exports = {