diff --git a/src/main/java/net/floodlightcontroller/packet/BSN.java b/src/main/java/net/floodlightcontroller/packet/BSN.java
index 27c8f70df69cce5896f66a5d64522a2bc1c9f654..2540f2081d10f261f493dadc0d68ee9a318917c9 100644
--- a/src/main/java/net/floodlightcontroller/packet/BSN.java
+++ b/src/main/java/net/floodlightcontroller/packet/BSN.java
@@ -96,7 +96,8 @@ public class BSN extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         
         int magic = bb.getInt();
diff --git a/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java b/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
index 1343f769b86f45399f33357ff3932092007c562c..c9115eacb5c22c459cbaded572a64063125118c6 100644
--- a/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
+++ b/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
@@ -125,7 +125,8 @@ public class BSNPROBE extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         
         controllerId = bb.getLong();
diff --git a/src/main/java/net/floodlightcontroller/packet/BasePacket.java b/src/main/java/net/floodlightcontroller/packet/BasePacket.java
index eed530c03d2e8047774697bc70032d58eee63981..9ed2871aaee86322680f039b0babba5483e4bbd5 100644
--- a/src/main/java/net/floodlightcontroller/packet/BasePacket.java
+++ b/src/main/java/net/floodlightcontroller/packet/BasePacket.java
@@ -113,7 +113,12 @@ public abstract class BasePacket implements IPacket {
         // cloning. Not the most efficient way but simple. We can revisit
         // if we hit performance problems.
         byte[] data = this.serialize();
-        pkt.deserialize(this.serialize(), 0, data.length);
+        try {
+            pkt.deserialize(this.serialize(), 0, data.length);
+        } catch (PacketParsingException e) {
+            // This shouldn't happen here, since we already deserialized it once
+            return new Data(data);
+        }
         pkt.setParent(this.parent);
         return pkt;
     }
diff --git a/src/main/java/net/floodlightcontroller/packet/Ethernet.java b/src/main/java/net/floodlightcontroller/packet/Ethernet.java
index 4fc2380762a5c71e019886cb6c0da82e6b84fc19..438e786a3459028888f1b95c6480ff052c5c5f45 100644
--- a/src/main/java/net/floodlightcontroller/packet/Ethernet.java
+++ b/src/main/java/net/floodlightcontroller/packet/Ethernet.java
@@ -262,7 +262,7 @@ public class Ethernet extends BasePacket {
             try {
                 payload = clazz.newInstance();
                 this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
-            } catch (Exception e) {
+            } catch (PacketParsingException e) {
                 if (log.isTraceEnabled()) {
                     log.trace("Failed to parse ethernet packet {}->{}" +
                             " payload as {}, treat as plain ethernet packet",
@@ -271,12 +271,27 @@ public class Ethernet extends BasePacket {
                                           clazz.getClass().getName()});
                     log.trace("Exception from parsing {}", e);
                 }
-                payload = new Data();
-                this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
+                this.payload = new Data(data);
+            } catch (InstantiationException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Fail to instantiate class {}, {}",
+                              clazz.getClass().getName(), e);
+                }
+                this.payload = new Data(data);
+            } catch (IllegalAccessException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Fail to access class for instantiation {}, {}",
+                              clazz.getClass().getName(), e);
+                }
+                this.payload = new Data(data);
+            } catch (RuntimeException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Runtime exception during packet parsing {}", e);
+                }
+                this.payload = new Data(data);
             }
         } else {
-            payload = new Data();
-            this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
+            this.payload = new Data(data);
         }
         this.payload.setParent(this);
         return this;
diff --git a/src/main/java/net/floodlightcontroller/packet/ICMP.java b/src/main/java/net/floodlightcontroller/packet/ICMP.java
index 6b02b5bd502a5869e35a86579152417f39cd0698..2988106484530d437df2b5fe62aac2c0a0bea480 100644
--- a/src/main/java/net/floodlightcontroller/packet/ICMP.java
+++ b/src/main/java/net/floodlightcontroller/packet/ICMP.java
@@ -184,7 +184,8 @@ public class ICMP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.icmpType = bb.get();
         this.icmpCode = bb.get();
diff --git a/src/main/java/net/floodlightcontroller/packet/IPacket.java b/src/main/java/net/floodlightcontroller/packet/IPacket.java
index 02376cd990cbd1c1980b78bb7815323a46480cf2..4eaaada8e243c072a7a33c48c46fc9d2b1d6ea72 100644
--- a/src/main/java/net/floodlightcontroller/packet/IPacket.java
+++ b/src/main/java/net/floodlightcontroller/packet/IPacket.java
@@ -67,7 +67,8 @@ public interface IPacket {
      * @param length length of the data to deserialize
      * @return the deserialized data
      */
-    public IPacket deserialize(byte[] data, int offset, int length);
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException;
     
     /** Clone this packet and its payload packet but not its parent. 
      * 
diff --git a/src/main/java/net/floodlightcontroller/packet/IPv4.java b/src/main/java/net/floodlightcontroller/packet/IPv4.java
index 327ef7fac9891833e41244d868e2614d15d18770..064ad31e81409941260530aea1fa4323871c0c77 100644
--- a/src/main/java/net/floodlightcontroller/packet/IPv4.java
+++ b/src/main/java/net/floodlightcontroller/packet/IPv4.java
@@ -353,7 +353,8 @@ public class IPv4 extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         short sscratch;
 
diff --git a/src/main/java/net/floodlightcontroller/packet/TCP.java b/src/main/java/net/floodlightcontroller/packet/TCP.java
index 5c2f0294696351152a59701c412858b0dbde5c71..2153378853818fd62d75ae21b9c1518b8b37f35a 100644
--- a/src/main/java/net/floodlightcontroller/packet/TCP.java
+++ b/src/main/java/net/floodlightcontroller/packet/TCP.java
@@ -258,7 +258,8 @@ public class TCP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.sourcePort = bb.getShort();
         this.destinationPort = bb.getShort();
diff --git a/src/main/java/net/floodlightcontroller/packet/UDP.java b/src/main/java/net/floodlightcontroller/packet/UDP.java
index cbeeedfd18add16d1f657c7930cadf4bf08da6b8..710762c097137bede7a84da1fa7cd6de2a586057 100644
--- a/src/main/java/net/floodlightcontroller/packet/UDP.java
+++ b/src/main/java/net/floodlightcontroller/packet/UDP.java
@@ -202,7 +202,8 @@ public class UDP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.sourcePort = bb.getShort();
         this.destinationPort = bb.getShort();