diff --git a/bin/test_beam_det.py b/bin/test_beam_det.py
new file mode 100644
index 0000000000000000000000000000000000000000..6061af1d42edae7445df88d8bef78a0039d2775b
--- /dev/null
+++ b/bin/test_beam_det.py
@@ -0,0 +1,22 @@
+import pykat
+
+kat = pykat.finesse.kat()
+
+kat.parseCommands("""
+l l1 1 0 n0
+s s1 1 n0 n1
+beam b1 0 n1
+
+gauss g1 l1 n0 1 0
+
+xaxis b1 x lin -3 3 100
+x2axis b1 y lin -3 3 100
+""")
+
+out = kat.run()
+
+import pylab
+pylab.pcolormesh(out.x, out.y, out["b1"])
+
+pylab.show()
+
diff --git a/pykat/detectors.py b/pykat/detectors.py
index 4609caaadb7b27e248b0bd4c11d72ada30630545..6b8ce2f8af669bd6a427ea1bd63f2f5ae4afd090 100644
--- a/pykat/detectors.py
+++ b/pykat/detectors.py
@@ -220,9 +220,56 @@ class Detector2(BaseDetector):
         self._set_node(value, 1)
                 
                 
-                
-                
+class beam(Detector1):
+    
+    def __init__(self, name, node_name, frequency=None, alternate_beam=False):
+        BaseDetector.__init__(self, name, node_name)
+        
+        self.alternate_beam = alternate_beam
+        self.__f = Param("f", self, frequency)        
+    
+    @property
+    def f(self): return self.__f
+    
+    @f.setter
+    def f(self, value):
+        self.__f.value = value
+        
+    @staticmethod
+    def parseFinesseText(text):
+        
+        values = text.split()
 
+        node=values[-1]
+        alt_beam = node[-1] == '*'
+        
+        if len(values) == 3:
+            return beam(values[1], node, alternate_beam=alt_beam)
+        elif len(values) == 4:
+            return beam(values[1], node, alternate_beam=alt_beam, frequency=pykat.SIfloat.SIfloat(values[2]))
+        else:
+            raise pkex.BasePyKatException('Beam detector code "{0}" is not a valid FINESSE command'.format(text))
+    
+    def getFinesseText(self) :
+        rtn = []
+        
+        if self.alternate_beam:
+            alt = '*'
+        else:
+            alt = ''
+        
+        if self.f.value is None:
+            rtn.append("beam {name} {node}{alt}".format(name=self.name, node=self.node.name, alt=alt))
+        else:
+            rtn.append("beam {name} {f} {node}{alt}".format(name=self.name, f=str(self.f.value), node=self.node.name, alt=alt))
+            
+        for p in self._params:
+            rtn.extend(p.getFinesseText())
+        
+        return rtn
+        
+        
+        
 class ad(Detector1):
     
     def __init__(self, name, frequency, node_name, mode=None, alternate_beam=False):
diff --git a/pykat/finesse.py b/pykat/finesse.py
index 1e96ee48b036f17371b13cb0655f33ca39266a9a..ff1eac5a87af656a61647035d673e185cab3ad26 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -835,6 +835,8 @@ class kat(object):
                         obj = pykat.detectors.bp.parseFinesseText(line)
                     elif(first[0:4] == "gouy"):
                         obj = pykat.detectors.gouy.parseFinesseText(line)
+                    elif(first[0:4] == "beam"):
+                        obj = pykat.detectors.beam.parseFinesseText(line)
                     elif(first[0:2] == "pd" and first != "pdtype"):
                         obj = pykat.detectors.pd.parseFinesseText(line)
                     elif(first == "qshot" or first == "qshotS" or first == "qshotN"):