diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp
index c623c07d6b..f2fd031526 100644
--- a/avatar-mixer/src/main.cpp
+++ b/avatar-mixer/src/main.cpp
@@ -93,7 +93,7 @@ int main(int argc, const char* argv[]) {
         }
         
         if (nodeList->getNodeSocket()->receive(nodeAddress, packetData, &receivedBytes) &&
-            versionForPacketType(packetData[0]) == packetData[1]) {
+            packetVersionMatch(packetData)) {
             switch (packetData[0]) {
                 case PACKET_TYPE_HEAD_DATA:
                     // grab the node ID from the packet
@@ -119,7 +119,7 @@ int main(int argc, const char* argv[]) {
                     break;
                 case PACKET_TYPE_AVATAR_VOXEL_URL:
                     // grab the node ID from the packet
-                    unpackNodeId(packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION), &nodeID);
+                    unpackNodeId(packetData + numBytesForPacketHeader(packetData), &nodeID);
                     
                     // let everyone else know about the update
                     for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) {
diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp
index 1911fb7dd4..065aa5e621 100644
--- a/domain-server/src/main.cpp
+++ b/domain-server/src/main.cpp
@@ -87,12 +87,14 @@ int main(int argc, const char * argv[])
     while (true) {
         if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) &&
             (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) &&
-            versionForPacketType(packetData[0]) == packetData[1]) {
+            packetVersionMatch(packetData)) {
             // this is an RFD or domain list request packet, and there is a version match
             std::map<char, Node *> newestSoloNodes;
             
+            int numBytesSenderHeader = numBytesForPacketHeader(packetData);
+            
             nodeType = packetData[1];
-            int numBytesSocket = unpackSocket(packetData + numHeaderBytes + sizeof(NODE_TYPE),
+            int numBytesSocket = unpackSocket(packetData + numBytesSenderHeader + sizeof(NODE_TYPE),
                                               (sockaddr*) &nodeLocalAddress);
             
             sockaddr* destinationSocket = (sockaddr*) &nodePublicAddress;
@@ -110,18 +112,18 @@ int main(int argc, const char * argv[])
             }
             
             Node* newNode = nodeList->addOrUpdateNode((sockaddr*) &nodePublicAddress,
-                                                          (sockaddr*) &nodeLocalAddress,
-                                                          nodeType,
-                                                          nodeList->getLastNodeID());
+                                                      (sockaddr*) &nodeLocalAddress,
+                                                      nodeType,
+                                                      nodeList->getLastNodeID());
             
             if (newNode->getNodeID() == nodeList->getLastNodeID()) {
                 nodeList->increaseNodeID();
             }
             
-            currentBufferPos = broadcastPacket + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);
+            currentBufferPos = broadcastPacket + numHeaderBytes;
             startPointer = currentBufferPos;
             
-            unsigned char* nodeTypesOfInterest = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION) + sizeof(NODE_TYPE)
+            unsigned char* nodeTypesOfInterest = packetData + numBytesSenderHeader + sizeof(NODE_TYPE)
                 + numBytesSocket + sizeof(unsigned char);
             int numInterestTypes = *(nodeTypesOfInterest - 1);
             
@@ -174,8 +176,8 @@ int main(int argc, const char * argv[])
             
             // send the constructed list back to this node
             nodeList->getNodeSocket()->send(destinationSocket,
-                                              broadcastPacket,
-                                              (currentBufferPos - startPointer) + 1);
+                                            broadcastPacket,
+                                            (currentBufferPos - startPointer) + 1);
         }
         
         if (Logstash::shouldSendStats()) {
diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp
index bce010e265..43314b290c 100644
--- a/libraries/shared/src/NodeList.cpp
+++ b/libraries/shared/src/NodeList.cpp
@@ -287,7 +287,7 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte
     sockaddr_in nodeLocalSocket;
     nodeLocalSocket.sin_family = AF_INET;
     
-    unsigned char* readPtr = packetData + sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);
+    unsigned char* readPtr = packetData + numBytesForPacketHeader(packetData);
     unsigned char* startPtr = packetData;
     
     while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) {
diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp
index f892afc124..7188ea8179 100644
--- a/libraries/shared/src/PacketHeaders.cpp
+++ b/libraries/shared/src/PacketHeaders.cpp
@@ -16,10 +16,40 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) {
     }
 }
 
-int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type) {
-    destination[0] = type;
-    destination[1] = versionForPacketType(type);
+bool packetVersionMatch(unsigned char* packetHeader) {
+    // currently this just checks if the version in the packet matches our return from versionForPacketType
+    // may need to be expanded in the future for types and versions that take > than 1 byte
+    return packetHeader[1] == versionForPacketType(packetHeader[0]);
+}
+
+int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type) {
+    destinationHeader[0] = type;
+    destinationHeader[1] = versionForPacketType(type);
     
     // return the number of bytes written for pointer pushing
     return 2;
+}
+
+int numBytesForPacketType(const unsigned char* packetType) {
+    if (packetType[0] == 255) {
+        return 1 + numBytesForPacketType(packetType + 1);
+    } else {
+        return 1;
+    }
+}
+
+int numBytesForPacketVersion(const unsigned char* packetVersion) {
+    if (packetVersion[0] == 255) {
+        return 1 + numBytesForPacketVersion(packetVersion + 1);
+    } else {
+        return 1;
+    }
+}
+
+int numBytesForPacketHeader(unsigned char* packetHeader) {
+    // int numBytesType = numBytesForPacketType(packetHeader);
+    // return numBytesType + numBytesForPacketVersion(packetHeader + numBytesType);
+    
+    // currently this need not be dynamic - there are 2 bytes for each packet header
+    return 2;
 }
\ No newline at end of file
diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h
index d521dda605..041303f2b5 100644
--- a/libraries/shared/src/PacketHeaders.h
+++ b/libraries/shared/src/PacketHeaders.h
@@ -38,7 +38,10 @@ typedef char PACKET_VERSION;
 
 PACKET_VERSION versionForPacketType(PACKET_TYPE type);
 
-int populateTypeAndVersion(unsigned char* destination, PACKET_TYPE type);
+bool packetVersionMatch(unsigned char* packetHeader);
+
+int populateTypeAndVersion(unsigned char* destinationHeader, PACKET_TYPE type);
+int numBytesForPacketHeader(unsigned char* packetHeader);
 
 const int MAX_PACKET_HEADER_BYTES = sizeof(PACKET_TYPE) + sizeof(PACKET_VERSION);