diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
index 33cd403..9f3c14c 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/CatalogAttributeResource.java
@@ -19,7 +19,6 @@
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID2;
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
 import static org.eclipse.mdm.businessobjects.utils.Decomposer.decompose;
-import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.L;
 import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.SL;
 
 import javax.ejb.EJB;
@@ -42,7 +41,6 @@
 import org.eclipse.mdm.api.dflt.model.CatalogComponent;
 import org.eclipse.mdm.businessobjects.entity.MDMEntity;
 import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
-import org.eclipse.mdm.businessobjects.entity.MDMRelation;
 import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
 import org.eclipse.mdm.businessobjects.service.EntityService;
 import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
@@ -130,22 +128,12 @@
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String catCompId,
 			MDMEntityResponse body) {
 		return entityService
-				.create(sourceName, CatalogAttribute.class, L(
-						decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName),
-						entityService.getEnumerationValueSupplier(decompose(body::getData).<MDMEntity>getAt(0)
-								.get(MDMEntity::getAttributes) //
-								.get(attrs -> attrs.stream()
-										.filter(attr -> attr.getName().equals(CatalogAttribute.VATTR_SCALAR_TYPE))
-										.findFirst().get().getValue())),
-						entityService.find(sourceName, Unit.class,
-								// get id of related Unit
-								decompose(body::getData).<MDMEntity>getAt(0) //
-										.get(e -> e.getRelations().stream() //
-												.filter(r -> r.getEntityType().equals(Unit.class.getSimpleName())) //
-												.findFirst().get()) //
-										.get(MDMRelation::getIds).getValueAt(0)),
-						entityService.find(sourceName, CatalogComponent.class, catCompId,
-								ServiceUtils.getContextTypeSupplier(contextTypeParam))))
+				.create(sourceName, CatalogAttribute.class,
+						entityService
+								.extractArgumentsFromRequestBody(sourceName, body, List.of("Name", "@ScalarType"),
+										List.of(Unit.class))
+								.append(entityService.find(sourceName, CatalogComponent.class, catCompId,
+										ServiceUtils.getContextTypeSupplier(contextTypeParam))))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
index ce8357d..d1d7a72 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/MeasurementResource.java
@@ -17,7 +17,6 @@
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_SOURCENAME;
 import static org.eclipse.mdm.businessobjects.utils.Decomposer.decompose;
-import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.L;
 import static org.eclipse.mdm.businessobjects.utils.ServiceUtils.V;
 
 import javax.ejb.EJB;
@@ -46,7 +45,6 @@
 import org.eclipse.mdm.businessobjects.entity.I18NResponse;
 import org.eclipse.mdm.businessobjects.entity.MDMEntity;
 import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
-import org.eclipse.mdm.businessobjects.entity.MDMRelation;
 import org.eclipse.mdm.businessobjects.entity.SearchAttributeResponse;
 import org.eclipse.mdm.businessobjects.service.ContextService;
 import org.eclipse.mdm.businessobjects.service.EntityFileLink;
@@ -59,9 +57,7 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import io.vavr.Value;
 import io.vavr.collection.List;
-import io.vavr.collection.Seq;
 import io.vavr.control.Try;
 
 /**
@@ -180,7 +176,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
 	public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, Measurement.class, id)
 				.map(measurement -> contextService.updateContext(body, measurement)).map(ContextResponse::new)
@@ -223,7 +219,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
 	public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, Measurement.class, id)
 				.map(measurement -> contextService.updateContext(body, measurement, ContextType.UNITUNDERTEST))
@@ -266,7 +262,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
 	public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, Measurement.class, id)
 				.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTSEQUENCE))
@@ -309,7 +305,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
 	public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, Measurement.class, id)
 				.map(measurement -> contextService.updateContext(body, measurement, ContextType.TESTEQUIPMENT))
@@ -365,23 +361,16 @@
 	 * @return the created {@link Measurement} as {@link Response}.
 	 */
 	@POST
-	@Operation(summary = "Create a new Measurement",  responses = {
+	@Operation(summary = "Create a new Measurement", responses = {
 			@ApiResponse(description = "The created Measurement", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
 			@ApiResponse(responseCode = "500", description = "Error") })
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
-		Seq<Value<?>> args = L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName),
-				// get PhysDim
-				entityService.find(sourceName, TestStep.class,
-						// get id of related TestStep
-						decompose(body::getData).<MDMEntity>getAt(0) //
-								.get(e -> e.getRelations().stream() //
-										.filter(r -> r.getEntityType().equals(TestStep.class.getSimpleName())) //
-										.findFirst().get()) //
-								.get(MDMRelation::getIds).getValueAt(0)),
-				V(new ContextRoot[] {}));
-		return entityService.create(sourceName, Measurement.class, args)
+		return entityService
+				.create(sourceName, Measurement.class,
+						entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
+								List.of(TestStep.class)).append(V(new ContextRoot[] {})))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
 	}
@@ -451,7 +440,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}/files/{remotePath}")
 	public Response streamFileLink(
 			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@Parameter(description = "ID of the Measurement containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id, 
+			@Parameter(description = "ID of the Measurement containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
 			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam("remotePath") String remotePath) {
 
 		return entityService.find(sourceName, Measurement.class, id).map(fa -> new EntityFileLink(fa, remotePath))
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
index 27ac6e8..daf75be 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/PoolResource.java
@@ -185,7 +185,8 @@
 
 		return entityService
 				.create(sourceName, Pool.class,
-						entityService.extractArgumentsFromRequestBody(sourceName, body, List.of(Project.class)))
+						entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
+								List.of(Project.class)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
index f8c2dd1..16a18e7 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestResource.java
@@ -193,7 +193,7 @@
 
 		return entityService
 				.create(sourceName, Test.class,
-						entityService.extractArgumentsFromRequestBody(sourceName, body,
+						entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
 								List.of(Pool.class, TemplateTest.class)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
index 3cc9254..2b1cc1f 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TestStepResource.java
@@ -176,7 +176,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts")
 	public Response updateContext(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, TestStep.class, id)
 				.map(testStep -> contextService.updateContext(body, testStep)).map(ContextResponse::new)
@@ -218,7 +218,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/unitundertest")
 	public Response updateContextUUT(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, TestStep.class, id)
 				.map(testStep -> contextService.updateContext(body, testStep, ContextType.UNITUNDERTEST))
@@ -260,7 +260,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testsequence")
 	public Response updateContextTSQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, TestStep.class, id)
 				.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTSEQUENCE))
@@ -302,7 +302,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}/contexts/testequipment")
 	public Response updateContextTEQ(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@PathParam(REQUESTPARAM_ID) String id, MDMEntityResponse body) {
+			@PathParam(REQUESTPARAM_ID) String id, ContextResponse body) {
 
 		return entityService.find(sourceName, TestStep.class, id)
 				.map(testStep -> contextService.updateContext(body, testStep, ContextType.TESTEQUIPMENT))
@@ -358,17 +358,18 @@
 	 * @return the created {@link TestStep} as {@link Response}.
 	 */
 	@POST
-	@Operation(summary = "Create a new TestStep",  responses = {
+	@Operation(summary = "Create a new TestStep", responses = {
 			@ApiResponse(description = "The created TestStep", content = @Content(schema = @Schema(implementation = MDMEntityResponse.class))),
 			@ApiResponse(responseCode = "500", description = "Error") })
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public Response create(
-			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			MDMEntityResponse body) {
 
 		return entityService
 				.create(sourceName, TestStep.class,
-						entityService.extractArgumentsFromRequestBody(sourceName, body,
+						entityService.extractArgumentsFromRequestBody(sourceName, body, List.of("Name"),
 								List.of(Test.class, TemplateTestStep.class)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER).getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -391,10 +392,10 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response patch(
-			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName, 
+			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@Parameter(description = "ID of the TestStep", required = true) @PathParam(REQUESTPARAM_ID) String id,
 			MDMEntityResponse body) {
-	
+
 		return entityService
 				.update(sourceName, entityService.find(sourceName, TestStep.class, id),
 						decompose(body::getData).<MDMEntity>getValueAt(0))
@@ -442,7 +443,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}/files/{remotePath}")
 	public Response streamFileLink(
 			@Parameter(description = "Name of the MDM datasource", required = true) @PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
-			@Parameter(description = "ID of the TestStep containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id, 
+			@Parameter(description = "ID of the TestStep containing the file link", required = true) @PathParam(REQUESTPARAM_ID) String id,
 			@Parameter(description = "The remote path of the file link whose content is to be retrieved", required = true) @PathParam("remotePath") String remotePath) {
 
 		return entityService.find(sourceName, TestStep.class, id).map(fa -> new EntityFileLink(fa, remotePath))
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
index bbcbc11..2286e49 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/entity/ContextResponse.java
@@ -63,6 +63,12 @@
 	}
 
 	/**
+	 * Default constructor
+	 */
+	public ContextResponse() {
+	}
+
+	/**
 	 * returns the context data
 	 * 
 	 * @return the context data
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
index 9169ac8..954fe6c 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/ContextService.java
@@ -17,6 +17,7 @@
 import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_MEASURED;
 import static org.eclipse.mdm.businessobjects.control.ContextActivity.CONTEXT_GROUP_ORDERED;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.NoSuchElementException;
@@ -25,6 +26,7 @@
 import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.inject.Inject;
+import javax.ws.rs.BadRequestException;
 
 import org.eclipse.mdm.api.base.Transaction;
 import org.eclipse.mdm.api.base.model.ContextComponent;
@@ -39,15 +41,19 @@
 import org.eclipse.mdm.api.dflt.model.EntityFactory;
 import org.eclipse.mdm.api.dflt.model.TemplateRoot;
 import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
-import org.eclipse.mdm.businessobjects.control.ContextActivity;
 import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
+import org.eclipse.mdm.businessobjects.entity.ContextCollection;
+import org.eclipse.mdm.businessobjects.entity.ContextResponse;
 import org.eclipse.mdm.businessobjects.entity.MDMAttribute;
 import org.eclipse.mdm.businessobjects.entity.MDMEntity;
-import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
+import org.eclipse.mdm.businessobjects.utils.Decomposer;
+import org.eclipse.mdm.businessobjects.utils.ISODateDeseralizer;
 import org.eclipse.mdm.businessobjects.utils.Serializer;
-import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
 import org.eclipse.mdm.connector.boundary.ConnectorService;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.google.common.base.Strings;
 
 import io.vavr.Lazy;
@@ -223,30 +229,42 @@
 	 *                           all contextTypes.
 	 * @return
 	 */
-	public DescribableContexts updateContext(MDMEntityResponse body, ContextDescribable contextDescribable,
+	public DescribableContexts updateContext(ContextResponse body, ContextDescribable contextDescribable,
 			ContextType... contextTypes) {
-		Try<Map<String, Object>> contextMap = Try.of(() -> body.getData().get(0)).map(this::transformMap);
 
-		DescribableContexts ec = updateContext(getTestStep(contextDescribable), contextMap,
+		ContextCollection contextCollection = Decomposer.decompose(body::getData).<ContextCollection>getValueAt(0);
+
+		DescribableContexts ec = updateContext(getTestStep(contextDescribable), contextCollection,
 				getContextTypes(contextTypes));
 		persist(ec);
 		return ec;
 	}
 
-	private DescribableContexts updateContext(TestStep testStep, Try<Map<String, Object>> contextMap,
+	private HashMap<String, Object> deserializeRequestBody(String body) {
+		ObjectMapper mapper = new ObjectMapper();
+		SimpleModule simpleModule = new SimpleModule();
+		simpleModule.addDeserializer(Object.class, new ISODateDeseralizer());
+		mapper.registerModule(simpleModule);
+
+		try {
+			return HashMap.ofAll(mapper.readValue(body, new TypeReference<java.util.Map<String, Object>>() {
+			}));
+		} catch (IOException e) {
+			throw new BadRequestException("Body of request could not be deserialized", e);
+		}
+	}
+
+	private DescribableContexts updateContext(TestStep testStep, ContextCollection contextCollection,
 			ContextType[] contextTypes) {
-		Map<ContextType, Object> orderedMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_ORDERED)
-				.map(this::transformMap).getOrElse(HashMap.empty())
-				.mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+
+		Map<ContextType, java.util.List<MDMEntity>> orderedMap = HashMap.ofAll(contextCollection.ordered)
 				.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
 
 		DescribableContexts ec = new DescribableContexts();
 		ec.setTestStep(testStep);
 		ec.setOrdered(updateContextDescribableContext(testStep, orderedMap, contextTypes));
 
-		Map<ContextType, Object> measuredMap = contextMap.get().get(ContextActivity.CONTEXT_GROUP_MEASURED)
-				.map(this::transformMap).getOrElse(HashMap.empty())
-				.mapKeys(t -> ServiceUtils.getContextTypeSupplier(t).get())
+		Map<ContextType, java.util.List<MDMEntity>> measuredMap = HashMap.ofAll(contextCollection.measured)
 				.filterKeys(t -> Arrays.asList(contextTypes).contains(t));
 
 		ec.setMeasurements(getEntityManager(testStep.getSourceName()).loadChildren(testStep, Measurement.class));
@@ -257,7 +275,8 @@
 	}
 
 	private java.util.Map<ContextType, ContextRoot> updateContextDescribableContext(
-			ContextDescribable contextDescribable, Map<ContextType, Object> rootMap, ContextType[] contextTypes) {
+			ContextDescribable contextDescribable, Map<ContextType, java.util.List<MDMEntity>> rootMap,
+			ContextType[] contextTypes) {
 		java.util.Map<ContextType, ContextRoot> existingRootMap = getEntityManager(contextDescribable.getSourceName())
 				.loadContexts(contextDescribable, contextTypes);
 
@@ -284,8 +303,8 @@
 		}
 	}
 
-	private void updateContextRoot(ContextRoot existingRoot, Object newContextRoot) {
-		transformList(newContextRoot).map(this::transformMap).map(this::transformToMDMEntity).forEach(mdmEntity -> {
+	private void updateContextRoot(ContextRoot existingRoot, java.util.List<MDMEntity> newContextRoot) {
+		newContextRoot.forEach(mdmEntity -> {
 			ContextComponent comp = existingRoot.getContextComponent(mdmEntity.getName())
 					.orElseGet(() -> getEntityFactory(existingRoot.getSourceName())
 							.createContextComponent(mdmEntity.getName(), existingRoot));
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
index 5b5b03f..317598d 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/EntityService.java
@@ -461,45 +461,77 @@
 	}
 
 	/**
-	 * see
-	 * {@link #extractArgumentsFromRequestBody(String, MDMEntityResponse, boolean, Class...)}
+	 * Extract arguments from request defaulting to extract MDMEntity.name see also
+	 * {@link #extractArgumentsFromRequestBody(String, MDMEntityResponse, List, List)}
 	 */
 	public Seq<Value<?>> extractArgumentsFromRequestBody(String sourceName, MDMEntityResponse body) {
-		return extractArgumentsFromRequestBody(sourceName, body, List.empty());
+		return extractArgumentsFromRequestBody(sourceName, body, List.of("Name"), List.empty());
 	}
 
 	/**
 	 * Extract arguments from request body to use for {@link EntityFactory} create
-	 * methods.
+	 * methods. If and argument given by attributeArguments or relationArguments
+	 * cannot be found, they are skipped.
 	 * 
-	 * @param sourceName             name of the source (MDM {@link Environment}
-	 *                               name)
-	 * @param body                   deserialized request to extract arguments from
-	 * @param relatedEntityArguments classes of related entities to extract from
-	 *                               request
-	 * @return the extracted arguments
+	 * @param sourceName         name of the source (MDM {@link Environment} name)
+	 * @param body               deserialized request to extract arguments from
+	 * @param attributeArguments list of names of attributes to extract values from
+	 * @param relationArguments  classes of related entities to extract from
+	 * @return the extracted arguments as a {@link Seq} of {@link Value}.
 	 */
 	public final Seq<Value<?>> extractArgumentsFromRequestBody(String sourceName, MDMEntityResponse body,
-			List<Class<? extends Entity>> relatedEntityArguments) {
-		List<Try<?>> name;
+			List<String> attributeArguments, List<Class<? extends Entity>> relationArguments) {
+		List<Try<?>> extractedArguments = List.empty();
 
-		// then name attribute can be omitted in some cases
-		Try<Decomposer<String>> nameTry = Try
-				.of(() -> decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName));
-		if (!nameTry.isFailure()) {
-			name = List.of(nameTry.get());
-		} else {
-			name = List.empty();
+		// if there arguments to be extracted from MDMEntity.attributes
+		if (attributeArguments != null) {
+			// although the name of the entity to be created is an attribute, it could also
+			// be given as MDMEntity.name instead of MDMEntity.attributes("Name")
+			extractedArguments = extractedArguments.appendAll(
+					attributeArguments.filter(attrName -> attrName.equalsIgnoreCase("name")).map(attrName -> Try
+							.of(() -> decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName)).get()));
+
+			extractedArguments = extractedArguments
+					// ignore name attr if already processed
+					.appendAll(attributeArguments.filter(attrName -> !attrName.equalsIgnoreCase("name"))//
+							.map(attrName -> Try.of(() -> //
+							decompose(body::getData) //
+									.<MDMEntity>getAt(0) //
+									.<MDMAttribute, String>getFiltered(MDMEntity::getAttributes, MDMAttribute::getName,
+											attrName) //
+									.map(attr -> {
+										Object value = attr.getValue().toString();
+										if (attr.getDataType().equals("ENUMERATION")) {
+											value = EnumRegistry.getInstance().get(EnumRegistry.VALUE_TYPE)
+													.valueOf(value.toString());
+										}
+										return value;
+									}).get())));
 		}
 
 		// wrap find in Try to handle non-existing relation (not all entityClasses must
 		// exist as a relation)
-		return relatedEntityArguments.map(clazz -> Try.of(() -> find(sourceName, clazz, //
-				decompose(body::getData).<MDMEntity>getAt(0) //
-						.<MDMRelation, String>getFiltered(MDMEntity::getRelations, MDMRelation::getEntityType,
-								clazz.getSimpleName()) //
-						.get(MDMRelation::getIds).getValueAt(0)).get()))
-				.foldLeft(name, (l, e) -> l.append(e)).filter(Try::isSuccess).map(Try::toOption);
+		if (relationArguments != null) {
+			extractedArguments = extractedArguments
+					.appendAll(relationArguments.map(clazz -> Try.of(() -> find(sourceName, clazz, //
+							// get IDs of related entities
+							decompose(body::getData).<MDMEntity>getAt(0) //
+									.<MDMRelation, String>getFiltered(MDMEntity::getRelations,
+											MDMRelation::getEntityType, clazz.getSimpleName()) //
+									.get(MDMRelation::getIds).getValueAt(0),
+							// get ContextType; if not present, find() ignores null value
+							Try.of(() -> decompose(body::getData).<MDMEntity>getAt(0) //
+									.<MDMRelation, String>getFiltered(MDMEntity::getRelations,
+											MDMRelation::getEntityType, clazz.getSimpleName()) //
+									.get(MDMRelation::getContextType)).getOrElse((Decomposer<ContextType>) null)) //
+											.get())));
+		}
+
+		// log failures as warnings
+		extractedArguments.filter(Try::isFailure)
+				.forEach(failure -> LOGGER.warn("Argument to extract not found: {}", failure.getCause().getMessage()));
+
+		return extractedArguments.filter(Try::isSuccess).map(Try::toOption);
 	}
 
 	/**
@@ -909,8 +941,7 @@
 		}
 
 		return entityClasses
-				.map(clazz -> find(sourceName, clazz,
-						requestBody.getStringValueSupplier(clazz.getSimpleName()).get()))
+				.map(clazz -> find(sourceName, clazz, requestBody.getStringValueSupplier(clazz.getSimpleName()).get()))
 				.foldLeft(name, (l, e) -> l.append(e)).filter(Try::isSuccess).map(Try::toOption);
 	}
 
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
index 5c5e691..cfeb3f0 100755
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/ISODateDeseralizer.java
@@ -33,7 +33,7 @@
  * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
  *
  */
-class ISODateDeseralizer extends UntypedObjectDeserializer {
+public class ISODateDeseralizer extends UntypedObjectDeserializer {
 
 	private static final long serialVersionUID = 1L;
 
