diff --git a/scapy/main.py b/scapy/main.py
index 100fdcdc60874531eb76fc1314a5d4108b283d1f..1513eac89c482e6d832f60873b7175df95269eb7 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -480,16 +480,11 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20):
         banner = the_banner + " using IPython %s\n" % IPython.__version__
         from IPython.terminal.embed import InteractiveShellEmbed
         from IPython.terminal.prompts import Prompts, Token
-        from IPython.utils.generics import complete_object
         from traitlets.config.loader import Config
         from scapy.packet import Packet
 
         cfg = Config()
 
-        @complete_object.when_type(Packet)
-        def complete_packet(obj, prev_completions):
-            return prev_completions + [fld.name for fld in obj.fields_desc]
-
         try:
             get_ipython
         except NameError:
diff --git a/scapy/packet.py b/scapy/packet.py
index 7bed20c801624f1bb6a5c1f3a431f964132a0d85..3064dd3f2124eb2c59a3936d9e0c2f1c2ff384bc 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -284,6 +284,25 @@ class Packet(six.with_metaclass(Packet_metaclass, BasePacket)):
             pass
         return object.__delattr__(self, attr)
             
+    def _superdir(self):
+        """
+        Return a list of slots and methods, including those from subclasses.
+        """
+        attrs = set()
+        cls = self.__class__
+        if hasattr(cls, '__all_slots__'):
+            attrs.update(cls.__all_slots__)
+        for bcls in cls.__mro__:
+            if hasattr(bcls, '__dict__'):
+                attrs.update(bcls.__dict__)
+        return attrs
+
+    def __dir__(self):
+        """
+        Add fields to tab completion list.
+        """
+        return sorted(itertools.chain(self._superdir(), self.default_fields))
+
     def __repr__(self):
         s = ""
         ct = conf.color_theme