diff --git a/pykat/commands.py b/pykat/commands.py
index 65c4b891dc540d1d049317be052eea2e4b86f87a..f5148cdcd3d99590c36623ab2eee9f8c7e332d98 100644
--- a/pykat/commands.py
+++ b/pykat/commands.py
@@ -25,7 +25,8 @@ from pykat.optics.gaussian_beams import beam_param
 class Command(object):
     __metaclass__ = abc.ABCMeta
     
-    def __init__(self, name):
+    def __init__(self, name, unique):
+        self.__unique = unique
         self.tag = None
         self.__removed = False
         self.__name = name.strip("*")
@@ -56,16 +57,55 @@ class Command(object):
     
 class cavity(Command):
     def __init__(self, name, c1, n1, c2, n2):
-        Command.__init__(self, name)
+        Command.__init__(self, name, False)
         
         self.__c1 = c1
         self.__c2 = c2
         self.__n1 = n1
         self.__n2 = n2
+        
+        self.enabled = True
 
     def getFinesseText(self):
-        return 'cav {0} {1} {2} {3} {4}'.format(self.name, self.__c1, self.__n1, self.__c2, self.__n2);
+        if self.enabled:
+            return 'cav {0} {1} {2} {3} {4}'.format(self.name, self.__c1.name, self.__n1.name, self.__c2.name, self.__n2.name);
+        else:
+            return None
 
+    @staticmethod
+    def parseFinesseText(line, kat):
+        v = line.split()
+        
+        if len(v) != 6:
+            raise pkex.BasePyKatException("cav command format `{0}` is incorrect".format(line))
+        
+        if v[2] not in kat.components:
+            raise pkex.BasePyKatException("cav command `{0}` refers to component `{1}` which does not exist".format(line, v[2]))
+        
+        if v[4] not in kat.components:
+            raise pkex.BasePyKatException("cav command `{0}` refers to component `{1}` which does not exist".format(line, v[4]))
+        
+        if v[3] not in kat.nodes.getNodes():
+            raise pkex.BasePyKatException("cav command `{0}` refers to node `{1}` which does not exist".format(line, v[3]))
+        
+        if v[5] not in kat.nodes.getNodes():
+            raise pkex.BasePyKatException("cav command `{0}` refers to node `{1}` which does not exist".format(line, v[5]))
+        
+        c1 = getattr(kat, v[2])
+        c2 = getattr(kat, v[4])
+        
+        n1 = getattr(kat.nodes, v[3])
+        n2 = getattr(kat.nodes, v[5])
+        
+        if not hasattr(c1, n1.name):
+            raise pkex.BasePyKatException("cav command `{0}`: node `{1}` is not attached to `{2}`".format(line, n1.name, c1.name))
+        
+        if not hasattr(c2, n2.name):
+            raise pkex.BasePyKatException("cav command `{0}`: node `{1}` is not attached to `{2}`".format(line, n2.name, c2.name))
+            
+        return pykat.commands.cavity(v[1], c1, n1, c2, n2)
+        
+        
 class gauss(object):
     @staticmethod
     def parseFinesseText(text, kat):
@@ -123,7 +163,7 @@ class tf(Command):
     fQ = namedtuple('fQ', ['f', 'Q'])
     
     def __init__(self, name, poles, zeros):
-        Command.__init__(self, name)
+        Command.__init__(self, name, False)
         pass
       
 class xaxis(Command):
@@ -142,7 +182,7 @@ class xaxis(Command):
         
         steps is the number of points to compute between upper and lower limits.
         """
-        Command.__init__(self, axis_type)
+        Command.__init__(self, axis_type, True)
         
         self._axis_type = axis_type
 
diff --git a/pykat/finesse.py b/pykat/finesse.py
index f9eac77b3fee5b5ab85a01ed97f436b4af392d4a..242a2e9e0da7c76bbd95b404448f098f5456b683 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -481,6 +481,25 @@ class kat(object):
         if kat_file != None:
             self.loadKatFile(kat_file)
 
+    def getAll(self, type):
+        """
+        Returns a collection of all objects of the type argument that are
+        part of this kat object.
+        
+        Example:
+            # returns all cav commands that are present in this kat object
+            cavs = kat.getAll(pykat.commands.cavity)
+        """
+        items = []
+        
+        for a in (item for item in self.__class__.__dict__):
+            b = getattr(self, a)
+            
+            if isinstance(b, type):
+                items.append(b)
+
+        return tuple(items)
+        
     def __deepcopy__(self, memo):
         """
         When deep copying a kat object we need to take into account
@@ -572,6 +591,10 @@ class kat(object):
     def detectors(self):
         return self.__detectors.copy()
         
+    @property
+    def commands(self):
+        return self.__commands.copy()
+        
     @property
     def noxaxis(self): return self.__noxaxis
     @noxaxis.setter
@@ -755,6 +778,8 @@ class kat(object):
                         after_process.append(line)
                     elif(first == "pdtype"):
                         after_process.append(line)
+                    elif(first == "cav"):
+                        after_process.append(line)
                     elif(first == "attr"):
                         after_process.append(line)
                     elif(first == "noxaxis"):
@@ -826,9 +851,15 @@ class kat(object):
             # now process all the varous gauss/attr etc. commands which require
             # components to exist first before they can be processed
             for line in after_process:
-                first = line.split(" ",1)[0]            
+                
+                first = line.split(" ",1)[0] 
+                           
                 if first == "gauss" or first == "gauss*" or first == "gauss**":
                     pykat.commands.gauss.parseFinesseText(line, self)
+                    
+                elif (first == "cav"):
+                    self.add(pykat.commands.cavity.parseFinesseText(line, self))
+                    
                 elif (first == "scale"):
                     v = line.split()
                     accepted = ["psd","psd_hf","asd","asd_hf","meter", "ampere", "degs"]
@@ -1293,8 +1324,12 @@ class kat(object):
                 del self.__components[obj.name]
                 self.__del_component(obj)
                 self.nodes._removeComponent(obj)
-            elif isinstance(obj, Command):    
-                del self.__commands[obj.name]
+            elif isinstance(obj, Command):  
+                if obj._Command__unique:  
+                    del self.__commands[obj.__class__.__name__]
+                else:
+                    del self.__commands[obj.name]
+                    
                 self.__del_command(obj)
             elif isinstance(obj, Detector):    
                 del self.__detectors[obj.name]
@@ -1391,7 +1426,11 @@ class kat(object):
                 
             elif isinstance(obj, Command):
                 
-                self.__commands[obj.__class__.__name__] = obj
+                if obj._Command__unique:
+                    self.__commands[obj.__class__.__name__] = obj
+                else:
+                    self.__commands[obj.name] = obj
+                    
                 self.__add_command(obj)
                 
             else:
@@ -1891,7 +1930,11 @@ class kat(object):
         if not isinstance(com, Command):
             raise pkex.BasePyKatException("Argument is not of type Command")
         
-        name = com.__class__.__name__
+        if com._Command__unique:
+            name = com.__class__.__name__
+        else:
+            name = com.name
+            
         fget = lambda self: self.__get_command(name)
         
         setattr(self.__class__, name, property(fget))