diff --git a/pykat/components.py b/pykat/components.py
index ac43a2b79999e24ee78ffcddab4618e630e99d9f..6d4f64be470a3a2dbe8fa5b099e50d22f0e2738b 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -158,14 +158,14 @@ class AbstractMirrorComponent(Component):
     def __init__(self, name, R=None, T=None, L=None, phi=0, Rcx=0, Rcy=0, xbeta=0, ybeta=0, mass=0, r_ap=0):
         super(AbstractMirrorComponent, self).__init__(name)
 
-        if (L != None and R != None and T != None) and R+T+L != 1: 
+        if (L != None and R != None and T != None) and SIfloat(R)+SIfloat(T)+SIfloat(L) != 1: 
             raise pkex.BasePyKatException('L+R+T must equal 1 if all are specified')
         elif (R != None and L is None and T != None):
-            L = 1- (R+T)
+            L = 1- (SIfloat(R)+SIfloat(T))
         elif (R is None and L != None and T != None):
-            R = 1 - (L+T)
+            R = 1 - (SIfloat(L)+SIfloat(T))
         elif (R != None and L != None and T is None):
-            T = 1 - (L+R)
+            T = 1 - (SIfloat(L)+SIfloat(R))
         else:
             raise pkex.BasePyKatException('Must specify at least two of L, R or T')
         
@@ -244,8 +244,8 @@ class AbstractMirrorComponent(Component):
         self.Rcy.value = SIfloat(value)
 
 class mirror(AbstractMirrorComponent):
-    def __init__(self,name,node1,node2,R=0,T=0,phi=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0, r_ap=0):
-        super(mirror, self).__init__(name, R, T, phi, Rcx, Rcy, xbeta, ybeta, mass, r_ap)
+    def __init__(self,name,node1,node2,R=None,T=None,L=None,phi=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0, r_ap=0):
+        super(mirror, self).__init__(name, R, T, L, phi, Rcx, Rcy, xbeta, ybeta, mass, r_ap)
         
         self._requested_node_names.append(node1)
         self._requested_node_names.append(node2)
@@ -262,17 +262,17 @@ class mirror(AbstractMirrorComponent):
 
         if len(values[0])==1:
             values.pop(0) # remove initial value
-            return mirror(values[0], values[4], values[5], R=values[1], T=values[2], phi=values[3])
+            return mirror(values[0], values[4], values[5], L=None, R=values[1], T=values[2], phi=values[3])
         else:
             if values[0][1]=="1":
                 values.pop(0) # remove initial value
-                return mirror(values[0], values[4], values[5], L=values[2], T=values[1], phi=values[3])
+                return mirror(values[0], values[4], values[5], R=None, L=values[2], T=values[1], phi=values[3])
             else:
                 values.pop(0) # remove initial value
-                return mirror(values[0], values[4], values[5], R=values[1], L=values[2], phi=values[3])
+                return mirror(values[0], values[4], values[5], T=None, R=values[1], L=values[2], phi=values[3])
 
     def getFinesseText(self):
-        if R+T+L > 1:
+        if self.R+self.T+self.L > 1:
             raise pkex.BasePyKatException("Mirror {0} has R+T+L > 1".format(self.name))        
         
         rtn = []
@@ -335,6 +335,9 @@ class beamSplitter(AbstractMirrorComponent):
                 values[4])
             
     def getFinesseText(self):
+        if self.R+self.T+self.L > 1:
+            raise pkex.BasePyKatException("Beamsplitter {0} has R+T+L > 1".format(self.name))
+
         rtn = []
             
         rtn.append('bs {0} {1} {2} {3} {4} {5} {6} {7} {8}'.format(
diff --git a/pykat/detectors.py b/pykat/detectors.py
index bc9c0dd7a4fac22a27649406fd3aa167d04c4f04..5356f551b70977d012c04e02f9001db58b6f9a7e 100644
--- a/pykat/detectors.py
+++ b/pykat/detectors.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 """
-Created on Fri Feb 01 09:09:10 2013
+Created on Fri Feb 01 0split()9:09:10 2013
 
 @author: Daniel
 """
@@ -80,7 +80,65 @@ class Detector(object) :
             del self._mask[id]
                 
         self._mask[id] = factor
+
+class ad(Detector):
+    
+    def __init__(self, name, frequency, node_name, mode=None, alternate_beam=False):
+        Detector.__init__(self, name, node_name)
+        self.mode = mode
+        self.alternate_beam = alternate_beam
+
+        self.__f = Param("f", self, frequency)
     
+    @property
+    def mode(self): return self.__mode
+    @mode.setter
+    def mode(self, value):
+        if value != None and len(value) != 2:
+            raise pkex.BasePyKatException('Mode must be a container of length 2, first element the x mode and second the y mode')
+    
+        self.__mode = value
+        
+    @property
+    def f(self): return self.__f
+    @f.setter
+    def f(self, value): 
+        self.__f.value = value
+        
+    @staticmethod
+    def parseFinesseText(text): 
+        values = text.split()
+        
+        if values[-1].endswith('*'):
+            altbeam = True
+        else:
+            altbeam = False
+        
+        if len(values) == 6:
+            return ad(values[1], values[4], values[5], mode = [int(values[2]), int(values[3])], alternate_beam=alt_beam)
+        elif len(values) == 4:
+            return ad(values[1], values[2], values[3], alternate_beam=altbeam)
+        else:
+            raise pkex.BasePyKatException('Amplitude detector code "{0}" is not a valid FINESSE command'.format(text))
+            
+    def getFinesseText(self) :
+        rtn = []
+        
+        if self.alternate_beam:
+            alt = '*'
+        else:
+            alt = ''
+        
+        if self.mode == None:
+            rtn.append("ad {name} {f} {node}{alt}".format(name=self.name, f=str(self.f.value), node=self.node.name, alt=alt))
+        else:
+            rtn.append("ad {name} {n} {m} {f} {node}{alt}".fomat(name=self.name, n=str(self.mode[0]), m=str(self.mode[1]), f=str(self.f.value), node=self.node.name, alt=alt))
+            
+        for p in self._params:
+            rtn.extend(p.getFinesseText())
+        
+        return rtn
+        
 class pd(Detector):
 
     def __init__(self, name, num_demods, node_name, senstype=None, alternate_beam=False, pdtype=None, **kwargs):
@@ -88,7 +146,7 @@ class pd(Detector):
         
         self.__num_demods = num_demods
         self.__senstype = senstype
-        self.__alternate_beam = alternate_beam
+        self.alternate_beam = alternate_beam
         self.__pdtype = pdtype
 
         # create the parameters for all 5 demodulations regardless
@@ -204,7 +262,7 @@ class pd(Detector):
     
     @staticmethod
     def parseFinesseText(text): 
-        values = text.split(" ")
+        values = text.split()
         demods = 0
         senstype = None
 
@@ -253,7 +311,7 @@ class pd(Detector):
             alt_str = ""
             fphi_str = ""
             
-            if self.__alternate_beam:
+            if self.alternate_beam:
                 alt_str = "*"
                 
             for n in range(1, 1+self.num_demods):
@@ -337,7 +395,7 @@ class photodiode(Detector):
         
     @staticmethod
     def parseFinesseText(text): 
-        values = text.split(" ")
+        values = text.split()
 
         if values[0][0:2] != "pd":
             raise exceptions.FinesseParse("'{0}' not a valid photodiode command".format(text))
diff --git a/pykat/finesse.py b/pykat/finesse.py
index 8217878351538e33292e05d77c9e4c65feb08e05..f196cf75850a544165c71c5b8f458cb3e7ccee1a 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -438,6 +438,8 @@ class kat(object):
                     obj = pykat.components.lens.parseFinesseText(line)
                 elif(first[0:3] == "mod"):
                     obj = pykat.components.modulator.parseFinesseText(line)
+                elif(first[0:2] == "ad"):
+                    obj = pykat.detectors.ad.parseFinesseText(line)
                 elif(first[0:2] == "pd" and first != "pdtype"):
                     obj = pykat.detectors.pd.parseFinesseText(line)
                 elif(first == "xaxis" or first == "xaxis*"):