diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py
index e92fdcf605e9dd5be14dfcbba69180a844073198..07115f33489d4d79aad623e3d628dc086c203c0e 100755
--- a/scapy/arch/windows/__init__.py
+++ b/scapy/arch/windows/__init__.py
@@ -546,7 +546,7 @@ def read_routes6():
 
 
 
-if conf.interactive_shell != 'ipython':
+if conf.interactive_shell != 'ipython' and conf.interactive:
     try:
         __IPYTHON__
     except NameError:
diff --git a/scapy/main.py b/scapy/main.py
index ed3067d215da9245e592ce9ac448d432fa07ab4e..3e4688685f1b9160266c37d0b21f8f2d3c1f8958 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -39,6 +39,7 @@ def _read_config_file(cf):
 
 DEFAULT_PRESTART_FILE = _probe_config_file(".scapy_prestart.py")
 DEFAULT_STARTUP_FILE = _probe_config_file(".scapy_startup.py")
+session = None
 
 def _usage():
     print """Usage: scapy.py [-s sessionfile] [-c new_startup_file] [-p new_prestart_file] [-C] [-P]
@@ -137,13 +138,16 @@ def save_session(fname=None, session=None, pickleProto=-1):
              log_interactive.error("[%s] (%s) can't be saved." % (k, type(to_be_saved[k])))
              del(to_be_saved[k])
 
+    
     try:
-        os.rename(fname, fname+".bak")
+         os.rename(fname, fname+".bak")
     except OSError:
-        pass
+         pass
+    
     f=gzip.open(fname,"wb")
     cPickle.dump(to_be_saved, f, pickleProto)
     f.close()
+    del f
 
 def load_session(fname=None):
     if fname is None:
@@ -151,11 +155,17 @@ def load_session(fname=None):
     try:
         s = cPickle.load(gzip.open(fname,"rb"))
     except IOError:
-        s = cPickle.load(open(fname,"rb"))
+        try:
+            s = cPickle.load(open(fname,"rb"))
+        except IOError:
+            # Raise "No such file exception"
+            raise
+
     scapy_session = __builtin__.__dict__["scapy_session"]
     scapy_session.clear()
     scapy_session.update(s)
-
+    log_loading.info("Loaded session [%s]" % conf.session)
+    
 def update_session(fname=None):
     if fname is None:
         fname = conf.session
@@ -166,8 +176,10 @@ def update_session(fname=None):
     scapy_session = __builtin__.__dict__["scapy_session"]
     scapy_session.update(s)
 
-def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE):
+def init_session(session_name, mydict=None):
     global session
+    global globkeys
+    
     scapy_builtins = __import__("all",globals(),locals(),".").__dict__
     for name, sym in scapy_builtins.iteritems():
         if name [0] != '_':
@@ -179,11 +191,6 @@ def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE
         __builtin__.__dict__.update(mydict)
         globkeys += mydict.keys()
     
-
-    conf.color_theme = DefaultTheme()
-    if STARTUP_FILE:
-        _read_config_file(STARTUP_FILE)
-        
     if session_name:
         try:
             os.stat(session_name)
@@ -208,13 +215,10 @@ def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE
         else:
             conf.session = session_name
             session={"conf":conf}
-            
     else:
         session={"conf": conf}
 
     __builtin__.__dict__["scapy_session"] = session
-    
-    return globkeys
 
 ################
 ##### Main #####
@@ -243,6 +247,7 @@ def scapy_write_history_file(readline):
 
 def interact(mydict=None,argv=None,mybanner=None,loglevel=20):
     global session
+    global globkeys
     import code,sys,os,getopt,re
     from scapy.config import conf
     conf.interactive = True
@@ -312,13 +317,11 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20):
         readline.parse_and_bind("tab: complete")
     
     
-    session=None
-    session_name=""
     STARTUP_FILE = DEFAULT_STARTUP_FILE
     PRESTART_FILE = DEFAULT_PRESTART_FILE
 
+    session_name = ""
 
-    iface = None
     try:
         opts=getopt.getopt(argv[1:], "hs:Cc:Pp:d")
         for opt, parm in opts[0]:
@@ -345,10 +348,14 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20):
         log_loading.error(msg)
         sys.exit(1)
 
+    conf.color_theme = DefaultTheme()
+    
+    if STARTUP_FILE:
+        _read_config_file(STARTUP_FILE)
     if PRESTART_FILE:
         _read_config_file(PRESTART_FILE)
 
-    globkeys = init_session(mydict, session_name, STARTUP_FILE)
+    init_session(None, mydict)
 
     if READLINE:
         if conf.histfile:
diff --git a/test/regression.uts b/test/regression.uts
index 8c07b3615785c3677e1f49cfc35809532f1483ef..cd0bc925be566e7de6c159935994d463abb244f5 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -96,15 +96,63 @@ True
 ############
 + Main.py tests
 
-= Test save_session
-init_session()
-# TODO: Remove the comments once the pickling bug has been fixed
-#test_value = IP(dst="192.168.0.10")
-#test_value
-save_session(fname="scapySession1")
-
-= Test load_session
-load_session(fname="scapySession1")
+= Prepare emulator
+import mock
+from mock import Mock
+
+if WINDOWS:
+    # This fix when the windows doesn't have a size (run with a windows server)
+    mock.patch("pyreadline.console.console.Console.size").return_value = (300, 300)
+
+@mock.patch("scapy.config.conf.readfunc")
+def emulate_main_input(data, mock_readfunc):
+    global index
+    index = 0 # reset var
+    def readlineScapy(*args, **kargs):
+        global index
+        if len(data) == index:
+            r_data = "exit(1 if hasattr(sys, 'last_value') and sys.last_value is not None else 0)"
+        else:
+            r_data = data[index]
+        index +=1
+        print r_data
+        return r_data
+    mock_readfunc.side_effect = readlineScapy
+    def reduce_mock(self):
+        return (Mock, ())
+    mock_readfunc.__reduce__ = reduce_mock
+    sys.argv = ['']
+    def console_exit(code):
+        raise SystemExit(code)
+    exit_code = -1
+    try:
+        interact(mydict={"exit": console_exit})
+    except SystemExit as e:
+        exit_code = str(e)
+        pass
+    assert exit_code == "0"
+
+= Test basic save_session and load_session
+
+data = ["init_session(\"scapySession1\")",\
+"test_value = \"8.8.8.8\"",\
+"save_session()",\
+"del test_value",\
+"load_session()",\
+"assert test_value == \"8.8.8.8\""]
+
+emulate_main_input(data)
+
+= Test save_session and load_session with fname
+
+data = ["init_session(\"scapySession2\")",\
+"test_value = 7",\
+"save_session(fname=\"scapySaveSession.dat\")",\
+"del test_value",\
+"load_session(fname=\"scapySaveSession.dat\")",\
+"assert test_value == 7"]
+
+emulate_main_input(data)
 
 = Test utility functions