diff --git a/scapy/autorun.py b/scapy/autorun.py
index eafe4dbb6caaec411602891e509aa6844c22dc3f..29566da2ddb76c5c2b00fa9fc56e30b2fae6ce11 100644
--- a/scapy/autorun.py
+++ b/scapy/autorun.py
@@ -7,7 +7,7 @@
 Run commands when the Scapy interpreter starts.
 """
 
-import code,sys
+import code, sys, importlib
 from scapy.config import conf
 from scapy.themes import *
 from scapy.error import Scapy_Exception
@@ -36,13 +36,16 @@ class ScapyAutorunInterpreter(code.InteractiveInterpreter):
         return code.InteractiveInterpreter.showtraceback(self, *args, **kargs)
 
 
-def autorun_commands(cmds,my_globals=None,verb=0):
+def autorun_commands(cmds, my_globals=None, ignore_globals=None, verb=0):
     sv = conf.verb
     import __builtin__
     try:
         try:
             if my_globals is None:
-                my_globals = __import__("scapy.all").all.__dict__
+                my_globals = importlib.import_module(".all", "scapy").__dict__
+                if ignore_globals:
+                    for ig in ignore_globals:
+                        my_globals.pop(ig, None)
             conf.verb = verb
             interp = ScapyAutorunInterpreter(my_globals)
             cmd = ""
diff --git a/scapy/layers/all.py b/scapy/layers/all.py
index 6624bec58dbbda63ac6e77d56af6c37ba828907c..a8523385bfbbd0bf6f2af68c728d0cf52570314e 100644
--- a/scapy/layers/all.py
+++ b/scapy/layers/all.py
@@ -7,15 +7,25 @@
 All layers. Configurable with conf.load_layers.
 """
 
+import __builtin__
 from scapy.config import conf
 from scapy.error import log_loading
-import logging
+import logging, importlib
+ignored = list(__builtin__.__dict__.keys()) + ["sys"]
 log = logging.getLogger("scapy.loading")
 
 __all__ = []
 
+
+def _validate_local(x):
+    """Returns whether or not a variable should be imported.
+    Will return False for any default modules (sys), or if
+    they are detected as private vars (starting with a _)"""
+    global ignored
+    return x[0] != "_" and not x in ignored
+
 def _import_star(m):
-    mod = __import__(m, globals(), locals())
+    mod = importlib.import_module("." + m, "scapy.layers")
     if '__all__' in mod.__dict__:
         # only import the exported symbols in __all__
         for name in mod.__dict__['__all__']:
@@ -24,7 +34,7 @@ def _import_star(m):
     else:
         # import all the non-private symbols
         for name, sym in mod.__dict__.iteritems():
-            if name[0] != '_':
+            if _validate_local(name):
                 __all__.append(name)
                 globals()[name] = sym
 
diff --git a/scapy/main.py b/scapy/main.py
index 3c91cd341a30859e030cde830ba8455d96940107..ea0d441bcbd103e71b1371f581958bba83efebfc 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -11,8 +11,10 @@ import os,sys
 import glob
 import types
 import gzip
+import importlib
 import cPickle
 import __builtin__
+ignored = list(__builtin__.__dict__.keys())
 
 from scapy.error import *
     
@@ -35,6 +37,12 @@ def _read_config_file(cf):
     except Exception as e:
         log_loading.exception("Error during evaluation of config file [%s]" % cf)
         
+def _validate_local(x):
+    """Returns whether or not a variable should be imported.
+    Will return False for any default modules (sys), or if
+    they are detected as private vars (starting with a _)"""
+    global ignored
+    return x[0] != "_" and not x in ignored
 
 DEFAULT_PRESTART_FILE = _probe_config_file(".scapy_prestart.py")
 DEFAULT_STARTUP_FILE = _probe_config_file(".scapy_startup.py")
@@ -58,7 +66,7 @@ from scapy.themes import DefaultTheme
 
 def _load(module):
     try:
-        mod = __import__(module,globals(),locals(),".")
+        mod = importlib.import_module(module)
         if '__all__' in mod.__dict__:
             # import listed symbols
             for name in mod.__dict__['__all__']:
@@ -66,7 +74,7 @@ def _load(module):
         else:
             # only import non-private symbols
             for name, sym in mod.__dict__.iteritems():
-                if name[0] != '_':
+                if _validate_local(name):
                     __builtin__.__dict__[name] = sym
     except Exception as e:
         log_interactive.error(e)
@@ -79,7 +87,7 @@ def load_layer(name):
 
 def load_contrib(name):
     try:
-        __import__("scapy.contrib." + name)
+        importlib.import_module("scapy.contrib." + name)
         _load("scapy.contrib." + name)
     except ImportError:
         # if layer not found in contrib, try in layers
@@ -180,11 +188,11 @@ def init_session(session_name, mydict=None):
     global session
     global globkeys
     
-    scapy_builtins = __import__("all",globals(),locals(),".").__dict__
+    scapy_builtins = importlib.import_module(".all", "scapy").__dict__
     for name, sym in scapy_builtins.iteritems():
-        if name [0] != '_':
+        if _validate_local(name):
             __builtin__.__dict__[name] = sym
-    globkeys = scapy_builtins.keys()
+    globkeys = list(scapy_builtins.keys())
     globkeys.append("scapy_session")
     scapy_builtins=None # XXX replace with "with" statement
     if mydict is not None:
diff --git a/scapy/tools/UTscapy.py b/scapy/tools/UTscapy.py
index fb307b50df0a2197e5cdc1c26da008ce1dd7e047..b96aea13b32d20e07c4a73ac4e0cddc58b9eb41d 100755
--- a/scapy/tools/UTscapy.py
+++ b/scapy/tools/UTscapy.py
@@ -7,7 +7,7 @@
 Unit testing infrastructure for Scapy
 """
 
-import sys, getopt, imp, glob
+import sys, getopt, imp, glob, importlib
 import bz2, base64, os.path, time, traceback, zlib, sha
 from scapy.consts import WINDOWS
 
@@ -355,17 +355,17 @@ def remove_empty_testsets(test_campaign):
 
 #### RUN CAMPAIGN #####
 
-def run_campaign(test_campaign, get_interactive_session, verb=3):
+def run_campaign(test_campaign, get_interactive_session, verb=3, ignore_globals=None):
     if WINDOWS:
         # Add a route to 127.0.0.1 and ::1
         from scapy.arch.windows import route_add_loopback
         route_add_loopback()
     passed=failed=0
     if test_campaign.preexec:
-        test_campaign.preexec_output = get_interactive_session(test_campaign.preexec.strip())[0]
+        test_campaign.preexec_output = get_interactive_session(test_campaign.preexec.strip(), ignore_globals=ignore_globals)[0]
     for testset in test_campaign:
         for t in testset:
-            t.output,res = get_interactive_session(t.test.strip())
+            t.output,res = get_interactive_session(t.test.strip(), ignore_globals=ignore_globals)
             the_res = False
             try:
                 if res is None or res:
@@ -607,7 +607,7 @@ def usage():
 #### MAIN ####
 
 def execute_campaign(TESTFILE, OUTPUTFILE, PREEXEC, NUM, KW_OK, KW_KO, DUMP,
-                     FORMAT, VERB, ONLYFAILED, CRC, autorun_func, pos_begin=0):
+                     FORMAT, VERB, ONLYFAILED, CRC, autorun_func, pos_begin=0, ignore_globals=None):
     # Parse test file
     test_campaign = parse_campaign_file(TESTFILE)
 
@@ -637,7 +637,7 @@ def execute_campaign(TESTFILE, OUTPUTFILE, PREEXEC, NUM, KW_OK, KW_KO, DUMP,
 
     # Run tests
     test_campaign.output_file = OUTPUTFILE
-    result = run_campaign(test_campaign, autorun_func[FORMAT], verb=VERB)
+    result = run_campaign(test_campaign, autorun_func[FORMAT], verb=VERB, ignore_globals=None)
 
     # Shrink passed
     if ONLYFAILED:
@@ -672,6 +672,7 @@ def resolve_testfiles(TESTFILES):
 
 def main(argv):
     import __builtin__
+    ignore_globals = list(__builtin__.__dict__.keys()) + ["sys"]
 
     # Parse arguments
     
@@ -815,7 +816,7 @@ def main(argv):
         output, result, campaign = execute_campaign(open(TESTFILE), OUTPUTFILE,
                                           PREEXEC, NUM, KW_OK, KW_KO,
                                           DUMP, FORMAT, VERB, ONLYFAILED,
-                                          CRC, autorun_func, pos_begin)
+                                          CRC, autorun_func, pos_begin, ignore_globals)
         runned_campaigns.append(campaign)
         pos_begin = campaign.end_pos
         if UNIQUE: