diff --git a/scapy/error.py b/scapy/error.py
index 0ca5433626b0b7a2152c69bb41a5eb6936d17f47..d7273447d018e12e15534362ebf43fd3ffdfccf8 100644
--- a/scapy/error.py
+++ b/scapy/error.py
@@ -64,13 +64,13 @@ log_interactive = logging.getLogger("scapy.interactive")  # logs in interactive
 log_loading = logging.getLogger("scapy.loading")          # logs when loading Scapy
 
 
-def warning(x, onlyOnce=False, *args, **kargs):
+def warning(x, *args, **kargs):
     """
     Prints a warning during runtime.
 
     onlyOnce - if True, the warning will never be printed again.
     """ 
-    if onlyOnce:
+    if kargs.pop("onlyOnce", False):
         from scapy.config import conf
         conf.warning_next_only_once = True
     log_runtime.warning(x, *args, **kargs)
diff --git a/scapy/main.py b/scapy/main.py
index 00d4cc544ca6890ccdb0bd7759218fc20aaccc05..c33d6661d3904e8b8bfd047c92e0d7ed546081f6 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -200,6 +200,12 @@ def list_contrib(name=None):
 ## Session saving/restoring ##
 ##############################
 
+def update_ipython_session(session):
+    """Updates IPython session with a custom one"""
+    try:
+        get_ipython().user_ns.update(session)
+    except:
+        pass
 
 def save_session(fname=None, session=None, pickleProto=-1):
     """Save current Scapy session to the file specified in the fname arg.
@@ -216,16 +222,21 @@ def save_session(fname=None, session=None, pickleProto=-1):
     log_interactive.info("Use [%s] as session file" % fname)
 
     if session is None:
-        session = six.moves.builtins.__dict__["scapy_session"]
+        try:
+            session = get_ipython().user_ns
+        except:
+            session = six.moves.builtins.__dict__["scapy_session"]
 
     to_be_saved = session.copy()
     if "__builtins__" in to_be_saved:
         del(to_be_saved["__builtins__"])
 
-    for k in to_be_saved.keys():
+    for k in list(to_be_saved.keys()):
         i = to_be_saved[k]
         if hasattr(i, "__module__") and (k[0] == "_" or i.__module__.startswith("IPython")):
             del(to_be_saved[k])
+        if isinstance(i, ConfClass):
+            del(to_be_saved[k])
         elif isinstance(i, (type, type, types.ModuleType)):
             if k[0] != "_":
                 log_interactive.error("[%s] (%s) can't be saved." % (k, type(to_be_saved[k])))
@@ -261,6 +272,7 @@ def load_session(fname=None):
     scapy_session = six.moves.builtins.__dict__["scapy_session"]
     scapy_session.clear()
     scapy_session.update(s)
+    update_ipython_session(scapy_session)
 
     log_loading.info("Loaded session [%s]" % fname)
     
@@ -277,6 +289,7 @@ def update_session(fname=None):
         s = six.moves.cPickle.load(open(fname,"rb"))
     scapy_session = six.moves.builtins.__dict__["scapy_session"]
     scapy_session.update(s)
+    update_ipython_session(scapy_session)
 
 def init_session(session_name, mydict=None):
     global SESSION
@@ -319,6 +332,7 @@ def init_session(session_name, mydict=None):
 
     if mydict is not None:
         six.moves.builtins.__dict__["scapy_session"].update(mydict)
+        update_ipython_session(mydict)
         GLOBKEYS.extend(mydict)
 
 ################