diff --git a/robotlab_safety/pluto_auto.py b/robotlab_safety/pluto_auto.py
index aad70ace26af7a7c20c90b658d35d160a5a4d782..1c509d05816023fa95a08cff5f2829f4702b21da 100755
--- a/robotlab_safety/pluto_auto.py
+++ b/robotlab_safety/pluto_auto.py
@@ -17,23 +17,26 @@ class PlutoVariables:
         pass
 
     def codegen(self, expr):
-        m = re.match('([^=]+)=AND\{(.*),(.*)\}', expr)
+        m = re.match('([^=]+)=(AND|OR)\{(.*),(.*)\}', expr)
         if m:
             lh = m.group(1)
-            regexp = m.group(2).replace('*', '.*')
-            rh = [ m.group(3).format(v, pluto=self.by_name[v][0])
-                   for v in self.by_name if re.match(regexp, v)]
-            return("%s=%s" % (lh, '*'.join(rh)))
-        m = re.match('([^=]+)=OR\{(.*),(.*)\}', expr)
-        if m:
-            lh = m.group(1)
-            regexp = m.group(2).replace('*', '.*')
-            rh = [ m.group(3).format(v, pluto=self.by_name[v][0])
-                   for v in self.by_name if re.match(regexp, v)]
-            return("%s=%s" % (lh, '+'.join(rh)))
+            op = m.group(2)
+            regexp = m.group(3).replace('*', '.*')
+            expr = m.group(4)
+            rh = []
+            for k,v in sorted(self.by_name.items()):
+                rh_m = re.match(regexp, k)
+                if rh_m:
+                    matches = (k,)+rh_m.groups()
+                    rh.append(expr.format(*matches, pluto=v[0]))
+                    pass
+                pass
+            if op == 'AND':
+                return("%s=%s" % (lh, '*'.join(rh)))
+            elif op == 'OR':
+                return("%s=%s" % (lh, '+'.join(rh)))
         raise Exception('Invalid expression', expr)
 
-    
 class SPS:
 
     def __init__(self, path):
diff --git a/robotlab_safety/safety_2020.sps b/robotlab_safety/safety_2020.sps
index ee34758432839b35543cfa953662fb5b4fbd4fc9..d99544cff6b84fd63ddda81b2e6ef2fde151cff0 100644
Binary files a/robotlab_safety/safety_2020.sps and b/robotlab_safety/safety_2020.sps differ