diff --git a/pykat/__init__.py b/pykat/__init__.py
index e9f2f0fa864bd9e765a40b1de676be7096463eff..1474e2085f64e36af0c16e10995e65b851a2fd58 100644
--- a/pykat/__init__.py
+++ b/pykat/__init__.py
@@ -3,7 +3,7 @@ from __future__ import division
 from __future__ import print_function
 from __future__ import unicode_literals
 
-__version__ = "1.0.6"
+__version__ = "1.0.8"
 
 # This flag is used to switch on the gui features in pkat at import time
 USE_GUI = False
diff --git a/pykat/components.py b/pykat/components.py
index 8d4f3c8da16e1e39528a89af4bfa1703b132f601..52d386031e5aaf0e95188f30ea030e7d435485a8 100644
--- a/pykat/components.py
+++ b/pykat/components.py
@@ -1003,35 +1003,58 @@ class isolator(Component):
         return self._svgItem
 
 class lens(Component):
-    def __init__(self, name, node1, node2, f=1):
+    def __init__(self, name, node1, node2, f=1, p=None):
         Component.__init__(self, name)
         
+        if not ((f is None) ^ (p is None)):
+            raise pkex.BasePyKatException("Specify either a focal length or power, not both.")
+        
         self._requested_node_names.append(node1)
         self._requested_node_names.append(node2)
         self._svgItem = None
         self.__f = Param("f", self, SIfloat(f))
+        self.__p = Param("p", self, SIfloat(p))
         
     @property
     def f(self): return self.__f
+            
     @f.setter
-    def f(self, value): self.__f.value = SIfloat(value)
+    def f(self, value):
+        self.__f.value = SIfloat(value)
+        self.__p.value = None
+    
+    @property
+    def p(self): return self.__p
+            
+    @p.setter
+    def p(self, value):
+        self.__p.value = SIfloat(value)
+        self.__f.value = None
     
     @staticmethod
     def parseFinesseText(text):
         values = text.split()
 
-        if values[0] != "lens":
+        if not values[0].startswith("lens"):
             raise pkex.BasePyKatException("'{0}' not a valid Finesse lens command".format(text))
 
+        alt = values[0].endswith("*")
+        
         values.pop(0) # remove initial value
         
         if len(values) == 4:
-            return lens(values[0], values[2], values[3], values[1])
+            if not alt:
+                return lens(values[0], values[2], values[3], f=values[1], p=None)
+            else:
+                return lens(values[0], values[2], values[3], f=None, p=values[1])
         else:
             raise pkex.BasePyKatException("Lens Finesse code format incorrect '{0}'".format(text))
         
     def getFinesseText(self):
-        rtn = ['lens {0} {1} {2} {3}'.format(self.name, self.f.value, self.nodes[0].name, self.nodes[1].name)]
+        if self.__p.value is None:
+            rtn = ['lens {0} {1} {2} {3}'.format(self.name, self.f.value, self.nodes[0].name, self.nodes[1].name)]
+        else:
+            rtn = ['lens* {0} {1} {2} {3}'.format(self.name, self.p.value, self.nodes[0].name, self.nodes[1].name)]
         
         for p in self._params:
             rtn.extend(p.getFinesseText())
diff --git a/pykat/finesse.py b/pykat/finesse.py
index 08d1fae817a28bf1c5f73462b03311550b94560c..cdb5a2ae1a44a2db553661393bfba3ee6229e0e3 100644
--- a/pykat/finesse.py
+++ b/pykat/finesse.py
@@ -642,13 +642,19 @@ class Signals(object):
     @property
     def f(self): return self.__f
     @f.setter
-    def f(self,value): self.__f.value = SIfloat(value)
+    def f(self,value):
+        v = SIfloat(value)
+        
+        if v <= 0:
+            raise pkex.BasePyKatException("Signal frequency must be greater than 0.")
+            
+        self.__f.value = SIfloat(value)
     
     def __init__(self, kat):
         self._default_name = "fsignal"
         self.targets = []
         self._params = []
-        self.__f = Param("f", self, 0)
+        self.__f = Param("f", self, None)
         self._kat = kat
         
     def _register_param(self, param):
@@ -667,21 +673,22 @@ class Signals(object):
     def getFinesseText(self):
         rtn = []
         
-        if len(self.targets) == 0 and (self.f != 0 and self.f is not None):
-            rtn.append("fsig {name} {frequency}"
-                            .format(name = self.name,
-                                    frequency=str(self.f)))
-        else:
-            for t in self.targets:
-                rtn.extend(t.getFinesseText())
-            
-                rtn.append("fsig {name} {comp} {target} {frequency} {phase} {amplitude}"
-                                .format(name = t.name,
-                                        comp=t.owner,
-                                        target=t.target,
-                                        frequency=str(self.f),
-                                        phase=str(t.phase),
-                                        amplitude=str(t.amplitude if t.amplitude != None else "")))
+        if self.f.value is not None and self.f is not None:
+            if len(self.targets) == 0:
+                rtn.append("fsig {name} {frequency}"
+                                .format(name = self.name,
+                                        frequency=str(self.f.value)))
+            else:
+                for t in self.targets:
+                    rtn.extend(t.getFinesseText())
+            
+                    rtn.append("fsig {name} {comp} {target} {frequency} {phase} {amplitude}"
+                                    .format(name = t.name,
+                                            comp=t.owner,
+                                            target=t.target,
+                                            frequency=str(self.f.value),
+                                            phase=str(t.phase),
+                                            amplitude=str(t.amplitude if t.amplitude != None else "")))
 
         for p in self._params:
             rtn.extend(p.getFinesseText())