diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 3b171b0..0b1d232 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -15,7 +15,6 @@
 <jenkins>
 	<!-- DO NOT EDIT BELOW THIS LINE -->
         <jenkins.build.dependencies>
-                <jenkins.build.dependency>org.eclipse.osbp.authentication</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ecview.core</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.ecview.extension.api</jenkins.build.dependency>
diff --git a/org.eclipse.osbp.autowireHelper.feature/feature.xml b/org.eclipse.osbp.autowireHelper.feature/feature.xml
index 456fe3c..d8cf4c0 100644
--- a/org.eclipse.osbp.autowireHelper.feature/feature.xml
+++ b/org.eclipse.osbp.autowireHelper.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.autowireHelper.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.autowireHelper">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.autowireHelper/META-INF/MANIFEST.MF b/org.eclipse.osbp.autowireHelper/META-INF/MANIFEST.MF
index 9d84508..86a7f2d 100644
--- a/org.eclipse.osbp.autowireHelper/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.autowireHelper/META-INF/MANIFEST.MF
@@ -8,12 +8,11 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Require-Bundle: org.slf4j.api;bundle-version="1.7.2",
- javax.annotation;bundle-version="[1.1.0,1.2.0)",
  com.google.inject;bundle-version="3.0.0";resolution:=optional,
  org.eclipse.emf.common,
  org.eclipse.emf.ecore;bundle-version="2.10.2",
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
- org.eclipse.xtext.xbase;bundle-version="[2.7.3,2.8.0)";resolution:=optional,
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
  org.eclipse.xtend2.lib;bundle-version="2.7.3";resolution:=optional,
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.dsl;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
@@ -22,8 +21,6 @@
  org.eclipse.osbp.ecview.extension.api;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.mobile.vaadin.ecview.model;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
  org.eclipse.osbp.ecview.extension.model;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.utils;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.authentication;bundle-version="[0.9.0,0.10.0)",
  javax.validation.api;bundle-version="1.1.0",
  org.eclipse.osbp.gitinfo;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.common.xtext;bundle-version="[0.9.0,0.10.0)",
@@ -32,10 +29,12 @@
  org.eclipse.osbp.dsl.datatype.lib;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.ecview.core.util.emf;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.core.runtime;bundle-version="3.10.0",
- org.eclipse.xtext.ui;bundle-version="2.7.3",
+ org.eclipse.xtext.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.ecview.extension.api;bundle-version="[0.9.0,0.10.0)",
  org.apache.commons.lang;bundle-version="2.6.0"
 Export-Package: org.eclipse.osbp.autowirehelper;version="0.9.0",
  org.eclipse.osbp.autowirehelper.utils;version="0.9.0"
-Import-Package: org.eclipse.osbp.utils.functionnormalizer.api;version="0.9.0"
+Import-Package: javax.annotation,
+ org.eclipse.osbp.utils.common;version="0.9.0",
+ org.eclipse.osbp.utils.functionnormalizer.api
 
diff --git a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/AutowireHelper.xtend b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/AutowireHelper.xtend
index c261cbf..73de8cb 100644
--- a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/AutowireHelper.xtend
+++ b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/AutowireHelper.xtend
@@ -12,7 +12,7 @@
  * 
  * 
  *  This copyright notice shows up in the generated Java code
- *
+ * 
  */
 package org.eclipse.osbp.autowirehelper
 
@@ -24,7 +24,7 @@
 import java.util.Map
 import java.util.Set
 import java.util.Stack
-import javax.validation.Constraint
+import javax.validation.Valid
 import org.eclipse.emf.common.util.URI
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.emf.ecore.InternalEObject
@@ -35,6 +35,7 @@
 import org.eclipse.osbp.dsl.common.datatypes.IDto
 import org.eclipse.osbp.ecview.core.common.model.binding.BindingFactory
 import org.eclipse.osbp.ecview.core.common.model.binding.YBindingUpdateStrategy
+import org.eclipse.osbp.ecview.core.common.model.binding.YDetailValueBindingEndpoint
 import org.eclipse.osbp.ecview.core.common.model.binding.YECViewModelListBindingEndpoint
 import org.eclipse.osbp.ecview.core.common.model.binding.YListBindingEndpoint
 import org.eclipse.osbp.ecview.core.common.model.binding.YValueBindingEndpoint
@@ -54,7 +55,6 @@
 import org.eclipse.osbp.ecview.dsl.extensions.BindableTypeResolver
 import org.eclipse.osbp.ecview.dsl.extensions.BindingInfoHelper
 import org.eclipse.osbp.ecview.dsl.extensions.BindingInfoHelper.BindingInfo
-import org.eclipse.osbp.ecview.dsl.extensions.I18nKeyProvider
 import org.eclipse.osbp.ecview.dsl.extensions.OperationExtensions
 import org.eclipse.osbp.ecview.dsl.extensions.OperationExtensions.OperationInfo
 import org.eclipse.osbp.ecview.dsl.extensions.SuperTypeCollector
@@ -77,10 +77,11 @@
 import org.eclipse.osbp.mobile.vaadin.ecview.model.VaadinMobileFactory
 import org.eclipse.osbp.runtime.common.annotations.DomainDescription
 import org.eclipse.osbp.runtime.common.annotations.DomainKey
+import org.eclipse.osbp.runtime.common.annotations.FilterDepth
+import org.eclipse.osbp.runtime.common.annotations.UniqueEntry
 import org.eclipse.osbp.runtime.common.metric.TimeLogger
 import org.eclipse.osbp.utils.functionnormalizer.api.FunctionTypingAPI
 import org.eclipse.xtext.common.types.JvmDeclaredType
-import org.eclipse.xtext.common.types.JvmEnumerationLiteral
 import org.eclipse.xtext.common.types.JvmGenericType
 import org.eclipse.xtext.common.types.JvmParameterizedTypeReference
 import org.eclipse.xtext.common.types.JvmPrimitiveType
@@ -93,6 +94,7 @@
 import org.eclipse.xtext.ui.editor.findrefs.IReferenceFinder
 import org.eclipse.xtext.util.IAcceptor
 import org.eclipse.xtext.util.concurrent.IUnitOfWork
+import org.eclipse.osbp.runtime.common.annotations.OnKanbanCard
 
 @SuppressWarnings("restriction")
 class AutowireHelper implements IAutowireDelegate {
@@ -147,12 +149,12 @@
 				return
 		}
 
-		//		val userAccessService = UserServiceBinder.getUserAccessService
-		//		val userName = userAccessService.user.userName
-		//		val permissionList = userAccessService.findPermissionsForUser(userName)
-		//		for (permission : permissionList.permissions){
-		//			println(permission)
-		//		}
+		// val userAccessService = UserServiceBinder.getUserAccessService
+		// val userName = userAccessService.user.userName
+		// val permissionList = userAccessService.findPermissionsForUser(userName)
+		// for (permission : permissionList.permissions){
+		// println(permission)
+		// }
 		val BindableTypeResolver resolver = new BindableTypeResolver
 		var resolvedType = resolver.resolveType(uiLayout.autoWireSource)
 		if (resolvedType instanceof JvmDeclaredType) {
@@ -180,7 +182,7 @@
 		jvmTypeURIs += EcoreUtil.getURI(dtoType)
 		val IAcceptor<IReferenceDescription> acceptor = [
 			val IReferenceDescription desc = it
-			if (desc.EReference == TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE) {
+			if (desc.EReference === TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE) {
 				if (sourceEObjectUri.fragment.endsWith("/@superTypes.0")) {
 					val URI uri = desc.sourceEObjectUri;
 					result += URI.createURI(uri.toString.replace("/@superTypes.0", ""))
@@ -213,11 +215,11 @@
 		sortedOpInfoMapList.createSuspectStructure(type, mobile, parentSuspect)
 	}
 
-	def createSuspectStructure(LinkedList<Map<String, OperationInfo>> sortedOpInfoMapList, JvmType dtoType,
+	def createSuspectStructure(LinkedList<Map<String, OperationInfo>> sortedOpInfoMapList, JvmDeclaredType dtoType,
 		boolean mobile, YTypedCompoundSuspect parentSuspect) {
 		if (!dtoType.isEnum) {
 			sortedOpInfoMapList.forEach [
-				it.createSuspectStructure(mobile, parentSuspect)
+				it.createSuspectStructure(dtoType, mobile, parentSuspect)
 			]
 		}
 
@@ -241,7 +243,7 @@
 		}
 	}
 
-	def createSuspectStructure(Map<String, OperationInfo> opInfoMap, boolean mobile,
+	def createSuspectStructure(Map<String, OperationInfo> opInfoMap, JvmDeclaredType dtoType, boolean mobile,
 		YTypedCompoundSuspect parentSuspect) {
 
 		opInfoMap.values.forEach [
@@ -253,18 +255,18 @@
 			}
 			var YSuspect suspect
 			var properties = newArrayList()
-			if (it.field != null) {
-				properties.addAll(beanType.toProperties(it.field.declaringType.qualifiedName + "." + it.name))
+			if (it.field !== null) {
+				properties.addAll(dtoType.toProperties(it.field.declaringType.qualifiedName + "." + it.name))
 			}
-			if (type.boolean) {
+			if (type.boolean && !it.isDirtyMark) {
 				if(mobile) type.createMobileSwitch(it) else suspect = type.createCheckbox(it)
 			} else if (type.numberWithDigits) {
 				suspect = type.createDecimalField(it)
-				if (beanType.isAttribute(it.name, "NumberToUomo")) {
+				if (dtoType.isAttribute(it.name, "NumberToUomo")) {
 					suspect.tags += "NumberToUomo"
 				} else {
-					var dataType = beanType.toDataType(it.name)
-					if (dataType != null) {
+					var dataType = dtoType.toDataType(it.name)
+					if (dataType !== null) {
 						var dataTypeName = dataType.jvmTypeReference.type.identifier
 						if (dataTypeName.equals(Double.canonicalName)) {
 							suspect = type.createCustomDecimalField(it)
@@ -273,15 +275,13 @@
 				}
 			} else if (type.numberWithoutDigits) {
 
-				// TODO Pirchner _ fix me with @ID annotation
-				if (!it.name.equals("id") && !it.name.equals("uuid")) {
+				if (!it.idOrUUID && !it.version && !it.dirtyMark) {
 					suspect = type.createNumberField(it)
 				}
 			} else if (type.string) {
 				val fieldType = properties.findFirst[it.key.equals(ILayoutingStrategy.PROPERTY_KEY__FIELD_TYPE)]?.value
 
-				// TODO Pirchner _ fix me with @ID annotation
-				if (!it.name.equals("id") && !it.name.equals("uuid")) {
+				if (!it.idOrUUID && !it.version && !it.dirtyMark) {
 					var functionTypingAPI = new FunctionTypingAPI()
 					val functionImagePicker = functionTypingAPI.functionImagePickerTypeName
 					if (it.isDomainKey || it.isDomainDescription ||
@@ -302,6 +302,10 @@
 						suspect = type.createOrganizationComboBox(it)
 					} else if (properties.exists[key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_PERSPECTIVE)]) {
 						suspect = type.createPerspectiveComboBox(it)
+					} else if (properties.exists[key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_PRINTSERVICE)]) {
+						suspect = type.createPrintServiceComboBox(it)
+					} else if (properties.exists[key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_THEME)]) {
+						suspect = type.createThemeComboBox(it)
 					} else if (properties.exists[key.equalsIgnoreCase(functionImagePicker)]) {
 						suspect = type.createIconComboBox(it)
 					} else {
@@ -325,7 +329,7 @@
 				}
 			} else if (it.domainReference) {
 				suspect = type.createBeanReferenceField(it)
-			} else if (it.field != null && it.field.collection) {
+			} else if (it.field !== null && it.field.collection) {
 				if (properties.exists[key.toLowerCase.equals(ILayoutingStrategy.PROPERTY_GRID)]) {
 					suspect = type.createGrid(it)
 				} else if (properties.exists[key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_TABLE)]) {
@@ -334,19 +338,19 @@
 			} else if (type.dto) {
 				suspect = type.createDtoSuspect(it)
 			}
-			if (parentSuspect == null) {
-				type.completeSuspect(it, suspect)
+			if (parentSuspect === null) {
+				type.completeSuspect(it, suspect, dtoType)
 			} else {
-				type.completeSuspect(it, suspect, parentSuspect)
+				type.completeSuspect(it, suspect, parentSuspect, dtoType)
 			}
 			for (keyAndValue : properties) {
-				if(suspect != null) suspect.properties.put(keyAndValue.key.toLowerCase, keyAndValue.value)
+				if(suspect !== null) suspect.properties.put(keyAndValue.key.toLowerCase, keyAndValue.value)
 			}
 		]
 	}
 
 	def createAuthorizationVisibilityProcessor(YAuthorizationable element, OperationInfo info) {
-		if (info.field != null) {
+		if (info.field !== null) {
 			val type = info.field.eContainer as JvmGenericType
 			if (!info.getter.returnType.type.isClass && info.getter.returnType.type.isAllowed(type, info)) {
 				element.authorizationGroup = type.fullyQualifiedName.toString
@@ -417,14 +421,31 @@
 		return superTypes.contains(typeof(IDto).name)
 	}
 
-	def completeSuspect(JvmType type, OperationInfo info, YSuspect suspect) {
-		if (suspect != null) {
+	def completeSuspect(JvmType type, OperationInfo info, YSuspect suspect, JvmType parentType) {
+		if (suspect !== null) {
 			suspect.id = '''«uiLayout.generateId».«info.name»'''
 
 			if (info.readonly) {
 				suspect.tags += "readonly"
 			}
 
+			if(info.isOnKanbanCard) {
+				suspect.tags += "onKanbanCard"
+			}
+
+			if (info.isUniqueEntry) {
+				suspect.tags += "unique"
+				var splittedId = info.id.split(":")
+				if (splittedId.length > 1) {
+					var fqClassName = splittedId.get(0)
+					suspect.properties.put("class", fqClassName)
+				}
+				suspect.properties.put("name", info.name)
+
+				// register the container of the binding to the suspect. Otherwise we can not check for the uniqueness
+				suspect.createModelValueContainerBinding(info.name, type, "value")
+			}
+
 			if (isValidationConstraint(info)) {
 				suspect.tags += "constraint"
 				var splittedId = info.id.split(":")
@@ -436,10 +457,27 @@
 			}
 
 			layouter.add(suspect)
-			if (info.field != null && info.field.collection) {
+			if (info.field !== null && info.field.collection) {
 				suspect.createModelListBinding(info, type, "list");
 			} else {
-				suspect.createBinding(info.name, type, "value");
+				suspect.createModelValueBinding(info.name, type, "value", parentType);
+			}
+
+			// fix the masterDetailBinding endpoint of the child suspects
+			if (suspect instanceof YTypedCompoundSuspect) {
+				val masterValueEP = suspect.valueBindingEndpoints.get(0)
+				if (!suspect.valueBindingEndpoints.isEmpty) {
+					for (child : suspect.children) {
+						child.id = suspect.id + child.id
+						if (!child.valueBindingEndpoints.isEmpty) {
+							val childValueEP = child.valueBindingEndpoints.get(0)
+							if (childValueEP instanceof YDetailValueBindingEndpoint) {
+								childValueEP.masterObservable = EcoreUtil.copy(masterValueEP) as YValueBindingEndpoint
+							}
+						}
+					}
+				}
+
 			}
 
 			// create the authorization infos
@@ -447,8 +485,8 @@
 		}
 	}
 
-	def completeSuspect(JvmType type, OperationInfo info, YSuspect suspect, YTypedCompoundSuspect parentSuspect) {
-		if (suspect != null) {
+	def completeSuspect(JvmType type, OperationInfo info, YSuspect suspect, YTypedCompoundSuspect parentSuspect, JvmType parentType) {
+		if (suspect !== null) {
 			suspect.id = '''«parentSuspect.id».«info.name»'''
 
 			if (info.readonly) {
@@ -466,10 +504,10 @@
 			}
 
 			parentSuspect.children.add(suspect)
-			if (info.field != null && info.field.collection) {
+			if (info.field !== null && info.field.collection) {
 				suspect.createModelListBinding(info, type, "list");
 			} else {
-				suspect.createBinding(info.name, type, "value");
+				suspect.createModelValueBinding(info.name, type, "value", parentType);
 			}
 
 			// create the authorization infos
@@ -479,14 +517,14 @@
 
 	/**
 	 * Sorted the attributes with the primitive types first and the rest after. Also all collections were left out. 
- 	 */
+	 */
 	def createSortedOpInfoMapForCollections(Map<String, OperationInfo> opInfoMap) {
 		val sortedOpInfoList = <String, OperationInfo>newLinkedHashMap()
 		val nonPrimitiveOpInfoMap = <String, OperationInfo>newLinkedHashMap()
 		opInfoMap.forEach [ key, opInfo |
 			var JvmType detailType
 			// do not create a column if field is a collection
-			if (opInfo.field != null && !opInfo.field.collection) {
+			if (opInfo.field !== null && !opInfo.field.collection) {
 				detailType = opInfo.getter.returnType.type
 
 				val isPrimitive = detailType instanceof JvmPrimitiveType || detailType.getQualifiedName().equals(
@@ -505,37 +543,37 @@
 
 	/**
 	 * Sorted the attributes in a individual but fix order. 
- 	 */
+	 */
 	def createSortedMapList(Map<String, OperationInfo> opInfoMap) {
 		val sortedOpInfoList = <Map<String, OperationInfo>>newLinkedList()
 
 		// At this moment the order of the following method is not desired. See #203.
 		// +++++ Due to the not existing sorting the following lines of code are replaced by ...
 		/*
-		val domainKeyOpInfoMap = <String, OperationInfo>newHashMap()
-		val constraintsOpInfoMap = <String, OperationInfo>newHashMap()
-		val indexOpInfoMap = <String, OperationInfo>newHashMap()
-		val stringOpInfoMap = <String, OperationInfo>newHashMap()
-		val restOpInfoMap = <String, OperationInfo>newHashMap()
+		 * val domainKeyOpInfoMap = <String, OperationInfo>newHashMap()
+		 * val constraintsOpInfoMap = <String, OperationInfo>newHashMap()
+		 * val indexOpInfoMap = <String, OperationInfo>newHashMap()
+		 * val stringOpInfoMap = <String, OperationInfo>newHashMap()
+		 * val restOpInfoMap = <String, OperationInfo>newHashMap()
 
-		// extract String-OperationInfos into a new Map to display later and display all string attributes first.
-		opInfoMap.forEach [ key, opInfo |
-			val type = opInfo.getter.returnType.type
-			if (opInfo != null && isDomainKey(opInfo)) {
-				domainKeyOpInfoMap.put(key, opInfo)
-			} else if (opInfo != null && isIndex(opInfo)) {
-				indexOpInfoMap.put(key, opInfo)
-			} else if (type.string) {
-				stringOpInfoMap.put(key, opInfo)
-			} else {
-				restOpInfoMap.put(key, opInfo)
-			}
-		]
-		sortedOpInfoList.add(domainKeyOpInfoMap)
-		sortedOpInfoList.add(indexOpInfoMap)
-		sortedOpInfoList.add(stringOpInfoMap)
-		sortedOpInfoList.add(constraintsOpInfoMap)
-		sortedOpInfoList.add(restOpInfoMap)
+		 * // extract String-OperationInfos into a new Map to display later and display all string attributes first.
+		 * opInfoMap.forEach [ key, opInfo |
+		 * 	val type = opInfo.getter.returnType.type
+		 * 	if (opInfo !== null && isDomainKey(opInfo)) {
+		 * 		domainKeyOpInfoMap.put(key, opInfo)
+		 * 	} else if (opInfo !== null && isIndex(opInfo)) {
+		 * 		indexOpInfoMap.put(key, opInfo)
+		 * 	} else if (type.string) {
+		 * 		stringOpInfoMap.put(key, opInfo)
+		 * 	} else {
+		 * 		restOpInfoMap.put(key, opInfo)
+		 * 	}
+		 * ]
+		 * sortedOpInfoList.add(domainKeyOpInfoMap)
+		 * sortedOpInfoList.add(indexOpInfoMap)
+		 * sortedOpInfoList.add(stringOpInfoMap)
+		 * sortedOpInfoList.add(constraintsOpInfoMap)
+		 * sortedOpInfoList.add(restOpInfoMap)
 		 */
 		// ++++ ... this line.
 		sortedOpInfoList.add(opInfoMap)
@@ -543,7 +581,7 @@
 	}
 
 	def isDomainKey(OperationInfo info) {
-		if (info != null && info.field != null) {
+		if (info !== null && info.field !== null) {
 			for (annotationRefs : info.field.annotations) {
 				if (DomainKey.canonicalName.equals(annotationRefs.annotation.identifier)) {
 					return true
@@ -552,9 +590,20 @@
 		}
 		return false
 	}
+	
+	def isOnKanbanCard(OperationInfo info) {
+		if (info !== null && info.field !== null) {
+			for (annotationRefs : info.field.annotations) {
+				if (OnKanbanCard.canonicalName.equals(annotationRefs.annotation.identifier)) {
+					return true
+				}
+			}
+		}
+		return false
+	}
 
 	def isDomainDescription(OperationInfo info) {
-		if (info != null && info.field != null) {
+		if (info !== null && info.field !== null) {
 			for (annotationRefs : info.field.annotations) {
 				if (DomainDescription.canonicalName.equals(annotationRefs.annotation.identifier)) {
 					return true
@@ -565,10 +614,22 @@
 	}
 
 	def isValidationConstraint(OperationInfo info) {
-		if (info != null && info.field != null) {
+		if (info !== null && info.field !== null) {
 			for (annotationRefs : info.field.annotations) {
-				if (annotationRefs.annotation.identifier != null &&
-					annotationRefs.annotation.identifier.startsWith(Constraint.canonicalName.toLowerCase)) {
+				if (annotationRefs.annotation.identifier !== null &&
+					annotationRefs.annotation.identifier.equals(Valid.canonicalName)) {
+					return true
+				}
+			}
+		}
+		return false
+	}
+
+	def isUniqueEntry(OperationInfo info) {
+		if (info !== null && info.field !== null) {
+			for (annotationRefs : info.field.annotations) {
+				if (annotationRefs.annotation.identifier !== null &&
+					annotationRefs.annotation.identifier.equals(UniqueEntry.canonicalName)) {
 					return true
 				}
 			}
@@ -577,7 +638,7 @@
 	}
 
 	def isIndex(OperationInfo info) {
-		if (info != null && info.field != null) {
+		if (info !== null && info.field !== null) {
 			for (annotationRefs : info.field.annotations) {
 				if (DomainKey.canonicalName.equals(annotationRefs.annotation.identifier)) {
 					return true
@@ -594,7 +655,7 @@
 	 * @return
 	 */
 	def isByteArray(JvmType type) {
-		if (type == null)
+		if (type === null)
 			return false;
 		if (isArray(type, Byte) || isArray(type, Byte.TYPE)) {
 			return true;
@@ -603,7 +664,7 @@
 	}
 
 	def isArray(JvmType type, Class<?> clazz) {
-		if (type == null)
+		if (type === null)
 			return false;
 		var className = clazz.getName();
 		if (className.charAt(0) == '[') {
@@ -624,7 +685,7 @@
 
 	def YTypedSuspect createSuggestTextField(JvmType type, OperationInfo info, Map<String, OperationInfo> opInfoMap) {
 		val OperationInfo idAttInfo = opInfoMap.values.toIdInfo
-		if (idAttInfo == null) {
+		if (idAttInfo === null) {
 			return createTextField(type, info)
 		}
 
@@ -642,12 +703,11 @@
 
 	/** 
 	 * Returns the operation info for the id property.  
- 	 */
+	 */
 	def OperationInfo getToIdInfo(Collection<OperationInfo> infos) {
 
-		// TODO change me!!! Very bad hack for now! Needs adding an ID annotation to DTOs
 		for (OperationInfo info : infos) {
-			if (info.name.equals("id") || info.name.equals("uuid")) {
+			if (info.idOrUUID) {
 				return info
 			}
 		}
@@ -735,6 +795,28 @@
 		suspect
 	}
 
+	def YTypedSuspect createThemeComboBox(JvmType type, OperationInfo info) {
+		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+		suspect.tags += ILayoutingStrategy.TAG__THEME_COMBO
+		suspect.type = typeof(String)
+		suspect.typeQualifiedName = typeof(String).name
+		if (info.readonly) {
+			suspect.tags += "readonly"
+		}
+		suspect
+	}
+
+	def YTypedSuspect createPrintServiceComboBox(JvmType type, OperationInfo info) {
+		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+		suspect.tags += ILayoutingStrategy.TAG__PRINTSERVICE_COMBO
+		suspect.type = typeof(String)
+		suspect.typeQualifiedName = typeof(String).name
+		if (info.readonly) {
+			suspect.tags += "readonly"
+		}
+		suspect
+	}
+
 	def YTypedSuspect createEnumOptionsGroup(JvmType type, OperationInfo info) {
 		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
 		suspect.tags += ILayoutingStrategy.TAG__ENUM_OPTIONS
@@ -748,11 +830,13 @@
 	}
 
 	def YTypedSuspect createBeanReferenceField(JvmType type, OperationInfo info) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		var captionProperty = BeanHelper.findCaptionProperty(suspect.type)
-		var captionDescription = BeanHelper.findDescriptionProperty(suspect.type)
-		if (captionProperty != null || captionDescription != null) {
+		var YTypedSuspect suspect = null
+		var suspectType = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+		var captionProperty = BeanHelper.findCaptionProperty(suspectType)
+		var captionDescription = BeanHelper.findDescriptionProperty(suspectType)
+		if (captionProperty !== null || captionDescription !== null) {
+			suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+			suspect.type = suspectType
 			suspect.tags += ILayoutingStrategy.TAG__BEAN_REFERENCE
 			suspect.id = '''«uiLayout.generateId».«info.name»'''
 
@@ -760,10 +844,16 @@
 				suspect.tags += "readonly"
 			}
 
+			if (info.hasAnnotation(FilterDepth)) {
+				val depth = toFilterDepth(info.field)
+				suspect.properties.put(ILayoutingStrategy.PROPERTY__FILTER_DEPTH, Integer.toString(depth))
+			}
+
 			suspect.typeQualifiedName = type.qualifiedName
 			suspect.properties.put(ILayoutingStrategy.PROPERTY__ITEM_CAPTION, captionProperty)
 			suspect.properties.put(ILayoutingStrategy.PROPERTY__ITEM_DESCRIPTION, captionDescription)
 		}
+
 		suspect
 	}
 
@@ -784,8 +874,8 @@
 		suspect.typeQualifiedName = typeInCollection.type.qualifiedName
 
 		// Not used! Has to be removed!
-		//		var typeRef = info.field.type
-		//		var JvmDeclaredType argType
+		// var typeRef = info.field.type
+		// var JvmDeclaredType argType
 		if (typeInCollection.type instanceof JvmDeclaredType) {
 			val castedType = typeInCollection.type as JvmDeclaredType
 
@@ -804,12 +894,12 @@
 						if (nestedInfo.hasAnnotation(typeof(DomainKey))) {
 							val nestPropMap = (detailType as JvmDeclaredType).toFieldProperties
 							columnInfo = nestedInfo.type.createYColumnInfo
-							columnInfo.name = it.field.type.simpleName + "." + nestedInfo.attributePath
+							columnInfo.name = it.field.simpleName + "." + nestedInfo.attributePath
 							var propList = nestPropMap.get(nestedInfo.name)
 							columnInfo.setYColumnInfoProperties(propList)
 						}
 					}
-				} else {
+				} else if (!it.idOrUUID && !it.version && !it.dirtyMark) {
 					var JvmType objectType = it.field.type.type;
 					if (isPrimitive) {
 						val primitiveTypeName = it.field.type.type.qualifiedName
@@ -822,7 +912,7 @@
 					var propList = propMap.get(it.field.identifier)
 					columnInfo.setYColumnInfoProperties(propList)
 				}
-				if (columnInfo != null) {
+				if (columnInfo !== null) {
 
 					// TODO (JCD): Simple name instead of FQN till solution of ticket - #581
 					columnInfo.labelI18nKey = columnInfo.name
@@ -850,7 +940,7 @@
 		val yField = vFactory.createVMSwitch
 		yField.initialEnabled = !info.readonly
 
-		//		yField.labelI18nKey = i18nRootKey + "." + info.name
+		// yField.labelI18nKey = i18nRootKey + "." + info.name
 		yField.label = info.name
 
 		layouter.add(yField)
@@ -867,354 +957,404 @@
 			suspect.tags += ILayoutingStrategy.TAG__RICH_TEXT__BLOB
 		} else {
 			throw new IllegalArgumentException(
-				"RichTextFields need to be bound to String or byte[]. " + type.qualifiedName + " is not a valid option.")
-		}
+				"RichTextFields need to be bound to String or byte[]. " + type.qualifiedName +
+					" is not a valid option.")
+				}
 
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	def YSuspect createMaskedTextField(JvmType type, OperationInfo info, String mask) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-		suspect.tags += ILayoutingStrategy.TAG__MASKED_TEXT_FIELD
-		suspect.properties.put(ILayoutingStrategy.PROPERTY_MASK, mask)
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	def YSuspect createMaskedDecimalField(JvmType type, OperationInfo info, String mask) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-		suspect.tags += ILayoutingStrategy.TAG__MASKED_DECIMAL_FIELD
-		suspect.properties.put(ILayoutingStrategy.PROPERTY_MASK, mask)
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	def YSuspect createPasswordField(JvmType type, OperationInfo info) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-
-		if (type.string) {
-			suspect.tags += ILayoutingStrategy.TAG__PASSWORD
-		} else {
-			throw new IllegalArgumentException(
-				"PasswordField need to be bound to String. " + type.qualifiedName + " is not a valid option.")
-		}
-
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	def YSuspect createBlopUploadComponent(JvmType type, OperationInfo info) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-		suspect.tags += ILayoutingStrategy.TAG__BLOB
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	def YSuspect createCustomDecimalField(JvmType type, OperationInfo info) {
-		val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
-		suspect.tags += ILayoutingStrategy.TAG__DECIMAL
-		suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
-		suspect.typeQualifiedName = type.qualifiedName
-		suspect
-	}
-
-	/**
-	 * Create the bindings and install at the view
-	 */
-	def createBinding(YEmbeddable yField, OperationInfo info, JvmType type, String fieldProperty) {
-
-		// use the autoWireSource as the model endpoint
-		val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.autoWireSource as UiBindingEndpointAssignment
-		val yModelEndpoint = computer.createValueBindingEndpoint(uiModelEndpoint)
-		val detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint
-		detailValueEndpoint.propertyPath = info.name
-		detailValueEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet, beanType.qualifiedName)
-
-		// create the field endpoint
-		val yFieldEndpoint = BindingFactory.eINSTANCE.createYECViewModelValueBindingEndpoint
-		yFieldEndpoint.element = yField
-		yFieldEndpoint.propertyPath = fieldProperty
-		yFieldEndpoint.typeQualifiedName = beanType.qualifiedName
-		yFieldEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet, beanType.qualifiedName)
-		if (yFieldEndpoint.type != null && yFieldEndpoint.type.isAssignableFrom(typeof(EObject))) {
-			yFieldEndpoint.emfNsURI = yField.eClass.EPackage.nsURI
-		}
-
-		// bind model to target		
-		val yBinding = BindingFactory.eINSTANCE.createYValueBinding();
-		yBinding.setTargetEndpoint(yFieldEndpoint);
-		yBinding.setModelEndpoint(detailValueEndpoint);
-		yBinding.setModelToTargetStrategy(YBindingUpdateStrategy.UPDATE);
-		yBinding.setTargetToModelStrategy(
-			if(info.readonly) YBindingUpdateStrategy.NEVER else YBindingUpdateStrategy.UPDATE)
-
-		// register the binding at the current view
-		yLayout.view.orCreateBindingSet.bindings += yBinding
-
-		// set the i18n key based on the binding
-		//		yField.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, detailValueEndpoint.propertyPath)
-		yField.labelI18nKey = detailValueEndpoint.propertyPath
-	}
-
-	/**
-	 * Create the bindings and install at the view
-	 */
-	def createBinding(YSuspect suspect, String propertyPath, JvmType type, String fieldProperty) {
-
-		val YBeanSlot subTypeBeanSlot = suspect.findSubTypeBeanSlot
-		var YValueBindingEndpoint endpoint = null
-		var path = ""
-
-		// If a subTypeBeanSlot could be found, then we need to create a binding endpoint against this beanslot.
-		// The main slot has a different type then detail beanslot. And we can not bind fields contained in the subtype
-		// to the main bean slot. Eclipse databinding requires a proper type at binding creation.
-		if (subTypeBeanSlot == null) {
-
-			// use the autoWireSource as the model endpoint
-			val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.autoWireSource as UiBindingEndpointAssignment
-			val yModelEndpoint = computer.createValueBindingEndpoint(uiModelEndpoint)
-			val detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint
-			detailValueEndpoint.propertyPath = propertyPath
-			detailValueEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet, beanType.qualifiedName)
-			endpoint = detailValueEndpoint
-			path = detailValueEndpoint.propertyPath
-		} else {
-			endpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath)
-			path = propertyPath
-		}
-
-		suspect.getValueBindingEndpoints().add(endpoint);
-
-		// set the i18n key based on the binding
-		//		suspect.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, path)
-		suspect.labelI18nKey = path
-		suspect.label = propertyPath
-	}
-
-	/**
-	 * Checks if the suspect is contained in an YSubTypeSuspect. <br>
-	 * If so, then the detail beanslot of the YSubTypeSuspect is returned. Null otherwise.
-	 */
-	def YBeanSlot findSubTypeBeanSlot(YSuspect suspect) {
-		if (suspect == null) {
-			return null
-		}
-		if (suspect instanceof YSubTypeSuspect) {
-			return suspect.beanSlot
-		}
-
-		val parent = suspect.eContainer
-		if (parent instanceof YSuspect) {
-			return parent.findSubTypeBeanSlot
-		}
-		return null
-	}
-
-	/**
-	 * Create the bindings and install at the view
-	 */
-	def createModelListBinding(YSuspect suspect, OperationInfo info, JvmType type, String fieldProperty) {
-
-		// use the autoWireSource as the model endpoint
-		val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.autoWireSource as UiBindingEndpointAssignment
-		val yModelEndpoint = createListBindingEndpointWithNested(uiModelEndpoint, info.name)
-
-		suspect.getValueBindingEndpoints().add(yModelEndpoint);
-
-		// set the i18n key based on the binding
-		//		suspect.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, info.name)
-		suspect.labelI18nKey = info.name
-		suspect.label = info.name
-
-	}
-
-	/**
-	 * Creates a listbinding with respect to nested collection fields. <p>
-	 * For instance:<br>
-	 * beanSlot contains Person. We want to bind the children of persons father to a table.
-	 * So we need to access the children collection of the beanslot by a nested property path: <code>beanslot.father.children</code>
-	 */
-	def YListBindingEndpoint createListBindingEndpointWithNested(UiBindingEndpointAssignment epDef, String attributePath) {
-		if (epDef == null) {
-			return null
-		}
-
-		var YListBindingEndpoint result = null;
-		val BindingInfoHelper.BindingInfo info = new BindingInfoHelper.BindingInfo()
-		bindingInfoHelper.collectBindingInfo(epDef, info);
-
-		if (info.bindingRoot instanceof UiBeanSlot) {
-			val uiBeanSlot = info.bindingRoot as UiBeanSlot
-
-			val YBeanSlot yBeanSlot = computer.associatedUi(uiBeanSlot)
-			val YBeanSlotListBindingEndpoint ep = factory.createBeanSlotListBindingEndpoint
-			ep.beanSlot = yBeanSlot
-
-			ep.attributePath = toNestedCollectionPath(info, attributePath)
-			result = ep
-		} else if (info.bindingRoot instanceof UiEmbeddable) {
-			val YEmbeddable yElement = computer.associatedUi(info.bindingRoot)
-			val YECViewModelListBindingEndpoint ep = factory.createECViewModelListBindingEndpoint
-			ep.element = yElement
-			ep.propertyPath = toNestedCollectionPath(info, attributePath)
-			if (info.typeForBinding != null) {
-				ep.typeQualifiedName = info.typeForBinding.qualifiedName
-				ep.type = computer.loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
 			}
-			if (yElement != null) {
-				ep.emfNsURI = yElement.eClass.EPackage.nsURI
+
+			def YSuspect createMaskedTextField(JvmType type, OperationInfo info, String mask) {
+				val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+				suspect.tags += ILayoutingStrategy.TAG__MASKED_TEXT_FIELD
+				suspect.properties.put(ILayoutingStrategy.PROPERTY_MASK, mask)
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
 			}
-			result = ep
-		}
 
-		return result
-	}
-
-	def toNestedCollectionPath(BindingInfo info, String attributePath) {
-		val StringBuilder b = new StringBuilder
-		if (!info.path.toString.nullOrEmpty) {
-			b.append(info.path.toString)
-		}
-
-		if (!attributePath.nullOrEmpty) {
-			if (b.length > 0) {
-				b.append(".")
+			def YSuspect createMaskedDecimalField(JvmType type, OperationInfo info, String mask) {
+				val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+				suspect.tags += ILayoutingStrategy.TAG__MASKED_DECIMAL_FIELD
+				suspect.properties.put(ILayoutingStrategy.PROPERTY_MASK, mask)
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
 			}
-			b.append(attributePath)
-		}
-		val pathResult = b.toString
-		pathResult
-	}
 
-	/**
- * Creates y column info element 
- */
-	def YColumnInfo createYColumnInfo(JvmType type) {
-		val YColumnInfo columnInfo = YECviewFactory.eINSTANCE.createYColumnInfo
+			def YSuspect createPasswordField(JvmType type, OperationInfo info) {
+				val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
 
-		columnInfo.typeQualifiedName = type.qualifiedName
-		columnInfo.type = computer.loadClass(uiLayout.eResource.resourceSet, columnInfo.typeQualifiedName)
-		columnInfo
-	}
+				if (type.string) {
+					suspect.tags += ILayoutingStrategy.TAG__PASSWORD
+				} else {
+					throw new IllegalArgumentException(
+						"PasswordField need to be bound to String. " + type.qualifiedName + " is not a valid option.")
+				}
 
-	/**
- * Sets properties into y column info
- */
-	def setYColumnInfoProperties(YColumnInfo columnInfo, List<AutowireUtil.Pair> propList) {
-		var properties = columnInfo.properties
-		if (propList != null) {
-			for (prop : propList) {
-				properties.put(prop.key, prop.value)
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
+			}
+
+			def YSuspect createBlopUploadComponent(JvmType type, OperationInfo info) {
+				val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+				suspect.tags += ILayoutingStrategy.TAG__BLOB
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
+			}
+
+			def YSuspect createCustomDecimalField(JvmType type, OperationInfo info) {
+				val suspect = YECviewFactory.eINSTANCE.createYTypedSuspect
+				suspect.tags += ILayoutingStrategy.TAG__DECIMAL
+				suspect.type = computer.loadClass(uiLayout.eResource.resourceSet, type.qualifiedName)
+				suspect.typeQualifiedName = type.qualifiedName
+				suspect
+			}
+
+			/**
+			 * Create the bindings and install at the view
+			 */
+			def createBinding(YEmbeddable yField, OperationInfo info, JvmType type, String fieldProperty) {
+
+				// use the autoWireSource as the model endpoint
+				val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.autoWireSource as UiBindingEndpointAssignment
+				val yModelEndpoint = computer.createValueBindingEndpoint(uiModelEndpoint)
+				val detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint
+				detailValueEndpoint.propertyPath = info.name
+				detailValueEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet, beanType.qualifiedName)
+
+				// create the field endpoint
+				val yFieldEndpoint = BindingFactory.eINSTANCE.createYECViewModelValueBindingEndpoint
+				yFieldEndpoint.element = yField
+				yFieldEndpoint.propertyPath = fieldProperty
+				yFieldEndpoint.typeQualifiedName = beanType.qualifiedName
+				yFieldEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet, beanType.qualifiedName)
+				if (yFieldEndpoint.type !== null && yFieldEndpoint.type.isAssignableFrom(typeof(EObject))) {
+					yFieldEndpoint.emfNsURI = yField.eClass.EPackage.nsURI
+				}
+
+				// bind model to target		
+				val yBinding = BindingFactory.eINSTANCE.createYValueBinding();
+				yBinding.setTargetEndpoint(yFieldEndpoint);
+				yBinding.setModelEndpoint(detailValueEndpoint);
+				yBinding.setModelToTargetStrategy(YBindingUpdateStrategy.UPDATE);
+				yBinding.setTargetToModelStrategy(
+					if(info.readonly) YBindingUpdateStrategy.NEVER else YBindingUpdateStrategy.UPDATE)
+
+				// register the binding at the current view
+				yLayout.view.orCreateBindingSet.bindings += yBinding
+
+				// set the i18n key based on the binding
+				// yField.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, detailValueEndpoint.propertyPath)
+				yField.labelI18nKey = detailValueEndpoint.propertyPath
+			}
+
+			/**
+			 * Create the bindings and install at the view
+			 */
+			def createModelValueBinding(YSuspect suspect, String propertyPath, JvmType type, String fieldProperty, JvmType parentType) {
+
+				val YBeanSlot subTypeBeanSlot = suspect.findSubTypeBeanSlot
+				var YValueBindingEndpoint endpoint = null
+				var path = ""
+
+				// If a subTypeBeanSlot could be found, then we need to create a binding endpoint against this beanslot.
+				// The main slot has a different type then detail beanslot. And we can not bind fields contained in the subtype
+				// to the main bean slot. Eclipse databinding requires a proper type at binding creation.
+				if (subTypeBeanSlot === null) {
+
+					// use the autoWireSource as the model endpoint
+					val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.
+						autoWireSource as UiBindingEndpointAssignment
+					val yModelEndpoint = computer.createValueBindingEndpoint(uiModelEndpoint)
+					val detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint
+					detailValueEndpoint.propertyPath = propertyPath
+					detailValueEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet,
+						parentType.qualifiedName)
+					endpoint = detailValueEndpoint
+					path = detailValueEndpoint.propertyPath
+				} else {
+					endpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath)
+					path = propertyPath
+				}
+
+				suspect.getValueBindingEndpoints().add(endpoint);
+
+				// set the i18n key based on the binding
+				// suspect.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, path)
+				suspect.labelI18nKey = path
+				suspect.label = propertyPath
+			}
+
+			/**
+			 * Creates a binding which points to the container of the property
+			 */
+			def createModelValueContainerBinding(YSuspect suspect, String propertyPath, JvmType type, String property) {
+
+				var fieldProperty = property
+				if (fieldProperty.contains(".")) {
+					fieldProperty = fieldProperty.substring(0, fieldProperty.lastIndexOf("."))
+				} else {
+					fieldProperty = null
+				}
+
+				val YBeanSlot subTypeBeanSlot = suspect.findSubTypeBeanSlot
+				var YValueBindingEndpoint endpoint = null
+
+				// If a subTypeBeanSlot could be found, then we need to create a binding endpoint against this beanslot.
+				// The main slot has a different type then detail beanslot. And we can not bind fields contained in the subtype
+				// to the main bean slot. Eclipse databinding requires a proper type at binding creation.
+				if (subTypeBeanSlot === null) {
+
+					// use the autoWireSource as the model endpoint
+					val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.
+						autoWireSource as UiBindingEndpointAssignment
+					val yModelEndpoint = computer.createValueBindingEndpoint(uiModelEndpoint)
+					endpoint = yModelEndpoint
+					if (fieldProperty !== null) {
+						val detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint
+						detailValueEndpoint.propertyPath = propertyPath
+						detailValueEndpoint.type = computer.loadClass(uiLayout.eResource.resourceSet,
+							beanType.qualifiedName)
+						endpoint = detailValueEndpoint
+					}
+				} else {
+					endpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath)
+				}
+
+				suspect.containerValueBindingEndpoint = endpoint
+			}
+
+			/**
+			 * Checks if the suspect is contained in an YSubTypeSuspect. <br>
+			 * If so, then the detail beanslot of the YSubTypeSuspect is returned. Null otherwise.
+			 */
+			def YBeanSlot findSubTypeBeanSlot(YSuspect suspect) {
+				if (suspect === null) {
+					return null
+				}
+				if (suspect instanceof YSubTypeSuspect) {
+					return suspect.beanSlot
+				}
+
+				val parent = suspect.eContainer
+				if (parent instanceof YSuspect) {
+					return parent.findSubTypeBeanSlot
+				}
+				return null
+			}
+
+			/**
+			 * Create the bindings and install at the view
+			 */
+			def createModelListBinding(YSuspect suspect, OperationInfo info, JvmType type, String fieldProperty) {
+
+				val YBeanSlot subTypeBeanSlot = suspect.findSubTypeBeanSlot
+				var YListBindingEndpoint endpoint = null
+				if (subTypeBeanSlot === null) {
+					// use the autoWireSource as the model endpoint
+					val UiBindingEndpointAssignment uiModelEndpoint = uiLayout.
+						autoWireSource as UiBindingEndpointAssignment
+					endpoint = createListBindingEndpointWithNested(uiModelEndpoint, info.name)
+				} else {
+					endpoint = subTypeBeanSlot.createListBindingEndpoint(info.name, subTypeBeanSlot.valueType)
+				}
+
+				suspect.getValueBindingEndpoints().add(endpoint);
+
+				// set the i18n key based on the binding
+				// suspect.labelI18nKey = I18nKeyProvider.toI18nKey(beanType.qualifiedName, info.name)
+				suspect.labelI18nKey = info.name
+				suspect.label = info.name
+			}
+
+			/**
+			 * Creates a listbinding with respect to nested collection fields. <p>
+			 * For instance:<br>
+			 * beanSlot contains Person. We want to bind the children of persons father to a table.
+			 * So we need to access the children collection of the beanslot by a nested property path: <code>beanslot.father.children</code>
+			 */
+			def YListBindingEndpoint createListBindingEndpointWithNested(UiBindingEndpointAssignment epDef,
+				String attributePath) {
+				if (epDef === null) {
+					return null
+				}
+
+				var YListBindingEndpoint result = null;
+				val BindingInfoHelper.BindingInfo info = new BindingInfoHelper.BindingInfo()
+				bindingInfoHelper.collectBindingInfo(epDef, info);
+
+				if (info.bindingRoot instanceof UiBeanSlot) {
+					val uiBeanSlot = info.bindingRoot as UiBeanSlot
+
+					val YBeanSlot yBeanSlot = computer.associatedUi(uiBeanSlot)
+					val YBeanSlotListBindingEndpoint ep = factory.createBeanSlotListBindingEndpoint
+					ep.beanSlot = yBeanSlot
+
+					ep.attributePath = toNestedCollectionPath(info, attributePath)
+					result = ep
+				} else if (info.bindingRoot instanceof UiEmbeddable) {
+					val YEmbeddable yElement = computer.associatedUi(info.bindingRoot)
+					val YECViewModelListBindingEndpoint ep = factory.createECViewModelListBindingEndpoint
+					ep.element = yElement
+					ep.propertyPath = toNestedCollectionPath(info, attributePath)
+					if (info.typeForBinding !== null) {
+						ep.typeQualifiedName = info.typeForBinding.qualifiedName
+						ep.type = computer.loadClass(epDef.eResource.resourceSet, ep.typeQualifiedName)
+					}
+					if (yElement !== null) {
+						ep.emfNsURI = yElement.eClass.EPackage.nsURI
+					}
+					result = ep
+				}
+
+				return result
+			}
+
+			def toNestedCollectionPath(BindingInfo info, String attributePath) {
+				val StringBuilder b = new StringBuilder
+				if (!info.path.toString.nullOrEmpty) {
+					b.append(info.path.toString)
+				}
+
+				if (!attributePath.nullOrEmpty) {
+					if (b.length > 0) {
+						b.append(".")
+					}
+					b.append(attributePath)
+				}
+				val pathResult = b.toString
+				pathResult
+			}
+
+			/**
+			 * Creates y column info element 
+			 */
+			def YColumnInfo createYColumnInfo(JvmType type) {
+				val YColumnInfo columnInfo = YECviewFactory.eINSTANCE.createYColumnInfo
+
+				columnInfo.typeQualifiedName = type.qualifiedName
+				columnInfo.type = computer.loadClass(uiLayout.eResource.resourceSet, columnInfo.typeQualifiedName)
+				columnInfo
+			}
+
+			/**
+			 * Sets properties into y column info
+			 */
+			def setYColumnInfoProperties(YColumnInfo columnInfo, List<AutowireUtil.Pair> propList) {
+				var properties = columnInfo.properties
+				if (propList !== null) {
+					for (prop : propList) {
+						properties.put(prop.key, prop.value)
+					}
+				}
+			}
+
+			public interface Layouter {
+				def void setup(UiLayout uiRootLayout, YLayout yRootLayout)
+
+				def void add(YEmbeddable element);
+
+				def void add(YSuspect suspect);
+
+				def void pushHierarchy(YTypedCompoundSuspect suspect);
+
+				def void popHierarchy();
+
+			}
+
+			public static class MobileLayouter implements Layouter {
+
+				VMVerticalComponentGroup group
+
+				override setup(UiLayout uiRootLayout, YLayout yRootLayout) {
+					group = VaadinMobileFactory.eINSTANCE.createVMVerticalComponentGroup
+
+					yRootLayout.elements += group
+				}
+
+				override add(YEmbeddable element) {
+					group.addElement(element)
+				}
+
+				override add(YSuspect ySuspect) {
+					// layout.suspects += ySuspect
+				}
+
+				override pushHierarchy(YTypedCompoundSuspect suspect) {
+					throw new UnsupportedOperationException("TODO: auto-generated method stub")
+				}
+
+				override popHierarchy() {
+					throw new UnsupportedOperationException("TODO: auto-generated method stub")
+				}
+
+			}
+
+			public static class StrategyLayoutLayouter implements Layouter {
+
+				Stack<YTypedCompoundSuspect> currentSubDtoSuspect = new Stack
+				YStrategyLayout layout
+
+				override setup(UiLayout uiRootLayout, YLayout yRootLayout) {
+					layout = YECviewFactory.eINSTANCE.createYStrategyLayout
+					layout.id = "cx-StrategyLayout"
+
+					yRootLayout.elements += layout
+					yRootLayout.view.visibilityProcessors +=
+						YVisibilityFactory.eINSTANCE.createYAuthorizationVisibilityProcessor
+					if (yRootLayout instanceof YAlignmentContainer) {
+						yRootLayout.applyAlignment(layout, YAlignment.FILL_FILL)
+					}
+				}
+
+				override add(YEmbeddable element) {
+				}
+
+				override add(YSuspect ySuspect) {
+					if (!currentSubDtoSuspect.isEmpty) {
+						currentSubDtoSuspect.peek.children += ySuspect
+					} else {
+						layout.suspects += ySuspect
+					}
+				}
+
+				override pushHierarchy(YTypedCompoundSuspect suspect) {
+					currentSubDtoSuspect.push(suspect)
+				}
+
+				override popHierarchy() {
+					currentSubDtoSuspect.pop
+				}
+
+			}
+
+			/**
+			 * The Class LocalResourceAccess.
+			 */
+			public static class LocalResourceAccess implements IReferenceFinder.ILocalResourceAccess {
+
+				ResourceSet rs
+
+				new(ResourceSet rs) {
+					this.rs = rs
+				}
+
+				/*
+				 * (non-Javadoc)
+				 * 
+				 * @see
+				 * org.eclipse.xtext.findReferences.IReferenceFinder.IResourceAccess
+				 * #readOnly(org.eclipse.emf.common.util.URI,
+				 * org.eclipse.xtext.util.concurrent.IUnitOfWork)
+				 */
+				override <R> R readOnly(URI targetURI, IUnitOfWork<R, ResourceSet> work) {
+					return work.exec(rs);
+				}
 			}
 		}
-	}
-
-	public interface Layouter {
-		def void setup(UiLayout uiRootLayout, YLayout yRootLayout)
-
-		def void add(YEmbeddable element);
-
-		def void add(YSuspect suspect);
-
-		def void pushHierarchy(YTypedCompoundSuspect suspect);
-
-		def void popHierarchy();
-
-	}
-
-	public static class MobileLayouter implements Layouter {
-
-		VMVerticalComponentGroup group
-
-		override setup(UiLayout uiRootLayout, YLayout yRootLayout) {
-			group = VaadinMobileFactory.eINSTANCE.createVMVerticalComponentGroup
-
-			yRootLayout.elements += group
-		}
-
-		override add(YEmbeddable element) {
-			group.addElement(element)
-		}
-
-		override add(YSuspect ySuspect) {
-			//			layout.suspects += ySuspect
-		}
-
-		override pushHierarchy(YTypedCompoundSuspect suspect) {
-			throw new UnsupportedOperationException("TODO: auto-generated method stub")
-		}
-
-		override popHierarchy() {
-			throw new UnsupportedOperationException("TODO: auto-generated method stub")
-		}
-
-	}
-
-	public static class StrategyLayoutLayouter implements Layouter {
-
-		Stack<YTypedCompoundSuspect> currentSubDtoSuspect = new Stack
-		YStrategyLayout layout
-
-		override setup(UiLayout uiRootLayout, YLayout yRootLayout) {
-			layout = YECviewFactory.eINSTANCE.createYStrategyLayout
-			layout.id = "cx-StrategyLayout"
-
-			yRootLayout.elements += layout
-			yRootLayout.view.visibilityProcessors +=
-				YVisibilityFactory.eINSTANCE.createYAuthorizationVisibilityProcessor
-			if (yRootLayout instanceof YAlignmentContainer) {
-				yRootLayout.applyAlignment(layout, YAlignment.FILL_FILL)
-			}
-		}
-
-		override add(YEmbeddable element) {
-		}
-
-		override add(YSuspect ySuspect) {
-			if (!currentSubDtoSuspect.isEmpty) {
-				currentSubDtoSuspect.peek.children += ySuspect
-			} else {
-				layout.suspects += ySuspect
-			}
-		}
-
-		override pushHierarchy(YTypedCompoundSuspect suspect) {
-			currentSubDtoSuspect.push(suspect)
-		}
-
-		override popHierarchy() {
-			currentSubDtoSuspect.pop
-		}
-
-	}
-
-	/**
-	 * The Class LocalResourceAccess.
-	 */
-	public static class LocalResourceAccess implements IReferenceFinder.ILocalResourceAccess {
-
-		ResourceSet rs
-
-		new(ResourceSet rs) {
-			this.rs = rs
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.xtext.findReferences.IReferenceFinder.IResourceAccess
-		 * #readOnly(org.eclipse.emf.common.util.URI,
-		 * org.eclipse.xtext.util.concurrent.IUnitOfWork)
-		 */
-		override <R> R readOnly(URI targetURI, IUnitOfWork<R, ResourceSet> work) {
-			return work.exec(rs);
-		}
-	}
-}
+		
\ No newline at end of file
diff --git a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/JvmTypeProperties.java b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/JvmTypeProperties.java
index 373a3c9..975e1ce 100644
--- a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/JvmTypeProperties.java
+++ b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/JvmTypeProperties.java
@@ -23,6 +23,9 @@
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.osbp.autowirehelper.AutowireHelper.LocalResourceAccess;
+import org.eclipse.osbp.runtime.common.annotations.Filter;
+import org.eclipse.osbp.runtime.common.annotations.Range;
+import org.eclipse.osbp.runtime.common.annotations.UniqueEntry;
 import org.eclipse.xtext.common.types.JvmAnnotationReference;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
 import org.eclipse.xtext.common.types.JvmFeature;
@@ -310,7 +313,7 @@
 		private JvmType type;
 		private JvmType parameterizedType;
 		private boolean many;
-
+		
 		public Info getParent() {
 			return parent;
 		}
@@ -455,6 +458,18 @@
 				return postFix;
 			}
 		}
+		
+		public boolean isRange() {
+			return hasAnnotation(Range.class);
+		}
+		
+		public boolean isFilter() {
+			return hasAnnotation(Filter.class);
+		}
+		
+		public boolean isUniqueEntry() {
+			return hasAnnotation(UniqueEntry.class);
+		}
 
 		@Override
 		public int compareTo(Info other) {
@@ -463,5 +478,6 @@
 			}
 			return name.compareTo(other.getName());
 		}
+
 	}
 }
diff --git a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.xtend b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.xtend
index 969920d..d460d35 100644
--- a/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.xtend
+++ b/org.eclipse.osbp.autowireHelper/src/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.xtend
@@ -49,6 +49,8 @@
 import org.eclipse.xtext.common.types.JvmType
 import org.eclipse.xtext.common.types.util.TypeReferences
 import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.common.types.JvmIntAnnotationValue
+import org.eclipse.osbp.runtime.common.annotations.FilterDepth
 
 class AutowireUtil {
 	@Inject extension IQualifiedNameProvider
@@ -136,6 +138,23 @@
 
 		return propMap
 	}
+	
+	/**
+	 * Returns the depth of the filter for BeanReferenceFields
+	 */
+	public def int toFilterDepth(JvmField field) {
+			val ref = field.annotations.findFirst[ e |
+				val result = e.annotation.identifier.equals(typeof(FilterDepth).name)
+				return result
+			]
+			
+			if(ref === null) {
+				return 0
+			}
+
+			val JvmIntAnnotationValue depthVal = ref.values.get(0) as JvmIntAnnotationValue
+			return depthVal.values.get(0)
+	}
 
 	/**
 	 * Detects all the existing properties of the jvmtype corresponding datatype of the attribute. 
diff --git a/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/AutowireHelper.java b/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/AutowireHelper.java
index addd820..376d82e 100644
--- a/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/AutowireHelper.java
+++ b/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/AutowireHelper.java
@@ -27,13 +27,11 @@
 import java.util.Stack;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
-import javax.validation.Constraint;
+import javax.validation.Valid;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
 import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -46,7 +44,6 @@
 import org.eclipse.osbp.ecview.core.common.model.binding.BindingFactory;
 import org.eclipse.osbp.ecview.core.common.model.binding.YBinding;
 import org.eclipse.osbp.ecview.core.common.model.binding.YBindingEndpoint;
-import org.eclipse.osbp.ecview.core.common.model.binding.YBindingSet;
 import org.eclipse.osbp.ecview.core.common.model.binding.YBindingUpdateStrategy;
 import org.eclipse.osbp.ecview.core.common.model.binding.YDetailValueBindingEndpoint;
 import org.eclipse.osbp.ecview.core.common.model.binding.YECViewModelListBindingEndpoint;
@@ -59,7 +56,6 @@
 import org.eclipse.osbp.ecview.core.common.model.core.YAuthorizationable;
 import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlot;
 import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlotListBindingEndpoint;
-import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlotValueBindingEndpoint;
 import org.eclipse.osbp.ecview.core.common.model.core.YDetailBeanSlot;
 import org.eclipse.osbp.ecview.core.common.model.core.YEmbeddable;
 import org.eclipse.osbp.ecview.core.common.model.core.YLayout;
@@ -98,15 +94,16 @@
 import org.eclipse.osbp.mobile.vaadin.ecview.model.VaadinMobileFactory;
 import org.eclipse.osbp.runtime.common.annotations.DomainDescription;
 import org.eclipse.osbp.runtime.common.annotations.DomainKey;
+import org.eclipse.osbp.runtime.common.annotations.FilterDepth;
+import org.eclipse.osbp.runtime.common.annotations.OnKanbanCard;
+import org.eclipse.osbp.runtime.common.annotations.UniqueEntry;
 import org.eclipse.osbp.runtime.common.metric.TimeLogger;
 import org.eclipse.osbp.utils.functionnormalizer.api.FunctionTypingAPI;
 import org.eclipse.xtend2.lib.StringConcatenation;
 import org.eclipse.xtext.common.types.JvmAnnotationReference;
-import org.eclipse.xtext.common.types.JvmAnnotationType;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
 import org.eclipse.xtext.common.types.JvmField;
 import org.eclipse.xtext.common.types.JvmGenericType;
-import org.eclipse.xtext.common.types.JvmOperation;
 import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
 import org.eclipse.xtext.common.types.JvmPrimitiveType;
 import org.eclipse.xtext.common.types.JvmType;
@@ -115,7 +112,6 @@
 import org.eclipse.xtext.common.types.TypesFactory;
 import org.eclipse.xtext.common.types.TypesPackage;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IReferenceDescription;
 import org.eclipse.xtext.ui.editor.findrefs.IReferenceFinder;
 import org.eclipse.xtext.util.IAcceptor;
@@ -127,7 +123,7 @@
 import org.eclipse.xtext.xbase.lib.IterableExtensions;
 import org.eclipse.xtext.xbase.lib.StringExtensions;
 
-@SuppressWarnings("all")
+@SuppressWarnings("restriction")
 public class AutowireHelper implements IAutowireDelegate {
   public interface Layouter {
     public abstract void setup(final UiLayout uiRootLayout, final YLayout yRootLayout);
@@ -144,24 +140,28 @@
   public static class MobileLayouter implements AutowireHelper.Layouter {
     private VMVerticalComponentGroup group;
     
+    @Override
     public void setup(final UiLayout uiRootLayout, final YLayout yRootLayout) {
-      VMVerticalComponentGroup _createVMVerticalComponentGroup = VaadinMobileFactory.eINSTANCE.createVMVerticalComponentGroup();
-      this.group = _createVMVerticalComponentGroup;
+      this.group = VaadinMobileFactory.eINSTANCE.createVMVerticalComponentGroup();
       EList<YEmbeddable> _elements = yRootLayout.getElements();
       _elements.add(this.group);
     }
     
+    @Override
     public void add(final YEmbeddable element) {
       this.group.addElement(element);
     }
     
+    @Override
     public void add(final YSuspect ySuspect) {
     }
     
+    @Override
     public void pushHierarchy(final YTypedCompoundSuspect suspect) {
       throw new UnsupportedOperationException("TODO: auto-generated method stub");
     }
     
+    @Override
     public void popHierarchy() {
       throw new UnsupportedOperationException("TODO: auto-generated method stub");
     }
@@ -172,14 +172,13 @@
     
     private YStrategyLayout layout;
     
+    @Override
     public void setup(final UiLayout uiRootLayout, final YLayout yRootLayout) {
-      YStrategyLayout _createYStrategyLayout = YECviewFactory.eINSTANCE.createYStrategyLayout();
-      this.layout = _createYStrategyLayout;
+      this.layout = YECviewFactory.eINSTANCE.createYStrategyLayout();
       this.layout.setId("cx-StrategyLayout");
       EList<YEmbeddable> _elements = yRootLayout.getElements();
       _elements.add(this.layout);
-      YView _view = yRootLayout.getView();
-      EList<YVisibilityProcessor> _visibilityProcessors = _view.getVisibilityProcessors();
+      EList<YVisibilityProcessor> _visibilityProcessors = yRootLayout.getView().getVisibilityProcessors();
       YAuthorizationVisibilityProcessor _createYAuthorizationVisibilityProcessor = YVisibilityFactory.eINSTANCE.createYAuthorizationVisibilityProcessor();
       _visibilityProcessors.add(_createYAuthorizationVisibilityProcessor);
       if ((yRootLayout instanceof YAlignmentContainer)) {
@@ -187,15 +186,16 @@
       }
     }
     
+    @Override
     public void add(final YEmbeddable element) {
     }
     
+    @Override
     public void add(final YSuspect ySuspect) {
       boolean _isEmpty = this.currentSubDtoSuspect.isEmpty();
       boolean _not = (!_isEmpty);
       if (_not) {
-        YTypedCompoundSuspect _peek = this.currentSubDtoSuspect.peek();
-        EList<YSuspect> _children = _peek.getChildren();
+        EList<YSuspect> _children = this.currentSubDtoSuspect.peek().getChildren();
         _children.add(ySuspect);
       } else {
         EList<YSuspect> _suspects = this.layout.getSuspects();
@@ -203,10 +203,12 @@
       }
     }
     
+    @Override
     public void pushHierarchy(final YTypedCompoundSuspect suspect) {
       this.currentSubDtoSuspect.push(suspect);
     }
     
+    @Override
     public void popHierarchy() {
       this.currentSubDtoSuspect.pop();
     }
@@ -230,6 +232,7 @@
      * #readOnly(org.eclipse.emf.common.util.URI,
      * org.eclipse.xtext.util.concurrent.IUnitOfWork)
      */
+    @Override
     public <R extends Object> R readOnly(final URI targetURI, final IUnitOfWork<R, ResourceSet> work) {
       try {
         return work.exec(this.rs);
@@ -280,6 +283,7 @@
   
   private YBeanSlot yMainBeanslot;
   
+  @Override
   public void autowire(final UiLayout uiLayout, final UiModelDerivedStateComputerx computer, final boolean mobile) {
     boolean _isAutowire = uiLayout.isAutowire();
     boolean _not = (!_isAutowire);
@@ -290,32 +294,26 @@
     this.computer = computer;
     this.mobile = mobile;
     this.uiLayout = uiLayout;
-    YLayout _associatedUi = computer.<YLayout>associatedUi(uiLayout);
-    this.yLayout = _associatedUi;
-    YView _view = this.yLayout.getView();
-    this.yView = _view;
-    YBeanSlot _beanSlot = this.getBeanSlot(uiLayout);
-    this.yMainBeanslot = _beanSlot;
+    this.yLayout = computer.<YLayout>associatedUi(uiLayout);
+    this.yView = this.yLayout.getView();
+    this.yMainBeanslot = this.getBeanSlot(uiLayout);
     boolean _matched = false;
-    if (!_matched) {
-      if (uiLayout instanceof UiHorizontalLayout) {
-        _matched=true;
-        AutowireHelper.Layouter _xifexpression = null;
-        if ((!mobile)) {
-          _xifexpression = new AutowireHelper.StrategyLayoutLayouter();
-        } else {
-          _xifexpression = new AutowireHelper.MobileLayouter();
-        }
-        this.layouter = _xifexpression;
-        this.layouter.setup(uiLayout, this.yLayout);
+    if (uiLayout instanceof UiHorizontalLayout) {
+      _matched=true;
+      AutowireHelper.Layouter _xifexpression = null;
+      if ((!mobile)) {
+        _xifexpression = new AutowireHelper.StrategyLayoutLayouter();
+      } else {
+        _xifexpression = new AutowireHelper.MobileLayouter();
       }
+      this.layouter = _xifexpression;
+      this.layouter.setup(uiLayout, this.yLayout);
     }
     if (!_matched) {
       return;
     }
     final BindableTypeResolver resolver = new BindableTypeResolver();
-    UiBindingExpression _autoWireSource = uiLayout.getAutoWireSource();
-    JvmType resolvedType = resolver.resolveType(_autoWireSource);
+    JvmType resolvedType = resolver.resolveType(uiLayout.getAutoWireSource());
     if ((resolvedType instanceof JvmDeclaredType)) {
       this.beanType = ((JvmDeclaredType) resolvedType);
       final Map<String, OperationExtensions.OperationInfo> opInfoMap = OperationExtensions.getOperationInfos(this.beanType);
@@ -334,22 +332,16 @@
       final Set<URI> jvmTypeURIs = CollectionLiterals.<URI>newHashSet();
       URI _uRI = EcoreUtil.getURI(dtoType);
       jvmTypeURIs.add(_uRI);
-      final IAcceptor<IReferenceDescription> _function = new IAcceptor<IReferenceDescription>() {
-        public void accept(final IReferenceDescription it) {
-          final IReferenceDescription desc = it;
-          EReference _eReference = desc.getEReference();
-          boolean _equals = Objects.equal(_eReference, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE);
-          if (_equals) {
-            URI _sourceEObjectUri = it.getSourceEObjectUri();
-            String _fragment = _sourceEObjectUri.fragment();
-            boolean _endsWith = _fragment.endsWith("/@superTypes.0");
-            if (_endsWith) {
-              final URI uri = desc.getSourceEObjectUri();
-              String _string = uri.toString();
-              String _replace = _string.replace("/@superTypes.0", "");
-              URI _createURI = URI.createURI(_replace);
-              result.add(_createURI);
-            }
+      final IAcceptor<IReferenceDescription> _function = (IReferenceDescription it) -> {
+        final IReferenceDescription desc = it;
+        EReference _eReference = desc.getEReference();
+        boolean _tripleEquals = (_eReference == TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE);
+        if (_tripleEquals) {
+          boolean _endsWith = it.getSourceEObjectUri().fragment().endsWith("/@superTypes.0");
+          if (_endsWith) {
+            final URI uri = desc.getSourceEObjectUri();
+            URI _createURI = URI.createURI(uri.toString().replace("/@superTypes.0", ""));
+            result.add(_createURI);
           }
         }
       };
@@ -379,38 +371,30 @@
     this.createSuspectStructure(sortedOpInfoMapList, type, mobile, parentSuspect);
   }
   
-  public void createSuspectStructure(final LinkedList<Map<String, OperationExtensions.OperationInfo>> sortedOpInfoMapList, final JvmType dtoType, final boolean mobile, final YTypedCompoundSuspect parentSuspect) {
+  public void createSuspectStructure(final LinkedList<Map<String, OperationExtensions.OperationInfo>> sortedOpInfoMapList, final JvmDeclaredType dtoType, final boolean mobile, final YTypedCompoundSuspect parentSuspect) {
     boolean _isEnum = this._typeHelper.isEnum(dtoType);
     boolean _not = (!_isEnum);
     if (_not) {
-      final Consumer<Map<String, OperationExtensions.OperationInfo>> _function = new Consumer<Map<String, OperationExtensions.OperationInfo>>() {
-        public void accept(final Map<String, OperationExtensions.OperationInfo> it) {
-          AutowireHelper.this.createSuspectStructure(it, mobile, parentSuspect);
-        }
+      final Consumer<Map<String, OperationExtensions.OperationInfo>> _function = (Map<String, OperationExtensions.OperationInfo> it) -> {
+        this.createSuspectStructure(it, dtoType, mobile, parentSuspect);
       };
       sortedOpInfoMapList.forEach(_function);
     }
-    Resource _eResource = this.uiLayout.eResource();
-    final Set<URI> subTypeURIs = this.findSubTypes(dtoType, _eResource);
+    final Set<URI> subTypeURIs = this.findSubTypes(dtoType, this.uiLayout.eResource());
     boolean _isEmpty = subTypeURIs.isEmpty();
     boolean _not_1 = (!_isEmpty);
     if (_not_1) {
       final YSubTypeBaseSuspect subtypeRootSuspect = YECviewFactory.eINSTANCE.createYSubTypeBaseSuspect();
       EList<String> _tags = subtypeRootSuspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__SUBTYPES_ROOT);
-      String _qualifiedName = dtoType.getQualifiedName();
-      subtypeRootSuspect.setTypeQualifiedName(_qualifiedName);
+      subtypeRootSuspect.setTypeQualifiedName(dtoType.getQualifiedName());
       this.layouter.add(subtypeRootSuspect);
       this.layouter.pushHierarchy(subtypeRootSuspect);
     }
-    final Consumer<URI> _function_1 = new Consumer<URI>() {
-      public void accept(final URI it) {
-        Resource _eResource = AutowireHelper.this.uiLayout.eResource();
-        ResourceSet _resourceSet = _eResource.getResourceSet();
-        EObject _eObject = _resourceSet.getEObject(it, true);
-        final JvmDeclaredType subDtoJvmType = ((JvmDeclaredType) _eObject);
-        AutowireHelper.this.createSubTypeDtoSuspect(subDtoJvmType);
-      }
+    final Consumer<URI> _function_1 = (URI it) -> {
+      EObject _eObject = this.uiLayout.eResource().getResourceSet().getEObject(it, true);
+      final JvmDeclaredType subDtoJvmType = ((JvmDeclaredType) _eObject);
+      this.createSubTypeDtoSuspect(subDtoJvmType);
     };
     subTypeURIs.forEach(_function_1);
     boolean _isEmpty_1 = subTypeURIs.isEmpty();
@@ -420,250 +404,147 @@
     }
   }
   
-  public void createSuspectStructure(final Map<String, OperationExtensions.OperationInfo> opInfoMap, final boolean mobile, final YTypedCompoundSuspect parentSuspect) {
-    Collection<OperationExtensions.OperationInfo> _values = opInfoMap.values();
-    final Consumer<OperationExtensions.OperationInfo> _function = new Consumer<OperationExtensions.OperationInfo>() {
-      public void accept(final OperationExtensions.OperationInfo it) {
-        JvmType type = null;
-        try {
-          JvmOperation _getter = it.getGetter();
-          JvmTypeReference _returnType = _getter.getReturnType();
-          JvmType _type = _returnType.getType();
-          type = _type;
-        } catch (final Throwable _t) {
-          if (_t instanceof NullPointerException) {
-            final NullPointerException e = (NullPointerException)_t;
-            return;
-          } else {
-            throw Exceptions.sneakyThrow(_t);
-          }
-        }
-        YSuspect suspect = null;
-        ArrayList<AutowireUtil.Pair> properties = CollectionLiterals.<AutowireUtil.Pair>newArrayList();
-        JvmField _field = it.getField();
-        boolean _notEquals = (!Objects.equal(_field, null));
-        if (_notEquals) {
-          JvmField _field_1 = it.getField();
-          JvmDeclaredType _declaringType = _field_1.getDeclaringType();
-          String _qualifiedName = _declaringType.getQualifiedName();
-          String _plus = (_qualifiedName + ".");
-          String _name = it.getName();
-          String _plus_1 = (_plus + _name);
-          List<AutowireUtil.Pair> _properties = AutowireHelper.this._autowireUtil.toProperties(AutowireHelper.this.beanType, _plus_1);
-          properties.addAll(_properties);
-        }
-        boolean _isBoolean = AutowireHelper.this._typeHelper.isBoolean(type);
-        if (_isBoolean) {
-          if (mobile) {
-            AutowireHelper.this.createMobileSwitch(type, it);
-          } else {
-            YTypedSuspect _createCheckbox = AutowireHelper.this.createCheckbox(type, it);
-            suspect = _createCheckbox;
-          }
+  public void createSuspectStructure(final Map<String, OperationExtensions.OperationInfo> opInfoMap, final JvmDeclaredType dtoType, final boolean mobile, final YTypedCompoundSuspect parentSuspect) {
+    final Consumer<OperationExtensions.OperationInfo> _function = (OperationExtensions.OperationInfo it) -> {
+      JvmType type = null;
+      try {
+        type = it.getGetter().getReturnType().getType();
+      } catch (final Throwable _t) {
+        if (_t instanceof NullPointerException) {
+          final NullPointerException e = (NullPointerException)_t;
+          return;
         } else {
-          boolean _isNumberWithDigits = AutowireHelper.this._typeHelper.isNumberWithDigits(type);
-          if (_isNumberWithDigits) {
-            YTypedSuspect _createDecimalField = AutowireHelper.this.createDecimalField(type, it);
-            suspect = _createDecimalField;
-            String _name_1 = it.getName();
-            boolean _isAttribute = AutowireHelper.this._autowireUtil.isAttribute(AutowireHelper.this.beanType, _name_1, "NumberToUomo");
-            if (_isAttribute) {
-              EList<String> _tags = suspect.getTags();
-              _tags.add("NumberToUomo");
-            } else {
-              String _name_2 = it.getName();
-              LDataType dataType = AutowireHelper.this._autowireUtil.toDataType(AutowireHelper.this.beanType, _name_2);
-              boolean _notEquals_1 = (!Objects.equal(dataType, null));
-              if (_notEquals_1) {
-                JvmTypeReference _jvmTypeReference = dataType.getJvmTypeReference();
-                JvmType _type_1 = _jvmTypeReference.getType();
-                String dataTypeName = _type_1.getIdentifier();
-                String _canonicalName = Double.class.getCanonicalName();
-                boolean _equals = dataTypeName.equals(_canonicalName);
-                if (_equals) {
-                  YSuspect _createCustomDecimalField = AutowireHelper.this.createCustomDecimalField(type, it);
-                  suspect = _createCustomDecimalField;
-                }
+          throw Exceptions.sneakyThrow(_t);
+        }
+      }
+      YSuspect suspect = null;
+      ArrayList<AutowireUtil.Pair> properties = CollectionLiterals.<AutowireUtil.Pair>newArrayList();
+      JvmField _field = it.getField();
+      boolean _tripleNotEquals = (_field != null);
+      if (_tripleNotEquals) {
+        String _qualifiedName = it.getField().getDeclaringType().getQualifiedName();
+        String _plus = (_qualifiedName + ".");
+        String _name = it.getName();
+        String _plus_1 = (_plus + _name);
+        properties.addAll(this._autowireUtil.toProperties(dtoType, _plus_1));
+      }
+      if ((this._typeHelper.isBoolean(type) && (!it.isDirtyMark()))) {
+        if (mobile) {
+          this.createMobileSwitch(type, it);
+        } else {
+          suspect = this.createCheckbox(type, it);
+        }
+      } else {
+        boolean _isNumberWithDigits = this._typeHelper.isNumberWithDigits(type);
+        if (_isNumberWithDigits) {
+          suspect = this.createDecimalField(type, it);
+          boolean _isAttribute = this._autowireUtil.isAttribute(dtoType, it.getName(), "NumberToUomo");
+          if (_isAttribute) {
+            EList<String> _tags = suspect.getTags();
+            _tags.add("NumberToUomo");
+          } else {
+            LDataType dataType = this._autowireUtil.toDataType(dtoType, it.getName());
+            if ((dataType != null)) {
+              String dataTypeName = dataType.getJvmTypeReference().getType().getIdentifier();
+              boolean _equals = dataTypeName.equals(Double.class.getCanonicalName());
+              if (_equals) {
+                suspect = this.createCustomDecimalField(type, it);
               }
             }
+          }
+        } else {
+          boolean _isNumberWithoutDigits = this._typeHelper.isNumberWithoutDigits(type);
+          if (_isNumberWithoutDigits) {
+            if ((((!it.isIdOrUUID()) && (!it.isVersion())) && (!it.isDirtyMark()))) {
+              suspect = this.createNumberField(type, it);
+            }
           } else {
-            boolean _isNumberWithoutDigits = AutowireHelper.this._typeHelper.isNumberWithoutDigits(type);
-            if (_isNumberWithoutDigits) {
-              boolean _and = false;
-              String _name_3 = it.getName();
-              boolean _equals_1 = _name_3.equals("id");
-              boolean _not = (!_equals_1);
-              if (!_not) {
-                _and = false;
-              } else {
-                String _name_4 = it.getName();
-                boolean _equals_2 = _name_4.equals("uuid");
-                boolean _not_1 = (!_equals_2);
-                _and = _not_1;
+            boolean _isString = this._typeHelper.isString(type);
+            if (_isString) {
+              final Function1<AutowireUtil.Pair, Boolean> _function_1 = (AutowireUtil.Pair it_1) -> {
+                return Boolean.valueOf(it_1.key.equals(ILayoutingStrategy.PROPERTY_KEY__FIELD_TYPE));
+              };
+              AutowireUtil.Pair _findFirst = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function_1);
+              String _value = null;
+              if (_findFirst!=null) {
+                _value=_findFirst.value;
               }
-              if (_and) {
-                YTypedSuspect _createNumberField = AutowireHelper.this.createNumberField(type, it);
-                suspect = _createNumberField;
-              }
-            } else {
-              boolean _isString = AutowireHelper.this._typeHelper.isString(type);
-              if (_isString) {
-                final Function1<AutowireUtil.Pair, Boolean> _function = new Function1<AutowireUtil.Pair, Boolean>() {
-                  public Boolean apply(final AutowireUtil.Pair it) {
-                    return Boolean.valueOf(it.key.equals(ILayoutingStrategy.PROPERTY_KEY__FIELD_TYPE));
-                  }
-                };
-                AutowireUtil.Pair _findFirst = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function);
-                String _value = null;
-                if (_findFirst!=null) {
-                  _value=_findFirst.value;
-                }
-                final String fieldType = _value;
-                boolean _and_1 = false;
-                String _name_5 = it.getName();
-                boolean _equals_3 = _name_5.equals("id");
-                boolean _not_2 = (!_equals_3);
-                if (!_not_2) {
-                  _and_1 = false;
+              final String fieldType = _value;
+              if ((((!it.isIdOrUUID()) && (!it.isVersion())) && (!it.isDirtyMark()))) {
+                FunctionTypingAPI functionTypingAPI = new FunctionTypingAPI();
+                final String functionImagePicker = functionTypingAPI.getFunctionImagePickerTypeName();
+                if (((this.isDomainKey(it) || this.isDomainDescription(it)) || ((!StringExtensions.isNullOrEmpty(fieldType)) && fieldType.equals(ILayoutingStrategy.PROPERTY_SUGGESTTEXT)))) {
+                  suspect = this.createSuggestTextField(type, it, opInfoMap);
                 } else {
-                  String _name_6 = it.getName();
-                  boolean _equals_4 = _name_6.equals("uuid");
-                  boolean _not_3 = (!_equals_4);
-                  _and_1 = _not_3;
-                }
-                if (_and_1) {
-                  FunctionTypingAPI functionTypingAPI = new FunctionTypingAPI();
-                  final String functionImagePicker = functionTypingAPI.getFunctionImagePickerTypeName();
-                  boolean _or = false;
-                  boolean _or_1 = false;
-                  boolean _isDomainKey = AutowireHelper.this.isDomainKey(it);
-                  if (_isDomainKey) {
-                    _or_1 = true;
+                  final Function1<AutowireUtil.Pair, Boolean> _function_2 = (AutowireUtil.Pair it_1) -> {
+                    return Boolean.valueOf(it_1.key.toLowerCase().equals(ILayoutingStrategy.PROPERTY_BLOB));
+                  };
+                  boolean _exists = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_2);
+                  if (_exists) {
+                    suspect = this.createBlopUploadComponent(type, it);
                   } else {
-                    boolean _isDomainDescription = AutowireHelper.this.isDomainDescription(it);
-                    _or_1 = _isDomainDescription;
-                  }
-                  if (_or_1) {
-                    _or = true;
-                  } else {
-                    boolean _and_2 = false;
-                    boolean _isNullOrEmpty = StringExtensions.isNullOrEmpty(fieldType);
-                    boolean _not_4 = (!_isNullOrEmpty);
-                    if (!_not_4) {
-                      _and_2 = false;
+                    if (((!StringExtensions.isNullOrEmpty(fieldType)) && fieldType.equals(ILayoutingStrategy.PROPERTY_RICH_TEXT))) {
+                      suspect = this.createRichTextField(type, it);
                     } else {
-                      boolean _equals_5 = fieldType.equals(ILayoutingStrategy.PROPERTY_SUGGESTTEXT);
-                      _and_2 = _equals_5;
-                    }
-                    _or = _and_2;
-                  }
-                  if (_or) {
-                    YTypedSuspect _createSuggestTextField = AutowireHelper.this.createSuggestTextField(type, it, opInfoMap);
-                    suspect = _createSuggestTextField;
-                  } else {
-                    final Function1<AutowireUtil.Pair, Boolean> _function_1 = new Function1<AutowireUtil.Pair, Boolean>() {
-                      public Boolean apply(final AutowireUtil.Pair it) {
-                        String _lowerCase = it.key.toLowerCase();
-                        return Boolean.valueOf(_lowerCase.equals(ILayoutingStrategy.PROPERTY_BLOB));
-                      }
-                    };
-                    boolean _exists = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_1);
-                    if (_exists) {
-                      YSuspect _createBlopUploadComponent = AutowireHelper.this.createBlopUploadComponent(type, it);
-                      suspect = _createBlopUploadComponent;
-                    } else {
-                      boolean _and_3 = false;
-                      boolean _isNullOrEmpty_1 = StringExtensions.isNullOrEmpty(fieldType);
-                      boolean _not_5 = (!_isNullOrEmpty_1);
-                      if (!_not_5) {
-                        _and_3 = false;
-                      } else {
-                        boolean _equals_6 = fieldType.equals(ILayoutingStrategy.PROPERTY_RICH_TEXT);
-                        _and_3 = _equals_6;
-                      }
-                      if (_and_3) {
-                        YSuspect _createRichTextField = AutowireHelper.this.createRichTextField(type, it);
-                        suspect = _createRichTextField;
-                      } else {
-                        boolean _and_4 = false;
-                        boolean _isNullOrEmpty_2 = StringExtensions.isNullOrEmpty(fieldType);
-                        boolean _not_6 = (!_isNullOrEmpty_2);
-                        if (!_not_6) {
-                          _and_4 = false;
-                        } else {
-                          boolean _equals_7 = fieldType.equals(ILayoutingStrategy.PROPERTY_MASKED_TEXT);
-                          _and_4 = _equals_7;
+                      if (((!StringExtensions.isNullOrEmpty(fieldType)) && fieldType.equals(ILayoutingStrategy.PROPERTY_MASKED_TEXT))) {
+                        final Function1<AutowireUtil.Pair, Boolean> _function_3 = (AutowireUtil.Pair it_1) -> {
+                          return Boolean.valueOf(it_1.key.equals(ILayoutingStrategy.PROPERTY_MASK));
+                        };
+                        AutowireUtil.Pair _findFirst_1 = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function_3);
+                        String _value_1 = null;
+                        if (_findFirst_1!=null) {
+                          _value_1=_findFirst_1.value;
                         }
-                        if (_and_4) {
-                          final Function1<AutowireUtil.Pair, Boolean> _function_2 = new Function1<AutowireUtil.Pair, Boolean>() {
-                            public Boolean apply(final AutowireUtil.Pair it) {
-                              return Boolean.valueOf(it.key.equals(ILayoutingStrategy.PROPERTY_MASK));
-                            }
-                          };
-                          AutowireUtil.Pair _findFirst_1 = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function_2);
-                          String _value_1 = null;
-                          if (_findFirst_1!=null) {
-                            _value_1=_findFirst_1.value;
-                          }
-                          final String mask = _value_1;
-                          YSuspect _createMaskedTextField = AutowireHelper.this.createMaskedTextField(type, it, mask);
-                          suspect = _createMaskedTextField;
+                        final String mask = _value_1;
+                        suspect = this.createMaskedTextField(type, it, mask);
+                      } else {
+                        if (((!StringExtensions.isNullOrEmpty(fieldType)) && fieldType.equals(ILayoutingStrategy.PROPERTY_PASSWORD))) {
+                          suspect = this.createPasswordField(type, it);
                         } else {
-                          boolean _and_5 = false;
-                          boolean _isNullOrEmpty_3 = StringExtensions.isNullOrEmpty(fieldType);
-                          boolean _not_7 = (!_isNullOrEmpty_3);
-                          if (!_not_7) {
-                            _and_5 = false;
+                          final Function1<AutowireUtil.Pair, Boolean> _function_4 = (AutowireUtil.Pair it_1) -> {
+                            return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_TEXTAREA));
+                          };
+                          boolean _exists_1 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_4);
+                          if (_exists_1) {
+                            suspect = this.createTextAreaField(type, it);
                           } else {
-                            boolean _equals_8 = fieldType.equals(ILayoutingStrategy.PROPERTY_PASSWORD);
-                            _and_5 = _equals_8;
-                          }
-                          if (_and_5) {
-                            YSuspect _createPasswordField = AutowireHelper.this.createPasswordField(type, it);
-                            suspect = _createPasswordField;
-                          } else {
-                            final Function1<AutowireUtil.Pair, Boolean> _function_3 = new Function1<AutowireUtil.Pair, Boolean>() {
-                              public Boolean apply(final AutowireUtil.Pair it) {
-                                return Boolean.valueOf(it.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_TEXTAREA));
-                              }
+                            final Function1<AutowireUtil.Pair, Boolean> _function_5 = (AutowireUtil.Pair it_1) -> {
+                              return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_ORGANIZATION));
                             };
-                            boolean _exists_1 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_3);
-                            if (_exists_1) {
-                              YTypedSuspect _createTextAreaField = AutowireHelper.this.createTextAreaField(type, it);
-                              suspect = _createTextAreaField;
+                            boolean _exists_2 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_5);
+                            if (_exists_2) {
+                              suspect = this.createOrganizationComboBox(type, it);
                             } else {
-                              final Function1<AutowireUtil.Pair, Boolean> _function_4 = new Function1<AutowireUtil.Pair, Boolean>() {
-                                public Boolean apply(final AutowireUtil.Pair it) {
-                                  return Boolean.valueOf(it.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_ORGANIZATION));
-                                }
+                              final Function1<AutowireUtil.Pair, Boolean> _function_6 = (AutowireUtil.Pair it_1) -> {
+                                return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_PERSPECTIVE));
                               };
-                              boolean _exists_2 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_4);
-                              if (_exists_2) {
-                                YTypedSuspect _createOrganizationComboBox = AutowireHelper.this.createOrganizationComboBox(type, it);
-                                suspect = _createOrganizationComboBox;
+                              boolean _exists_3 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_6);
+                              if (_exists_3) {
+                                suspect = this.createPerspectiveComboBox(type, it);
                               } else {
-                                final Function1<AutowireUtil.Pair, Boolean> _function_5 = new Function1<AutowireUtil.Pair, Boolean>() {
-                                  public Boolean apply(final AutowireUtil.Pair it) {
-                                    return Boolean.valueOf(it.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_PERSPECTIVE));
-                                  }
+                                final Function1<AutowireUtil.Pair, Boolean> _function_7 = (AutowireUtil.Pair it_1) -> {
+                                  return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_PRINTSERVICE));
                                 };
-                                boolean _exists_3 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_5);
-                                if (_exists_3) {
-                                  YTypedSuspect _createPerspectiveComboBox = AutowireHelper.this.createPerspectiveComboBox(type, it);
-                                  suspect = _createPerspectiveComboBox;
+                                boolean _exists_4 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_7);
+                                if (_exists_4) {
+                                  suspect = this.createPrintServiceComboBox(type, it);
                                 } else {
-                                  final Function1<AutowireUtil.Pair, Boolean> _function_6 = new Function1<AutowireUtil.Pair, Boolean>() {
-                                    public Boolean apply(final AutowireUtil.Pair it) {
-                                      return Boolean.valueOf(it.key.equalsIgnoreCase(functionImagePicker));
-                                    }
+                                  final Function1<AutowireUtil.Pair, Boolean> _function_8 = (AutowireUtil.Pair it_1) -> {
+                                    return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_THEME));
                                   };
-                                  boolean _exists_4 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_6);
-                                  if (_exists_4) {
-                                    YTypedSuspect _createIconComboBox = AutowireHelper.this.createIconComboBox(type, it);
-                                    suspect = _createIconComboBox;
+                                  boolean _exists_5 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_8);
+                                  if (_exists_5) {
+                                    suspect = this.createThemeComboBox(type, it);
                                   } else {
-                                    YTypedSuspect _createTextField = AutowireHelper.this.createTextField(type, it);
-                                    suspect = _createTextField;
+                                    final Function1<AutowireUtil.Pair, Boolean> _function_9 = (AutowireUtil.Pair it_1) -> {
+                                      return Boolean.valueOf(it_1.key.equalsIgnoreCase(functionImagePicker));
+                                    };
+                                    boolean _exists_6 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_9);
+                                    if (_exists_6) {
+                                      suspect = this.createIconComboBox(type, it);
+                                    } else {
+                                      suspect = this.createTextField(type, it);
+                                    }
                                   }
                                 }
                               }
@@ -674,160 +555,98 @@
                     }
                   }
                 }
-              } else {
-                boolean _isDate = AutowireHelper.this._typeHelper.isDate(type);
-                if (_isDate) {
-                  YTypedSuspect _createDateField = AutowireHelper.this.createDateField(type, it);
-                  suspect = _createDateField;
-                } else {
-                  boolean _isEnum = AutowireHelper.this._typeHelper.isEnum(type);
-                  if (_isEnum) {
-                    final Function1<AutowireUtil.Pair, Boolean> _function_7 = new Function1<AutowireUtil.Pair, Boolean>() {
-                      public Boolean apply(final AutowireUtil.Pair it) {
-                        String _lowerCase = it.key.toLowerCase();
-                        return Boolean.valueOf(_lowerCase.equals(ILayoutingStrategy.PROPERTY_OPTION_GROUP));
-                      }
-                    };
-                    boolean _exists_5 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_7);
-                    if (_exists_5) {
-                      YTypedSuspect _createEnumOptionsGroup = AutowireHelper.this.createEnumOptionsGroup(type, it);
-                      suspect = _createEnumOptionsGroup;
-                    } else {
-                      YTypedSuspect _createEnumComboBox = AutowireHelper.this.createEnumComboBox(type, it);
-                      suspect = _createEnumComboBox;
-                    }
-                  } else {
-                    boolean _isByteArray = AutowireHelper.this.isByteArray(type);
-                    if (_isByteArray) {
-                      final Function1<AutowireUtil.Pair, Boolean> _function_8 = new Function1<AutowireUtil.Pair, Boolean>() {
-                        public Boolean apply(final AutowireUtil.Pair it) {
-                          return Boolean.valueOf(it.key.equals(ILayoutingStrategy.PROPERTY_KEY__FIELD_TYPE));
-                        }
-                      };
-                      AutowireUtil.Pair _findFirst_2 = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function_8);
-                      String _value_2 = null;
-                      if (_findFirst_2!=null) {
-                        _value_2=_findFirst_2.value;
-                      }
-                      final String fieldType_1 = _value_2;
-                      boolean _and_6 = false;
-                      boolean _isNullOrEmpty_4 = StringExtensions.isNullOrEmpty(fieldType_1);
-                      boolean _not_8 = (!_isNullOrEmpty_4);
-                      if (!_not_8) {
-                        _and_6 = false;
-                      } else {
-                        boolean _equals_9 = fieldType_1.equals(ILayoutingStrategy.PROPERTY_RICH_TEXT);
-                        _and_6 = _equals_9;
-                      }
-                      if (_and_6) {
-                        YSuspect _createRichTextField_1 = AutowireHelper.this.createRichTextField(type, it);
-                        suspect = _createRichTextField_1;
-                      } else {
-                        YSuspect _createBlopUploadComponent_1 = AutowireHelper.this.createBlopUploadComponent(type, it);
-                        suspect = _createBlopUploadComponent_1;
-                      }
-                    } else {
-                      boolean _isDomainReference = AutowireHelper.this._typeHelper.isDomainReference(it);
-                      if (_isDomainReference) {
-                        YTypedSuspect _createBeanReferenceField = AutowireHelper.this.createBeanReferenceField(type, it);
-                        suspect = _createBeanReferenceField;
-                      } else {
-                        boolean _and_7 = false;
-                        JvmField _field_2 = it.getField();
-                        boolean _notEquals_2 = (!Objects.equal(_field_2, null));
-                        if (!_notEquals_2) {
-                          _and_7 = false;
-                        } else {
-                          JvmField _field_3 = it.getField();
-                          boolean _isCollection = AutowireHelper.this._typeHelper.isCollection(_field_3);
-                          _and_7 = _isCollection;
-                        }
-                        if (_and_7) {
-                          final Function1<AutowireUtil.Pair, Boolean> _function_9 = new Function1<AutowireUtil.Pair, Boolean>() {
-                            public Boolean apply(final AutowireUtil.Pair it) {
-                              String _lowerCase = it.key.toLowerCase();
-                              return Boolean.valueOf(_lowerCase.equals(ILayoutingStrategy.PROPERTY_GRID));
-                            }
-                          };
-                          boolean _exists_6 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_9);
-                          if (_exists_6) {
-                            YTypedSuspect _createGrid = AutowireHelper.this.createGrid(type, it);
-                            suspect = _createGrid;
-                          } else {
-                            final Function1<AutowireUtil.Pair, Boolean> _function_10 = new Function1<AutowireUtil.Pair, Boolean>() {
-                              public Boolean apply(final AutowireUtil.Pair it) {
-                                return Boolean.valueOf(it.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_TABLE));
-                              }
-                            };
-                            boolean _exists_7 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_10);
-                            if (_exists_7) {
-                              YTypedSuspect _createTableField = AutowireHelper.this.createTableField(type, it);
-                              suspect = _createTableField;
-                            }
-                          }
-                        } else {
-                          boolean _isDto = AutowireHelper.this.isDto(type);
-                          if (_isDto) {
-                            YSuspect _createDtoSuspect = AutowireHelper.this.createDtoSuspect(type, it);
-                            suspect = _createDtoSuspect;
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
               }
+            } else {
+              boolean _isDate = this._typeHelper.isDate(type);
+              if (_isDate) {
+                suspect = this.createDateField(type, it);
+              } else {
+                boolean _isEnum = this._typeHelper.isEnum(type);
+                if (_isEnum) {
+                  final Function1<AutowireUtil.Pair, Boolean> _function_10 = (AutowireUtil.Pair it_1) -> {
+                    return Boolean.valueOf(it_1.key.toLowerCase().equals(ILayoutingStrategy.PROPERTY_OPTION_GROUP));
+                  };
+                  boolean _exists_7 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_10);
+                  if (_exists_7) {
+                    suspect = this.createEnumOptionsGroup(type, it);
+                  } else {
+                    suspect = this.createEnumComboBox(type, it);
+                  }
+                } else {
+                  boolean _isByteArray = this.isByteArray(type);
+                  if (_isByteArray) {
+                    final Function1<AutowireUtil.Pair, Boolean> _function_11 = (AutowireUtil.Pair it_1) -> {
+                      return Boolean.valueOf(it_1.key.equals(ILayoutingStrategy.PROPERTY_KEY__FIELD_TYPE));
+                    };
+                    AutowireUtil.Pair _findFirst_2 = IterableExtensions.<AutowireUtil.Pair>findFirst(properties, _function_11);
+                    String _value_2 = null;
+                    if (_findFirst_2!=null) {
+                      _value_2=_findFirst_2.value;
+                    }
+                    final String fieldType_1 = _value_2;
+                    if (((!StringExtensions.isNullOrEmpty(fieldType_1)) && fieldType_1.equals(ILayoutingStrategy.PROPERTY_RICH_TEXT))) {
+                      suspect = this.createRichTextField(type, it);
+                    } else {
+                      suspect = this.createBlopUploadComponent(type, it);
+                    }
+                  } else {
+                    boolean _isDomainReference = this._typeHelper.isDomainReference(it);
+                    if (_isDomainReference) {
+                      suspect = this.createBeanReferenceField(type, it);
+                    } else {
+                      if (((it.getField() != null) && this._typeHelper.isCollection(it.getField()))) {
+                        final Function1<AutowireUtil.Pair, Boolean> _function_12 = (AutowireUtil.Pair it_1) -> {
+                          return Boolean.valueOf(it_1.key.toLowerCase().equals(ILayoutingStrategy.PROPERTY_GRID));
+                        };
+                        boolean _exists_8 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_12);
+                        if (_exists_8) {
+                          suspect = this.createGrid(type, it);
+                        } else {
+                          final Function1<AutowireUtil.Pair, Boolean> _function_13 = (AutowireUtil.Pair it_1) -> {
+                            return Boolean.valueOf(it_1.key.equalsIgnoreCase(ILayoutingStrategy.PROPERTY_TABLE));
+                          };
+                          boolean _exists_9 = IterableExtensions.<AutowireUtil.Pair>exists(properties, _function_13);
+                          if (_exists_9) {
+                            suspect = this.createTableField(type, it);
+                          }
+                        }
+                      } else {
+                        boolean _isDto = this.isDto(type);
+                        if (_isDto) {
+                          suspect = this.createDtoSuspect(type, it);
+                        }
+                      }
+                    }
+                  }
+                }
+              }
             }
           }
         }
-        boolean _equals_10 = Objects.equal(parentSuspect, null);
-        if (_equals_10) {
-          AutowireHelper.this.completeSuspect(type, it, suspect);
-        } else {
-          AutowireHelper.this.completeSuspect(type, it, suspect, parentSuspect);
-        }
-        for (final AutowireUtil.Pair keyAndValue : properties) {
-          boolean _notEquals_3 = (!Objects.equal(suspect, null));
-          if (_notEquals_3) {
-            EMap<String, String> _properties_1 = suspect.getProperties();
-            String _lowerCase = keyAndValue.key.toLowerCase();
-            _properties_1.put(_lowerCase, keyAndValue.value);
-          }
-        }
       }
+      if ((parentSuspect == null)) {
+        this.completeSuspect(type, it, suspect, dtoType);
+      } else {
+        this.completeSuspect(type, it, suspect, parentSuspect, dtoType);
+      }
+      for (final AutowireUtil.Pair keyAndValue : properties) {
+        if ((suspect != null)) {
+          suspect.getProperties().put(keyAndValue.key.toLowerCase(), keyAndValue.value);
+        }
+      }
     };
-    _values.forEach(_function);
+    opInfoMap.values().forEach(_function);
   }
   
   public void createAuthorizationVisibilityProcessor(final YAuthorizationable element, final OperationExtensions.OperationInfo info) {
     JvmField _field = info.getField();
-    boolean _notEquals = (!Objects.equal(_field, null));
-    if (_notEquals) {
-      JvmField _field_1 = info.getField();
-      EObject _eContainer = _field_1.eContainer();
+    boolean _tripleNotEquals = (_field != null);
+    if (_tripleNotEquals) {
+      EObject _eContainer = info.getField().eContainer();
       final JvmGenericType type = ((JvmGenericType) _eContainer);
-      boolean _and = false;
-      JvmOperation _getter = info.getGetter();
-      JvmTypeReference _returnType = _getter.getReturnType();
-      JvmType _type = _returnType.getType();
-      boolean _isClass = this._autowireUtil.isClass(_type);
-      boolean _not = (!_isClass);
-      if (!_not) {
-        _and = false;
-      } else {
-        JvmOperation _getter_1 = info.getGetter();
-        JvmTypeReference _returnType_1 = _getter_1.getReturnType();
-        JvmType _type_1 = _returnType_1.getType();
-        boolean _isAllowed = this._autowireUtil.isAllowed(_type_1, type, info);
-        _and = _isAllowed;
-      }
-      if (_and) {
-        QualifiedName _fullyQualifiedName = this._iQualifiedNameProvider.getFullyQualifiedName(type);
-        String _string = _fullyQualifiedName.toString();
-        element.setAuthorizationGroup(_string);
-        JvmField _field_2 = info.getField();
-        String _simpleName = _field_2.getSimpleName();
-        element.setAuthorizationId(_simpleName);
+      if (((!this._autowireUtil.isClass(info.getGetter().getReturnType().getType())) && this._autowireUtil.isAllowed(info.getGetter().getReturnType().getType(), type, info))) {
+        element.setAuthorizationGroup(this._iQualifiedNameProvider.getFullyQualifiedName(type).toString());
+        element.setAuthorizationId(info.getField().getSimpleName());
       }
     }
   }
@@ -853,25 +672,17 @@
     final YSubTypeSuspect subTypeSuspect = YECviewFactory.eINSTANCE.createYSubTypeSuspect();
     EList<String> _tags = subTypeSuspect.getTags();
     _tags.add(ILayoutingStrategy.TAG__SUBTYPE);
-    String _qualifiedName = subDtoJvmType.getQualifiedName();
-    subTypeSuspect.setTypeQualifiedName(_qualifiedName);
-    Resource _eResource = this.uiLayout.eResource();
-    ResourceSet _resourceSet = _eResource.getResourceSet();
-    String _typeQualifiedName = subTypeSuspect.getTypeQualifiedName();
-    Class<?> _loadClass = this.computer.loadClass(_resourceSet, _typeQualifiedName);
-    subTypeSuspect.setType(_loadClass);
+    subTypeSuspect.setTypeQualifiedName(subDtoJvmType.getQualifiedName());
+    subTypeSuspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), subTypeSuspect.getTypeQualifiedName()));
     final YView view = this.computer.getCurrentView();
-    String _typeQualifiedName_1 = subTypeSuspect.getTypeQualifiedName();
-    Class<?> _type = subTypeSuspect.getType();
-    final YDetailBeanSlot detailSlot = view.addDetailBeanSlot(_typeQualifiedName_1, _type, 
+    final YDetailBeanSlot detailSlot = view.addDetailBeanSlot(subTypeSuspect.getTypeQualifiedName(), subTypeSuspect.getType(), 
       this.yMainBeanslot, "");
     EList<String> _tags_1 = detailSlot.getTags();
     _tags_1.add(ILayoutingStrategy.TAG__SUBTYPE);
     subTypeSuspect.setBeanSlot(detailSlot);
     this.layouter.add(subTypeSuspect);
     this.layouter.pushHierarchy(subTypeSuspect);
-    Map<String, OperationExtensions.OperationInfo> _operationInfos = OperationExtensions.getOperationInfos(subDtoJvmType, false);
-    final LinkedList<Map<String, OperationExtensions.OperationInfo>> subTypeInfos = this.createSortedMapList(_operationInfos);
+    final LinkedList<Map<String, OperationExtensions.OperationInfo>> subTypeInfos = this.createSortedMapList(OperationExtensions.getOperationInfos(subDtoJvmType, false));
     this.createSuspectStructure(subTypeInfos, subDtoJvmType, this.mobile, subTypeSuspect);
     this.layouter.popHierarchy();
     return subTypeSuspect;
@@ -883,72 +694,98 @@
   public boolean isDto(final JvmType type) {
     final SuperTypeCollector collector = new SuperTypeCollector();
     final Set<String> superTypes = collector.collectSuperTypeNames(type);
-    String _name = IDto.class.getName();
-    return superTypes.contains(_name);
+    return superTypes.contains(IDto.class.getName());
   }
   
-  public void completeSuspect(final JvmType type, final OperationExtensions.OperationInfo info, final YSuspect suspect) {
-    boolean _notEquals = (!Objects.equal(suspect, null));
-    if (_notEquals) {
+  public void completeSuspect(final JvmType type, final OperationExtensions.OperationInfo info, final YSuspect suspect, final JvmType parentType) {
+    if ((suspect != null)) {
       StringConcatenation _builder = new StringConcatenation();
       String _generateId = this._autowireUtil.generateId(this.uiLayout);
-      _builder.append(_generateId, "");
+      _builder.append(_generateId);
       _builder.append(".");
       String _name = info.getName();
-      _builder.append(_name, "");
+      _builder.append(_name);
       suspect.setId(_builder.toString());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
         EList<String> _tags = suspect.getTags();
         _tags.add("readonly");
       }
-      boolean _isValidationConstraint = this.isValidationConstraint(info);
-      if (_isValidationConstraint) {
+      boolean _isOnKanbanCard = this.isOnKanbanCard(info);
+      if (_isOnKanbanCard) {
         EList<String> _tags_1 = suspect.getTags();
-        _tags_1.add("constraint");
-        String _id = info.getId();
-        String[] splittedId = _id.split(":");
+        _tags_1.add("onKanbanCard");
+      }
+      boolean _isUniqueEntry = this.isUniqueEntry(info);
+      if (_isUniqueEntry) {
+        EList<String> _tags_2 = suspect.getTags();
+        _tags_2.add("unique");
+        String[] splittedId = info.getId().split(":");
         int _length = splittedId.length;
         boolean _greaterThan = (_length > 1);
         if (_greaterThan) {
           String fqClassName = splittedId[0];
-          EMap<String, String> _properties = suspect.getProperties();
-          _properties.put("class", fqClassName);
+          suspect.getProperties().put("class", fqClassName);
         }
-        EMap<String, String> _properties_1 = suspect.getProperties();
-        String _name_1 = info.getName();
-        _properties_1.put("name", _name_1);
+        suspect.getProperties().put("name", info.getName());
+        this.createModelValueContainerBinding(suspect, info.getName(), type, "value");
+      }
+      boolean _isValidationConstraint = this.isValidationConstraint(info);
+      if (_isValidationConstraint) {
+        EList<String> _tags_3 = suspect.getTags();
+        _tags_3.add("constraint");
+        String[] splittedId_1 = info.getId().split(":");
+        int _length_1 = splittedId_1.length;
+        boolean _greaterThan_1 = (_length_1 > 1);
+        if (_greaterThan_1) {
+          String fqClassName_1 = splittedId_1[0];
+          suspect.getProperties().put("class", fqClassName_1);
+        }
+        suspect.getProperties().put("name", info.getName());
       }
       this.layouter.add(suspect);
-      boolean _and = false;
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      if (!_notEquals_1) {
-        _and = false;
-      } else {
-        JvmField _field_1 = info.getField();
-        boolean _isCollection = this._typeHelper.isCollection(_field_1);
-        _and = _isCollection;
-      }
-      if (_and) {
+      if (((info.getField() != null) && this._typeHelper.isCollection(info.getField()))) {
         this.createModelListBinding(suspect, info, type, "list");
       } else {
-        String _name_2 = info.getName();
-        this.createBinding(suspect, _name_2, type, "value");
+        this.createModelValueBinding(suspect, info.getName(), type, "value", parentType);
+      }
+      if ((suspect instanceof YTypedCompoundSuspect)) {
+        final YBindingEndpoint masterValueEP = ((YTypedCompoundSuspect)suspect).getValueBindingEndpoints().get(0);
+        boolean _isEmpty = ((YTypedCompoundSuspect)suspect).getValueBindingEndpoints().isEmpty();
+        boolean _not = (!_isEmpty);
+        if (_not) {
+          EList<YSuspect> _children = ((YTypedCompoundSuspect)suspect).getChildren();
+          for (final YSuspect child : _children) {
+            {
+              String _id = ((YTypedCompoundSuspect)suspect).getId();
+              String _id_1 = child.getId();
+              String _plus = (_id + _id_1);
+              child.setId(_plus);
+              boolean _isEmpty_1 = child.getValueBindingEndpoints().isEmpty();
+              boolean _not_1 = (!_isEmpty_1);
+              if (_not_1) {
+                final YBindingEndpoint childValueEP = child.getValueBindingEndpoints().get(0);
+                if ((childValueEP instanceof YDetailValueBindingEndpoint)) {
+                  YBindingEndpoint _copy = EcoreUtil.<YBindingEndpoint>copy(masterValueEP);
+                  ((YDetailValueBindingEndpoint)childValueEP).setMasterObservable(((YValueBindingEndpoint) _copy));
+                }
+              }
+            }
+          }
+        }
       }
       this.createAuthorizationVisibilityProcessor(suspect, info);
     }
   }
   
-  public void completeSuspect(final JvmType type, final OperationExtensions.OperationInfo info, final YSuspect suspect, final YTypedCompoundSuspect parentSuspect) {
-    boolean _notEquals = (!Objects.equal(suspect, null));
-    if (_notEquals) {
+  public void completeSuspect(final JvmType type, final OperationExtensions.OperationInfo info, final YSuspect suspect, final YTypedCompoundSuspect parentSuspect, final JvmType parentType) {
+    if ((suspect != null)) {
       StringConcatenation _builder = new StringConcatenation();
       String _id = parentSuspect.getId();
-      _builder.append(_id, "");
+      _builder.append(_id);
       _builder.append(".");
       String _name = info.getName();
-      _builder.append(_name, "");
+      _builder.append(_name);
       suspect.setId(_builder.toString());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
@@ -959,36 +796,20 @@
       if (_isValidationConstraint) {
         EList<String> _tags_1 = suspect.getTags();
         _tags_1.add("constraint");
-        String _id_1 = info.getId();
-        String[] splittedId = _id_1.split(":");
+        String[] splittedId = info.getId().split(":");
         int _length = splittedId.length;
         boolean _greaterThan = (_length > 1);
         if (_greaterThan) {
           String fqClassName = splittedId[0];
-          EMap<String, String> _properties = suspect.getProperties();
-          _properties.put("class", fqClassName);
+          suspect.getProperties().put("class", fqClassName);
         }
-        EMap<String, String> _properties_1 = suspect.getProperties();
-        String _name_1 = info.getName();
-        _properties_1.put("name", _name_1);
+        suspect.getProperties().put("name", info.getName());
       }
-      EList<YSuspect> _children = parentSuspect.getChildren();
-      _children.add(suspect);
-      boolean _and = false;
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      if (!_notEquals_1) {
-        _and = false;
-      } else {
-        JvmField _field_1 = info.getField();
-        boolean _isCollection = this._typeHelper.isCollection(_field_1);
-        _and = _isCollection;
-      }
-      if (_and) {
+      parentSuspect.getChildren().add(suspect);
+      if (((info.getField() != null) && this._typeHelper.isCollection(info.getField()))) {
         this.createModelListBinding(suspect, info, type, "list");
       } else {
-        String _name_2 = info.getName();
-        this.createBinding(suspect, _name_2, type, "value");
+        this.createModelValueBinding(suspect, info.getName(), type, "value", parentType);
       }
       this.createAuthorizationVisibilityProcessor(suspect, info);
     }
@@ -1002,40 +823,16 @@
     {
       final LinkedHashMap<String, OperationExtensions.OperationInfo> sortedOpInfoList = CollectionLiterals.<String, OperationExtensions.OperationInfo>newLinkedHashMap();
       final LinkedHashMap<String, OperationExtensions.OperationInfo> nonPrimitiveOpInfoMap = CollectionLiterals.<String, OperationExtensions.OperationInfo>newLinkedHashMap();
-      final BiConsumer<String, OperationExtensions.OperationInfo> _function = new BiConsumer<String, OperationExtensions.OperationInfo>() {
-        public void accept(final String key, final OperationExtensions.OperationInfo opInfo) {
-          JvmType detailType = null;
-          boolean _and = false;
-          JvmField _field = opInfo.getField();
-          boolean _notEquals = (!Objects.equal(_field, null));
-          if (!_notEquals) {
-            _and = false;
+      final BiConsumer<String, OperationExtensions.OperationInfo> _function = (String key, OperationExtensions.OperationInfo opInfo) -> {
+        JvmType detailType = null;
+        if (((opInfo.getField() != null) && (!this._typeHelper.isCollection(opInfo.getField())))) {
+          detailType = opInfo.getGetter().getReturnType().getType();
+          final boolean isPrimitive = ((detailType instanceof JvmPrimitiveType) || detailType.getQualifiedName().equals(
+            String.class.getName()));
+          if (isPrimitive) {
+            sortedOpInfoList.put(key, opInfo);
           } else {
-            JvmField _field_1 = opInfo.getField();
-            boolean _isCollection = AutowireHelper.this._typeHelper.isCollection(_field_1);
-            boolean _not = (!_isCollection);
-            _and = _not;
-          }
-          if (_and) {
-            JvmOperation _getter = opInfo.getGetter();
-            JvmTypeReference _returnType = _getter.getReturnType();
-            JvmType _type = _returnType.getType();
-            detailType = _type;
-            boolean _or = false;
-            if ((detailType instanceof JvmPrimitiveType)) {
-              _or = true;
-            } else {
-              String _qualifiedName = detailType.getQualifiedName();
-              String _name = String.class.getName();
-              boolean _equals = _qualifiedName.equals(_name);
-              _or = _equals;
-            }
-            final boolean isPrimitive = _or;
-            if (isPrimitive) {
-              sortedOpInfoList.put(key, opInfo);
-            } else {
-              nonPrimitiveOpInfoMap.put(key, opInfo);
-            }
+            nonPrimitiveOpInfoMap.put(key, opInfo);
           }
         }
       };
@@ -1060,23 +857,23 @@
   }
   
   public boolean isDomainKey(final OperationExtensions.OperationInfo info) {
-    boolean _and = false;
-    boolean _notEquals = (!Objects.equal(info, null));
-    if (!_notEquals) {
-      _and = false;
-    } else {
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      _and = _notEquals_1;
-    }
-    if (_and) {
-      JvmField _field_1 = info.getField();
-      EList<JvmAnnotationReference> _annotations = _field_1.getAnnotations();
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
       for (final JvmAnnotationReference annotationRefs : _annotations) {
-        String _canonicalName = DomainKey.class.getCanonicalName();
-        JvmAnnotationType _annotation = annotationRefs.getAnnotation();
-        String _identifier = _annotation.getIdentifier();
-        boolean _equals = _canonicalName.equals(_identifier);
+        boolean _equals = DomainKey.class.getCanonicalName().equals(annotationRefs.getAnnotation().getIdentifier());
+        if (_equals) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+  
+  public boolean isOnKanbanCard(final OperationExtensions.OperationInfo info) {
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
+      for (final JvmAnnotationReference annotationRefs : _annotations) {
+        boolean _equals = OnKanbanCard.class.getCanonicalName().equals(annotationRefs.getAnnotation().getIdentifier());
         if (_equals) {
           return true;
         }
@@ -1086,23 +883,10 @@
   }
   
   public boolean isDomainDescription(final OperationExtensions.OperationInfo info) {
-    boolean _and = false;
-    boolean _notEquals = (!Objects.equal(info, null));
-    if (!_notEquals) {
-      _and = false;
-    } else {
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      _and = _notEquals_1;
-    }
-    if (_and) {
-      JvmField _field_1 = info.getField();
-      EList<JvmAnnotationReference> _annotations = _field_1.getAnnotations();
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
       for (final JvmAnnotationReference annotationRefs : _annotations) {
-        String _canonicalName = DomainDescription.class.getCanonicalName();
-        JvmAnnotationType _annotation = annotationRefs.getAnnotation();
-        String _identifier = _annotation.getIdentifier();
-        boolean _equals = _canonicalName.equals(_identifier);
+        boolean _equals = DomainDescription.class.getCanonicalName().equals(annotationRefs.getAnnotation().getIdentifier());
         if (_equals) {
           return true;
         }
@@ -1112,34 +896,24 @@
   }
   
   public boolean isValidationConstraint(final OperationExtensions.OperationInfo info) {
-    boolean _and = false;
-    boolean _notEquals = (!Objects.equal(info, null));
-    if (!_notEquals) {
-      _and = false;
-    } else {
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      _and = _notEquals_1;
-    }
-    if (_and) {
-      JvmField _field_1 = info.getField();
-      EList<JvmAnnotationReference> _annotations = _field_1.getAnnotations();
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
       for (final JvmAnnotationReference annotationRefs : _annotations) {
-        boolean _and_1 = false;
-        JvmAnnotationType _annotation = annotationRefs.getAnnotation();
-        String _identifier = _annotation.getIdentifier();
-        boolean _notEquals_2 = (!Objects.equal(_identifier, null));
-        if (!_notEquals_2) {
-          _and_1 = false;
-        } else {
-          JvmAnnotationType _annotation_1 = annotationRefs.getAnnotation();
-          String _identifier_1 = _annotation_1.getIdentifier();
-          String _canonicalName = Constraint.class.getCanonicalName();
-          String _lowerCase = _canonicalName.toLowerCase();
-          boolean _startsWith = _identifier_1.startsWith(_lowerCase);
-          _and_1 = _startsWith;
+        if (((annotationRefs.getAnnotation().getIdentifier() != null) && 
+          annotationRefs.getAnnotation().getIdentifier().equals(Valid.class.getCanonicalName()))) {
+          return true;
         }
-        if (_and_1) {
+      }
+    }
+    return false;
+  }
+  
+  public boolean isUniqueEntry(final OperationExtensions.OperationInfo info) {
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
+      for (final JvmAnnotationReference annotationRefs : _annotations) {
+        if (((annotationRefs.getAnnotation().getIdentifier() != null) && 
+          annotationRefs.getAnnotation().getIdentifier().equals(UniqueEntry.class.getCanonicalName()))) {
           return true;
         }
       }
@@ -1148,23 +922,10 @@
   }
   
   public boolean isIndex(final OperationExtensions.OperationInfo info) {
-    boolean _and = false;
-    boolean _notEquals = (!Objects.equal(info, null));
-    if (!_notEquals) {
-      _and = false;
-    } else {
-      JvmField _field = info.getField();
-      boolean _notEquals_1 = (!Objects.equal(_field, null));
-      _and = _notEquals_1;
-    }
-    if (_and) {
-      JvmField _field_1 = info.getField();
-      EList<JvmAnnotationReference> _annotations = _field_1.getAnnotations();
+    if (((info != null) && (info.getField() != null))) {
+      EList<JvmAnnotationReference> _annotations = info.getField().getAnnotations();
       for (final JvmAnnotationReference annotationRefs : _annotations) {
-        String _canonicalName = DomainKey.class.getCanonicalName();
-        JvmAnnotationType _annotation = annotationRefs.getAnnotation();
-        String _identifier = _annotation.getIdentifier();
-        boolean _equals = _canonicalName.equals(_identifier);
+        boolean _equals = DomainKey.class.getCanonicalName().equals(annotationRefs.getAnnotation().getIdentifier());
         if (_equals) {
           return true;
         }
@@ -1180,40 +941,27 @@
    * @return
    */
   public boolean isByteArray(final JvmType type) {
-    boolean _equals = Objects.equal(type, null);
-    if (_equals) {
+    if ((type == null)) {
       return false;
     }
-    boolean _or = false;
-    boolean _isArray = this.isArray(type, Byte.class);
-    if (_isArray) {
-      _or = true;
-    } else {
-      boolean _isArray_1 = this.isArray(type, Byte.TYPE);
-      _or = _isArray_1;
-    }
-    if (_or) {
+    if ((this.isArray(type, Byte.class) || this.isArray(type, Byte.TYPE))) {
       return true;
     }
     return false;
   }
   
   public boolean isArray(final JvmType type, final Class<?> clazz) {
-    boolean _equals = Objects.equal(type, null);
-    if (_equals) {
+    if ((type == null)) {
       return false;
     }
     String className = clazz.getName();
     char _charAt = className.charAt(0);
-    boolean _equals_1 = Objects.equal(Character.valueOf(_charAt), "[");
-    if (_equals_1) {
-      String _canonicalName = clazz.getCanonicalName();
-      className = _canonicalName;
+    boolean _equals = Objects.equal(Character.valueOf(_charAt), "[");
+    if (_equals) {
+      className = clazz.getCanonicalName();
     }
-    String _concat = className.concat("[]");
-    className = _concat;
-    String _identifier = type.getIdentifier();
-    boolean result = className.equals(_identifier);
+    className = className.concat("[]");
+    boolean result = className.equals(type.getIdentifier());
     return result;
   }
   
@@ -1223,13 +971,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__TEXT);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1238,31 +981,18 @@
   public YTypedSuspect createSuggestTextField(final JvmType type, final OperationExtensions.OperationInfo info, final Map<String, OperationExtensions.OperationInfo> opInfoMap) {
     YTypedSuspect _xblockexpression = null;
     {
-      Collection<OperationExtensions.OperationInfo> _values = opInfoMap.values();
-      final OperationExtensions.OperationInfo idAttInfo = this.getToIdInfo(_values);
-      boolean _equals = Objects.equal(idAttInfo, null);
-      if (_equals) {
+      final OperationExtensions.OperationInfo idAttInfo = this.getToIdInfo(opInfoMap.values());
+      if ((idAttInfo == null)) {
         return this.createTextField(type, info);
       }
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__SUGGEST_TEXT);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = this.beanType.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = this.beanType.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
-      EMap<String, String> _properties = suspect.getProperties();
-      String _name = info.getName();
-      _properties.put(ILayoutingStrategy.PROPERTY__ITEM_CAPTION, _name);
-      EMap<String, String> _properties_1 = suspect.getProperties();
-      String _name_1 = info.getName();
-      _properties_1.put(ILayoutingStrategy.PROPERTY__ITEM_FILTER, _name_1);
-      EMap<String, String> _properties_2 = suspect.getProperties();
-      String _name_2 = idAttInfo.getName();
-      _properties_2.put(ILayoutingStrategy.PROPERTY__ITEM_UUID, _name_2);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), this.beanType.getQualifiedName()));
+      suspect.setTypeQualifiedName(this.beanType.getQualifiedName());
+      suspect.getProperties().put(ILayoutingStrategy.PROPERTY__ITEM_CAPTION, info.getName());
+      suspect.getProperties().put(ILayoutingStrategy.PROPERTY__ITEM_FILTER, info.getName());
+      suspect.getProperties().put(ILayoutingStrategy.PROPERTY__ITEM_UUID, idAttInfo.getName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1273,17 +1003,8 @@
    */
   public OperationExtensions.OperationInfo getToIdInfo(final Collection<OperationExtensions.OperationInfo> infos) {
     for (final OperationExtensions.OperationInfo info : infos) {
-      boolean _or = false;
-      String _name = info.getName();
-      boolean _equals = _name.equals("id");
-      if (_equals) {
-        _or = true;
-      } else {
-        String _name_1 = info.getName();
-        boolean _equals_1 = _name_1.equals("uuid");
-        _or = _equals_1;
-      }
-      if (_or) {
+      boolean _isIdOrUUID = info.isIdOrUUID();
+      if (_isIdOrUUID) {
         return info;
       }
     }
@@ -1296,13 +1017,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__TEXTAREA);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1314,13 +1030,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__DECIMAL);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1332,13 +1043,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__NUMBER);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1350,13 +1056,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__BOOLEAN);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1368,13 +1069,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__DATE);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1386,13 +1082,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__IMAGE_PICKER);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1404,13 +1095,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__ENUM_COMBO);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
         EList<String> _tags_1 = suspect.getTags();
@@ -1428,8 +1114,7 @@
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__ORGANIZATION_COMBO);
       suspect.setType(String.class);
-      String _name = String.class.getName();
-      suspect.setTypeQualifiedName(_name);
+      suspect.setTypeQualifiedName(String.class.getName());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
         EList<String> _tags_1 = suspect.getTags();
@@ -1447,8 +1132,43 @@
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__PERSPECTIVE_COMBO);
       suspect.setType(String.class);
-      String _name = String.class.getName();
-      suspect.setTypeQualifiedName(_name);
+      suspect.setTypeQualifiedName(String.class.getName());
+      boolean _isReadonly = info.isReadonly();
+      if (_isReadonly) {
+        EList<String> _tags_1 = suspect.getTags();
+        _tags_1.add("readonly");
+      }
+      _xblockexpression = suspect;
+    }
+    return _xblockexpression;
+  }
+  
+  public YTypedSuspect createThemeComboBox(final JvmType type, final OperationExtensions.OperationInfo info) {
+    YTypedSuspect _xblockexpression = null;
+    {
+      final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
+      EList<String> _tags = suspect.getTags();
+      _tags.add(ILayoutingStrategy.TAG__THEME_COMBO);
+      suspect.setType(String.class);
+      suspect.setTypeQualifiedName(String.class.getName());
+      boolean _isReadonly = info.isReadonly();
+      if (_isReadonly) {
+        EList<String> _tags_1 = suspect.getTags();
+        _tags_1.add("readonly");
+      }
+      _xblockexpression = suspect;
+    }
+    return _xblockexpression;
+  }
+  
+  public YTypedSuspect createPrintServiceComboBox(final JvmType type, final OperationExtensions.OperationInfo info) {
+    YTypedSuspect _xblockexpression = null;
+    {
+      final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
+      EList<String> _tags = suspect.getTags();
+      _tags.add(ILayoutingStrategy.TAG__PRINTSERVICE_COMBO);
+      suspect.setType(String.class);
+      suspect.setTypeQualifiedName(String.class.getName());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
         EList<String> _tags_1 = suspect.getTags();
@@ -1465,19 +1185,14 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__ENUM_OPTIONS);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       StringConcatenation _builder = new StringConcatenation();
       String _generateId = this._autowireUtil.generateId(this.uiLayout);
-      _builder.append(_generateId, "");
+      _builder.append(_generateId);
       _builder.append(".");
       String _name = info.getName();
-      _builder.append(_name, "");
+      _builder.append(_name);
       suspect.setId(_builder.toString());
       boolean _isReadonly = info.isReadonly();
       if (_isReadonly) {
@@ -1492,45 +1207,35 @@
   public YTypedSuspect createBeanReferenceField(final JvmType type, final OperationExtensions.OperationInfo info) {
     YTypedSuspect _xblockexpression = null;
     {
-      final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      Class<?> _type = suspect.getType();
-      String captionProperty = BeanHelper.findCaptionProperty(_type);
-      Class<?> _type_1 = suspect.getType();
-      String captionDescription = BeanHelper.findDescriptionProperty(_type_1);
-      boolean _or = false;
-      boolean _notEquals = (!Objects.equal(captionProperty, null));
-      if (_notEquals) {
-        _or = true;
-      } else {
-        boolean _notEquals_1 = (!Objects.equal(captionDescription, null));
-        _or = _notEquals_1;
-      }
-      if (_or) {
+      YTypedSuspect suspect = null;
+      Class<?> suspectType = this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName());
+      String captionProperty = BeanHelper.findCaptionProperty(suspectType);
+      String captionDescription = BeanHelper.findDescriptionProperty(suspectType);
+      if (((captionProperty != null) || (captionDescription != null))) {
+        suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
+        suspect.setType(suspectType);
         EList<String> _tags = suspect.getTags();
         _tags.add(ILayoutingStrategy.TAG__BEAN_REFERENCE);
         StringConcatenation _builder = new StringConcatenation();
         String _generateId = this._autowireUtil.generateId(this.uiLayout);
-        _builder.append(_generateId, "");
+        _builder.append(_generateId);
         _builder.append(".");
         String _name = info.getName();
-        _builder.append(_name, "");
+        _builder.append(_name);
         suspect.setId(_builder.toString());
         boolean _isReadonly = info.isReadonly();
         if (_isReadonly) {
           EList<String> _tags_1 = suspect.getTags();
           _tags_1.add("readonly");
         }
-        String _qualifiedName_1 = type.getQualifiedName();
-        suspect.setTypeQualifiedName(_qualifiedName_1);
-        EMap<String, String> _properties = suspect.getProperties();
-        _properties.put(ILayoutingStrategy.PROPERTY__ITEM_CAPTION, captionProperty);
-        EMap<String, String> _properties_1 = suspect.getProperties();
-        _properties_1.put(ILayoutingStrategy.PROPERTY__ITEM_DESCRIPTION, captionDescription);
+        boolean _hasAnnotation = info.hasAnnotation(FilterDepth.class);
+        if (_hasAnnotation) {
+          final int depth = this._autowireUtil.toFilterDepth(info.getField());
+          suspect.getProperties().put(ILayoutingStrategy.PROPERTY__FILTER_DEPTH, Integer.toString(depth));
+        }
+        suspect.setTypeQualifiedName(type.getQualifiedName());
+        suspect.getProperties().put(ILayoutingStrategy.PROPERTY__ITEM_CAPTION, captionProperty);
+        suspect.getProperties().put(ILayoutingStrategy.PROPERTY__ITEM_DESCRIPTION, captionDescription);
       }
       _xblockexpression = suspect;
     }
@@ -1549,97 +1254,65 @@
     YCollectionSuspect _xblockexpression = null;
     {
       final YCollectionSuspect suspect = YECviewFactory.eINSTANCE.createYCollectionSuspect();
-      JvmOperation _getter = info.getGetter();
-      JvmTypeReference _returnType = _getter.getReturnType();
+      JvmTypeReference _returnType = info.getGetter().getReturnType();
       final JvmParameterizedTypeReference collectionType = ((JvmParameterizedTypeReference) _returnType);
-      EList<JvmTypeReference> _arguments = collectionType.getArguments();
-      final JvmTypeReference typeInCollection = _arguments.get(0);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      JvmType _type = typeInCollection.getType();
-      String _qualifiedName = _type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
+      final JvmTypeReference typeInCollection = collectionType.getArguments().get(0);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), typeInCollection.getType().getQualifiedName()));
       EList<String> _tags = suspect.getTags();
       _tags.add(tag);
-      JvmType _type_1 = typeInCollection.getType();
-      String _qualifiedName_1 = _type_1.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
-      JvmType _type_2 = typeInCollection.getType();
-      if ((_type_2 instanceof JvmDeclaredType)) {
-        JvmType _type_3 = typeInCollection.getType();
-        final JvmDeclaredType castedType = ((JvmDeclaredType) _type_3);
+      suspect.setTypeQualifiedName(typeInCollection.getType().getQualifiedName());
+      JvmType _type = typeInCollection.getType();
+      if ((_type instanceof JvmDeclaredType)) {
+        JvmType _type_1 = typeInCollection.getType();
+        final JvmDeclaredType castedType = ((JvmDeclaredType) _type_1);
         final Map<String, List<AutowireUtil.Pair>> propMap = this._autowireUtil.toFieldProperties(castedType);
         final Map<String, OperationExtensions.OperationInfo> opInfoMap = OperationExtensions.getOperationInfos(castedType);
         final LinkedHashMap<String, OperationExtensions.OperationInfo> sortedOpInfoMap = this.createSortedOpInfoMapForCollections(opInfoMap);
-        Collection<OperationExtensions.OperationInfo> _values = sortedOpInfoMap.values();
-        final Consumer<OperationExtensions.OperationInfo> _function = new Consumer<OperationExtensions.OperationInfo>() {
-          public void accept(final OperationExtensions.OperationInfo it) {
-            JvmOperation _getter = it.getGetter();
-            JvmTypeReference _returnType = _getter.getReturnType();
-            JvmType detailType = _returnType.getType();
-            YColumnInfo columnInfo = null;
-            final boolean isPrimitive = (detailType instanceof JvmPrimitiveType);
-            boolean _isDomainReference = AutowireHelper.this._typeHelper.isDomainReference(it);
-            if (_isDomainReference) {
-              Map<String, JvmTypeProperties.Info> _operationInfos = JvmTypeProperties.getOperationInfos(((JvmDeclaredType) detailType));
-              Collection<JvmTypeProperties.Info> _values = _operationInfos.values();
-              for (final JvmTypeProperties.Info nestedInfo : _values) {
-                boolean _hasAnnotation = nestedInfo.hasAnnotation(DomainKey.class);
-                if (_hasAnnotation) {
-                  final Map<String, List<AutowireUtil.Pair>> nestPropMap = AutowireHelper.this._autowireUtil.toFieldProperties(((JvmDeclaredType) detailType));
-                  JvmType _type = nestedInfo.getType();
-                  YColumnInfo _createYColumnInfo = AutowireHelper.this.createYColumnInfo(_type);
-                  columnInfo = _createYColumnInfo;
-                  JvmField _field = it.getField();
-                  JvmTypeReference _type_1 = _field.getType();
-                  String _simpleName = _type_1.getSimpleName();
-                  String _plus = (_simpleName + ".");
-                  String _attributePath = nestedInfo.getAttributePath();
-                  String _plus_1 = (_plus + _attributePath);
-                  columnInfo.setName(_plus_1);
-                  String _name = nestedInfo.getName();
-                  List<AutowireUtil.Pair> propList = nestPropMap.get(_name);
-                  AutowireHelper.this.setYColumnInfoProperties(columnInfo, propList);
-                }
+        final Consumer<OperationExtensions.OperationInfo> _function = (OperationExtensions.OperationInfo it) -> {
+          JvmType detailType = it.getGetter().getReturnType().getType();
+          YColumnInfo columnInfo = null;
+          final boolean isPrimitive = (detailType instanceof JvmPrimitiveType);
+          boolean _isDomainReference = this._typeHelper.isDomainReference(it);
+          if (_isDomainReference) {
+            Collection<JvmTypeProperties.Info> _values = JvmTypeProperties.getOperationInfos(((JvmDeclaredType) detailType)).values();
+            for (final JvmTypeProperties.Info nestedInfo : _values) {
+              boolean _hasAnnotation = nestedInfo.hasAnnotation(DomainKey.class);
+              if (_hasAnnotation) {
+                final Map<String, List<AutowireUtil.Pair>> nestPropMap = this._autowireUtil.toFieldProperties(((JvmDeclaredType) detailType));
+                columnInfo = this.createYColumnInfo(nestedInfo.getType());
+                String _simpleName = it.getField().getSimpleName();
+                String _plus = (_simpleName + ".");
+                String _attributePath = nestedInfo.getAttributePath();
+                String _plus_1 = (_plus + _attributePath);
+                columnInfo.setName(_plus_1);
+                List<AutowireUtil.Pair> propList = nestPropMap.get(nestedInfo.getName());
+                this.setYColumnInfoProperties(columnInfo, propList);
               }
-            } else {
-              JvmField _field_1 = it.getField();
-              JvmTypeReference _type_2 = _field_1.getType();
-              JvmType objectType = _type_2.getType();
+            }
+          } else {
+            if ((((!it.isIdOrUUID()) && (!it.isVersion())) && (!it.isDirtyMark()))) {
+              JvmType objectType = it.getField().getType().getType();
               if (isPrimitive) {
-                JvmField _field_2 = it.getField();
-                JvmTypeReference _type_3 = _field_2.getType();
-                JvmType _type_4 = _type_3.getType();
-                final String primitiveTypeName = _type_4.getQualifiedName();
+                final String primitiveTypeName = it.getField().getType().getType().getQualifiedName();
                 JvmVoid _createJvmVoid = TypesFactory.eINSTANCE.createJvmVoid();
                 final InternalEObject proxy = ((InternalEObject) _createJvmVoid);
-                String _objectProxy = AutowireHelper.this.toObjectProxy(primitiveTypeName);
-                URI _createURI = URI.createURI(_objectProxy);
-                proxy.eSetProxyURI(_createURI);
-                Resource _eResource = AutowireHelper.this.uiLayout.eResource();
-                EObject _resolve = EcoreUtil.resolve(proxy, _eResource);
+                proxy.eSetProxyURI(URI.createURI(this.toObjectProxy(primitiveTypeName)));
+                EObject _resolve = EcoreUtil.resolve(proxy, this.uiLayout.eResource());
                 objectType = ((JvmType) _resolve);
               }
-              YColumnInfo _createYColumnInfo_1 = AutowireHelper.this.createYColumnInfo(objectType);
-              columnInfo = _createYColumnInfo_1;
-              String _name_1 = it.getName();
-              columnInfo.setName(_name_1);
-              JvmField _field_3 = it.getField();
-              String _identifier = _field_3.getIdentifier();
-              List<AutowireUtil.Pair> propList_1 = propMap.get(_identifier);
-              AutowireHelper.this.setYColumnInfoProperties(columnInfo, propList_1);
-            }
-            boolean _notEquals = (!Objects.equal(columnInfo, null));
-            if (_notEquals) {
-              String _name_2 = columnInfo.getName();
-              columnInfo.setLabelI18nKey(_name_2);
-              EList<YColumnInfo> _columns = suspect.getColumns();
-              _columns.add(columnInfo);
+              columnInfo = this.createYColumnInfo(objectType);
+              columnInfo.setName(it.getName());
+              List<AutowireUtil.Pair> propList_1 = propMap.get(it.getField().getIdentifier());
+              this.setYColumnInfoProperties(columnInfo, propList_1);
             }
           }
+          if ((columnInfo != null)) {
+            columnInfo.setLabelI18nKey(columnInfo.getName());
+            EList<YColumnInfo> _columns = suspect.getColumns();
+            _columns.add(columnInfo);
+          }
         };
-        _values.forEach(_function);
+        sortedOpInfoMap.values().forEach(_function);
       }
       _xblockexpression = suspect;
     }
@@ -1650,23 +1323,32 @@
    * Creates a proxy object
    */
   public String toObjectProxy(final String primitiveTypeName) {
-    boolean _matched = false;
-    if (!_matched) {
-      if (Objects.equal(primitiveTypeName, "int")) {
-        _matched=true;
-        StringConcatenation _builder = new StringConcatenation();
-        _builder.append("java:/Objects/java.lang.Integer#java.lang.Integer");
-        return _builder.toString();
+    if (primitiveTypeName != null) {
+      switch (primitiveTypeName) {
+        case "int":
+          StringConcatenation _builder = new StringConcatenation();
+          _builder.append("java:/Objects/java.lang.Integer#java.lang.Integer");
+          return _builder.toString();
+        default:
+          StringConcatenation _builder_1 = new StringConcatenation();
+          _builder_1.append("java:/Objects/java.lang.");
+          String _firstUpper = StringExtensions.toFirstUpper(primitiveTypeName);
+          _builder_1.append(_firstUpper);
+          _builder_1.append("#java.lang.");
+          String _firstUpper_1 = StringExtensions.toFirstUpper(primitiveTypeName);
+          _builder_1.append(_firstUpper_1);
+          return _builder_1.toString();
       }
+    } else {
+      StringConcatenation _builder_1 = new StringConcatenation();
+      _builder_1.append("java:/Objects/java.lang.");
+      String _firstUpper = StringExtensions.toFirstUpper(primitiveTypeName);
+      _builder_1.append(_firstUpper);
+      _builder_1.append("#java.lang.");
+      String _firstUpper_1 = StringExtensions.toFirstUpper(primitiveTypeName);
+      _builder_1.append(_firstUpper_1);
+      return _builder_1.toString();
     }
-    StringConcatenation _builder_1 = new StringConcatenation();
-    _builder_1.append("java:/Objects/java.lang.");
-    String _firstUpper = StringExtensions.toFirstUpper(primitiveTypeName);
-    _builder_1.append(_firstUpper, "");
-    _builder_1.append("#java.lang.");
-    String _firstUpper_1 = StringExtensions.toFirstUpper(primitiveTypeName);
-    _builder_1.append(_firstUpper_1, "");
-    return _builder_1.toString();
   }
   
   public void createMobileSwitch(final JvmType type, final OperationExtensions.OperationInfo info) {
@@ -1674,8 +1356,7 @@
     boolean _isReadonly = info.isReadonly();
     boolean _not = (!_isReadonly);
     yField.setInitialEnabled(_not);
-    String _name = info.getName();
-    yField.setLabel(_name);
+    yField.setLabel(info.getName());
     this.layouter.add(yField);
     this.createBinding(yField, info, type, "value");
   }
@@ -1696,17 +1377,13 @@
         } else {
           String _qualifiedName = type.getQualifiedName();
           String _plus = ("RichTextFields need to be bound to String or byte[]. " + _qualifiedName);
-          String _plus_1 = (_plus + " is not a valid option.");
+          String _plus_1 = (_plus + 
+            " is not a valid option.");
           throw new IllegalArgumentException(_plus_1);
         }
       }
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName_1 = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName_1);
-      suspect.setType(_loadClass);
-      String _qualifiedName_2 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_2);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1718,15 +1395,9 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__MASKED_TEXT_FIELD);
-      EMap<String, String> _properties = suspect.getProperties();
-      _properties.put(ILayoutingStrategy.PROPERTY_MASK, mask);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.getProperties().put(ILayoutingStrategy.PROPERTY_MASK, mask);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1738,15 +1409,9 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__MASKED_DECIMAL_FIELD);
-      EMap<String, String> _properties = suspect.getProperties();
-      _properties.put(ILayoutingStrategy.PROPERTY_MASK, mask);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.getProperties().put(ILayoutingStrategy.PROPERTY_MASK, mask);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1766,13 +1431,8 @@
         String _plus_1 = (_plus + " is not a valid option.");
         throw new IllegalArgumentException(_plus_1);
       }
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName_1 = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName_1);
-      suspect.setType(_loadClass);
-      String _qualifiedName_2 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_2);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1784,13 +1444,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__BLOB);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1802,13 +1457,8 @@
       final YTypedSuspect suspect = YECviewFactory.eINSTANCE.createYTypedSuspect();
       EList<String> _tags = suspect.getTags();
       _tags.add(ILayoutingStrategy.TAG__DECIMAL);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = type.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      suspect.setType(_loadClass);
-      String _qualifiedName_1 = type.getQualifiedName();
-      suspect.setTypeQualifiedName(_qualifiedName_1);
+      suspect.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), type.getQualifiedName()));
+      suspect.setTypeQualifiedName(type.getQualifiedName());
       _xblockexpression = suspect;
     }
     return _xblockexpression;
@@ -1822,38 +1472,15 @@
     final UiBindingEndpointAssignment uiModelEndpoint = ((UiBindingEndpointAssignment) _autoWireSource);
     final YValueBindingEndpoint yModelEndpoint = this.computer.createValueBindingEndpoint(uiModelEndpoint);
     final YDetailValueBindingEndpoint detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint();
-    String _name = info.getName();
-    detailValueEndpoint.setPropertyPath(_name);
-    Resource _eResource = this.uiLayout.eResource();
-    ResourceSet _resourceSet = _eResource.getResourceSet();
-    String _qualifiedName = this.beanType.getQualifiedName();
-    Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-    detailValueEndpoint.setType(_loadClass);
+    detailValueEndpoint.setPropertyPath(info.getName());
+    detailValueEndpoint.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), this.beanType.getQualifiedName()));
     final YECViewModelValueBindingEndpoint yFieldEndpoint = BindingFactory.eINSTANCE.createYECViewModelValueBindingEndpoint();
     yFieldEndpoint.setElement(yField);
     yFieldEndpoint.setPropertyPath(fieldProperty);
-    String _qualifiedName_1 = this.beanType.getQualifiedName();
-    yFieldEndpoint.setTypeQualifiedName(_qualifiedName_1);
-    Resource _eResource_1 = this.uiLayout.eResource();
-    ResourceSet _resourceSet_1 = _eResource_1.getResourceSet();
-    String _qualifiedName_2 = this.beanType.getQualifiedName();
-    Class<?> _loadClass_1 = this.computer.loadClass(_resourceSet_1, _qualifiedName_2);
-    yFieldEndpoint.setType(_loadClass_1);
-    boolean _and = false;
-    Class<?> _type = yFieldEndpoint.getType();
-    boolean _notEquals = (!Objects.equal(_type, null));
-    if (!_notEquals) {
-      _and = false;
-    } else {
-      Class<?> _type_1 = yFieldEndpoint.getType();
-      boolean _isAssignableFrom = _type_1.isAssignableFrom(EObject.class);
-      _and = _isAssignableFrom;
-    }
-    if (_and) {
-      EClass _eClass = yField.eClass();
-      EPackage _ePackage = _eClass.getEPackage();
-      String _nsURI = _ePackage.getNsURI();
-      yFieldEndpoint.setEmfNsURI(_nsURI);
+    yFieldEndpoint.setTypeQualifiedName(this.beanType.getQualifiedName());
+    yFieldEndpoint.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), this.beanType.getQualifiedName()));
+    if (((yFieldEndpoint.getType() != null) && yFieldEndpoint.getType().isAssignableFrom(EObject.class))) {
+      yFieldEndpoint.setEmfNsURI(yField.eClass().getEPackage().getNsURI());
     }
     final YValueBinding yBinding = BindingFactory.eINSTANCE.createYValueBinding();
     yBinding.setTargetEndpoint(yFieldEndpoint);
@@ -1867,54 +1494,74 @@
       _xifexpression = YBindingUpdateStrategy.UPDATE;
     }
     yBinding.setTargetToModelStrategy(_xifexpression);
-    YView _view = this.yLayout.getView();
-    YBindingSet _orCreateBindingSet = _view.getOrCreateBindingSet();
-    EList<YBinding> _bindings = _orCreateBindingSet.getBindings();
+    EList<YBinding> _bindings = this.yLayout.getView().getOrCreateBindingSet().getBindings();
     _bindings.add(yBinding);
-    String _propertyPath = detailValueEndpoint.getPropertyPath();
-    yField.setLabelI18nKey(_propertyPath);
+    yField.setLabelI18nKey(detailValueEndpoint.getPropertyPath());
   }
   
   /**
    * Create the bindings and install at the view
    */
-  public void createBinding(final YSuspect suspect, final String propertyPath, final JvmType type, final String fieldProperty) {
+  public void createModelValueBinding(final YSuspect suspect, final String propertyPath, final JvmType type, final String fieldProperty, final JvmType parentType) {
     final YBeanSlot subTypeBeanSlot = this.findSubTypeBeanSlot(suspect);
     YValueBindingEndpoint endpoint = null;
     String path = "";
-    boolean _equals = Objects.equal(subTypeBeanSlot, null);
-    if (_equals) {
+    if ((subTypeBeanSlot == null)) {
       UiBindingExpression _autoWireSource = this.uiLayout.getAutoWireSource();
       final UiBindingEndpointAssignment uiModelEndpoint = ((UiBindingEndpointAssignment) _autoWireSource);
       final YValueBindingEndpoint yModelEndpoint = this.computer.createValueBindingEndpoint(uiModelEndpoint);
       final YDetailValueBindingEndpoint detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint();
       detailValueEndpoint.setPropertyPath(propertyPath);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _qualifiedName = this.beanType.getQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _qualifiedName);
-      detailValueEndpoint.setType(_loadClass);
+      detailValueEndpoint.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), 
+        parentType.getQualifiedName()));
       endpoint = detailValueEndpoint;
-      String _propertyPath = detailValueEndpoint.getPropertyPath();
-      path = _propertyPath;
+      path = detailValueEndpoint.getPropertyPath();
     } else {
-      YBeanSlotValueBindingEndpoint _createBindingEndpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath);
-      endpoint = _createBindingEndpoint;
+      endpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath);
       path = propertyPath;
     }
-    EList<YBindingEndpoint> _valueBindingEndpoints = suspect.getValueBindingEndpoints();
-    _valueBindingEndpoints.add(endpoint);
+    suspect.getValueBindingEndpoints().add(endpoint);
     suspect.setLabelI18nKey(path);
     suspect.setLabel(propertyPath);
   }
   
   /**
+   * Creates a binding which points to the container of the property
+   */
+  public void createModelValueContainerBinding(final YSuspect suspect, final String propertyPath, final JvmType type, final String property) {
+    String fieldProperty = property;
+    boolean _contains = fieldProperty.contains(".");
+    if (_contains) {
+      fieldProperty = fieldProperty.substring(0, fieldProperty.lastIndexOf("."));
+    } else {
+      fieldProperty = null;
+    }
+    final YBeanSlot subTypeBeanSlot = this.findSubTypeBeanSlot(suspect);
+    YValueBindingEndpoint endpoint = null;
+    if ((subTypeBeanSlot == null)) {
+      UiBindingExpression _autoWireSource = this.uiLayout.getAutoWireSource();
+      final UiBindingEndpointAssignment uiModelEndpoint = ((UiBindingEndpointAssignment) _autoWireSource);
+      final YValueBindingEndpoint yModelEndpoint = this.computer.createValueBindingEndpoint(uiModelEndpoint);
+      endpoint = yModelEndpoint;
+      if ((fieldProperty != null)) {
+        final YDetailValueBindingEndpoint detailValueEndpoint = yModelEndpoint.createDetailValueEndpoint();
+        detailValueEndpoint.setPropertyPath(propertyPath);
+        detailValueEndpoint.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), 
+          this.beanType.getQualifiedName()));
+        endpoint = detailValueEndpoint;
+      }
+    } else {
+      endpoint = subTypeBeanSlot.createBindingEndpoint(propertyPath);
+    }
+    suspect.setContainerValueBindingEndpoint(endpoint);
+  }
+  
+  /**
    * Checks if the suspect is contained in an YSubTypeSuspect. <br>
    * If so, then the detail beanslot of the YSubTypeSuspect is returned. Null otherwise.
    */
   public YBeanSlot findSubTypeBeanSlot(final YSuspect suspect) {
-    boolean _equals = Objects.equal(suspect, null);
-    if (_equals) {
+    if ((suspect == null)) {
       return null;
     }
     if ((suspect instanceof YSubTypeSuspect)) {
@@ -1931,16 +1578,18 @@
    * Create the bindings and install at the view
    */
   public void createModelListBinding(final YSuspect suspect, final OperationExtensions.OperationInfo info, final JvmType type, final String fieldProperty) {
-    UiBindingExpression _autoWireSource = this.uiLayout.getAutoWireSource();
-    final UiBindingEndpointAssignment uiModelEndpoint = ((UiBindingEndpointAssignment) _autoWireSource);
-    String _name = info.getName();
-    final YListBindingEndpoint yModelEndpoint = this.createListBindingEndpointWithNested(uiModelEndpoint, _name);
-    EList<YBindingEndpoint> _valueBindingEndpoints = suspect.getValueBindingEndpoints();
-    _valueBindingEndpoints.add(yModelEndpoint);
-    String _name_1 = info.getName();
-    suspect.setLabelI18nKey(_name_1);
-    String _name_2 = info.getName();
-    suspect.setLabel(_name_2);
+    final YBeanSlot subTypeBeanSlot = this.findSubTypeBeanSlot(suspect);
+    YListBindingEndpoint endpoint = null;
+    if ((subTypeBeanSlot == null)) {
+      UiBindingExpression _autoWireSource = this.uiLayout.getAutoWireSource();
+      final UiBindingEndpointAssignment uiModelEndpoint = ((UiBindingEndpointAssignment) _autoWireSource);
+      endpoint = this.createListBindingEndpointWithNested(uiModelEndpoint, info.getName());
+    } else {
+      endpoint = subTypeBeanSlot.createListBindingEndpoint(info.getName(), subTypeBeanSlot.getValueType());
+    }
+    suspect.getValueBindingEndpoints().add(endpoint);
+    suspect.setLabelI18nKey(info.getName());
+    suspect.setLabel(info.getName());
   }
   
   /**
@@ -1950,8 +1599,7 @@
    * So we need to access the children collection of the beanslot by a nested property path: <code>beanslot.father.children</code>
    */
   public YListBindingEndpoint createListBindingEndpointWithNested(final UiBindingEndpointAssignment epDef, final String attributePath) {
-    boolean _equals = Objects.equal(epDef, null);
-    if (_equals) {
+    if ((epDef == null)) {
       return null;
     }
     YListBindingEndpoint result = null;
@@ -1964,36 +1612,23 @@
       final YBeanSlot yBeanSlot = this.computer.<YBeanSlot>associatedUi(uiBeanSlot);
       final YBeanSlotListBindingEndpoint ep = this.factory.createBeanSlotListBindingEndpoint();
       ep.setBeanSlot(yBeanSlot);
-      String _nestedCollectionPath = this.toNestedCollectionPath(info, attributePath);
-      ep.setAttributePath(_nestedCollectionPath);
+      ep.setAttributePath(this.toNestedCollectionPath(info, attributePath));
       result = ep;
     } else {
       EObject _bindingRoot_2 = info.getBindingRoot();
       if ((_bindingRoot_2 instanceof UiEmbeddable)) {
-        EObject _bindingRoot_3 = info.getBindingRoot();
-        final YEmbeddable yElement = this.computer.<YEmbeddable>associatedUi(_bindingRoot_3);
+        final YEmbeddable yElement = this.computer.<YEmbeddable>associatedUi(info.getBindingRoot());
         final YECViewModelListBindingEndpoint ep_1 = this.factory.createECViewModelListBindingEndpoint();
         ep_1.setElement(yElement);
-        String _nestedCollectionPath_1 = this.toNestedCollectionPath(info, attributePath);
-        ep_1.setPropertyPath(_nestedCollectionPath_1);
+        ep_1.setPropertyPath(this.toNestedCollectionPath(info, attributePath));
         JvmType _typeForBinding = info.getTypeForBinding();
-        boolean _notEquals = (!Objects.equal(_typeForBinding, null));
-        if (_notEquals) {
-          JvmType _typeForBinding_1 = info.getTypeForBinding();
-          String _qualifiedName = _typeForBinding_1.getQualifiedName();
-          ep_1.setTypeQualifiedName(_qualifiedName);
-          Resource _eResource = epDef.eResource();
-          ResourceSet _resourceSet = _eResource.getResourceSet();
-          String _typeQualifiedName = ep_1.getTypeQualifiedName();
-          Class<?> _loadClass = this.computer.loadClass(_resourceSet, _typeQualifiedName);
-          ep_1.setType(_loadClass);
+        boolean _tripleNotEquals = (_typeForBinding != null);
+        if (_tripleNotEquals) {
+          ep_1.setTypeQualifiedName(info.getTypeForBinding().getQualifiedName());
+          ep_1.setType(this.computer.loadClass(epDef.eResource().getResourceSet(), ep_1.getTypeQualifiedName()));
         }
-        boolean _notEquals_1 = (!Objects.equal(yElement, null));
-        if (_notEquals_1) {
-          EClass _eClass = yElement.eClass();
-          EPackage _ePackage = _eClass.getEPackage();
-          String _nsURI = _ePackage.getNsURI();
-          ep_1.setEmfNsURI(_nsURI);
+        if ((yElement != null)) {
+          ep_1.setEmfNsURI(yElement.eClass().getEPackage().getNsURI());
         }
         result = ep_1;
       }
@@ -2005,14 +1640,10 @@
     String _xblockexpression = null;
     {
       final StringBuilder b = new StringBuilder();
-      StringBuilder _path = info.getPath();
-      String _string = _path.toString();
-      boolean _isNullOrEmpty = StringExtensions.isNullOrEmpty(_string);
+      boolean _isNullOrEmpty = StringExtensions.isNullOrEmpty(info.getPath().toString());
       boolean _not = (!_isNullOrEmpty);
       if (_not) {
-        StringBuilder _path_1 = info.getPath();
-        String _string_1 = _path_1.toString();
-        b.append(_string_1);
+        b.append(info.getPath().toString());
       }
       boolean _isNullOrEmpty_1 = StringExtensions.isNullOrEmpty(attributePath);
       boolean _not_1 = (!_isNullOrEmpty_1);
@@ -2037,13 +1668,8 @@
     YColumnInfo _xblockexpression = null;
     {
       final YColumnInfo columnInfo = YECviewFactory.eINSTANCE.createYColumnInfo();
-      String _qualifiedName = type.getQualifiedName();
-      columnInfo.setTypeQualifiedName(_qualifiedName);
-      Resource _eResource = this.uiLayout.eResource();
-      ResourceSet _resourceSet = _eResource.getResourceSet();
-      String _typeQualifiedName = columnInfo.getTypeQualifiedName();
-      Class<?> _loadClass = this.computer.loadClass(_resourceSet, _typeQualifiedName);
-      columnInfo.setType(_loadClass);
+      columnInfo.setTypeQualifiedName(type.getQualifiedName());
+      columnInfo.setType(this.computer.loadClass(this.uiLayout.eResource().getResourceSet(), columnInfo.getTypeQualifiedName()));
       _xblockexpression = columnInfo;
     }
     return _xblockexpression;
@@ -2054,8 +1680,7 @@
    */
   public void setYColumnInfoProperties(final YColumnInfo columnInfo, final List<AutowireUtil.Pair> propList) {
     EMap<String, String> properties = columnInfo.getProperties();
-    boolean _notEquals = (!Objects.equal(propList, null));
-    if (_notEquals) {
+    if ((propList != null)) {
       for (final AutowireUtil.Pair prop : propList) {
         properties.put(prop.key, prop.value);
       }
diff --git a/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.java b/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.java
index f5d89bb..734d49d 100644
--- a/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.java
+++ b/org.eclipse.osbp.autowireHelper/xtend-gen/org/eclipse/osbp/autowirehelper/utils/AutowireUtil.java
@@ -23,10 +23,8 @@
 import org.apache.commons.lang.StringEscapeUtils;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
 import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
 import org.eclipse.osbp.dsl.semantic.common.types.LKeyAndValue;
-import org.eclipse.osbp.dsl.semantic.common.types.LReference;
 import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
 import org.eclipse.osbp.dsl.semantic.dto.LDto;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoAbstractAttribute;
@@ -38,23 +36,22 @@
 import org.eclipse.osbp.ecview.dsl.extensions.OperationExtensions;
 import org.eclipse.osbp.ecview.dsl.extensions.TypeHelper;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
-import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingExpression;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiLayout;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiView;
 import org.eclipse.osbp.ecview.semantic.uimodel.impl.UiViewImpl;
 import org.eclipse.osbp.runtime.common.annotations.DomainDescription;
 import org.eclipse.osbp.runtime.common.annotations.DomainKey;
+import org.eclipse.osbp.runtime.common.annotations.FilterDepth;
 import org.eclipse.osbp.runtime.common.annotations.Properties;
 import org.eclipse.osbp.utils.common.EntityUtils;
 import org.eclipse.xtend2.lib.StringConcatenation;
 import org.eclipse.xtext.common.types.JvmAnnotationAnnotationValue;
 import org.eclipse.xtext.common.types.JvmAnnotationReference;
-import org.eclipse.xtext.common.types.JvmAnnotationType;
 import org.eclipse.xtext.common.types.JvmAnnotationValue;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
-import org.eclipse.xtext.common.types.JvmFeature;
 import org.eclipse.xtext.common.types.JvmField;
+import org.eclipse.xtext.common.types.JvmIntAnnotationValue;
 import org.eclipse.xtext.common.types.JvmMember;
 import org.eclipse.xtext.common.types.JvmStringAnnotationValue;
 import org.eclipse.xtext.common.types.JvmType;
@@ -94,29 +91,26 @@
   
   public String generateId(final UiLayout layout) {
     final BindableTypeResolver resolver = new BindableTypeResolver();
-    UiBindingExpression _autoWireSource = layout.getAutoWireSource();
-    JvmType resolvedType = resolver.resolveType(_autoWireSource);
+    JvmType resolvedType = resolver.resolveType(layout.getAutoWireSource());
     String viewName = "";
     EObject parent = layout.eContainer();
     while ((!(parent instanceof UiModel))) {
       {
         if ((parent instanceof UiViewImpl)) {
-          String _name = ((UiViewImpl) parent).getName();
-          viewName = _name;
+          viewName = ((UiViewImpl) parent).getName();
         }
-        EObject _eContainer = parent.eContainer();
-        parent = _eContainer;
+        parent = parent.eContainer();
       }
     }
     UiModel uimodel = ((UiModel) parent);
     StringConcatenation _builder = new StringConcatenation();
     String _packageName = uimodel.getPackageName();
-    _builder.append(_packageName, "");
+    _builder.append(_packageName);
     {
       boolean _notEquals = (!Objects.equal(viewName, null));
       if (_notEquals) {
         _builder.append(".");
-        _builder.append(viewName, "");
+        _builder.append(viewName);
       }
     }
     {
@@ -124,7 +118,7 @@
       if (_notEquals_1) {
         _builder.append(".");
         String _identifier = resolvedType.getIdentifier();
-        _builder.append(_identifier, "");
+        _builder.append(_identifier);
       }
     }
     return _builder.toString();
@@ -133,8 +127,7 @@
   public UiView getUiView(final UiLayout layout) {
     EObject parent = layout.eContainer();
     while ((!(parent instanceof UiViewImpl))) {
-      EObject _eContainer = parent.eContainer();
-      parent = _eContainer;
+      parent = parent.eContainer();
     }
     if ((parent instanceof UiViewImpl)) {
       return ((UiViewImpl) parent);
@@ -146,14 +139,11 @@
     LDto dto = EntityUtils.getDto(type);
     boolean _notEquals = (!Objects.equal(dto, null));
     if (_notEquals) {
-      List<LDtoAbstractAttribute> _attributes = dto.getAttributes();
-      final Function1<LDtoAbstractAttribute, Boolean> _function = new Function1<LDtoAbstractAttribute, Boolean>() {
-        public Boolean apply(final LDtoAbstractAttribute it) {
-          String _name = AutowireUtil.this.toName(it);
-          return Boolean.valueOf(Objects.equal(_name, attribute));
-        }
+      final Function1<LDtoAbstractAttribute, Boolean> _function = (LDtoAbstractAttribute it) -> {
+        String _name = this.toName(it);
+        return Boolean.valueOf(Objects.equal(_name, attribute));
       };
-      LDtoAbstractAttribute attr = IterableExtensions.<LDtoAbstractAttribute>findFirst(_attributes, _function);
+      LDtoAbstractAttribute attr = IterableExtensions.<LDtoAbstractAttribute>findFirst(dto.getAttributes(), _function);
       boolean _notEquals_1 = (!Objects.equal(attr, null));
       if (_notEquals_1) {
         LScalarType _datatype = this.toDatatype(attr);
@@ -169,13 +159,11 @@
    * Detects all the existing properties of the jvmtype corresponding attribute, the datatype of the attribute and references.
    */
   public List<AutowireUtil.Pair> toProperties(final JvmDeclaredType type, final String attributeName) {
-    Map<String, List<AutowireUtil.Pair>> _fieldProperties = this.toFieldProperties(type);
-    final List<AutowireUtil.Pair> result = _fieldProperties.get(attributeName);
+    final List<AutowireUtil.Pair> result = this.toFieldProperties(type).get(attributeName);
     boolean _notEquals = (!Objects.equal(result, null));
     if (_notEquals) {
       for (final AutowireUtil.Pair prop : result) {
-        String _unescapeHtml = StringEscapeUtils.unescapeHtml(prop.value);
-        prop.value = _unescapeHtml;
+        prop.value = StringEscapeUtils.unescapeHtml(prop.value);
       }
     }
     List<AutowireUtil.Pair> _xifexpression = null;
@@ -193,87 +181,75 @@
    */
   public Map<String, List<AutowireUtil.Pair>> toFieldProperties(final JvmDeclaredType jvmType) {
     final Map<String, List<AutowireUtil.Pair>> propMap = CollectionLiterals.<String, List<AutowireUtil.Pair>>newHashMap();
-    Iterable<JvmFeature> _allFeatures = jvmType.getAllFeatures();
-    Iterable<JvmField> _filter = Iterables.<JvmField>filter(_allFeatures, JvmField.class);
-    final Consumer<JvmField> _function = new Consumer<JvmField>() {
-      public void accept(final JvmField it) {
-        StringConcatenation _builder = new StringConcatenation();
-        String _qualifiedName = jvmType.getQualifiedName();
-        _builder.append(_qualifiedName, "");
-        _builder.append(".");
-        String _simpleName = it.getSimpleName();
-        _builder.append(_simpleName, "");
-        final String attrPropKey = _builder.toString();
-        final List<AutowireUtil.Pair> values = CollectionLiterals.<AutowireUtil.Pair>newArrayList();
-        propMap.put(attrPropKey, values);
-        EList<JvmAnnotationReference> _annotations = it.getAnnotations();
-        final Function1<JvmAnnotationReference, Boolean> _function = new Function1<JvmAnnotationReference, Boolean>() {
-          public Boolean apply(final JvmAnnotationReference e) {
-            JvmAnnotationType _annotation = e.getAnnotation();
-            String _identifier = _annotation.getIdentifier();
-            String _name = Properties.class.getName();
-            final boolean result = _identifier.equals(_name);
-            return Boolean.valueOf(result);
-          }
+    final Consumer<JvmField> _function = (JvmField it) -> {
+      StringConcatenation _builder = new StringConcatenation();
+      String _qualifiedName = jvmType.getQualifiedName();
+      _builder.append(_qualifiedName);
+      _builder.append(".");
+      String _simpleName = it.getSimpleName();
+      _builder.append(_simpleName);
+      final String attrPropKey = _builder.toString();
+      final List<AutowireUtil.Pair> values = CollectionLiterals.<AutowireUtil.Pair>newArrayList();
+      propMap.put(attrPropKey, values);
+      final Function1<JvmAnnotationReference, Boolean> _function_1 = (JvmAnnotationReference e) -> {
+        final boolean result = e.getAnnotation().getIdentifier().equals(Properties.class.getName());
+        return Boolean.valueOf(result);
+      };
+      final Consumer<JvmAnnotationReference> _function_2 = (JvmAnnotationReference it_1) -> {
+        final JvmAnnotationReference ref = it_1;
+        final Function1<JvmAnnotationValue, JvmAnnotationAnnotationValue> _function_3 = (JvmAnnotationValue it_2) -> {
+          return ((JvmAnnotationAnnotationValue) it_2);
         };
-        Iterable<JvmAnnotationReference> _filter = IterableExtensions.<JvmAnnotationReference>filter(_annotations, _function);
-        final Consumer<JvmAnnotationReference> _function_1 = new Consumer<JvmAnnotationReference>() {
-          public void accept(final JvmAnnotationReference it) {
-            final JvmAnnotationReference ref = it;
-            EList<JvmAnnotationValue> _values = ref.getValues();
-            final Function1<JvmAnnotationValue, JvmAnnotationAnnotationValue> _function = new Function1<JvmAnnotationValue, JvmAnnotationAnnotationValue>() {
-              public JvmAnnotationAnnotationValue apply(final JvmAnnotationValue it) {
-                return ((JvmAnnotationAnnotationValue) it);
-              }
-            };
-            List<JvmAnnotationAnnotationValue> _map = ListExtensions.<JvmAnnotationValue, JvmAnnotationAnnotationValue>map(_values, _function);
-            final Consumer<JvmAnnotationAnnotationValue> _function_1 = new Consumer<JvmAnnotationAnnotationValue>() {
-              public void accept(final JvmAnnotationAnnotationValue av) {
-                EList<JvmAnnotationReference> _values = av.getValues();
-                final Consumer<JvmAnnotationReference> _function = new Consumer<JvmAnnotationReference>() {
-                  public void accept(final JvmAnnotationReference it) {
-                    EList<JvmAnnotationValue> _values = it.getValues();
-                    JvmAnnotationValue _get = _values.get(0);
-                    final JvmStringAnnotationValue keyAn = ((JvmStringAnnotationValue) _get);
-                    EList<JvmAnnotationValue> _values_1 = it.getValues();
-                    JvmAnnotationValue _get_1 = _values_1.get(1);
-                    final JvmStringAnnotationValue valueAn = ((JvmStringAnnotationValue) _get_1);
-                    EList<String> _values_2 = keyAn.getValues();
-                    String _get_2 = _values_2.get(0);
-                    EList<String> _values_3 = valueAn.getValues();
-                    String _get_3 = _values_3.get(0);
-                    AutowireUtil.Pair _pair = new AutowireUtil.Pair(_get_2, _get_3);
-                    values.add(_pair);
-                  }
-                };
-                _values.forEach(_function);
-              }
-            };
-            _map.forEach(_function_1);
-          }
+        final Consumer<JvmAnnotationAnnotationValue> _function_4 = (JvmAnnotationAnnotationValue av) -> {
+          final Consumer<JvmAnnotationReference> _function_5 = (JvmAnnotationReference it_2) -> {
+            JvmAnnotationValue _get = it_2.getValues().get(0);
+            final JvmStringAnnotationValue keyAn = ((JvmStringAnnotationValue) _get);
+            JvmAnnotationValue _get_1 = it_2.getValues().get(1);
+            final JvmStringAnnotationValue valueAn = ((JvmStringAnnotationValue) _get_1);
+            String _get_2 = keyAn.getValues().get(0);
+            String _get_3 = valueAn.getValues().get(0);
+            AutowireUtil.Pair _pair = new AutowireUtil.Pair(_get_2, _get_3);
+            values.add(_pair);
+          };
+          av.getValues().forEach(_function_5);
         };
-        _filter.forEach(_function_1);
-      }
+        ListExtensions.<JvmAnnotationValue, JvmAnnotationAnnotationValue>map(ref.getValues(), _function_3).forEach(_function_4);
+      };
+      IterableExtensions.<JvmAnnotationReference>filter(it.getAnnotations(), _function_1).forEach(_function_2);
     };
-    _filter.forEach(_function);
+    Iterables.<JvmField>filter(jvmType.getAllFeatures(), JvmField.class).forEach(_function);
     return propMap;
   }
   
   /**
+   * Returns the depth of the filter for BeanReferenceFields
+   */
+  public int toFilterDepth(final JvmField field) {
+    final Function1<JvmAnnotationReference, Boolean> _function = (JvmAnnotationReference e) -> {
+      final boolean result = e.getAnnotation().getIdentifier().equals(FilterDepth.class.getName());
+      return Boolean.valueOf(result);
+    };
+    final JvmAnnotationReference ref = IterableExtensions.<JvmAnnotationReference>findFirst(field.getAnnotations(), _function);
+    if ((ref == null)) {
+      return 0;
+    }
+    JvmAnnotationValue _get = ref.getValues().get(0);
+    final JvmIntAnnotationValue depthVal = ((JvmIntAnnotationValue) _get);
+    return (depthVal.getValues().get(0)).intValue();
+  }
+  
+  /**
    * Detects all the existing properties of the jvmtype corresponding datatype of the attribute.
    */
   public LDataType toDataType(final JvmType type, final String attributeName) {
     LDto dto = EntityUtils.getDto(type);
     boolean _notEquals = (!Objects.equal(dto, null));
     if (_notEquals) {
-      List<LDtoAbstractAttribute> _attributes = dto.getAttributes();
-      final Function1<LDtoAbstractAttribute, Boolean> _function = new Function1<LDtoAbstractAttribute, Boolean>() {
-        public Boolean apply(final LDtoAbstractAttribute it) {
-          String _name = AutowireUtil.this.toName(it);
-          return Boolean.valueOf(Objects.equal(_name, attributeName));
-        }
+      final Function1<LDtoAbstractAttribute, Boolean> _function = (LDtoAbstractAttribute it) -> {
+        String _name = this.toName(it);
+        return Boolean.valueOf(Objects.equal(_name, attributeName));
       };
-      LDtoAbstractAttribute attr = IterableExtensions.<LDtoAbstractAttribute>findFirst(_attributes, _function);
+      LDtoAbstractAttribute attr = IterableExtensions.<LDtoAbstractAttribute>findFirst(dto.getAttributes(), _function);
       boolean _notEquals_1 = (!Objects.equal(attr, null));
       if (_notEquals_1) {
         LScalarType dataType = this.toDatatype(attr);
@@ -300,12 +276,10 @@
   
   public String toName(final LDtoFeature feature) {
     if ((feature instanceof LDtoInheritedAttribute)) {
-      LAttribute _inheritedFeature = ((LDtoInheritedAttribute)feature).getInheritedFeature();
-      return _inheritedFeature.getName();
+      return ((LDtoInheritedAttribute)feature).getInheritedFeature().getName();
     } else {
       if ((feature instanceof LDtoInheritedReference)) {
-        LReference _inheritedFeature_1 = ((LDtoInheritedReference)feature).getInheritedFeature();
-        return _inheritedFeature_1.getName();
+        return ((LDtoInheritedReference)feature).getInheritedFeature().getName();
       } else {
         return feature.getName();
       }
@@ -314,8 +288,7 @@
   
   public LScalarType toDatatype(final LDtoAbstractAttribute att) {
     if ((att instanceof LDtoInheritedAttribute)) {
-      LAttribute _inheritedFeature = ((LDtoInheritedAttribute)att).getInheritedFeature();
-      return _inheritedFeature.getType();
+      return ((LDtoInheritedAttribute)att).getInheritedFeature().getType();
     } else {
       return att.getType();
     }
@@ -323,14 +296,11 @@
   
   public boolean isBlob(final JvmType type, final String attribute) {
     LDto dto = EntityUtils.getDto(type);
-    List<LDtoAbstractAttribute> _attributes = dto.getAttributes();
-    final Function1<LDtoAbstractAttribute, Boolean> _function = new Function1<LDtoAbstractAttribute, Boolean>() {
-      public Boolean apply(final LDtoAbstractAttribute it) {
-        String _name = it.getName();
-        return Boolean.valueOf(Objects.equal(_name, attribute));
-      }
+    final Function1<LDtoAbstractAttribute, Boolean> _function = (LDtoAbstractAttribute it) -> {
+      String _name = it.getName();
+      return Boolean.valueOf(Objects.equal(_name, attribute));
     };
-    Iterable<LDtoAbstractAttribute> attrs = IterableExtensions.<LDtoAbstractAttribute>filter(_attributes, _function);
+    Iterable<LDtoAbstractAttribute> attrs = IterableExtensions.<LDtoAbstractAttribute>filter(dto.getAttributes(), _function);
     for (final LDtoAbstractAttribute attr : attrs) {
       {
         LScalarType _type = attr.getType();
@@ -343,29 +313,24 @@
   }
   
   public String getEntityName(final UiBeanSlot uiBeanSlot) {
-    JvmTypeReference _jvmType = uiBeanSlot.getJvmType();
-    JvmType _type = _jvmType.getType();
-    LEntity _entityFromDto = EntityUtils.getEntityFromDto(_type);
+    LEntity _entityFromDto = EntityUtils.getEntityFromDto(uiBeanSlot.getJvmType().getType());
     final LEntity entity = ((LEntity) _entityFromDto);
     String eName = null;
     boolean _equals = Objects.equal(entity, null);
     if (_equals) {
-      JvmTypeReference _jvmType_1 = uiBeanSlot.getJvmType();
-      JvmType _type_1 = _jvmType_1.getType();
-      boolean _equals_1 = Objects.equal(_type_1, null);
+      JvmType _type = uiBeanSlot.getJvmType().getType();
+      boolean _equals_1 = Objects.equal(_type, null);
       if (_equals_1) {
         eName = "";
       } else {
-        JvmTypeReference _jvmType_2 = uiBeanSlot.getJvmType();
-        JvmType _type_2 = _jvmType_2.getType();
-        boolean _notEquals = (!Objects.equal(_type_2, null));
+        JvmType _type_1 = uiBeanSlot.getJvmType().getType();
+        boolean _notEquals = (!Objects.equal(_type_1, null));
         if (_notEquals) {
           eName = "";
         }
       }
     } else {
-      String _name = entity.getName();
-      eName = _name;
+      eName = entity.getName();
     }
     return eName;
   }
@@ -418,35 +383,16 @@
                   boolean _isDomainReference = this._typeHelper.isDomainReference(info);
                   if (_isDomainReference) {
                     boolean _matched = false;
-                    if (!_matched) {
-                      if (type instanceof JvmDeclaredType) {
-                        _matched=true;
-                        boolean _or = false;
-                        boolean _isAnnotationOf = this.isAnnotationOf(((JvmDeclaredType) type), DomainKey.class);
-                        if (_isAnnotationOf) {
-                          _or = true;
-                        } else {
-                          boolean _isAnnotationOf_1 = this.isAnnotationOf(((JvmDeclaredType) type), DomainDescription.class);
-                          _or = _isAnnotationOf_1;
-                        }
-                        if (_or) {
-                          return true;
-                        }
+                    if (type instanceof JvmDeclaredType) {
+                      _matched=true;
+                      if ((this.isAnnotationOf(((JvmDeclaredType) type), DomainKey.class) || 
+                        this.isAnnotationOf(((JvmDeclaredType) type), DomainDescription.class))) {
+                        return true;
                       }
                     }
                     return false;
                   } else {
-                    boolean _and = false;
-                    JvmField _field = info.getField();
-                    boolean _notEquals = (!Objects.equal(_field, null));
-                    if (!_notEquals) {
-                      _and = false;
-                    } else {
-                      JvmField _field_1 = info.getField();
-                      boolean _isCollection = this._typeHelper.isCollection(_field_1);
-                      _and = _isCollection;
-                    }
-                    if (_and) {
+                    if (((!Objects.equal(info.getField(), null)) && this._typeHelper.isCollection(info.getField()))) {
                       return true;
                     }
                   }
@@ -465,10 +411,7 @@
     for (final JvmMember member : _members) {
       EList<JvmAnnotationReference> _annotations = member.getAnnotations();
       for (final JvmAnnotationReference annotation : _annotations) {
-        JvmAnnotationType _annotation = annotation.getAnnotation();
-        String _identifier = _annotation.getIdentifier();
-        String _canonicalName = clazz.getCanonicalName();
-        boolean _equals = _identifier.equals(_canonicalName);
+        boolean _equals = annotation.getAnnotation().getIdentifier().equals(clazz.getCanonicalName());
         if (_equals) {
           return true;
         }
