diff --git a/scapy/packet.py b/scapy/packet.py
index 90f238eee4b6dcef4d3f31169e210ae78a3aaf31..eb8e265e3f0831477b74f301d39cb37148f53fcb 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -73,6 +73,31 @@ class Packet(BasePacket):
         for lower,fval in self._overload_fields.iteritems():
             print "%-20s  %s" % (lower.__name__, ", ".join("%-12s" % ("%s=%r"%i) for i in fval.iteritems()))
 
+    def _unpickle(self, dlist):
+        """Used to unpack pickling"""
+        self.__init__("".join(dlist))
+        return self
+
+    def __reduce__(self):
+        """Used by pickling methods"""
+        return (self.__class__, (), (self.build(),))
+
+    def __reduce_ex__(self, proto):
+        """Used by pickling methods"""
+        return self.__reduce__()
+
+    def __getstate__(self):
+        """Mark object as pickable"""
+        return self.__reduce__()[2]
+
+    def __setstate__(self, state):
+        """Rebuild state using pickable methods"""
+        return self._unpickle(state)
+
+    def __deepcopy__(self, memo):
+        """Used by copy.deepcopy"""
+        return self.copy()
+
     def __init__(self, _pkt="", post_transform=None, _internal=0, _underlayer=None, **fields):
         self.time  = time.time()
         self.sent_time = None
diff --git a/test/regression.uts b/test/regression.uts
index bd13bbefe2dedc8940d2c4a31081785df9b32697..0da39aa3a932165e569956f68573df5247d23b77 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -154,6 +154,27 @@ data = ["init_session(\"scapySession2\")",\
 
 emulate_main_input(data)
 
+= Test pickling with packets
+
+data = ["init_session(\"scapySession1\")",\
+"test_value = IP(src=\"127.0.0.1\", dst=\"8.8.8.8\")",\
+"test_value2 = ICMPv6EchoReply(data=\"testData@%!\")",\
+"save_session()",\
+"del test_value",\
+"load_session()",\
+"assert test_value.src == \"127.0.0.1\"",\
+"assert test_value.dst == \"8.8.8.8\"",\
+"assert test_value2.data == \"testData@%!\""]
+
+emulate_main_input(data)
+
+= Clean up session files
+
+try:
+    os.remove("scapySaveSession.dat")
+except OSError:
+    pass
+
 = Test utility functions
 
 tmpfile =  get_temp_file(autoext=".ut")