diff --git a/examples/length_tuning.py b/examples/length_tuning.py
new file mode 100644
index 0000000000000000000000000000000000000000..f6393dcc04d33be33014708181293252e16aefa1
--- /dev/null
+++ b/examples/length_tuning.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Dec 10 14:18:17 2013
+
+@author: Sean
+"""
+
+import sys
+sys.path.append("../")
+
+import pykat
+from pykat.utilities.optics.gaussian_beams import gauss_param
+import pykat.finesse as finesse
+from pykat.commands import xaxis
+import pylab as pl
+import numpy as np
+import math
+
+code = """
+%------------------------------------------------------------------------
+% Finesse input file to plot the phase of light field reflected from a
+% beam splitter to show the way lengths and positions are handled
+% Andreas Freise 15.08.2009
+%------------------------------------------------------------------------
+                 
+l l1 1 0 n1    % laser with P=1W at the default frequency
+s s1 1 1 n1 n2 % space of 1m length
+bs b1 1 0 0 0 n2 n3 dump dump % beam splitter as `turning mirror'
+s s2 1 1 n3 n4 % another space of 1m length
+ad ad1 0 n4     % amplitude detector
+ 
+% for the plot we perform two sequenctial runs of Finesse
+% 1) first trace: change microscopic position of beamsplitter
+xaxis b1 phi lin 0 180 100
+% 2) second trace: change length of space s1
+% xaxis s1 L lin 1 2 100
+ 
+yaxis deg     % plotting the phase of the results
+"""
+
+kat = finesse.kat()
+kat.parseCommands(code)
+
+maxtem = np.arange(0, 2, 2)
+
+for tem in maxtem:
+    print "Calculating maxtem ", tem, "..."
+    kat.maxtem = tem
+    r = kat.run()
+    pl.plot(r.x, r.y, label="maxtem={0}".format(tem))
+
+pl.ylabel("Phase [deg]")
+pl.xlabel("Tuning [deg]")
+pl.legend()
+pl.show()
+    
diff --git a/examples/length_tuning.py~ b/examples/length_tuning.py~
new file mode 100644
index 0000000000000000000000000000000000000000..da5348d2ee95ba98daab8bed163b751efec4bfe6
--- /dev/null
+++ b/examples/length_tuning.py~
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Dec 10 14:18:17 2013
+
+@author: Sean
+"""
+
+import sys
+sys.path.append("../")
+
+import pykat
+from pykat.utilities.optics.gaussian_beams import gauss_param
+import pykat.finesse as finesse
+from pykat.commands import xaxis
+import pylab as pl
+import numpy as np
+import math
+
+code = """
+%------------------------------------------------------------------------
+% Finesse input file to plot the phase of light field reflected from a
+% beam splitter to show the way lengths and positions are handled
+% Andreas Freise 15.08.2009
+%------------------------------------------------------------------------
+                 
+l l1 1 0 n1    % laser with P=1W at the default frequency
+s s1 1 1 n1 n2 % space of 1m length
+bs     b1 1 0 0 0 n2 n3 dump dump % beam splitter as `turning mirror'
+s s2 1 1 n3 n4 % another space of 1m length
+ad     ad1 0 n4     % amplitude detector
+ 
+% for the plot we perform two sequenctial runs of Finesse
+% 1) first trace: change microscopic position of beamsplitter
+xaxis b1 phi lin 0 180 100
+% 2) second trace: change length of space s1
+% xaxis s1 L lin 1 2 100
+ 
+yaxis deg     % plotting the phase of the results
+"""
+
+kat = finesse.kat()
+kat.parseCommands(code)
+
+maxtem = np.arange(0, 2, 2)
+
+for tem in maxtem:
+    #print "Calculating maxtem ", tem, "..."
+    kat.maxtem = tem
+    r = kat.run()
+    pl.plot(r.x, r.y, label="maxtem={0}".format(tem))
+
+pl.ylabel("Phase [deg]")
+pl.xlabel("Tuning [deg]")
+pl.legend()
+pl.show()
+    
diff --git a/pykat/components.py b/pykat/components.py
index e888b71d148cdbd56b9836624ccf85ec4ca8ea92..87056a4a628183c1786ce84f4ca18a16ae35852f 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -227,6 +227,7 @@ class mirror(Component):
     def parseFinesseText(text):
         values = text.split(" ")
 
+        #if values[0] != "m" and values[0] != "m1" and values[0] != "m2":
         if values[0] != "m" and values[0] != "m1" and values[0] != "m2":
             raise exceptions.RuntimeError("'{0}' not a valid Finesse mirror command".format(text))
         
@@ -266,7 +267,120 @@ class mirror(Component):
             self._svgItem = pykat.gui.graphics.ComponentQGraphicsItem(":/resources/mirror_flat.svg", self ,[(-4,15,self.nodes[0]), (14,15,self.nodes[1])])
             
         return self._svgItem
-   
+
+class beamSplitter(Component):
+    def __init__(self,name,node1,node2,node3,node4,R=0,T=0,phi=0,alpha=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0):
+        Component.__init__(self,name)
+        
+        self._requested_node_names.append(node1)
+        self._requested_node_names.append(node2)
+        self._requested_node_names.append(node3)
+        self._requested_node_names.append(node4)
+             
+        self.__R = SIfloat(R)
+        self.__T = SIfloat(T)
+        self.__alpha = SIfloat(alpha)
+        self.__phi = SIfloat(phi)
+        self.__Rcx = SIfloat(Rcx)
+        self.__Rcy = SIfloat(Rcy)
+        self.__xbeta = SIfloat(xbeta)
+        self.__ybeta = SIfloat(ybeta)
+    
+    @property
+    def R(self): return Param('R', self.__R)
+    @R.setter
+    def R(self,value): self.__R = SIfloat(value)
+    
+    @property
+    def T(self): return Param('T', self.__T)
+    @T.setter
+    def T(self,value): self.__T = SIfloat(value)
+        
+    @property
+    def phi(self): return Param('phi', self.__phi)
+    @phi.setter
+    def phi(self,value): self.__phi = SIfloat(value)
+    
+    @property
+    def alpha(self): return Param('alpha', self.__alpha)
+    @alpha.setter
+    def alpha(self,value): self.__alpha = SIfloat(value)
+    
+    @property
+    def Rcx(self): return Param('Rcx', self.__Rcx)
+    @Rcx.setter
+    def Rcx(self,value): self.__Rcx = SIfloat(value)
+    
+    @property
+    def Rcy(self): return Param('Rcy', self.__Rcy)
+    @Rcy.setter
+    def Rcy(self,value): self.__Rcy = SIfloat(value)
+    
+    @property
+    def xbeta(self): return Param('xbeta', self.__xbeta)
+    @xbeta.setter
+    def xbeta(self,value): self.__xbeta = SIfloat(value)
+    
+    @property
+    def ybeta(self): return Param('ybeta', self.__ybeta)
+    @ybeta.setter
+    def ybeta(self,value): self.__ybeta = SIfloat(value)
+    
+    @property
+    def Rc(self):
+        if self.Rcx == self.Rcy:
+            return self.Rcx
+        else:
+            return [self.Rcx, self.Rcy]
+    
+    @Rc.setter
+    def Rc(self,value):
+        self.Rcx = SIfloat(value)
+        self.Rcy = SIfloat(value)
+    
+    @staticmethod
+    def parseFinesseText(text):
+        values = text.split(" ")
+
+        if values[0] != "bs" and values[0] != "bs1" and values[0] != "bs2":
+            raise exceptions.RuntimeError("'{0}' not a valid Finesse beam splitter command".format(text))
+        
+        if len(values) != 10:
+            raise exceptions.RuntimeError("Beam splitter Finesse code format incorrect '{0}'".format(text))
+
+        if len(values[0])==1:
+            values.pop(0) # remove initial value
+            return beamSplitter(values[0], values[5], values[6], values[7], values[8], values[1], values[2], values[3], values[4])
+        else:
+            if values[0][1]=="1":
+                values.pop(0) # remove initial value
+                return beamSplitter(values[0], values[5], values[6], values[7], values[8], 1.0 - SIfloat(values[1]) - SIfloat(values[2]), values[1], values[3], values[4])
+            else:
+                values.pop(0) # remove initial value
+                return beamSplitter(values[0], values[5], values[6], values[7], values[8], values[1], 1.0 - SIfloat(values[1]) - SIfloat(values[2]), values[3], values[4])
+            
+    def getFinesseText(self):        
+        rtn = []
+            
+        rtn.append('bs {0} {1} {2} {3} {4} {5} {6} {7} {8}'.format(
+                self.name, self.__R, self.__T, self.__phi,
+                self.__alpha, self.nodes[0].name,
+                self.nodes[1].name, self.nodes[2].name,
+                self.nodes[3].name))
+
+        if self.Rcx != 0: rtn.append("attr {0} Rcx {1}".format(self.name,self.__Rcx))
+        if self.Rcy != 0: rtn.append("attr {0} Rcy {1}".format(self.name,self.__Rcy))
+        if self.xbeta != 0: rtn.append("attr {0} xbeta {1}".format(self.name,self.__xbeta))
+        if self.ybeta != 0: rtn.append("attr {0} ybeta {1}".format(self.name,self.__ybeta))
+        
+        return rtn
+        
+    def getQGraphicsItem(self):
+        if self._svgItem == None:
+            # FIXME: make proper SVG component for beam splitter
+            self._svgItem = pykat.gui.graphics.ComponentQGraphicsItem(":/resources/mirror_flat.svg", self ,[(-4,15,self.nodes[0]), (14,15,self.nodes[1])])
+            
+        return self._svgItem
    
 class space(Component):
     def __init__(self, name, node1, node2, L=0, n=1):
diff --git a/pykat/finesse.py b/pykat/finesse.py
index 9618fe5819c7ada526fdf124047ef1448ed0c3d6..1ab236133c5d841001be2a4eb2f16649cd467676 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -203,6 +203,8 @@ class kat(object):
                     obj = pykat.components.space.parseFinesseText(line)
                 elif(first == "l"):
                     obj = pykat.components.laser.parseFinesseText(line)
+                elif(first[0:2] == "bs"):
+                    obj = pykat.components.beamSplitter.parseFinesseText(line)
                 elif(first[0:2] == "pd"):
                     obj = pykat.detectors.photodiode.parseFinesseText(line)
                 elif(first == "xaxis" or first == "x2axis" or first == "xaxis*" or first == "x2axis*"):