diff --git a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
index 9841fc2..dfaf422 100644
--- a/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
+++ b/org.eclipse.osbp.xtext.entitymock/src/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.xtend
@@ -92,6 +92,7 @@
 import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
 import org.osgi.service.component.annotations.Component
 import org.slf4j.Logger
+import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
 
 /**
  * <p>Infers a JVM model from the source model.</p> 
@@ -1224,9 +1225,8 @@
 										''')
 								}
 								EntityMockAttributeByReference: {
-									append('''	internal.set«WordUtils.capitalize(attribute.attributeRef.name)»((«EntityUtils.
-											getDtoFQNForLEntity(attribute.attributeRef.type)»)getMockData().get("«attribute.
-											attributeRef.name»"));
+									append('''	internal.set«WordUtils.capitalize(attribute.attributeRef.name)»(«attribute.attributeRef.baseMockDataTypeCasting('''getMockData().get("«attribute.
+											attributeRef.name»")''')»);
 										''')
 								}
 							}
@@ -1255,7 +1255,7 @@
 			}
 		]
 	}
-
+	
 	def boolean isReferenceOnExistingDto(EntityMockEntityFunctionParameter param) {
 		val entityMock = param.eContainer.eContainer as EntityMockEntity
 		for (attribute : entityMock.attributes) {
@@ -1319,6 +1319,18 @@
 		}
 	}
 
+
+	/**
+     * generate the code for casting a mock data to the data type of the entity attribute
+     */
+	def String baseMockDataTypeCasting(LEntityReference entityRef, String getting) {
+		var text = EntityUtils.getDtoFQNForLEntity(entityRef.type)
+		if (entityRef.multiplicity !== null) {
+			text = '''List<«text»>'''
+		}
+		return '''(«text»)«getting»'''
+	}
+
 	/**
      * generate the code for casting a mock data to the data type of the entity attribute
      */
@@ -1329,6 +1341,9 @@
 		if (attribute.type instanceof LBean) {
 			return '''(«EntityUtils.getDtoFQNForLBean(attribute.type as LBean)»)(«getting»)'''
 		}
+		if (attribute.type instanceof LBean) {
+			return '''(«EntityUtils.getDtoFQNForLBean(attribute.type as LBean)»)(«getting»)'''
+		}
 		var etype = dtType.getBasicType(attribute)
 		switch (etype) {
 			case BOOLEAN: return '''asBoolean(«getting»)'''
@@ -1577,7 +1592,6 @@
 		«iteratorLine»
 		List list«mockEntity.name» = new ArrayList<«mockEntity.entityDtoFQN»>();
 		entityMockDbFiller.notifyInitializationStep("generate «mockEntity.entityMockName(mock)»", 0, 0.6);
-		persistenceService.registerPersistenceUnit(entity«mockEntity.name».getPersistenceUnit(), «mockEntity.entityFQN».class);
 		while (iterator«mockEntity.name».hasNext()) {
 		    list«mockEntity.name».add(entity«mockEntity.name».generateEntity(iterator«mockEntity.name».next()));
 		}
diff --git a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
index 029a6c8..d30f88d 100644
--- a/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
+++ b/org.eclipse.osbp.xtext.entitymock/xtend-gen/org/eclipse/osbp/xtext/entitymock/jvmmodel/EntityMockDSLJvmModelInferrer.java
@@ -33,10 +33,12 @@
 import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
 import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
+import org.eclipse.osbp.dsl.semantic.common.types.LMultiplicity;
 import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
 import org.eclipse.osbp.dsl.semantic.entity.LBean;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
 import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
 import org.eclipse.osbp.ui.api.customfields.IBlobService;
 import org.eclipse.osbp.ui.api.datamart.IDataMart;
@@ -2563,13 +2565,16 @@
                   _builder_10.append("internal.set");
                   String _capitalize = WordUtils.capitalize(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName());
                   _builder_10.append(_capitalize, "\t");
-                  _builder_10.append("((");
-                  String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getType());
-                  _builder_10.append(_dtoFQNForLEntity, "\t");
-                  _builder_10.append(")getMockData().get(\"");
+                  _builder_10.append("(");
+                  LEntityReference _attributeRef = ((EntityMockAttributeByReference)attribute_1).getAttributeRef();
+                  StringConcatenation _builder_11 = new StringConcatenation();
+                  _builder_11.append("getMockData().get(\"");
                   String _name_4 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
-                  _builder_10.append(_name_4, "\t");
-                  _builder_10.append("\"));");
+                  _builder_11.append(_name_4);
+                  _builder_11.append("\")");
+                  String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
+                  _builder_10.append(_baseMockDataTypeCasting, "\t");
+                  _builder_10.append(");");
                   _builder_10.newLineIfNotEmpty();
                   it_2.append(_builder_10);
                 }
@@ -2722,6 +2727,28 @@
   /**
    * generate the code for casting a mock data to the data type of the entity attribute
    */
+  public String baseMockDataTypeCasting(final LEntityReference entityRef, final String getting) {
+    String text = EntityUtils.getDtoFQNForLEntity(entityRef.getType());
+    LMultiplicity _multiplicity = entityRef.getMultiplicity();
+    boolean _tripleNotEquals = (_multiplicity != null);
+    if (_tripleNotEquals) {
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("List<");
+      _builder.append(text);
+      _builder.append(">");
+      text = _builder.toString();
+    }
+    StringConcatenation _builder_1 = new StringConcatenation();
+    _builder_1.append("(");
+    _builder_1.append(text);
+    _builder_1.append(")");
+    _builder_1.append(getting);
+    return _builder_1.toString();
+  }
+  
+  /**
+   * generate the code for casting a mock data to the data type of the entity attribute
+   */
   public String baseMockDataTypeCasting(final LEntityAttribute attribute, final String getting) {
     LScalarType _type = attribute.getType();
     if ((_type instanceof LEnum)) {
@@ -2746,76 +2773,88 @@
       _builder_1.append(")");
       return _builder_1.toString();
     }
+    LScalarType _type_4 = attribute.getType();
+    if ((_type_4 instanceof LBean)) {
+      StringConcatenation _builder_2 = new StringConcatenation();
+      _builder_2.append("(");
+      LScalarType _type_5 = attribute.getType();
+      String _dtoFQNForLBean_1 = EntityUtils.getDtoFQNForLBean(((LBean) _type_5));
+      _builder_2.append(_dtoFQNForLBean_1);
+      _builder_2.append(")(");
+      _builder_2.append(getting);
+      _builder_2.append(")");
+      return _builder_2.toString();
+    }
     IDataMart.EType etype = this.dtType.getBasicType(attribute);
     if (etype != null) {
       switch (etype) {
         case BOOLEAN:
-          StringConcatenation _builder_2 = new StringConcatenation();
-          _builder_2.append("asBoolean(");
-          _builder_2.append(getting);
-          _builder_2.append(")");
-          return _builder_2.toString();
-        case BYTE:
           StringConcatenation _builder_3 = new StringConcatenation();
-          _builder_3.append("asByte(");
+          _builder_3.append("asBoolean(");
           _builder_3.append(getting);
           _builder_3.append(")");
           return _builder_3.toString();
-        case DATE:
+        case BYTE:
           StringConcatenation _builder_4 = new StringConcatenation();
-          _builder_4.append("asDate(");
+          _builder_4.append("asByte(");
           _builder_4.append(getting);
           _builder_4.append(")");
           return _builder_4.toString();
-        case FLOAT:
+        case DATE:
           StringConcatenation _builder_5 = new StringConcatenation();
-          _builder_5.append("asFloat(");
+          _builder_5.append("asDate(");
           _builder_5.append(getting);
           _builder_5.append(")");
           return _builder_5.toString();
-        case DOUBLE:
+        case FLOAT:
           StringConcatenation _builder_6 = new StringConcatenation();
-          _builder_6.append("asDouble(");
+          _builder_6.append("asFloat(");
           _builder_6.append(getting);
           _builder_6.append(")");
           return _builder_6.toString();
-        case SHORT:
+        case DOUBLE:
           StringConcatenation _builder_7 = new StringConcatenation();
-          _builder_7.append("asShort(");
+          _builder_7.append("asDouble(");
           _builder_7.append(getting);
           _builder_7.append(")");
           return _builder_7.toString();
-        case INTEGER:
+        case SHORT:
           StringConcatenation _builder_8 = new StringConcatenation();
-          _builder_8.append("asInt(");
+          _builder_8.append("asShort(");
           _builder_8.append(getting);
           _builder_8.append(")");
           return _builder_8.toString();
-        case LONG:
+        case INTEGER:
           StringConcatenation _builder_9 = new StringConcatenation();
-          _builder_9.append("asLong(");
+          _builder_9.append("asInt(");
           _builder_9.append(getting);
           _builder_9.append(")");
           return _builder_9.toString();
-        case TIME:
+        case LONG:
           StringConcatenation _builder_10 = new StringConcatenation();
-          _builder_10.append("asTime(");
+          _builder_10.append("asLong(");
           _builder_10.append(getting);
           _builder_10.append(")");
           return _builder_10.toString();
-        default:
+        case TIME:
           StringConcatenation _builder_11 = new StringConcatenation();
-          _builder_11.append("asString(");
+          _builder_11.append("asTime(");
           _builder_11.append(getting);
           _builder_11.append(")");
           return _builder_11.toString();
+        default:
+          StringConcatenation _builder_12 = new StringConcatenation();
+          _builder_12.append("asString(");
+          _builder_12.append(getting);
+          _builder_12.append(")");
+          return _builder_12.toString();
       }
     } else {
-      StringConcatenation _builder_11 = new StringConcatenation();
-      _builder_11.append("asString(");
-      _builder_11.append(getting);
-      _builder_11.append(")");
-      return _builder_11.toString();
+      StringConcatenation _builder_12 = new StringConcatenation();
+      _builder_12.append("asString(");
+      _builder_12.append(getting);
+      _builder_12.append(")");
+      return _builder_12.toString();
     }
   }
   
@@ -3346,36 +3385,28 @@
     _builder.append(_entityMockName_3);
     _builder.append("\", 0, 0.6);");
     _builder.newLineIfNotEmpty();
-    _builder.append("persistenceService.registerPersistenceUnit(entity");
+    _builder.append("while (iterator");
     String _name_2 = mockEntity.getName();
     _builder.append(_name_2);
-    _builder.append(".getPersistenceUnit(), ");
-    String _entityFQN = this.entityFQN(mockEntity);
-    _builder.append(_entityFQN);
-    _builder.append(".class);");
-    _builder.newLineIfNotEmpty();
-    _builder.append("while (iterator");
-    String _name_3 = mockEntity.getName();
-    _builder.append(_name_3);
     _builder.append(".hasNext()) {");
     _builder.newLineIfNotEmpty();
     _builder.append("    ");
     _builder.append("list");
+    String _name_3 = mockEntity.getName();
+    _builder.append(_name_3, "    ");
+    _builder.append(".add(entity");
     String _name_4 = mockEntity.getName();
     _builder.append(_name_4, "    ");
-    _builder.append(".add(entity");
+    _builder.append(".generateEntity(iterator");
     String _name_5 = mockEntity.getName();
     _builder.append(_name_5, "    ");
-    _builder.append(".generateEntity(iterator");
-    String _name_6 = mockEntity.getName();
-    _builder.append(_name_6, "    ");
     _builder.append(".next()));");
     _builder.newLineIfNotEmpty();
     _builder.append("}");
     _builder.newLine();
     _builder.append("addMockObjects(\"");
-    String _name_7 = mockEntity.getName();
-    _builder.append(_name_7);
+    String _name_6 = mockEntity.getName();
+    _builder.append(_name_6);
     _builder.append("\", ");
     String _entityDtoFQNClass = this.entityDtoFQNClass(mockEntity);
     _builder.append(_entityDtoFQNClass);
@@ -3383,8 +3414,8 @@
     String _persistenceUnit = mockEntity.getEntityRef().getPersistenceUnit();
     _builder.append(_persistenceUnit);
     _builder.append("\", list");
-    String _name_8 = mockEntity.getName();
-    _builder.append(_name_8);
+    String _name_7 = mockEntity.getName();
+    _builder.append(_name_7);
     _builder.append(");");
     _builder.newLineIfNotEmpty();
     _builder.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
