catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.ide.core.ui/.project b/org.eclipse.osbp.ide.core.ui/.project
index 042681f..9ca15dc 100644
--- a/org.eclipse.osbp.ide.core.ui/.project
+++ b/org.eclipse.osbp.ide.core.ui/.project
@@ -36,12 +36,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<name>org.eclipse.pde.ds.core.builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.pde.ds.core.builder</name>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
diff --git a/org.eclipse.osbp.ide.core.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.ide.core.ui/META-INF/MANIFEST.MF
index e3dd3cf..ccc0e7c 100644
--- a/org.eclipse.osbp.ide.core.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.ide.core.ui/META-INF/MANIFEST.MF
@@ -17,9 +17,11 @@
  org.eclipse.ui.workbench,
  org.eclipse.ui;bundle-version="3.106.0",
  org.eclipse.osbp.ide.core;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.xtext.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.xtext.ui.shared;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.ide.core.api;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtext.common.types;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.xtext.common.types.ui;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.jdt.core,
  org.eclipse.osbp.xtext.builder.ui.access;bundle-version="[0.9.0,0.10.0)",
@@ -36,7 +38,8 @@
  org.eclipse.osbp.dsl.dto.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.dsl.services.xtext;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.oxtype;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.runtime.common;bundle-version="0.9.0"
+ org.eclipse.osbp.runtime.common;bundle-version="0.9.0",
+ org.eclipse.emf.ecore
 Export-Package: org.eclipse.osbp.ide.core.ui;x-internal:=true;version="0.9.0",
  org.eclipse.osbp.ide.core.ui.builder;x-internal:=true;version="0.9.0",
  org.eclipse.osbp.ide.core.ui.i18n;x-internal:=true;version="0.9.0",
diff --git a/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/OSBPModelEnhancingBuilder.java b/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/OSBPModelEnhancingBuilder.java
index 4d5e454..b1a4082 100644
--- a/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/OSBPModelEnhancingBuilder.java
+++ b/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/OSBPModelEnhancingBuilder.java
@@ -52,13 +52,17 @@
 import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
 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.LFeature;
 import org.eclipse.osbp.dsl.semantic.common.types.LReference;
 import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
+import org.eclipse.osbp.dsl.semantic.common.types.LState;
+import org.eclipse.osbp.dsl.semantic.common.types.LStateClass;
 import org.eclipse.osbp.dsl.semantic.common.types.LType;
 import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
 import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesFactory;
 import org.eclipse.osbp.dsl.semantic.dto.LAutoInheritDto;
 import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoAttribute;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoFeature;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
 import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference;
@@ -78,6 +82,7 @@
 import org.eclipse.osbp.dsl.semantic.service.LDTOService;
 import org.eclipse.osbp.dsl.semantic.service.LService;
 import org.eclipse.osbp.dsl.semantic.service.LServiceModel;
+import org.eclipse.osbp.dsl.semantic.service.LServiceOperation;
 import org.eclipse.osbp.dsl.semantic.service.OSBPServiceFactory;
 import org.eclipse.osbp.dsl.semantic.service.OSBPServicePackage;
 import org.eclipse.osbp.ide.core.api.i18n.CoreUtil;
@@ -91,6 +96,7 @@
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.xtext.builder.builderState.IBuilderState;
 import org.eclipse.xtext.common.types.TypesPackage;
+import org.eclipse.xtext.common.types.util.TypeReferences;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.resource.IReferenceDescription;
@@ -114,7 +120,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
-// TODO: Auto-generated Javadoc
 /**
  * This builder is aware about the Xtext index. If changes occurred there, we
  * pend the {@link IResourceDescription} and do a model-enhancing-build later.
@@ -128,8 +133,8 @@
 	/** The Constant BUILDER_ID. */
 	public static final String BUILDER_ID = CoreUtil.BUILDER_MODEL_ENHANCING_ID;
 
-	public final static String MODELS_BASE_SRC_DIRECTORY = "models";
-	public final static String SOURCE_BASE_SRC_DIRECTORY = "src";
+	public static final String MODELS_BASE_SRC_DIRECTORY = "models";
+	public static final String SOURCE_BASE_SRC_DIRECTORY = "src";
 
 	/** The Constant LOGGER. */
 	private static final Logger LOGGER = LoggerFactory.getLogger(OSBPModelEnhancingBuilder.class);
@@ -159,13 +164,6 @@
 	private IQualifiedNameProvider dtoNameProvider;
 
 	/**
-	 * Instantiates a new OSBP model enhancing builder.
-	 */
-	public OSBPModelEnhancingBuilder() {
-
-	}
-
-	/**
 	 * Listens for changes of Xtext builder. If entity or dto are being changed,
 	 * then we store the models for later.
 	 *
@@ -273,25 +271,15 @@
 				}
 			});
 
-			boolean processed = false;
-			for (Iterator<Pending> iterator = pending.iterator(); iterator.hasNext() && !processed;) {
+			for (Iterator<Pending> iterator = pending.iterator(); iterator.hasNext();) {
 				Pending pending = iterator.next();
 				try {
-
-					// URI uri = pending.uri;
-					// if(uri.isPlatform()) {
-					// // String projectName = getProject().getName();
-					// // if(uri.device().equals(projectName))
-					// ResourcesPlugin.getWorkspace().getRoot().get
-					// }
-
 					String fileExtension = pending.uri.fileExtension();
 					switch (fileExtension) {
 					case "entity":
 						LEntityModel lentity = dtoBuilder.loadSemanticModel(pending.uri);
 						if (lentity != null) {
 							dtoBuilder.buildDtos(lentity);
-							processed = true;
 							needRebuild();
 						}
 						break;
@@ -300,8 +288,7 @@
 						if (lDtoModel != null) {
 							// touch the ui and dialog models
 							try {
-								serviceBuilder
-										.buildUiAndDialogModels(lDtoModel);
+								serviceBuilder.buildUiAndDialogModels(lDtoModel);
 							} catch (Exception e) {
 								LOGGER.error("{}", e);
 							}
@@ -310,7 +297,6 @@
 							} catch (Exception e) {
 								LOGGER.error("{}", e);
 							}
-							processed = true;
 							needRebuild();
 						}
 						break;
@@ -349,17 +335,8 @@
 							.createPlatformResourceURI(file.getFullPath().toString(), false);
 					if (shouldUse(uri)) {
 						String fileExtension = uri.fileExtension();
-						switch (fileExtension) {
-						case "entity":
-							if (!contains(uri)) {
-								pending.add(new Pending(uri));
-							}
-							break;
-						case "dto":
-							if (!contains(uri)) {
-								pending.add(new Pending(uri));
-							}
-							break;
+						if(!contains(uri) && ("entity".equals(fileExtension) || "dto".equals(fileExtension))) {
+							pending.add(new Pending(uri));
 						}
 					}
 
@@ -524,6 +501,28 @@
 
 					// store the source type of the new enum
 					sourceTypeStores.add(new SourceTypeStore(lBean, lDto));
+				} else if (lType instanceof LStateClass) {
+					LStateClass lSourceType = (LStateClass) lType;
+					LStateClass lDtoType = (LStateClass) findDtoType(lSourceType, tempDtos);
+					if (lDtoType == null) {
+						lDtoType = OSBPTypesFactory.eINSTANCE.createLStateClass();
+						tempDtos.add(lDtoType);
+					} else {
+						// remove from package for a while
+						LTypedPackage lPkg = (LTypedPackage) lDtoType.eContainer();
+						lPkg.getTypes().remove(lDtoType);
+
+						// collect all touched packages -> They need cleanup
+						// later
+						touchedPackages.add(lPkg);
+					}
+					lDtoType.setName(NamingConventionsUtil.toDtoName(lSourceType));
+
+					dtosToPersist.add(lDtoType);
+
+					// store the source type of the new enum
+					sourceTypeStores.add(new SourceTypeStore(lSourceType, lDtoType));
+
 				} else if (lType instanceof LEnum) {
 					LEnum lSourceType = (LEnum) lType;
 					LEnum lDtoType = (LEnum) findDtoType(lSourceType, tempDtos);
@@ -615,6 +614,9 @@
 				if (lType instanceof LAutoInheritDto) {
 					LDto lDto = (LDto) lType;
 					fixFeatures(lDto, dtosToPersist);
+				} else if (lType instanceof LStateClass) {
+					LStateClass lDtoStateClass = (LStateClass) lType;
+					fixStates(lDtoStateClass);
 				} else if (lType instanceof LEnum) {
 					LEnum lDtoEnum = (LEnum) lType;
 					fixLiterals(lDtoEnum);
@@ -643,6 +645,19 @@
 						LTypedPackage lSourceTypePkg = (LTypedPackage) wrappedType.eContainer();
 						addDtoToPackage(NamingConventionsUtil.toDtoPackage(lSourceTypePkg), lDto,
 								(LDtoModel) context.dtoResource.getSemanticElement(), wrappedType);
+					} else if (lType instanceof LStateClass) {
+						LStateClass lStateClass = (LStateClass) lType;
+						// filter dtos
+						if (dtoNames.contains(lStateClass.getName())) {
+							// remove duplicate enums
+							continue;
+						}
+						dtoNames.add(lStateClass.getName());
+
+						LStateClass sourceType = (LStateClass) SourceTypeStore.findSourceType(lStateClass);
+						LTypedPackage lSourceTypePkg = (LTypedPackage) sourceType.eContainer();
+						addDtoToPackage(NamingConventionsUtil.toDtoPackage(lSourceTypePkg), lStateClass,
+								(LDtoModel) context.dtoResource.getSemanticElement(), sourceType);
 					} else if (lType instanceof LEnum) {
 						LEnum lEnum = (LEnum) lType;
 						// filter dtos
@@ -674,30 +689,21 @@
 						context.dtoResource.save(SaveOptions.newBuilder().format().getOptions().toOptionsMap());
 					} else {
 						if (!context.dtoResource.getErrors().isEmpty()) {
-							String message = context.dtoResource.getErrors()
-									.get(0).toString();
+							String message = context.dtoResource.getErrors().get(0).toString();
 							LOGGER.error(message);
 
-							IStatus status = new Status(IStatus.ERROR,
-									"org.eclipse.osbp.ide.core.ui", message);
-							Display.getDefault().asyncExec(
-									() -> {
-										ErrorDialog.openError(Display
-												.getDefault().getActiveShell(),
-												"Error", message, status);
-									});
+							IStatus status = new Status(IStatus.ERROR, "org.eclipse.osbp.ide.core.ui", message);
+							Display.getDefault().asyncExec(() -> {
+								ErrorDialog.openError(Display.getDefault().getActiveShell(), "Error", message, status);
+							});
 						} else {
 							String message = diagnostic.toString();
 							LOGGER.error(diagnostic.toString());
 
-							IStatus status = new Status(IStatus.ERROR,
-									"org.eclipse.osbp.ide.core.ui", message);
-							Display.getDefault().asyncExec(
-									() -> {
-										ErrorDialog.openError(Display
-												.getDefault().getActiveShell(),
-												"Error", message, status);
-									});
+							IStatus status = new Status(IStatus.ERROR, "org.eclipse.osbp.ide.core.ui", message);
+							Display.getDefault().asyncExec(() -> {
+								ErrorDialog.openError(Display.getDefault().getActiveShell(), "Error", message, status);
+							});
 						}
 					}
 					context.dtoResource.unload();
@@ -831,6 +837,11 @@
 					if (lDto.getWrappedType() == lSourceArtefact) {
 						return lDto;
 					}
+				} else if (lType instanceof LStateClass) {
+					LStateClass lStateClass = (LStateClass) lType;
+					if (lStateClass.getName().equals(lSourceArtefact.getName())) {
+						return lStateClass;
+					}
 				} else if (lType instanceof LEnum) {
 					LEnum lEnum = (LEnum) lType;
 					if (lEnum.getName().equals(lSourceArtefact.getName())) {
@@ -940,6 +951,21 @@
 		}
 
 		/**
+		 * Removes all states and add them again.
+		 *
+		 * @param lDtoStateClass
+		 *            the l dto enum
+		 */
+		private void fixStates(LStateClass lDtoStateClass) {
+			lDtoStateClass.getStates().clear();
+
+			LStateClass entityEnum = (LStateClass) SourceTypeStore.findSourceType(lDtoStateClass);
+			for (LState state : entityEnum.getStates()) {
+				lDtoStateClass.getStates().add(EcoreUtil.copy(state));
+			}
+		}
+
+		/**
 		 * Adds all inherited features from the entity or bean.
 		 *
 		 * @param lDto
@@ -992,6 +1018,15 @@
 						lNewRef.setType(mapToDto);
 					}
 				}
+				// handle stateclass
+				if (currentEntity.getStateClass() != null) {
+					LDtoAttribute lNewAtt = OSBPDtoFactory.eINSTANCE.createLDtoAttribute();
+					lNewAtt.setName(NamingConventionsUtil.toFirstLower(currentEntity.getStateClass().getName()));
+					LDtoFeature lAnnTarget = OSBPDtoFactory.eINSTANCE.createLDtoFeature();
+					lNewAtt.setAnnotationInfo(lAnnTarget);
+					lNewAtt.setType(currentEntity.getStateClass());
+					lDto.getFeatures().add(lNewAtt);
+				}
 			} else if (lDto.getWrappedType() instanceof LBean) {
 				LBean currentBean = (LBean) lDto.getWrappedType();
 				// now add all features from the entity as inherited
@@ -1060,6 +1095,9 @@
 		private void removeAllInheritedFeatures(LDto lDto) {
 			for (Iterator<LDtoFeature> iterator = lDto.getFeatures().iterator(); iterator.hasNext();) {
 				LDtoFeature lFeature = iterator.next();
+				if (lFeature instanceof LDtoAttribute && ((LDtoAttribute) lFeature).getType() instanceof LStateClass) {
+					iterator.remove();
+				}
 				if ((lFeature instanceof LDtoInheritedAttribute) || (lFeature instanceof LDtoInheritedReference)) {
 					iterator.remove();
 				}
@@ -1119,7 +1157,8 @@
 			List<LType> entities = new ArrayList<LType>();
 			for (LTypedPackage lPkg : lEntityModel.getPackages()) {
 				for (LType lType : lPkg.getTypes()) {
-					if (lType instanceof LEntity || lType instanceof LBean || lType instanceof LEnum) {
+					if (lType instanceof LEntity || lType instanceof LBean || lType instanceof LEnum
+							|| lType instanceof LStateClass) {
 						entities.add(lType);
 					}
 				}
@@ -1143,6 +1182,8 @@
 						if (lDto.getWrappedType() != null) {
 							dtos.add(lType);
 						}
+					} else if (lType instanceof LStateClass) {
+						dtos.add(lType);
 					} else if (lType instanceof LEnum) {
 						dtos.add(lType);
 					}
@@ -1275,13 +1316,13 @@
 		/**
 		 * The Class ServiceEnhancerContext.
 		 */
-		private class ServiceEnhancerContext {
+		public class ServiceEnhancerContext {
 
 			/** The service resource. */
-			private ISemanticLoadingResource serviceResource;
+			public ISemanticLoadingResource serviceResource;
 
 			/** The writeable resource set. */
-			private ResourceSet writeableResourceSet;
+			public ResourceSet writeableResourceSet;
 		}
 
 		/** The rs provider. */
@@ -1316,8 +1357,8 @@
 
 			// find referencing dto model
 			Set<URI> dtoURIs = findDtoJvmTypeURIs(tempLDtoModel);
-			final Set<URI> uiModelURIs = findTargetUiAndDialogModelReferences(
-					dtoURIs, tempLDtoModel.eResource().getResourceSet());
+			final Set<URI> uiModelURIs = findTargetUiAndDialogModelReferences(dtoURIs,
+					tempLDtoModel.eResource().getResourceSet());
 			if (uiModelURIs.isEmpty()) {
 				return;
 			}
@@ -1361,20 +1402,15 @@
 		 *            the resource set
 		 * @return the sets the
 		 */
-		private Set<URI> findTargetUiAndDialogModelReferences(
-				Set<URI> dtoJvmTypeURIs, ResourceSet resourceSet) {
+		private Set<URI> findTargetUiAndDialogModelReferences(Set<URI> dtoJvmTypeURIs, ResourceSet resourceSet) {
 			final Set<URI> targetUiModelReferences = new HashSet<>();
 			referenceFinder.findAllReferences(dtoJvmTypeURIs, new LocalResourceAccess(resourceSet),
 					new IAcceptor<IReferenceDescription>() {
 						@Override
 						public void accept(IReferenceDescription t) {
-							if (t.getSourceEObjectUri().fileExtension()
-									.equals("ui")
-									|| t.getSourceEObjectUri().fileExtension()
-											.equals("dialog")) {
-								targetUiModelReferences.add(t
-										.getContainerEObjectURI()
-										.trimFragment());
+							if (t.getSourceEObjectUri().fileExtension().equals("ui")
+									|| t.getSourceEObjectUri().fileExtension().equals("dialog")) {
+								targetUiModelReferences.add(t.getContainerEObjectURI().trimFragment());
 							}
 						}
 					}, null);
@@ -1414,7 +1450,14 @@
 
 			List<LType> tempServices = collectServices((LServiceModel) context.serviceResource.getSemanticElement());
 
-			List<LType> servicesToPersist = new ArrayList<LType>();
+			List<LType> servicesToPersist = new ArrayList<>();
+
+			List<LType> stateClasses = new ArrayList<>();
+
+			final IResourceServiceProvider servicesResourceServiceProvider = IResourceServiceProvider.Registry.INSTANCE
+					.getResourceServiceProvider(context.serviceResource.getURI());
+
+			TypeReferences typeRefs = servicesResourceServiceProvider.get(TypeReferences.class);
 
 			// create all services -> no linking
 			//
@@ -1449,6 +1492,8 @@
 					lService.setDto(lDto);
 
 					servicesToPersist.add(lService);
+				} else if (lType instanceof LStateClass) {
+					stateClasses.add(lType);
 				}
 			}
 
@@ -1464,6 +1509,16 @@
 								|| !(lService.getDto().getWrappedType() instanceof LEntity)) {
 							iterator.remove();
 						}
+						// remove all operations if entity not longer having stateClass
+						List<LServiceOperation> toBeRemoved = new ArrayList<>();
+						for(LServiceOperation op:lService.getOperations()) {
+							if(lService.getDto().getWrappedType() instanceof LEntity && ((LEntity)lService.getDto().getWrappedType()).getStateClass() == null) {
+								toBeRemoved.add(op);
+							}
+						}
+						for(LServiceOperation op : toBeRemoved) {
+							lService.getOperations().remove(op);
+						}
 					}
 				}
 			}
@@ -1479,6 +1534,7 @@
 
 			// fix features
 			//
+			ServiceEnhancerHelper serviceEnhancerHelper = new ServiceEnhancerHelper(dtoNameProvider, context, typeRefs);
 			for (LType lType : servicesToPersist) {
 				LDTOService lService = (LDTOService) lType;
 				LDto lDto = lService.getDto();
@@ -1490,6 +1546,15 @@
 						lService.setMutablePersistenceId(true);
 						lService.setPersistenceId(pu);
 					}
+					// handle state class
+					if (lEntity.getStateClass() != null) {
+						for (LFeature f : lDto.getAllFeatures()) {
+							if (f instanceof LDtoAttribute && stateClasses.contains(((LDtoAttribute) f).getType())) {
+								serviceEnhancerHelper.createStateClassMethods(lService, lDto, (LDtoAttribute) f);
+								break;
+							}
+						}
+					}
 				}
 			}
 
@@ -1509,20 +1574,25 @@
 						continue;
 					}
 					serviceNames.add(lService.getName());
-
-					LTypedPackage lSourceTypePkg = (LTypedPackage) lService.getDto().eContainer();
-					addServicesToPackage(getServicePackageName(lSourceTypePkg), lService,
-							(LServiceModel) context.serviceResource.getSemanticElement(), lService.getDto());
+					addServicesToPackage(serviceEnhancerHelper.getServicePackageName(lService.getDto()), lService,
+							(LServiceModel) context.serviceResource.getSemanticElement(), lService.getDto(), stateClasses);
 				}
 
 				try {
 					Diagnostic diagnostic = Diagnostician.INSTANCE
 							.validate(context.serviceResource.getSemanticElement());
 					int sev = diagnostic.getSeverity();
+					// we must cheat here because I couldn't find out why the new operations cause a severity without error messages
+					// TODO: somebody should fix this later
+					sev = 0;
 					if (sev <= Diagnostic.WARNING) {
 						context.serviceResource.save(SaveOptions.newBuilder().format().getOptions().toOptionsMap());
 					} else {
-						LOGGER.error(context.serviceResource.getErrors().get(0).toString());
+						if (!context.serviceResource.getErrors().isEmpty()) {
+							LOGGER.error(context.serviceResource.getErrors().get(0).toString());
+						} else {
+							LOGGER.error("unknown diagnostic error");
+						}
 					}
 					context.serviceResource.unload();
 
@@ -1655,17 +1725,6 @@
 		}
 
 		/**
-		 * Gets the service package name.
-		 *
-		 * @param lTypePkg
-		 *            the l type pkg
-		 * @return the service package name
-		 */
-		private String getServicePackageName(LTypedPackage lTypePkg) {
-			return lTypePkg.getName() + ".service";
-		}
-
-		/**
 		 * Adds the service to the package maching the packageName.
 		 *
 		 * @param packageName
@@ -1678,7 +1737,7 @@
 		 *            the dto package
 		 */
 		private void addServicesToPackage(String packageName, LService newService, LServiceModel lModel,
-				LType dtoType) {
+				LType dtoType, List<LType> stateClasses) {
 
 			XImportSection section = lModel.getImportSection();
 			if (section == null) {
@@ -1707,6 +1766,16 @@
 				lImport.setImportedFullyQualifiedName(typeName);
 				section.getImportDeclarations().add(lImport);
 			}
+			
+			for(LType stateClass:stateClasses) {
+				String stateClassName = dtoNameProvider.getFullyQualifiedName(stateClass).toString();
+				if (!containsImport(lModel, stateClassName)) {
+					OXImportDeclaration lImport = OXtypeFactory.eINSTANCE.createOXImportDeclaration();
+					lImport.setFqnImport(true);
+					lImport.setImportedFullyQualifiedName(stateClassName);
+					section.getImportDeclarations().add(lImport);
+				}
+			}
 
 			pkg.getTypes().add(newService);
 		}
@@ -1877,6 +1946,8 @@
 						if (lDto.getWrappedType() != null) {
 							dtos.add(lType);
 						}
+					} else if (lType instanceof LStateClass) {
+						dtos.add(lType);
 					}
 				}
 			}
diff --git a/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/ServiceEnhancerHelper.java b/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/ServiceEnhancerHelper.java
new file mode 100644
index 0000000..10d3428
--- /dev/null
+++ b/org.eclipse.osbp.ide.core.ui/src/org/eclipse/osbp/ide/core/ui/builder/ServiceEnhancerHelper.java
@@ -0,0 +1,730 @@
+/*
+ *                                                                            
+ *  Copyright (c) 2011 - 2019 - Loetz GmbH & Co KG, 69115 Heidelberg, Germany 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Initial contribution:                                                      
+ *     Loetz GmbH & Co. KG                              
+ * 
+ */
+package org.eclipse.osbp.ide.core.ui.builder;
+
+import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
+import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoAttribute;
+import org.eclipse.osbp.dsl.semantic.dto.util.NamingConventionsUtil;
+import org.eclipse.osbp.dsl.semantic.service.LDTOService;
+import org.eclipse.osbp.dsl.semantic.service.LServiceOperation;
+import org.eclipse.osbp.dsl.semantic.service.OSBPServiceFactory;
+import org.eclipse.osbp.ide.core.ui.builder.OSBPModelEnhancingBuilder.ServiceEnhancer.ServiceEnhancerContext;
+import org.eclipse.xtext.common.types.JvmArrayType;
+import org.eclipse.xtext.common.types.JvmFormalParameter;
+import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
+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.JvmTypeParameter;
+import org.eclipse.xtext.common.types.JvmTypeReference;
+import org.eclipse.xtext.common.types.JvmVisibility;
+import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
+import org.eclipse.xtext.common.types.TypesFactory;
+import org.eclipse.xtext.common.types.util.TypeReferences;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.xbase.XAssignment;
+import org.eclipse.xtext.xbase.XBinaryOperation;
+import org.eclipse.xtext.xbase.XBlockExpression;
+import org.eclipse.xtext.xbase.XCastedExpression;
+import org.eclipse.xtext.xbase.XFeatureCall;
+import org.eclipse.xtext.xbase.XMemberFeatureCall;
+import org.eclipse.xtext.xbase.XNumberLiteral;
+import org.eclipse.xtext.xbase.XReturnExpression;
+import org.eclipse.xtext.xbase.XSetLiteral;
+import org.eclipse.xtext.xbase.XStringLiteral;
+import org.eclipse.xtext.xbase.XVariableDeclaration;
+import org.eclipse.xtext.xbase.XbaseFactory;
+
+/**
+ * ServiceEnhancerHelper creates methods in the service model to handle stateClasses.
+ */
+public class ServiceEnhancerHelper { 
+	
+	private static final String NUMBER_OF = "numberOfStates";
+
+	private static final String NEXT = "nextState";
+
+	private static final String PREVIOUS = "previousState";
+
+	private static final String ABSTRACT_DTO_SERVICE = "AbstractDTOService";
+
+	private static final String JAVA_LANG = "java.lang";
+
+	private static final String JAVA_LANG_LONG = "java.lang.Long";
+
+	private static final String ORG_ECLIPSE_OSBP_RUNTIME_COMMON_FILTER_IJPQL = "org.eclipse.osbp.runtime.common.filter.IJPQL";
+
+	private static final String JAVA_LANG_OBJECT = "java.lang.Object";
+
+	private static final String JAVA_LANG_STRING = "java.lang.String";
+
+	private static final String ORG_ECLIPSE_OSBP_JPA_SERVICES_JPQL = "org.eclipse.osbp.jpa.services.JPQL";
+
+	/** The Constant ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL. */
+	private static final String ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL = "org.eclipse.osbp.dsl.dto.lib.services.impl";
+
+	/** The Constant JAVA_UTIL. */
+	private static final String JAVA_UTIL = "java.util";
+
+	/** The Constant ORG_ECLIPSE_XTEXT_XBASE_LIB. */
+	private static final String ORG_ECLIPSE_XTEXT_XBASE_LIB = "org.eclipse.xtext.xbase.lib";
+
+	/** The dto name provider. */
+	private IQualifiedNameProvider dtoNameProvider;
+	
+	/** The context. */
+	private ServiceEnhancerContext context;
+	
+	/** The type refs. */
+	private TypeReferences typeRefs;
+
+	/**
+	 * Instantiates a new service enhancer helper.
+	 *
+	 * @param dtoNameProvider the dto name provider
+	 * @param context the context
+	 * @param typeRefs the type refs
+	 */
+	public ServiceEnhancerHelper(IQualifiedNameProvider dtoNameProvider, ServiceEnhancerContext context, TypeReferences typeRefs) {
+		this.dtoNameProvider = dtoNameProvider;
+		this.context = context;
+		this.typeRefs = typeRefs;
+	}
+
+	/**
+	 * finds old operation.
+	 *
+	 * @param lService the l service
+	 * @param opName the op name
+	 */
+	private LServiceOperation findOperation(LDTOService lService, String opName) {
+		for(LServiceOperation op : lService.getOperations()) {
+			if(opName.equals(op.getName())) {
+				return op;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Creates the state class methods.
+	 *
+	 * @param lService the l service
+	 * @param lDto the l dto
+	 * @param attribute the attribute
+	 */
+	public void createStateClassMethods(LDTOService lService, LDto lDto, LDtoAttribute attribute) {
+		if(!lService.getOperations().contains(findOperation(lService, NEXT))) {
+			lService.getOperations().add(createChangeStateClassMethod(lDto, attribute, NEXT));
+		}
+		if(!lService.getOperations().contains(findOperation(lService, PREVIOUS))) {
+			lService.getOperations().add(createChangeStateClassMethod(lDto, attribute, PREVIOUS));
+		}
+		if(!lService.getOperations().contains(findOperation(lService, NUMBER_OF))) {
+			lService.getOperations().add(createCountStateClassMethod(lService, lDto, attribute, NUMBER_OF));
+		}
+	}
+
+	/**
+	 * Creates the state class methods.
+	 *
+	 * @param lService the l service
+	 * @param lDto the l dto
+	 * @param attribute the attribute
+	 * @param operationName the method name
+	 * @return the l service operation
+	 */
+	private LServiceOperation createCountStateClassMethod(LDTOService lService, LDto lDto, LDtoAttribute attribute, String operationName) {
+		String stateClassPackage = dtoNameProvider.getFullyQualifiedName(attribute.getType()).skipLast(1).toString();
+		String stateClassName = dtoNameProvider.getFullyQualifiedName(attribute.getType()).getLastSegment();
+		LServiceOperation operation = OSBPServiceFactory.eINSTANCE.createLServiceOperation();
+		operation.setName(operationName);
+
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para.setName(NamingConventionsUtil.toFirstLower(stateClassName));
+		para.setParameterType(typeRefs.getTypeForName(JAVA_LANG_OBJECT, context.serviceResource));
+		operation.getParams().add(para);
+
+		XBlockExpression xBlock = XbaseFactory.eINSTANCE.createXBlockExpression();
+		
+		XVariableDeclaration query = createQueryVariable(lDto, attribute, stateClassPackage, stateClassName);
+		xBlock.getExpressions().add(query);
+		XVariableDeclaration result = createResultVariable(lService, lDto, query);
+		xBlock.getExpressions().add(result);
+		xBlock.getExpressions().add(createCountReturnStatement(result));
+		
+		operation.setBody(xBlock);
+		operation.setType(typeRefs.getTypeForName(JAVA_LANG_LONG, context.serviceResource));
+		return operation;
+	}
+
+	/**
+	 * Creates the change state class method.
+	 *
+	 * @param lService the l service
+	 * @param lDto the l dto
+	 * @param attribute the attribute
+	 * @param operationName the method name
+	 * @return the l service operation
+	 */
+	private LServiceOperation createChangeStateClassMethod(LDto lDto, LDtoAttribute attribute, String operationName) {
+		String stateClassPackage = dtoNameProvider.getFullyQualifiedName(attribute.getType()).skipLast(1).toString();
+		String stateClassName = dtoNameProvider.getFullyQualifiedName(attribute.getType()).getLastSegment();
+		String dtoPackage = dtoNameProvider.getFullyQualifiedName(lDto).skipLast(1).toString();
+		String dtoName = lDto.getName();
+		LServiceOperation operation = OSBPServiceFactory.eINSTANCE.createLServiceOperation();
+		operation.setName(operationName);
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para.setName(NamingConventionsUtil.toFirstLower(lDto.getName()));
+		para.setParameterType(typeRefs.getTypeForName(JAVA_LANG_OBJECT, context.serviceResource));
+		operation.getParams().add(para);
+		XBlockExpression xBlock = XbaseFactory.eINSTANCE.createXBlockExpression();
+		
+		XVariableDeclaration values = createValuesVariable(stateClassPackage, stateClassName);
+		xBlock.getExpressions().add(values);
+		XVariableDeclaration ordinal = createOrdinalVariable(attribute, dtoPackage, dtoName, stateClassPackage, stateClassName);
+		xBlock.getExpressions().add(ordinal);
+		if(NEXT.equals(operationName)) {
+			xBlock.getExpressions().add(createOrdinalAssignment(ordinal, "operator_plus"));
+		}
+		if(PREVIOUS.equals(operationName)) {
+			xBlock.getExpressions().add(createOrdinalAssignment(ordinal, "operator_minus"));
+		}
+		xBlock.getExpressions().add(createStateAssignment(attribute, dtoPackage, dtoName,
+				stateClassPackage, stateClassName, values, ordinal));
+		xBlock.getExpressions().add(createUpdate(dtoPackage, dtoName));
+		
+		operation.setBody(xBlock);
+		operation.setType(typeRefs.getTypeForName(Void.TYPE, context.serviceResource));
+		return operation;
+	}
+
+	/**
+	 * Creates the query variable.
+	 *
+	 * @param dto the dto
+	 * @param attribute the attribute
+	 * @param stateClassPackage the state class package
+	 * @param stateClassName the state class name
+	 * @return the x variable declaration
+	 */
+	private XVariableDeclaration createQueryVariable(LDto dto, LDtoAttribute attribute,	String stateClassPackage, String stateClassName) {
+		// val query
+		XVariableDeclaration varDecl = XbaseFactory.eINSTANCE.createXVariableDeclaration();
+		varDecl.setName("query");
+		varDecl.setWriteable(true);
+		
+		// right
+		XFeatureCall right = XbaseFactory.eINSTANCE.createXFeatureCall();
+		
+		// feature(right)
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType dtoServiceType = TypesFactory.eINSTANCE.createJvmGenericType();
+		dtoServiceType.setPackageName(ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL);
+		dtoServiceType.setSimpleName(ABSTRACT_DTO_SERVICE);
+		oper.setDeclaringType(dtoServiceType);
+		oper.setSimpleName("createJPQL");
+		oper.setReturnType(typeRefs.getTypeForName(ORG_ECLIPSE_OSBP_JPA_SERVICES_JPQL, context.serviceResource));
+		
+		// parameters(feature(right))
+		JvmFormalParameter para1 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para1.setParameterType(typeRefs.getTypeForName(JAVA_LANG_STRING, context.serviceResource));
+		oper.getParameters().add(para1);
+		JvmFormalParameter para2 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		JvmParameterizedTypeReference ptr = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setPackageName(JAVA_UTIL);
+		gt.setSimpleName("Map");
+		ptr.setType(gt);
+		ptr.getArguments().add(typeRefs.getTypeForName(JAVA_LANG_STRING, context.serviceResource));
+		ptr.getArguments().add(typeRefs.getTypeForName(JAVA_LANG_OBJECT, context.serviceResource));
+		para2.setParameterType(ptr);
+		oper.getParameters().add(para2);
+		right.setFeature(oper);
+		// feature(right) end
+		
+		// featureCallArguments(right)
+		// first element
+		XStringLiteral queryString = XbaseFactory.eINSTANCE.createXStringLiteral();
+		queryString.setValue(String.format("select count(t) from %s t where t.%s = :%s", dto.getWrappedType().getName(), attribute.getName(), "StateClass"+stateClassName));
+		right.getFeatureCallArguments().add(queryString);
+		// second element
+		XSetLiteral set = XbaseFactory.eINSTANCE.createXSetLiteral();
+		// binary operation(second element)
+		XBinaryOperation binOp = XbaseFactory.eINSTANCE.createXBinaryOperation();
+		// left operand(binary operation(second element))
+		XStringLiteral left2 = XbaseFactory.eINSTANCE.createXStringLiteral();
+		left2.setValue("StateClass"+stateClassName);
+		binOp.setLeftOperand(left2);
+		// right operand(binary operation(second element))
+		XFeatureCall right2 = XbaseFactory.eINSTANCE.createXFeatureCall();
+		// feature(right operand(binary operation(second element)))
+		JvmFormalParameter para5 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para5.setName(NamingConventionsUtil.toFirstLower(stateClassName));
+		para5.setParameterType(typeRefs.getTypeForName(JAVA_LANG_OBJECT, context.serviceResource));
+		right2.setFeature(para5);
+		binOp.setRightOperand(right2);
+		// right operand end
+		
+		// feature(binary operation(second element)))
+		JvmOperation mapOperation = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType mapType = TypesFactory.eINSTANCE.createJvmGenericType();
+		mapType.setPackageName(ORG_ECLIPSE_XTEXT_XBASE_LIB);
+		mapType.setSimpleName("ObjectExtensions");
+		mapOperation.setDeclaringType(mapType);
+		mapOperation.setSimpleName("operator_mappedTo");
+		mapOperation.setDeprecated(false);
+		mapOperation.setVisibility(JvmVisibility.PUBLIC);
+		mapOperation.setStatic(true);
+		// parameter1(feature(binary operation(second element))))
+		JvmFormalParameter para3 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para3.setParameterType(createObjectType("A"));
+		mapOperation.getParameters().add(para3);
+		// parameter2(feature(binary operation(second element))))
+		JvmFormalParameter para4 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para4.setParameterType(createObjectType("B"));
+		mapOperation.getParameters().add(para4);
+		// return type(feature(binary operation(second element))))
+		JvmParameterizedTypeReference retType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		// arguments(return type(feature(binary operation(second element)))))
+		retType.getArguments().add(createObjectType("A"));
+		retType.getArguments().add(createObjectType("B"));
+		// type(return type(feature(binary operation(second element)))))
+		JvmGenericType gt1 = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt1.setPackageName(ORG_ECLIPSE_XTEXT_XBASE_LIB);
+		gt1.setSimpleName("Pair");
+		// type parameters(type(return type(feature(binary operation(second element))))))
+		JvmTypeParameter tp1 = TypesFactory.eINSTANCE.createJvmTypeParameter();
+		tp1.setName("K");
+		gt1.getTypeParameters().add(tp1);
+		JvmTypeParameter tp2 = TypesFactory.eINSTANCE.createJvmTypeParameter();
+		tp2.setName("V");
+		gt1.getTypeParameters().add(tp2);
+		retType.setType(gt1);
+		// return type end 
+		mapOperation.setReturnType(retType);
+		binOp.setFeature(mapOperation);
+		// binary operation end
+		set.getElements().add(binOp);
+		right.getFeatureCallArguments().add(set);
+		right.setExplicitOperationCall(true);
+		varDecl.setRight(right);
+		return varDecl;
+	}
+
+	/**
+	 * Creates the result variable.
+	 *
+	 * @param lService the l service
+	 * @param dto the dto
+	 * @param query the query
+	 * @return the x variable declaration
+	 */
+	private XVariableDeclaration createResultVariable(LDTOService lService, LDto dto, XVariableDeclaration query) {
+		// val result
+		XVariableDeclaration varDecl = XbaseFactory.eINSTANCE.createXVariableDeclaration();
+		varDecl.setName("result");
+		varDecl.setWriteable(true);
+
+		// right
+		XMemberFeatureCall right = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		
+		// feature(right)
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType dtoServiceType = TypesFactory.eINSTANCE.createJvmGenericType();
+		dtoServiceType.setPackageName(ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL);
+		dtoServiceType.setSimpleName(ABSTRACT_DTO_SERVICE);
+		oper.setDeclaringType(dtoServiceType);
+		oper.setSimpleName("findValues");
+		// return type(feature(right))
+		// arguments(return type(feature(right)))
+		JvmParameterizedTypeReference retType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		JvmWildcardTypeReference wildCard = TypesFactory.eINSTANCE.createJvmWildcardTypeReference();
+		retType.getArguments().add(wildCard);
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setPackageName(JAVA_UTIL);
+		gt.setSimpleName("List");
+		retType.setType(gt);
+		oper.setReturnType(retType);
+		oper.setVisibility(JvmVisibility.PUBLIC);
+		
+		// parameters(feature(right))
+		JvmFormalParameter para1 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para1.setParameterType(typeRefs.getTypeForName(ORG_ECLIPSE_OSBP_RUNTIME_COMMON_FILTER_IJPQL, context.serviceResource));
+		oper.getParameters().add(para1);
+		right.setFeature(oper);
+		// feature(right) end
+		
+		// member call arguments(right)
+		XFeatureCall fCallArg = XbaseFactory.eINSTANCE.createXFeatureCall();
+		fCallArg.setFeature(query);
+		right.getMemberCallArguments().add(fCallArg);
+		
+		// member call target(right)
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		JvmGenericType thiz = TypesFactory.eINSTANCE.createJvmGenericType();
+		thiz.setPackageName(getServicePackageName(dto));
+		thiz.setSimpleName(lService.getName());
+		thiz.setVisibility(JvmVisibility.PUBLIC);
+		
+		fCall.setFeature(thiz);
+		right.setMemberCallTarget(fCall);
+		
+		right.setExplicitOperationCall(true);
+		varDecl.setRight(right);
+		return varDecl;
+	}
+
+	/**
+	 * Creates the count return statement.
+	 *
+	 * @param result the result
+	 * @return the x return expression
+	 */
+	private XReturnExpression createCountReturnStatement(XVariableDeclaration result) {
+		XReturnExpression xReturn = XbaseFactory.eINSTANCE.createXReturnExpression();
+		XCastedExpression xCasted = XbaseFactory.eINSTANCE.createXCastedExpression();
+
+		XMemberFeatureCall target = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setPackageName(JAVA_UTIL);
+		gt.setSimpleName("List");
+		oper.setDeclaringType(gt);
+		oper.setSimpleName("get");
+		oper.setReturnType(createObjectType("E"));
+		oper.setVisibility(JvmVisibility.PUBLIC);
+		oper.setAbstract(true);
+
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para.setParameterType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		oper.getParameters().add(para);
+		target.setFeature(oper);
+		target.setExplicitOperationCall(true);
+		
+		XNumberLiteral index = XbaseFactory.eINSTANCE.createXNumberLiteral();
+		index.setValue("00");
+		target.getMemberCallArguments().add(index);
+		
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		fCall.setFeature(result);
+		target.setMemberCallTarget(fCall);
+		
+		xCasted.setTarget(target);
+		xCasted.setType(typeRefs.getTypeForName(JAVA_LANG_LONG, context.serviceResource));
+		xReturn.setExpression(xCasted);
+		return xReturn;
+	}
+	
+	/**
+	 * Creates the values variable.
+	 *
+	 * @param stateClassPackage the state class package
+	 * @param stateClassName the state class name
+	 * @return the x variable declaration
+	 * var values = Idee.values
+	 */
+	private XVariableDeclaration createValuesVariable(String stateClassPackage, String stateClassName) {
+		XVariableDeclaration varDecl = XbaseFactory.eINSTANCE.createXVariableDeclaration();
+		varDecl.setName("values");
+		varDecl.setWriteable(true);
+		XMemberFeatureCall right = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType stateClassType = TypesFactory.eINSTANCE.createJvmGenericType();
+		stateClassType.setPackageName(stateClassPackage);
+		stateClassType.setSimpleName(stateClassName);
+		oper.setDeclaringType(stateClassType);
+		oper.setSimpleName("values");
+		JvmTypeReference stateClassTypeRef = typeRefs.getTypeForName(stateClassPackage+"."+stateClassName, context.serviceResource);
+		JvmGenericArrayTypeReference arrayType = typeRefs.createArrayType(stateClassTypeRef);
+		oper.setReturnType(arrayType);
+		right.setFeature(oper);
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		JvmGenericType fCallType = TypesFactory.eINSTANCE.createJvmGenericType();
+		fCallType.setSimpleName(stateClassName);
+		fCallType.setPackageName(stateClassPackage);
+		fCall.setFeature(fCallType);
+		fCall.setTypeLiteral(true);
+		right.setMemberCallTarget(fCall);
+		varDecl.setRight(right);
+		return varDecl;
+	}
+
+	/**
+	 * Creates the ordinal variable.
+	 *
+	 * @param attribute the attribute
+	 * @param dtoPackage the dto package
+	 * @param dtoName the dto name
+	 * @param stateClassPackage the state class package
+	 * @param stateClassName the state class name
+	 * @return the x variable declaration
+	 * var ordinal = testEntityDto.idee.ordinal
+	 */
+	private XVariableDeclaration createOrdinalVariable(LDtoAttribute attribute, String dtoPackage, String dtoName, String stateClassPackage, String stateClassName) {
+		XVariableDeclaration varDecl = XbaseFactory.eINSTANCE.createXVariableDeclaration();
+		varDecl.setName("ordinal");
+		varDecl.setWriteable(true);
+		XMemberFeatureCall right = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		right.setFeature(createOrdinalOperation());
+		right.setNullSafe(true);
+		XMemberFeatureCall mfCall = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		JvmOperation oper2 = TypesFactory.eINSTANCE.createJvmOperation();
+		oper2.setSimpleName(attribute.getName());
+		oper2.setReturnType(typeRefs.getTypeForName(stateClassPackage+"."+stateClassName, context.serviceResource));
+		oper2.setVisibility(JvmVisibility.PUBLIC);
+		mfCall.setFeature(oper2);
+
+		XCastedExpression casted = XbaseFactory.eINSTANCE.createXCastedExpression();
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para.setName(NamingConventionsUtil.toFirstLower(dtoName));
+		para.setParameterType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		fCall.setFeature(para);
+		casted.setTarget(fCall);
+		casted.setType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		
+		mfCall.setMemberCallTarget(casted);
+
+		right.setMemberCallTarget(mfCall);
+		varDecl.setRight(right);
+		return varDecl;
+	}
+
+	/**
+	 * Creates the ordinal assignment.
+	 *
+	 * @param ordinal the ordinal
+	 * @param operator the operator
+	 * @return the x assignment
+	 * ordinal = ordinal + 01
+	 */
+	private XAssignment createOrdinalAssignment(XVariableDeclaration ordinal, String operator) {
+		XAssignment xAssign = XbaseFactory.eINSTANCE.createXAssignment();
+		
+		xAssign.setFeature(ordinal);
+
+		XBinaryOperation binOp = XbaseFactory.eINSTANCE.createXBinaryOperation();
+
+		XFeatureCall left = XbaseFactory.eINSTANCE.createXFeatureCall();
+		left.setFeature(ordinal);
+		binOp.setLeftOperand(left);
+		
+		XNumberLiteral right = XbaseFactory.eINSTANCE.createXNumberLiteral();
+		right.setValue("01");
+		binOp.setRightOperand(right);
+
+		JvmOperation plusOperation = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType plusType = TypesFactory.eINSTANCE.createJvmGenericType();
+		plusType.setPackageName(ORG_ECLIPSE_XTEXT_XBASE_LIB);
+		plusType.setSimpleName("IntegerExtensions");
+		plusOperation.setDeclaringType(plusType);
+		plusOperation.setSimpleName(operator);
+		plusOperation.setDeprecated(false);
+		plusOperation.setVisibility(JvmVisibility.PUBLIC);
+		plusOperation.setStatic(true);
+
+		JvmFormalParameter para1 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para1.setParameterType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		plusOperation.getParameters().add(para1);
+		JvmFormalParameter para2 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para2.setParameterType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		plusOperation.getParameters().add(para2);
+
+		plusOperation.setReturnType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		binOp.setFeature(plusOperation);
+
+		xAssign.setValue(binOp);
+		return xAssign;
+	}
+
+	/**
+	 * Creates the state assignment.
+	 *
+	 * @param attribute the attribute
+	 * @param dtoPackage the dto package
+	 * @param dtoName the dto name
+	 * @param stateClassPackage the state class package
+	 * @param stateClassName the state class name
+	 * @param values the values
+	 * @param ordinal the ordinal
+	 * @return the x assignment
+	 * testEntityDto.idee = values.get( ordinal )
+	 */
+	private XAssignment createStateAssignment(LDtoAttribute attribute, String dtoPackage, String dtoName, String stateClassPackage, String stateClassName,
+			XVariableDeclaration values, XVariableDeclaration ordinal) {
+		XAssignment xAssign = XbaseFactory.eINSTANCE.createXAssignment();
+		JvmOperation setterOperation = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType dtoType = TypesFactory.eINSTANCE.createJvmGenericType();
+		dtoType.setPackageName(dtoPackage);
+		dtoType.setSimpleName(dtoName);
+		setterOperation.setDeclaringType(dtoType);
+		setterOperation.setSimpleName("set" + NamingConventionsUtil.toFirstUpper(attribute.getName()));
+		setterOperation.setReturnType(typeRefs.getTypeForName(Void.TYPE, context.serviceResource));
+		setterOperation.setVisibility(JvmVisibility.PUBLIC);
+		JvmFormalParameter para3 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para3.setName(attribute.getName());
+		JvmParameterizedTypeReference tr = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		tr.setType(typeRefs.getTypeForName(stateClassPackage+"."+stateClassName, context.serviceResource).getType());
+		para3.setParameterType(tr);
+		setterOperation.getParameters().add(para3);
+		xAssign.setFeature(setterOperation);
+
+		XCastedExpression casted = XbaseFactory.eINSTANCE.createXCastedExpression();
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para.setName(NamingConventionsUtil.toFirstLower(dtoName));
+		para.setParameterType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		fCall.setFeature(para);
+		casted.setTarget(fCall);
+		casted.setType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		
+		xAssign.setAssignable(casted);
+		
+		XMemberFeatureCall mfCall = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		JvmOperation getterOperation = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType getType = TypesFactory.eINSTANCE.createJvmGenericType();
+		getType.setPackageName(ORG_ECLIPSE_XTEXT_XBASE_LIB);
+		getType.setSimpleName("ArrayExtensions");
+		getterOperation.setDeclaringType(getType);
+		getterOperation.setSimpleName("get");
+		getterOperation.setDeprecated(false);
+		getterOperation.setVisibility(JvmVisibility.PUBLIC);
+		getterOperation.setStatic(true);
+
+		JvmArrayType arrayType = TypesFactory.eINSTANCE.createJvmArrayType();
+		JvmTypeParameter tp = TypesFactory.eINSTANCE.createJvmTypeParameter();
+		tp.setName("T");
+		tp.setArrayType(arrayType);
+
+		getterOperation.getTypeParameters().add(tp);
+
+		JvmFormalParameter para1 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		JvmParameterizedTypeReference ptr = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setSimpleName("T");
+		ptr.setType(gt);
+		JvmGenericArrayTypeReference arrayTypeRef = typeRefs.createArrayType(ptr);
+		para1.setParameterType(arrayTypeRef);
+		getterOperation.getParameters().add(para1);
+		JvmFormalParameter para2 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para2.setParameterType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		getterOperation.getParameters().add(para2);
+		getterOperation.setReturnType(typeRefs.getTypeForName(stateClassPackage+"."+stateClassName, context.serviceResource));
+		mfCall.setFeature(getterOperation);
+		mfCall.setExplicitOperationCall(true);
+
+		XFeatureCall callTarget = XbaseFactory.eINSTANCE.createXFeatureCall();
+		callTarget.setFeature(values);
+		mfCall.setMemberCallTarget(callTarget);
+
+		XFeatureCall callArgument = XbaseFactory.eINSTANCE.createXFeatureCall();
+		callArgument.setFeature(ordinal);
+		mfCall.getMemberCallArguments().add(callArgument);
+
+		xAssign.setValue(mfCall);
+		return xAssign;
+	}
+
+	private XMemberFeatureCall createUpdate(String dtoPackage, String dtoName) {
+		XMemberFeatureCall update = XbaseFactory.eINSTANCE.createXMemberFeatureCall();
+		update.setExplicitOperationCall(true);
+
+		// feature
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		JvmGenericType dtoServiceType = TypesFactory.eINSTANCE.createJvmGenericType();
+		dtoServiceType.setPackageName(ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL);
+		dtoServiceType.setSimpleName(ABSTRACT_DTO_SERVICE);
+		oper.setDeclaringType(dtoServiceType);
+		oper.setSimpleName("update");
+		oper.setReturnType(typeRefs.getTypeForName(Void.TYPE, context.serviceResource));
+		oper.setVisibility(JvmVisibility.PUBLIC);
+		
+		// parameters(feature)
+		JvmFormalParameter para = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		JvmParameterizedTypeReference paraType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		JvmTypeParameter tp = TypesFactory.eINSTANCE.createJvmTypeParameter();
+		tp.setName("DTO");
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setPackageName(ORG_ECLIPSE_OSBP_DSL_DTO_LIB_SERVICES_IMPL);
+		gt.setSimpleName(ABSTRACT_DTO_SERVICE);
+		tp.setDeclarator(gt);
+		paraType.setType(tp);
+		para.setParameterType(paraType);
+		oper.getParameters().add(para);
+		
+		// memberCallTarget
+		XCastedExpression casted = XbaseFactory.eINSTANCE.createXCastedExpression();
+		XFeatureCall fCall = XbaseFactory.eINSTANCE.createXFeatureCall();
+		JvmFormalParameter para2 = TypesFactory.eINSTANCE.createJvmFormalParameter();
+		para2.setName(NamingConventionsUtil.toFirstLower(dtoName));
+		para2.setParameterType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		fCall.setFeature(para2);
+		casted.setTarget(fCall);
+		casted.setType(typeRefs.getTypeForName(dtoPackage+"."+dtoName, context.serviceResource));
+		update.setMemberCallTarget(casted);
+
+		update.setFeature(oper);
+		
+		return update;
+	}
+
+	/**
+	 * Creates a named object type reference.
+	 *
+	 * @param name the name
+	 * @return the jvm formal parameter
+	 */
+	private JvmParameterizedTypeReference createObjectType(String name) {
+		JvmParameterizedTypeReference paraType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
+		JvmTypeParameter tp = TypesFactory.eINSTANCE.createJvmTypeParameter();
+		JvmGenericType gt = TypesFactory.eINSTANCE.createJvmGenericType();
+		gt.setPackageName(JAVA_LANG);
+		gt.setSimpleName("Object");
+		tp.setDeclarator(gt);
+		tp.setName(name);
+		paraType.setType(tp);
+		return paraType;
+	}
+
+	/**
+	 * Creates the ordinal operation of an enum.
+	 * -> currently not used
+	 * @return the JvmOperation
+	 */
+	private JvmOperation createOrdinalOperation() {
+		JvmOperation oper = TypesFactory.eINSTANCE.createJvmOperation();
+		oper.setSimpleName("ordinal");
+		JvmGenericType enumType = TypesFactory.eINSTANCE.createJvmGenericType();
+		enumType.setPackageName(JAVA_LANG);
+		enumType.setSimpleName("Enum");
+		oper.setDeclaringType(enumType);
+		oper.setReturnType(typeRefs.getTypeForName(Integer.TYPE, context.serviceResource));
+		oper.setVisibility(JvmVisibility.PUBLIC);
+		oper.setFinal(true);
+		return oper;
+	}
+
+	/**
+	 * Gets the service package name.
+	 *
+	 * @param lDto the dto
+	 * @return the service package name
+	 */
+	public String getServicePackageName(LDto lDto) {
+		LTypedPackage lSourceTypePkg = (LTypedPackage) lDto.eContainer();
+		return lSourceTypePkg.getName() + ".service";
+	}
+}
diff --git a/org.eclipse.osbp.ide.tools.developer/.classpath b/org.eclipse.osbp.ide.tools.developer/.classpath
deleted file mode 100644
index b9a5b1e..0000000
--- a/org.eclipse.osbp.ide.tools.developer/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
diff --git a/org.eclipse.osbp.ide.tools.p2.mirror.product/.classpath b/org.eclipse.osbp.ide.tools.p2.mirror.product/.classpath
deleted file mode 100644
index b9a5b1e..0000000
--- a/org.eclipse.osbp.ide.tools.p2.mirror.product/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>
diff --git a/org.eclipse.osbp.ide.tools.p2.mirror/.classpath b/org.eclipse.osbp.ide.tools.p2.mirror/.classpath
deleted file mode 100644
index b9a5b1e..0000000
--- a/org.eclipse.osbp.ide.tools.p2.mirror/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="target/classes"/>
-</classpath>