diff --git a/IPython/zmq/parallel/controller.py b/IPython/zmq/parallel/controller.py
old mode 100644
new mode 100755
index dde3aca..fad60c4
--- a/IPython/zmq/parallel/controller.py
+++ b/IPython/zmq/parallel/controller.py
@@ -802,7 +802,7 @@ def make_argument_parser():
     
     return parser
     
-def main():
+def main(argv=None):
     import time
     from multiprocessing import Process
     
@@ -816,7 +816,7 @@ def main():
     
     parser = make_argument_parser()
     
-    args = parser.parse_args()
+    args = parser.parse_args(argv)
     parse_url(args)
     
     iface="%s://%s"%(args.transport,args.ip)+':%i'
diff --git a/IPython/zmq/parallel/engine.py b/IPython/zmq/parallel/engine.py
old mode 100644
new mode 100755
index 1284874..fc368a3
--- a/IPython/zmq/parallel/engine.py
+++ b/IPython/zmq/parallel/engine.py
@@ -39,8 +39,10 @@ class Engine(object):
     registrar=None
     heart=None
     kernel=None
+    user_ns=None
     
-    def __init__(self, context, loop, session, registrar, client=None, ident=None):
+    def __init__(self, context, loop, session, registrar, client=None, ident=None,
+        heart_id=None, user_ns=None):
         self.context = context
         self.loop = loop
         self.session = session
@@ -48,6 +50,7 @@ class Engine(object):
         self.client = client
         self.ident = ident if ident else str(uuid.uuid4())
         self.registrar.on_send(printer)
+        self.user_ns = user_ns
         
     def register(self):
         
@@ -78,8 +81,14 @@ class Engine(object):
             sub.on_recv(lambda *a: None)
             port = sub.bind_to_random_port("tcp://%s"%LOCALHOST)
             iopub_addr = "tcp://%s:%i"%(LOCALHOST,12345)
-            make_kernel(self.ident, control_addr, shell_addrs, iopub_addr, hb_addrs, 
-                        client_addr=None, loop=self.loop, context=self.context, key=self.session.key)
+            
+            k = make_kernel(self.ident, control_addr, shell_addrs, iopub_addr,
+                            hb_addrs, client_addr=None, loop=self.loop,
+                            context=self.context, key=self.session.key)[-1]
+            self.kernel = k
+            if self.user_ns is not None:
+                self.user_ns.update(self.kernel.user_ns)
+                self.kernel.user_ns = self.user_ns
             
         else:
             # logger.error("Registration Failed: %s"%msg)
@@ -100,11 +109,11 @@ class Engine(object):
 
         
 
-def main():
+def main(argv=None, user_ns=None):
     
     parser = make_base_argument_parser()
     
-    args = parser.parse_args()
+    args = parser.parse_args(argv)
     
     parse_url(args)
     
@@ -127,7 +136,11 @@ def main():
     reg = zmqstream.ZMQStream(reg, loop)
     client = None
     
-    e = Engine(ctx, loop, session, reg, client, args.ident)
+    e = Engine(ctx, loop, session, reg, client, args.ident, user_ns=user_ns)
     dc = ioloop.DelayedCallback(e.start, 100, loop)
     dc.start()
-    loop.start()
\ No newline at end of file
+    loop.start()
+
+# Execution as a script
+if __name__ == '__main__':
+    main()
diff --git a/IPython/zmq/parallel/streamkernel.py b/IPython/zmq/parallel/streamkernel.py
index a361bc5..c08f856 100755
--- a/IPython/zmq/parallel/streamkernel.py
+++ b/IPython/zmq/parallel/streamkernel.py
@@ -419,5 +419,5 @@ def make_kernel(identity, control_addr, shell_addrs, iopub_addr, hb_addrs,
             shell_streams=shell_streams, iopub_stream=iopub_stream, 
             client=client)
     kernel.start()
-    return loop, c
+    return loop, c, kernel