diff --git a/bin/test_aperture.py b/bin/test_aperture.py
index 2824b4e93ca5e8d8e46e8f4bd0a254263a6dc78c..b88ce17bdd9d35831e803000711de8c391f4163a 100644
--- a/bin/test_aperture.py
+++ b/bin/test_aperture.py
@@ -6,7 +6,7 @@ import numpy as np
 code = """
 l l1 1 0 0 n1
 s s1 10 1 n1 n2
-m m1 1 0 0 n2 dump
+m m1 1 0 0 n2 n3
 
 gauss g1 m1 n2 1e-3 0
 
diff --git a/bin/test_pykat_gui.py b/bin/test_pykat_gui.py
index fa1ad52d0ee3d0299985746c77b2f68730e981f0..3b39da58caad54f2f31129c9651e2c1ac2146bae 100644
--- a/bin/test_pykat_gui.py
+++ b/bin/test_pykat_gui.py
@@ -10,52 +10,12 @@ from pykat.structs import *
 import numpy as np
 import pylab as pl
 
-kat = finesse.kat()
+code = """
+l l1 1 0 0 n1
+"""
 
-laser(kat,'l1','n1',1)
-space(kat,'s1','n1','n2',1)
+kat = finesse.kat(kat_code = code)
 
-mirror(kat,'m1','n2','n3',R=0.8,T=0.2)
-space(kat,'s2','n3','n4',L=1)
-mirror(kat,'m2','n4','n5',R=0.7,T=0.3)
-cavity(kat, 'cav1','m1','n3','m2','n4')
-space(kat,'s3','n5','n6',L=1)
-
-photodiode(kat,'pd_cav','n4')
-photodiode(kat,'pd_ref','n2')
-photodiode(kat,'pd_trs','n5')
-
-kat.m1.Rcx = -1000.0
-kat.m1.Rcy = -1000.0
-kat.m2.Rcx =  1000.0
-kat.m2.Rcy =  1000.0
-
-xaxis(kat, Scale.linear, [0,360], kat.m2, kat.m2.phi, 1000)
-
-kat.maxtem = 0
-
-run = kat.run(printout=0,printerr=0)
-
-#pl.figure()
-#pl.ion()
-#pl.plot(run.x,run.y)
-#pl.xlabel(run.xlabel)
-#pl.ylabel("Intensity [W]")
-#pl.legend(run.ylabels)
-#pl.show()
-
-kat.m1.R = 0.5
-kat.m1.T = 0.5
-kat.pd_cav.enabled = False
-
-run = kat.run(printout=0,printerr=0)
-
-#pl.figure()
-#pl.plot(run.x,run.y)
-#pl.xlabel(run.xlabel)
-#pl.ylabel("Intensity [W]")
-#pl.legend(run.ylabels)
-#pl.show()
 
 kat.openGUI()
 
diff --git a/pykat/components.py b/pykat/components.py
index c8c578b49b970cc6bad7e1259678ca905cd93669..bbb62d11f0eefb111ccec9941939d0d82e6c7faa 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -17,7 +17,7 @@ class Component(object) :
     def __init__(self, name):
         self.__name = name
         self._svgItem = None
-        self.__nodes = []
+        self._nodes = []
         self._requested_node_names = []
         self._kat = None
     
@@ -52,13 +52,13 @@ class Component(object) :
         else:
             n.connect(self)
                 
-            self.__nodes.append(n)
+            self._nodes.append(n)
         
         return n
         
     def getNodes(self):
         """ Returns a copy of the nodes the component has """
-        return self.__nodes[:]        
+        return self._nodes[:]        
             
     def __getname(self):
         return self.__name      
@@ -235,11 +235,11 @@ class space(Component):
         node_new.connect(self)
         node_old.disconnect(self)
         
-        if self.node1 == node_old:
-            self.node1 = node_new
+        if self._nodes[0] == node_old:
+            self._nodes[0] = node_new
         
-        if self.node2 == node_old:
-            self.node2 = node_new
+        if self._nodes[1] == node_old:
+            self._nodes[1] = node_new
 
     
 class laser(Component):
diff --git a/pykat/gui/graphics.py b/pykat/gui/graphics.py
index 6e95ae3f75f40e3cc885a4a9830a2df8b2eb2231..b5b1368e12d535ecc122aa8ae62f74ce8db2e963 100644
--- a/pykat/gui/graphics.py
+++ b/pykat/gui/graphics.py
@@ -60,11 +60,16 @@ class SpaceQGraphicsItem(QGraphicsLineItem):
             
         conn = nodes[0].amIConnected(self.__space)
         
+        x1 = 0
+        y1 = 0
+        x2 = 0
+        y2 = 0
+        
         if conn[0]:
             if conn[1] != None:
                 if self.__n1 is not None:
                     # i.e. we have a node graphic item but now it is connected to something
-                    self.__n1.scene().removeItem(self.__n2)
+                    self.__n1.scene().removeItem(self.__n1)
                     self.__n1 = None
                     
                 # now check if a connected component was returned too
@@ -170,7 +175,7 @@ class ComponentQGraphicsItem(QGraphicsSvgItem):
             n.refresh()
         
     def itemChange(self, change, value):
-        # if the item move then update any spaces
+        # if the item is moved then update any spaces attached to it
         if change == QGraphicsItem.ItemPositionHasChanged:
             nodes = self.__component.getNodes()
             
diff --git a/pykat/gui/gui.py b/pykat/gui/gui.py
index eecad83bcd4147ff3c9027e8dcaa416e73777899..6b82e3d35c0f7e1ccf7780937948a60af0c3171d 100644
--- a/pykat/gui/gui.py
+++ b/pykat/gui/gui.py
@@ -99,10 +99,27 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
     def addMirror(self, x,y):
         name = self.kat.getNewComponentName('m')
         n = self.kat.getNewNodeNames('n',2)
-        m = pykat.components.mirror(self.kat,name,n[0],n[1])
-               
+        m = pykat.components.mirror(name,n[0],n[1])
+        
+        self.kat.add(m)
         self.addComponentToScene(m,x,y)
-                
+    
+    def addSpace(self, x,y):
+        name = self.kat.getNewComponentName('s')
+        n = self.kat.getNewNodeNames('n',2)
+        s = pykat.components.space(name, n[0], n[1])
+
+        self.kat.add(s)
+        self.addComponentToScene(s,x,y) 
+     
+    def addLaser(self, x,y):
+        name = self.kat.getNewComponentName('l')
+        n = self.kat.getNewNodeNames('n',1)
+        l = pykat.components.laser(name, n[0])
+
+        self.kat.add(l)
+        self.addComponentToScene(l,x,y)   
+        
 class pyKatGraphicsScene(QGraphicsScene):
     def drawBackground(self, painter, rect):
         size = 10
@@ -148,10 +165,15 @@ class pyKatGraphicsView(QGraphicsView):
         menu = QMenu(self)
         addmenu = menu.addMenu("Add...")
         
+        action = addmenu.addAction("Space")
+        action.triggered.connect(functools.partial(gui.addSpace, pt.x(), pt.y()))
+        
         action = addmenu.addAction("Mirror")
-        action.triggered.connect(functools.partial(gui.addMirror,pt.x(),pt.y()))
-                
-        addmenu.addAction("Laser")
+        action.triggered.connect(functools.partial(gui.addMirror, pt.x(), pt.y()))
+        
+        action = addmenu.addAction("Laser")
+        action.triggered.connect(functools.partial(gui.addLaser, pt.x(), pt.y()))
+        
         addmenu.addAction("Beamsplitter")
         addmenu.addAction("Photodiode")
         
@@ -204,6 +226,7 @@ class pyKatGraphicsView(QGraphicsView):
     def mouseReleaseEvent(self, ev):
         # if we have dragged a node and marked another to connect it too
         if self.__selected_item is not None and isinstance(self.__selected_item, NodeQGraphicItem) and self.__marked is not None:
+            
             # node attached to space which needs to be removed
             node_s = self.__selected_item.node
             
@@ -217,13 +240,16 @@ class pyKatGraphicsView(QGraphicsView):
             qcomp = self.__marked.parentItem()
             
             # connect space of node dragged to the component node
-            space.changeNode(node_s,node_c)
-            node_s.remove()
+            # the space node that has been dragged gets deleted and we
+            # replace it with the components
+            space.changeNode(node_s, node_c)
+            node_s.remove() # now remove from node network completly
             
             # then refresh the graphical items
             qspace.refresh()
             qcomp.refresh()
             
+                        
         if self.__marked is not None:
             self.__marked.marked = False
             self.__marked.refresh()
diff --git a/pykat/node_network.py b/pykat/node_network.py
index b39431ca5aa52fd2c97654abc255ebec76f25b3f..b872b459edf4dbaea271617ac396cfa577b08b5f 100644
--- a/pykat/node_network.py
+++ b/pykat/node_network.py
@@ -22,7 +22,7 @@ class NodeNetwork(object):
             # then this node already exists
             return self._nodes[node_name]
         else:
-            n = Node(node_name,self)
+            n = Node(node_name, self)
             self._nodes[node_name] = n
             return n
         
@@ -30,7 +30,7 @@ class NodeNetwork(object):
         if not isinstance(node,Node):
             raise exceptions.ValueError("node argument is not of type Node")
         
-        if node not in self._nodes:
+        if node.name not in self._nodes:
             raise exceptions.RuntimeError("Trying to remove node {0} when it has not been added".format(node.name))
         
         C = node.getComponents()
@@ -87,7 +87,7 @@ class Node(object):
         self._detectors = []
         self.__name = name
         self._item = None
-        self._network = None
+        self._network = network
         
     @property
     def network(self): return self._network
@@ -100,8 +100,33 @@ class Node(object):
       
     def remove(self):
         self._network.removeNode(self)
-        self._item.scene().removeItem(self._item)
-                      
+        
+        if self._item != None:
+            self._item.scene().removeItem(self._item)
+    
+    def disconnect(self, obj):
+    
+        if not (isinstance(obj,Component) or isinstance(obj,Detector)):
+            raise exceptions.ValueError("Object is not a component or detector")
+        
+        if isinstance(obj, Component):
+            
+            if self._comp1 == obj:
+                self._comp1 = None
+            elif self._comp2 == obj:
+                self._comp2 = None
+            else:
+                raise exceptions.RuntimeError("Cannot dettach {0} from node {1}".format(
+                                    obj.name, self.__name))
+          
+        else:
+            # we must have a detector as we check above            
+            self._detectors.remove(obj)
+    
+        if self._item is not None:
+            self._item.refresh()
+            
+    
     def connect(self, obj):
 
         if not (isinstance(obj,Component) or isinstance(obj,Detector)):
@@ -143,7 +168,7 @@ class Node(object):
         
     def amIConnected(self, obj):
         """
-        Checks if obj is connected oto the node. Returns true or false in tuple
+        Checks if obj is connected to the node. Returns true or false in tuple
         with None or the other object and the node index which it is attached to
         """ 
         if obj == self._comp1: