diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend
index b6ee19d..8a72ed9 100644
--- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend
+++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.xtend
@@ -30,28 +30,25 @@
 		// no super call, keep it simple
 		val List<ExpressionFeature> scope = newArrayList
 
-		if (transitionEventData != null)
-			scope += createExprFeature(transitionEventData)
+		if(transitionEventData != null) { 
+			scope += transitionEventData.createExprFeature(ExpressionPostfix.NONE)
+		}
+		scope += actorClass.latestOperations.map[createExprFeature]
+		scope += actorClass.allAttributes.map[createExprFeature]
 		actorClass.allInterfaceItems.forEach [
 			switch it {
 				SPP case isEventDriven/* fall through */,
 				Port case isEventDriven && isReplicated: {
-					scope += createExprFeature // additional feature for broadcast 
+					scope += createExprFeature(ExpressionPostfix.NONE) // additional feature for broadcast 
 					scope += createExprFeature(ExpressionPostfix.BRACKETS)
 				}
 				Port case isReplicated/* fall through  */,
 				SPP:
 					scope += createExprFeature(ExpressionPostfix.BRACKETS)
 				default:
-					scope += createExprFeature
+					scope += createExprFeature(ExpressionPostfix.NONE)
 			}
 		]
-		scope += actorClass.latestOperations.map[createExprFeature(ExpressionPostfix.PARENTHESES)]
-		scope += actorClass.allAttributes.map[
-			switch (size) {
-				case size > 1: createExprFeature(ExpressionPostfix.BRACKETS)
-				default: createExprFeature
-			}]
 
 		return scope
 	}
@@ -64,29 +61,27 @@
 		switch obj : ctx.data {
 			Port case obj.multiplicity == 1/* fall through  */,
 			SAP: scope +=
-				obj.protocol.getAllOperations(!obj.conjugated).map[createExprFeature(ExpressionPostfix.PARENTHESES)]
+				obj.protocol.getAllOperations(!obj.conjugated).map[createExprFeature]
 		}
 		switch obj : ctx.data {
 			InterfaceItem: {
 				val pc = obj.protocol
 				switch pc.commType {
 					case EVENT_DRIVEN:
-						scope += pc.getAllMessages(obj.conjugated).map[createExprFeature(ExpressionPostfix.PARENTHESES)]
+						scope += pc.getAllMessages(obj.conjugated).map[createExprFeature]
 					case DATA_DRIVEN:
 						if (obj.conjugated)
-							scope += pc.allIncomingMessages.map[createExprFeature(ExpressionPostfix.PARENTHESES)]
-						else
 							scope += pc.allIncomingMessages.map[createExprFeature]
-					case SYNCHRONOUS: {
-					}
+						else
+							scope += pc.allIncomingMessages.map[createExprFeature(ExpressionPostfix.NONE)] // data message has no Parenthesis
+					case SYNCHRONOUS: {}
 				}
 
 			// TODO Attributes ?
 			}
 			Attribute case obj.type.type instanceof DataClass: {
 				val dc = obj.type.type as DataClass
-				scope += dc.allAttributes.map[
-					if(size > 1) createExprFeature(ExpressionPostfix.BRACKETS) else createExprFeature]
+				scope += dc.allAttributes.map[createExprFeature]
 				// not supported yet by code translation:
 				// scope += dc.latestOperations.map[createExprFeature(ExpressionPostfix.PARENTHESES)]
 			}
diff --git a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend
index 955af89..f379933 100644
--- a/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend
+++ b/plugins/org.eclipse.etrice.ui.behavior/src/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.xtend
@@ -31,6 +31,9 @@
 
 import static extension org.eclipse.xtend.lib.annotations.AccessorType.*
 import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+import org.eclipse.etrice.core.room.SAP
+import org.eclipse.etrice.core.room.Operation
+import org.eclipse.etrice.core.room.Message
 
 /**
  * Defines expression for fsm guards of an ActorClass
@@ -53,19 +56,16 @@
 	override getInitialFeatures() {
 		val List<ExpressionFeature> scope = newArrayList
 
-		if(transitionEventData != null)
-			scope += createExprFeature(transitionEventData)
-		scope += actorClass.allInterfaceItems.filter[isDataDriven && !isConjugated].map[
+		if(transitionEventData != null) { 
+			scope += transitionEventData.createExprFeature(ExpressionPostfix.NONE)
+		}
+		scope += actorClass.allInterfaceItems.filter[isEventDriven || !isConjugated].map[
 			switch it {
 				Port case isReplicated: createExprFeature(ExpressionPostfix.BRACKETS)
-				default: createExprFeature
-			}]
-		scope += actorClass.latestOperations.map[createExprFeature(ExpressionPostfix.PARENTHESES)]
-		scope += actorClass.allAttributes.map[
-			switch (size) {
-				case size > 1: createExprFeature(ExpressionPostfix.BRACKETS)
-				default: createExprFeature
-			}]
+				default: createExprFeature(ExpressionPostfix.NONE)
+		}]
+		scope += actorClass.latestOperations.map[createExprFeature]
+		scope += actorClass.allAttributes.map[createExprFeature]
 
 		return scope
 	}
@@ -75,27 +75,46 @@
 
 		val List<ExpressionFeature> scope = newArrayList
 		switch obj : ctx.data {
+			Port case obj.multiplicity == 1/* fall through  */,
+			SAP: scope +=
+				obj.protocol.getAllOperations(!obj.conjugated).map[createExprFeature]
+		}
+		switch obj : ctx.data {
 			InterfaceItem: {
 				val pc = obj.protocol
 				switch pc.commType {
 					case DATA_DRIVEN:
-						if (!obj.conjugated)
-							scope += pc.allIncomingMessages.map[createExprFeature]
+						if (!obj.conjugated) scope += pc.allIncomingMessages.map[createExprFeature]
+					case EVENT_DRIVEN: { /* no async message calls */}
+					case SYNCHRONOUS: {}
 				}
 			}
 			Attribute case obj.type.type instanceof DataClass: {
 				val dc = obj.type.type as DataClass
-				scope += dc.allAttributes.map[
-					if(size > 1) createExprFeature(ExpressionPostfix.BRACKETS) else createExprFeature]
-				scope += dc.latestOperations.map[createExprFeature(ExpressionPostfix.PARENTHESES)]
+				scope += dc.allAttributes.map[createExprFeature]
+				scope += dc.latestOperations.map[createExprFeature]
 			}
 		}
 
 		return scope
 	}
-
-	def protected createExprFeature(EObject eObj) {
-		createExprFeature(eObj, ExpressionPostfix.NONE)
+	
+	def ExpressionFeature createExprFeature(Operation it){
+		// assuming all operations have parenthesis
+		createExprFeature(ExpressionPostfix.PARENTHESES)
+	}
+	
+	def ExpressionFeature createExprFeature(Message it){
+		// assuming all message have parenthesis
+		createExprFeature(ExpressionPostfix.PARENTHESES)
+	}
+	
+	def ExpressionFeature createExprFeature(Attribute it){
+		// assuming all attributes have brackets or not depending on size
+		switch (size) {
+			case size > 1: createExprFeature(ExpressionPostfix.BRACKETS)
+			default: createExprFeature(ExpressionPostfix.NONE)
+		}
 	}
 
 	def protected createExprFeature(EObject eObj, ExpressionPostfix postfix) {
diff --git a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java b/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java
index 81e8370..1d525ac 100644
--- a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java
+++ b/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/DefaultDetailExpressionProvider.java
@@ -13,6 +13,7 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.Iterables;
 import java.util.List;
+import java.util.function.Consumer;
 import org.eclipse.etrice.core.room.ActorClass;
 import org.eclipse.etrice.core.room.Attribute;
 import org.eclipse.etrice.core.room.CommunicationType;
@@ -32,9 +33,7 @@
 import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor;
 import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 import org.eclipse.xtext.xbase.lib.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
 import org.eclipse.xtext.xbase.lib.ListExtensions;
-import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
 
 /**
  * Defines expression for fsm detail code of an ActorClass
@@ -47,13 +46,31 @@
     final List<IDetailExpressionProvider.ExpressionFeature> scope = CollectionLiterals.<IDetailExpressionProvider.ExpressionFeature>newArrayList();
     boolean _notEquals = (!Objects.equal(this.transitionEventData, null));
     if (_notEquals) {
-      IDetailExpressionProvider.ExpressionFeature _createExprFeature = this.createExprFeature(this.transitionEventData);
+      IDetailExpressionProvider.ExpressionFeature _createExprFeature = this.createExprFeature(this.transitionEventData, IDetailExpressionProvider.ExpressionPostfix.NONE);
       scope.add(_createExprFeature);
     }
-    List<InterfaceItem> _allInterfaceItems = this.roomHelpers.getAllInterfaceItems(this.actorClass);
-    final Procedure1<InterfaceItem> _function = new Procedure1<InterfaceItem>() {
+    List<StandardOperation> _latestOperations = this.roomHelpers.getLatestOperations(this.actorClass);
+    final Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature> _function = new Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature>() {
       @Override
-      public void apply(final InterfaceItem it) {
+      public IDetailExpressionProvider.ExpressionFeature apply(final StandardOperation it) {
+        return DefaultDetailExpressionProvider.this.createExprFeature(it);
+      }
+    };
+    List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<StandardOperation, IDetailExpressionProvider.ExpressionFeature>map(_latestOperations, _function);
+    Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map);
+    List<Attribute> _allAttributes = this.roomHelpers.getAllAttributes(this.actorClass);
+    final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
+      @Override
+      public IDetailExpressionProvider.ExpressionFeature apply(final Attribute it) {
+        return DefaultDetailExpressionProvider.this.createExprFeature(it);
+      }
+    };
+    List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function_1);
+    Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_1);
+    List<InterfaceItem> _allInterfaceItems = this.roomHelpers.getAllInterfaceItems(this.actorClass);
+    final Consumer<InterfaceItem> _function_2 = new Consumer<InterfaceItem>() {
+      @Override
+      public void accept(final InterfaceItem it) {
         boolean _matched = false;
         if (it instanceof SPP) {
           boolean _isEventDriven = ((SPP)it).isEventDriven();
@@ -69,7 +86,7 @@
           }
         }
         if (_matched) {
-          IDetailExpressionProvider.ExpressionFeature _createExprFeature = DefaultDetailExpressionProvider.this.createExprFeature(it);
+          IDetailExpressionProvider.ExpressionFeature _createExprFeature = DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.NONE);
           scope.add(_createExprFeature);
           IDetailExpressionProvider.ExpressionFeature _createExprFeature_1 = DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
           scope.add(_createExprFeature_1);
@@ -92,42 +109,12 @@
           }
         }
         if (!_matched) {
-          IDetailExpressionProvider.ExpressionFeature _createExprFeature_3 = DefaultDetailExpressionProvider.this.createExprFeature(it);
+          IDetailExpressionProvider.ExpressionFeature _createExprFeature_3 = DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.NONE);
           scope.add(_createExprFeature_3);
         }
       }
     };
-    IterableExtensions.<InterfaceItem>forEach(_allInterfaceItems, _function);
-    List<StandardOperation> _latestOperations = this.roomHelpers.getLatestOperations(this.actorClass);
-    final Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature>() {
-      @Override
-      public IDetailExpressionProvider.ExpressionFeature apply(final StandardOperation it) {
-        return DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
-      }
-    };
-    List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<StandardOperation, IDetailExpressionProvider.ExpressionFeature>map(_latestOperations, _function_1);
-    Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map);
-    List<Attribute> _allAttributes = this.roomHelpers.getAllAttributes(this.actorClass);
-    final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function_2 = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
-      @Override
-      public IDetailExpressionProvider.ExpressionFeature apply(final Attribute it) {
-        IDetailExpressionProvider.ExpressionFeature _switchResult = null;
-        int _size = it.getSize();
-        boolean _matched = false;
-        int _size_1 = it.getSize();
-        boolean _greaterThan = (_size_1 > 1);
-        if (_greaterThan) {
-          _matched=true;
-          _switchResult = DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
-        }
-        if (!_matched) {
-          _switchResult = DefaultDetailExpressionProvider.this.createExprFeature(it);
-        }
-        return _switchResult;
-      }
-    };
-    List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function_2);
-    Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_1);
+    _allInterfaceItems.forEach(_function_2);
     return scope;
   }
   
@@ -158,7 +145,7 @@
       final Function1<PortOperation, IDetailExpressionProvider.ExpressionFeature> _function = new Function1<PortOperation, IDetailExpressionProvider.ExpressionFeature>() {
         @Override
         public IDetailExpressionProvider.ExpressionFeature apply(final PortOperation it) {
-          return DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+          return DefaultDetailExpressionProvider.this.createExprFeature(it);
         }
       };
       List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<PortOperation, IDetailExpressionProvider.ExpressionFeature>map(_allOperations, _function);
@@ -179,7 +166,7 @@
             final Function1<Message, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<Message, IDetailExpressionProvider.ExpressionFeature>() {
               @Override
               public IDetailExpressionProvider.ExpressionFeature apply(final Message it) {
-                return DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+                return DefaultDetailExpressionProvider.this.createExprFeature(it);
               }
             };
             List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Message, IDetailExpressionProvider.ExpressionFeature>map(_allMessages, _function_1);
@@ -192,7 +179,7 @@
               final Function1<Message, IDetailExpressionProvider.ExpressionFeature> _function_2 = new Function1<Message, IDetailExpressionProvider.ExpressionFeature>() {
                 @Override
                 public IDetailExpressionProvider.ExpressionFeature apply(final Message it) {
-                  return DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+                  return DefaultDetailExpressionProvider.this.createExprFeature(it);
                 }
               };
               List<IDetailExpressionProvider.ExpressionFeature> _map_2 = ListExtensions.<Message, IDetailExpressionProvider.ExpressionFeature>map(_allIncomingMessages, _function_2);
@@ -202,7 +189,7 @@
               final Function1<Message, IDetailExpressionProvider.ExpressionFeature> _function_3 = new Function1<Message, IDetailExpressionProvider.ExpressionFeature>() {
                 @Override
                 public IDetailExpressionProvider.ExpressionFeature apply(final Message it) {
-                  return DefaultDetailExpressionProvider.this.createExprFeature(it);
+                  return DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.NONE);
                 }
               };
               List<IDetailExpressionProvider.ExpressionFeature> _map_3 = ListExtensions.<Message, IDetailExpressionProvider.ExpressionFeature>map(_allIncomingMessages_1, _function_3);
@@ -229,15 +216,7 @@
           final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
             @Override
             public IDetailExpressionProvider.ExpressionFeature apply(final Attribute it) {
-              IDetailExpressionProvider.ExpressionFeature _xifexpression = null;
-              int _size = it.getSize();
-              boolean _greaterThan = (_size > 1);
-              if (_greaterThan) {
-                _xifexpression = DefaultDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
-              } else {
-                _xifexpression = DefaultDetailExpressionProvider.this.createExprFeature(it);
-              }
-              return _xifexpression;
+              return DefaultDetailExpressionProvider.this.createExprFeature(it);
             }
           };
           List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function_1);
diff --git a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java b/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java
index b5c88cf..14360cd 100644
--- a/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java
+++ b/plugins/org.eclipse.etrice.ui.behavior/xtend-gen/org/eclipse/etrice/ui/behavior/detailcode/GuardDetailExpressionProvider.java
@@ -24,9 +24,12 @@
 import org.eclipse.etrice.core.room.DataType;
 import org.eclipse.etrice.core.room.InterfaceItem;
 import org.eclipse.etrice.core.room.Message;
+import org.eclipse.etrice.core.room.Operation;
 import org.eclipse.etrice.core.room.Port;
+import org.eclipse.etrice.core.room.PortOperation;
 import org.eclipse.etrice.core.room.ProtocolClass;
 import org.eclipse.etrice.core.room.RefableType;
+import org.eclipse.etrice.core.room.SAP;
 import org.eclipse.etrice.core.room.StandardOperation;
 import org.eclipse.etrice.core.room.VarDecl;
 import org.eclipse.etrice.core.room.util.RoomHelpers;
@@ -67,14 +70,14 @@
     final List<IDetailExpressionProvider.ExpressionFeature> scope = CollectionLiterals.<IDetailExpressionProvider.ExpressionFeature>newArrayList();
     boolean _notEquals = (!Objects.equal(this.transitionEventData, null));
     if (_notEquals) {
-      IDetailExpressionProvider.ExpressionFeature _createExprFeature = this.createExprFeature(this.transitionEventData);
+      IDetailExpressionProvider.ExpressionFeature _createExprFeature = this.createExprFeature(this.transitionEventData, IDetailExpressionProvider.ExpressionPostfix.NONE);
       scope.add(_createExprFeature);
     }
     List<InterfaceItem> _allInterfaceItems = this.roomHelpers.getAllInterfaceItems(this.actorClass);
     final Function1<InterfaceItem, Boolean> _function = new Function1<InterfaceItem, Boolean>() {
       @Override
       public Boolean apply(final InterfaceItem it) {
-        return Boolean.valueOf((GuardDetailExpressionProvider.this.roomHelpers.isDataDriven(it) && (!GuardDetailExpressionProvider.this.roomHelpers.isConjugated(it))));
+        return Boolean.valueOf((it.isEventDriven() || (!GuardDetailExpressionProvider.this.roomHelpers.isConjugated(it))));
       }
     };
     Iterable<InterfaceItem> _filter = IterableExtensions.<InterfaceItem>filter(_allInterfaceItems, _function);
@@ -91,7 +94,7 @@
           }
         }
         if (!_matched) {
-          _switchResult = GuardDetailExpressionProvider.this.createExprFeature(it);
+          _switchResult = GuardDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.NONE);
         }
         return _switchResult;
       }
@@ -102,7 +105,7 @@
     final Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature> _function_2 = new Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature>() {
       @Override
       public IDetailExpressionProvider.ExpressionFeature apply(final StandardOperation it) {
-        return GuardDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+        return GuardDetailExpressionProvider.this.createExprFeature(it);
       }
     };
     List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<StandardOperation, IDetailExpressionProvider.ExpressionFeature>map(_latestOperations, _function_2);
@@ -111,19 +114,7 @@
     final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function_3 = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
       @Override
       public IDetailExpressionProvider.ExpressionFeature apply(final Attribute it) {
-        IDetailExpressionProvider.ExpressionFeature _switchResult = null;
-        int _size = it.getSize();
-        boolean _matched = false;
-        int _size_1 = it.getSize();
-        boolean _greaterThan = (_size_1 > 1);
-        if (_greaterThan) {
-          _matched=true;
-          _switchResult = GuardDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
-        }
-        if (!_matched) {
-          _switchResult = GuardDetailExpressionProvider.this.createExprFeature(it);
-        }
-        return _switchResult;
+        return GuardDetailExpressionProvider.this.createExprFeature(it);
       }
     };
     List<IDetailExpressionProvider.ExpressionFeature> _map_2 = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function_3);
@@ -138,75 +129,120 @@
     Object _data = ctx.getData();
     final Object obj = _data;
     boolean _matched = false;
-    if (obj instanceof InterfaceItem) {
-      _matched=true;
-      final ProtocolClass pc = this.roomHelpers.getProtocol(((InterfaceItem)obj));
+    if (obj instanceof Port) {
+      int _multiplicity = ((Port)obj).getMultiplicity();
+      boolean _equals = (_multiplicity == 1);
+      if (_equals) {
+        _matched=true;
+      }
+    }
+    if (!_matched) {
+      if (obj instanceof SAP) {
+        _matched=true;
+      }
+    }
+    if (_matched) {
+      ProtocolClass _protocol = this.roomHelpers.getProtocol(((InterfaceItem)obj));
+      boolean _isConjugated = this.roomHelpers.isConjugated(((InterfaceItem)obj));
+      boolean _not = (!_isConjugated);
+      List<PortOperation> _allOperations = this.roomHelpers.getAllOperations(_protocol, _not);
+      final Function1<PortOperation, IDetailExpressionProvider.ExpressionFeature> _function = new Function1<PortOperation, IDetailExpressionProvider.ExpressionFeature>() {
+        @Override
+        public IDetailExpressionProvider.ExpressionFeature apply(final PortOperation it) {
+          return GuardDetailExpressionProvider.this.createExprFeature(it);
+        }
+      };
+      List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<PortOperation, IDetailExpressionProvider.ExpressionFeature>map(_allOperations, _function);
+      Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map);
+    }
+    Object _data_1 = ctx.getData();
+    final Object obj_1 = _data_1;
+    boolean _matched_1 = false;
+    if (obj_1 instanceof InterfaceItem) {
+      _matched_1=true;
+      final ProtocolClass pc = this.roomHelpers.getProtocol(((InterfaceItem)obj_1));
       CommunicationType _commType = pc.getCommType();
       if (_commType != null) {
         switch (_commType) {
           case DATA_DRIVEN:
-            boolean _isConjugated = this.roomHelpers.isConjugated(((InterfaceItem)obj));
-            boolean _not = (!_isConjugated);
-            if (_not) {
+            boolean _isConjugated_1 = this.roomHelpers.isConjugated(((InterfaceItem)obj_1));
+            boolean _not_1 = (!_isConjugated_1);
+            if (_not_1) {
               List<Message> _allIncomingMessages = this.roomHelpers.getAllIncomingMessages(pc);
-              final Function1<Message, IDetailExpressionProvider.ExpressionFeature> _function = new Function1<Message, IDetailExpressionProvider.ExpressionFeature>() {
+              final Function1<Message, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<Message, IDetailExpressionProvider.ExpressionFeature>() {
                 @Override
                 public IDetailExpressionProvider.ExpressionFeature apply(final Message it) {
                   return GuardDetailExpressionProvider.this.createExprFeature(it);
                 }
               };
-              List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<Message, IDetailExpressionProvider.ExpressionFeature>map(_allIncomingMessages, _function);
-              Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map);
+              List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Message, IDetailExpressionProvider.ExpressionFeature>map(_allIncomingMessages, _function_1);
+              Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_1);
             }
             break;
+          case EVENT_DRIVEN:
+            break;
+          case SYNCHRONOUS:
+            break;
           default:
             break;
         }
       }
     }
-    if (!_matched) {
-      if (obj instanceof Attribute) {
-        RefableType _type = ((Attribute)obj).getType();
+    if (!_matched_1) {
+      if (obj_1 instanceof Attribute) {
+        RefableType _type = ((Attribute)obj_1).getType();
         DataType _type_1 = _type.getType();
         if ((_type_1 instanceof DataClass)) {
-          _matched=true;
-          RefableType _type_2 = ((Attribute)obj).getType();
+          _matched_1=true;
+          RefableType _type_2 = ((Attribute)obj_1).getType();
           DataType _type_3 = _type_2.getType();
           final DataClass dc = ((DataClass) _type_3);
           List<Attribute> _allAttributes = this.roomHelpers.getAllAttributes(dc);
-          final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
+          final Function1<Attribute, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<Attribute, IDetailExpressionProvider.ExpressionFeature>() {
             @Override
             public IDetailExpressionProvider.ExpressionFeature apply(final Attribute it) {
-              IDetailExpressionProvider.ExpressionFeature _xifexpression = null;
-              int _size = it.getSize();
-              boolean _greaterThan = (_size > 1);
-              if (_greaterThan) {
-                _xifexpression = GuardDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
-              } else {
-                _xifexpression = GuardDetailExpressionProvider.this.createExprFeature(it);
-              }
-              return _xifexpression;
+              return GuardDetailExpressionProvider.this.createExprFeature(it);
             }
           };
-          List<IDetailExpressionProvider.ExpressionFeature> _map = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function);
-          Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map);
+          List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<Attribute, IDetailExpressionProvider.ExpressionFeature>map(_allAttributes, _function_1);
+          Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_1);
           List<StandardOperation> _latestOperations = this.roomHelpers.getLatestOperations(dc);
-          final Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature> _function_1 = new Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature>() {
+          final Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature> _function_2 = new Function1<StandardOperation, IDetailExpressionProvider.ExpressionFeature>() {
             @Override
             public IDetailExpressionProvider.ExpressionFeature apply(final StandardOperation it) {
-              return GuardDetailExpressionProvider.this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+              return GuardDetailExpressionProvider.this.createExprFeature(it);
             }
           };
-          List<IDetailExpressionProvider.ExpressionFeature> _map_1 = ListExtensions.<StandardOperation, IDetailExpressionProvider.ExpressionFeature>map(_latestOperations, _function_1);
-          Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_1);
+          List<IDetailExpressionProvider.ExpressionFeature> _map_2 = ListExtensions.<StandardOperation, IDetailExpressionProvider.ExpressionFeature>map(_latestOperations, _function_2);
+          Iterables.<IDetailExpressionProvider.ExpressionFeature>addAll(scope, _map_2);
         }
       }
     }
     return scope;
   }
   
-  protected IDetailExpressionProvider.ExpressionFeature createExprFeature(final EObject eObj) {
-    return this.createExprFeature(eObj, IDetailExpressionProvider.ExpressionPostfix.NONE);
+  public IDetailExpressionProvider.ExpressionFeature createExprFeature(final Operation it) {
+    return this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+  }
+  
+  public IDetailExpressionProvider.ExpressionFeature createExprFeature(final Message it) {
+    return this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.PARENTHESES);
+  }
+  
+  public IDetailExpressionProvider.ExpressionFeature createExprFeature(final Attribute it) {
+    IDetailExpressionProvider.ExpressionFeature _switchResult = null;
+    int _size = it.getSize();
+    boolean _matched = false;
+    int _size_1 = it.getSize();
+    boolean _greaterThan = (_size_1 > 1);
+    if (_greaterThan) {
+      _matched=true;
+      _switchResult = this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.BRACKETS);
+    }
+    if (!_matched) {
+      _switchResult = this.createExprFeature(it, IDetailExpressionProvider.ExpressionPostfix.NONE);
+    }
+    return _switchResult;
   }
   
   protected IDetailExpressionProvider.ExpressionFeature createExprFeature(final EObject eObj, final IDetailExpressionProvider.ExpressionPostfix postfix) {
diff --git a/tests/org.eclipse.etrice.generator.common.tests/models/DetailExpressionTest.room b/tests/org.eclipse.etrice.generator.common.tests/models/DetailExpressionTest.room
index f45443d..0330485 100644
--- a/tests/org.eclipse.etrice.generator.common.tests/models/DetailExpressionTest.room
+++ b/tests/org.eclipse.etrice.generator.common.tests/models/DetailExpressionTest.room
@@ -29,11 +29,11 @@
 					triggers {
 						<out1: cPortEvent guard {
 							"/* TODO activate action code editor */"
-							"rPortData.in1 == numberArray[3] &&"
-							"accessibleMessageData && infoData.flag"
+							"rPortData.in1 == numberArray[3] && accessibleMessageData && infoData.flag && actorOp(32)  && rPortEvent.regularOp(32) && cPortEvent.conjugatedOp(32)"
 						}>
 					}
-					action {
+					action 
+				{
 						"// TODO syntax highlightiing"
 						"rPortEvent.out1(true);"
 						"rPortData.in1;"
@@ -67,8 +67,9 @@
 					}
 				}
 				Transition guardedTrans: idle -> state2 {
-					guard {
-						"rPortData.in1 == numberArray[3] && infoData.flag"
+					guard 
+				{
+						"rPortData.in1 == numberArray[3] && infoData.flag && actorOp(32)  && rPortEvent.regularOp(32) && cPortEvent.conjugatedOp(32)"
 					}
 				}
 				Transition init: initial -> idle
