diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
index 8ad824f..b6d8b4a 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ResourceConstants.java
@@ -50,6 +50,11 @@
 	public static final String REQUESTPARAM_ID = "ID";
 
 	/**
+	 * Parameter holding the {@link Entity}s name in the URI path
+	 */
+	public static final String REQUESTPARAM_NAME = "NAME";
+
+	/**
 	 * Parameter holding an additional {@link Entity}s id in the URI path, e.g. for
 	 * a {@link TemplateComponent} when {@link REQUESTPARAM_ID} holds the id of the
 	 * {@link TemplateRoot}.
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
index 2d02130..9f86259 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateRootResource.java
@@ -41,7 +41,7 @@
 import org.eclipse.mdm.businessobjects.entity.MDMEntityAction;
 import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
 import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
-import org.eclipse.mdm.businessobjects.service.TemplateRootService;
+import org.eclipse.mdm.businessobjects.service.TemplateService;
 import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
 
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -57,7 +57,7 @@
 public class TemplateRootResource {
 
 	@EJB
-	private TemplateRootService tplRootService;
+	private TemplateService tplService;
 
 	/**
 	 * Returns the found {@link TemplateRoot}.
@@ -73,7 +73,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
-		return tplRootService
+		return tplService
 				.find(sourceName, TemplateRoot.class, id, ServiceUtils.getContextTypeSupplier(contextTypeParam))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
@@ -92,7 +92,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @QueryParam("filter") String filter) {
-		return tplRootService
+		return tplService
 				.findAll(sourceName, TemplateRoot.class, filter, ServiceUtils.getContextTypeSupplier(contextTypeParam))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
@@ -110,7 +110,7 @@
 	@Consumes(MediaType.APPLICATION_JSON)
 	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, MDMEntityResponse body) {
-		return tplRootService
+		return tplService
 				.create(sourceName, TemplateRoot.class,
 						L(ServiceUtils.getContextTypeSupplier(contextTypeParam),
 								decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName)))
@@ -135,9 +135,9 @@
 	public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id,
 			MDMEntityResponse body) {
-		return tplRootService
+		return tplService
 				.update(sourceName,
-						tplRootService.find(sourceName, TemplateRoot.class, id,
+						tplService.find(sourceName, TemplateRoot.class, id,
 								ServiceUtils.getContextTypeSupplier(contextTypeParam)),
 						decompose(body::getData).<MDMEntity>getValueAt(0))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
@@ -156,9 +156,9 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_CONTEXTTYPE) String contextTypeParam, @PathParam(REQUESTPARAM_ID) String id) {
-		return tplRootService
+		return tplService
 				.delete(sourceName,
-						tplRootService.find(sourceName, TemplateRoot.class, id,
+						tplService.find(sourceName, TemplateRoot.class, id,
 								ServiceUtils.getContextTypeSupplier(contextTypeParam)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
@@ -187,7 +187,7 @@
 					.entity(String.format("Given action '%s' is not supported", entityAction.getType().name())).build();
 		}
 
-		return tplRootService.createNewVersion(sourceName, ServiceUtils.getContextTypeSupplier(contextTypeParam), id)
+		return tplService.createTplRootVersion(sourceName, ServiceUtils.getContextTypeSupplier(contextTypeParam), id)
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -204,7 +204,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/searchattributes")
 	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateRoot.class, tplRootService);
+		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateRoot.class, tplService);
 	}
 
 	/**
@@ -218,6 +218,6 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/localizations")
 	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateRoot.class, tplRootService);
+		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateRoot.class, tplService);
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
index 9a26798..b82debd 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestResource.java
@@ -15,6 +15,7 @@
 package org.eclipse.mdm.businessobjects.boundary;
 
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_NAME;
 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;
@@ -33,11 +34,13 @@
 import javax.ws.rs.core.Response.Status;
 
 import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
 import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
 import org.eclipse.mdm.businessobjects.entity.MDMEntity;
 import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
 import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
-import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.service.TemplateService;
 import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
 
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -53,7 +56,7 @@
 public class TemplateTestResource {
 
 	@EJB
-	private EntityService entityService;
+	private TemplateService tplService;
 
 	/**
 	 * Returns the found {@link TemplateTest}.
@@ -66,7 +69,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
-		return entityService.find(sourceName, TemplateTest.class, id)
+		return tplService.find(sourceName, TemplateTest.class, id)
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -83,7 +86,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@QueryParam("filter") String filter) {
-		return entityService.findAll(sourceName, TemplateTest.class, filter)
+		return tplService.findAll(sourceName, TemplateTest.class, filter)
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -99,7 +102,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
-		return entityService
+		return tplService
 				.create(sourceName, TemplateTest.class,
 						L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED))
@@ -122,8 +125,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
 			MDMEntityResponse body) {
-		return entityService
-				.update(sourceName, entityService.find(sourceName, TemplateTest.class, id),
+		return tplService.update(sourceName, tplService.find(sourceName, TemplateTest.class, id),
 						decompose(body::getData).<MDMEntity>getValueAt(0))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
@@ -131,6 +133,27 @@
 	}
 
 	/**
+	 * Creates new version of given {@link TemplateTestStep}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateRoot} to create new
+	 *                   version of
+	 * @return a new version of given {@link TemplateTestStep}
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_NAME + "}/versions")
+	public Response createNewVersion(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_NAME) String name) {
+
+		return tplService.createTplTestVersion(sourceName, name)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) //
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
 	 * Deletes and returns the deleted {@link TemplateTest}.
 	 * 
 	 * @param id The identifier of the {@link TemplateTest} to delete.
@@ -141,7 +164,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_ID) String id) {
-		return entityService.delete(sourceName, entityService.find(sourceName, TemplateTest.class, id))
+		return tplService.delete(sourceName, tplService.find(sourceName, TemplateTest.class, id))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -157,7 +180,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/searchattributes")
 	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTest.class, entityService);
+		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTest.class, tplService);
 	}
 
 	/**
@@ -170,6 +193,6 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/localizations")
 	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTest.class, entityService);
+		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTest.class, tplService);
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
index 413e10d..664d566 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/TemplateTestStepResource.java
@@ -15,6 +15,7 @@
 package org.eclipse.mdm.businessobjects.boundary;
 
 import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_ID;
+import static org.eclipse.mdm.businessobjects.boundary.ResourceConstants.REQUESTPARAM_NAME;
 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;
@@ -34,11 +35,12 @@
 
 import org.eclipse.mdm.api.base.model.ContextType;
 import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
 import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
 import org.eclipse.mdm.businessobjects.entity.MDMEntity;
 import org.eclipse.mdm.businessobjects.entity.MDMEntityResponse;
 import org.eclipse.mdm.businessobjects.entity.SearchAttribute;
-import org.eclipse.mdm.businessobjects.service.EntityService;
+import org.eclipse.mdm.businessobjects.service.TemplateService;
 import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
 
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -54,7 +56,7 @@
 public class TemplateTestStepResource {
 
 	@EJB
-	private EntityService entityService;
+	private TemplateService tplService;
 
 	/**
 	 * Returns the found {@link TemplateTestStep}.
@@ -69,7 +71,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response find(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id) {
-		return entityService.find(sourceName, TemplateTestStep.class, id)
+		return tplService.find(sourceName, TemplateTestStep.class, id)
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -89,7 +91,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response findAll(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@QueryParam("filter") String filter) {
-		return entityService.findAll(sourceName, TemplateTestStep.class, filter)
+		return tplService.findAll(sourceName, TemplateTestStep.class, filter)
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -105,7 +107,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public Response create(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, MDMEntityResponse body) {
-		return entityService
+		return tplService
 				.create(sourceName, TemplateTestStep.class,
 						L(decompose(body::getData).<MDMEntity>getAt(0).get(MDMEntity::getName)))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) //
@@ -128,8 +130,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response patch(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName, @PathParam(REQUESTPARAM_ID) String id,
 			MDMEntityResponse body) {
-		return entityService
-				.update(sourceName, entityService.find(sourceName, TemplateTestStep.class, id),
+		return tplService.update(sourceName, tplService.find(sourceName, TemplateTestStep.class, id),
 						decompose(body::getData).<MDMEntity>getValueAt(0))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
@@ -137,6 +138,27 @@
 	}
 
 	/**
+	 * Creates new version of given {@link TemplateTestStep}.
+	 * 
+	 * @param sourceName name of the source (MDM {@link Environment} name)
+	 * @param id         the identifier of the {@link TemplateRoot} to create new
+	 *                   version of
+	 * @return a new version of given {@link TemplateTestStep}
+	 */
+	@POST
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Path("/{" + REQUESTPARAM_NAME + "}/versions")
+	public Response createNewVersion(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
+			@PathParam(REQUESTPARAM_NAME) String name) {
+
+		return tplService.createTplTestStepVersion(sourceName, name)
+				.map(e -> ServiceUtils.buildEntityResponse(e, Status.CREATED)) //
+				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
+				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
+	}
+
+	/**
 	 * Deletes and returns the deleted {@link TemplateTestStep}.
 	 * 
 	 * @param id The identifier of the {@link TemplateTestStep} to delete.
@@ -147,7 +169,7 @@
 	@Path("/{" + REQUESTPARAM_ID + "}")
 	public Response delete(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName,
 			@PathParam(REQUESTPARAM_ID) String id) {
-		return entityService.delete(sourceName, entityService.find(sourceName, TemplateTestStep.class, id))
+		return tplService.delete(sourceName, tplService.find(sourceName, TemplateTestStep.class, id))
 				.map(e -> ServiceUtils.buildEntityResponse(e, Status.OK)) //
 				.recover(ServiceUtils.ERROR_RESPONSE_SUPPLIER) //
 				.getOrElse(ServiceUtils.SERVER_ERROR_RESPONSE);
@@ -163,7 +185,7 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/searchattributes")
 	public Response getSearchAttributes(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTestStep.class, entityService);
+		return ServiceUtils.buildSearchAttributesResponse(sourceName, TemplateTestStep.class, tplService);
 	}
 
 	/**
@@ -176,6 +198,6 @@
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("/localizations")
 	public Response localize(@PathParam(REQUESTPARAM_SOURCENAME) String sourceName) {
-		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTestStep.class, entityService);
+		return ServiceUtils.buildLocalizationResponse(sourceName, TemplateTestStep.class, tplService);
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java
similarity index 61%
rename from org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java
rename to org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java
index d06c762..a218aca 100644
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateRootService.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/service/TemplateService.java
@@ -34,6 +34,11 @@
 import org.eclipse.mdm.api.dflt.model.TemplateComponent;
 import org.eclipse.mdm.api.dflt.model.TemplateRoot;
 import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
+import org.eclipse.mdm.businessobjects.utils.EntityNotFoundException;
+import org.eclipse.mdm.businessobjects.utils.EntityNotFoundException.Type;
 
 import io.vavr.Tuple;
 import io.vavr.Value;
@@ -43,28 +48,129 @@
  * {@link TemplateRoot} service handling corresponding operations
  * 
  * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
+ * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
  *
  */
 @Stateless
-public class TemplateRootService extends EntityService {
+public class TemplateService extends EntityService {
 
 	/**
-	 * Create new version of {@link TemplateRoot} with given id
+	 * Create new version of {@link TemplateTest} with given name. The link linked
+	 * {@link TemplateTestStep}s are copied.
+	 * 
+	 * @param sourceNameSupplier a {@link Value} with the source name (MDM
+	 *                           {@link Environment} name)
+	 * @param name               name of entity to create new version of
+	 * @return new version of the {@link TemplateTestStep} with the given name
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> Try<T> createTplTestVersion(String sourceName, String name) {
+		return Try.of(() -> {
+			List<TemplateTest> tplTests = getEntityManager(sourceName)
+					.mapTry(em -> em.loadAll(TemplateTest.class, name)).get();
+			if (tplTests.isEmpty()) {
+				throw new EntityNotFoundException(TemplateTestStep.class, name, Type.NAME);
+			}
+
+			ApplicationContext appContext = connectorService.getContextByName(sourceName);
+			EntityFactory entityFactory = appContext.getEntityFactory().get();
+			EntityManager entityManager = appContext.getEntityManager().get();
+
+			// get latest version
+			Comparator<TemplateTest> versionComparator = Comparator.comparing(TemplateTest::getVersion);
+			TemplateTest latestTplTest = tplTests.stream().max(versionComparator).get();
+
+			TemplateTest newTplTest = entityFactory.createTemplateTest(latestTplTest.getName());
+			newTplTest.setVersion(latestTplTest.getVersion() + 1);
+
+			Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(entityManager,
+					Tuple.of(newTplTest, DataAccessHelper.CREATE));
+
+			// set TplTestSteps as in latestVersion
+			for (TemplateTestStepUsage tplTestStepUsage : latestTplTest.getTemplateTestStepUsages()) {
+				TemplateTestStepUsage newUsage = entityFactory.createTemplateTestStepUsage(tplTestStepUsage.getName(),
+						newTplTest, tplTestStepUsage.getTemplateTestStep());
+				DataAccessHelper.execute(entityManager, Tuple.of(newUsage, DataAccessHelper.CREATE));
+			}
+
+			return (T) entities.toArray()[0];
+		});
+	}
+
+	/**
+	 * Create new version of {@link TemplateTestStep} with given name. The linked
+	 * TplRoots are copied from the given {@link TemplateTestStep}
+	 * 
+	 * @param sourceNameSupplier a {@link Value} with the source name (MDM
+	 *                           {@link Environment} name)
+	 * @param name               name of entity to create new version of
+	 * @return new version of the {@link TemplateTestStep} with the given name
+	 */
+	@SuppressWarnings("unchecked")
+	public <T extends Entity> Try<T> createTplTestStepVersion(String sourceName, String name) {
+		return Try.of(() -> {
+			List<TemplateTestStep> tplTestSteps = getEntityManager(sourceName)
+					.mapTry(em -> em.loadAll(TemplateTestStep.class, name)).get();
+			if (tplTestSteps.isEmpty()) {
+				throw new EntityNotFoundException(TemplateTestStep.class, name, Type.NAME);
+			}
+			TemplateTestStep givenTplTestStep = tplTestSteps.get(0);
+			ApplicationContext appContext = connectorService.getContextByName(sourceName);
+			TemplateTestStep newTplTestStep = copyTplTestStep(appContext.getEntityFactory().get(),
+					appContext.getEntityManager().get(), givenTplTestStep);
+			Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(getEntityManager(sourceName).get(),
+					Tuple.of(newTplTestStep, DataAccessHelper.CREATE));
+
+			return (T) entities.toArray()[0];
+		});
+	}
+
+	/**
+	 * Create a copy of a given {@link TemplateTestStep} and set version to latest +
+	 * 1
+	 * 
+	 * @param entityFactory    {@link EntityFactory} to create new
+	 *                         {@link TemplateTestStep}
+	 * @param entityManager    {@link EntityManager} to get last version of given
+	 *                         {@link TemplateTestStep}
+	 * @param givenTplTestStep {@link TemplateTestStep} to create new version of
+	 * @return copy of the given {@link TemplateTestStep}
+	 */
+	private TemplateTestStep copyTplTestStep(EntityFactory entityFactory, EntityManager entityManager,
+			TemplateTestStep givenTplTestStep) {
+
+		TemplateTestStep newTemplateTestStep = entityFactory.createTemplateTestStep(givenTplTestStep.getName());
+		Comparator<TemplateTestStep> versionComparator = Comparator.comparing(TemplateTestStep::getVersion);
+		Optional<Integer> latestVersion = entityManager.loadAll(TemplateTestStep.class, newTemplateTestStep.getName())
+				.stream().max(versionComparator).map(TemplateTestStep::getVersion);
+		if (latestVersion.isPresent()) {
+			newTemplateTestStep.setVersion(latestVersion.get() + 1);
+		}
+
+		for (TemplateRoot tplRoot : givenTplTestStep.getTemplateRoots()) {
+			newTemplateTestStep.setTemplateRoot(tplRoot);
+		}
+
+		return newTemplateTestStep;
+	}
+
+	/**
+	 * * Create new version of {@link TemplateRoot} with given id
 	 * 
 	 * @param sourceNameSupplier  a {@link Value} with the source name (MDM
 	 *                            {@link Environment} name)
 	 * @param contextTypeSupplier a {@link Value} with the contextType of entity to
 	 *                            create new version of.
 	 * @param id                  id of entity to create new version of
-	 * @return
+	 * @return new version of the {@link TemplateRoot} with the given id
 	 */
 	@SuppressWarnings("unchecked")
-	public <T extends Entity> Try<T> createNewVersion(String sourceName, Value<ContextType> contextTypeSupplier,
+	public <T extends Entity> Try<T> createTplRootVersion(String sourceName, Value<ContextType> contextTypeSupplier,
 			String id) {
 		return Try.of(() -> {
 			TemplateRoot givenTplRoot = find(sourceName, TemplateRoot.class, id, contextTypeSupplier).get();
 			ApplicationContext appContext = connectorService.getContextByName(sourceName);
-			TemplateRoot newTplRoot = createNewTplRootVersion(appContext.getEntityFactory().get(),
+			TemplateRoot newTplRoot = copyTplRoot(appContext.getEntityFactory().get(),
 					appContext.getEntityManager().get(), givenTplRoot);
 			Set<Entity> entities = (Set<Entity>) DataAccessHelper.execute(getEntityManager(sourceName).get(),
 					Tuple.of(newTplRoot, DataAccessHelper.CREATE));
@@ -74,7 +180,7 @@
 	}
 
 	/**
-	 * Create new version of given {@link TemplateRoot}
+	 * Create a copy of a given {@link TemplateRoot} and set version to latest + 1
 	 * 
 	 * @param entityFactory {@link EntityFactory} to create new {@link TemplateRoot}
 	 * @param entityManager {@link EntityManager} to get last version of given
@@ -82,7 +188,7 @@
 	 * @param givenTplRoot  {@link TemplateRoot} to create new version of
 	 * @return
 	 */
-	private TemplateRoot createNewTplRootVersion(EntityFactory entityFactory, EntityManager entityManager,
+	private TemplateRoot copyTplRoot(EntityFactory entityFactory, EntityManager entityManager,
 			TemplateRoot givenTplRoot) {
 		TemplateRoot newTemplateRoot = entityFactory.createTemplateRoot(givenTplRoot.getContextType(),
 				givenTplRoot.getName());
@@ -112,24 +218,6 @@
 	}
 
 	/**
-	 * Copy given {@link TemplateAttribute}s into given {@link TemplateComponent}
-	 * 
-	 * @param entityFactory {@link EntityFactory} to create new entities
-	 * @param tplComp       {@link TemplateComponent} into given
-	 *                      {@link TemplateAttribute}s shall be copied
-	 * @param givenTplAttrs {@link TemplateAttribute}s which shall be copied
-	 */
-	private void copyTplAttrs(EntityFactory entityFactory, TemplateComponent tplComp,
-			List<TemplateAttribute> givenTplAttrs) {
-		for (TemplateAttribute tplAttr : givenTplAttrs) {
-			TemplateAttribute newTplAttr = tplComp.getTemplateAttributes().stream()
-					.filter(ta -> ta.getName().equals(tplAttr.getName())).findFirst()
-					.orElseGet(() -> entityFactory.createTemplateAttribute(tplAttr.getName(), tplComp));
-			mergeEntities(tplAttr, newTplAttr, Entity.ATTR_NAME, Entity.ATTR_MIMETYPE);
-		}
-	}
-
-	/**
 	 * Copy given child {@link TemplateComponent}s into given
 	 * {@link TemplateComponent}
 	 * 
@@ -153,6 +241,24 @@
 	}
 
 	/**
+	 * Copy given {@link TemplateAttribute}s into given {@link TemplateComponent}
+	 * 
+	 * @param entityFactory {@link EntityFactory} to create new entities
+	 * @param tplComp       {@link TemplateComponent} into given
+	 *                      {@link TemplateAttribute}s shall be copied
+	 * @param givenTplAttrs {@link TemplateAttribute}s which shall be copied
+	 */
+	private void copyTplAttrs(EntityFactory entityFactory, TemplateComponent tplComp,
+			List<TemplateAttribute> givenTplAttrs) {
+		for (TemplateAttribute tplAttr : givenTplAttrs) {
+			TemplateAttribute newTplAttr = tplComp.getTemplateAttributes().stream()
+					.filter(ta -> ta.getName().equals(tplAttr.getName())).findFirst()
+					.orElseGet(() -> entityFactory.createTemplateAttribute(tplAttr.getName(), tplComp));
+			mergeEntities(tplAttr, newTplAttr, Entity.ATTR_NAME, Entity.ATTR_MIMETYPE);
+		}
+	}
+
+	/**
 	 * Copy given {@link TemplateSeonsor}s into given {@link TemplateComponent}
 	 * 
 	 * @param entityFactory   {@link EntityFactory} to create new entities
diff --git a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
index 5a5ca75..7ec5115 100755
--- a/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
+++ b/org.eclipse.mdm.businessobjects/src/main/java/org/eclipse/mdm/businessobjects/utils/EntityNotFoundException.java
@@ -26,6 +26,10 @@
 
 	private static final long serialVersionUID = 6862157710262117670L;
 
+	public enum Type {
+		ID, NAME;
+	}
+
 	/**
 	 * Default constructor with causing exception
 	 * 
@@ -41,9 +45,21 @@
 	 * Default constructor without causing exception
 	 * 
 	 * @param entityClass Class of entity that could not be found
+	 * @param identifier  identifier of entity (either {@link Type.id} or
+	 *                    {@link Type.name} that could not be found
+	 * @param type        type of identifier
+	 */
+	public EntityNotFoundException(Class<? extends Entity> entityClass, String identifier, Type type) {
+		super(entityClass.getSimpleName() + " with " + type.toString() + " " + identifier + " not found.");
+	}
+
+	/**
+	 * Default constructor without causing exception
+	 * 
+	 * @param entityClass Class of entity that could not be found
 	 * @param id          id of entity that could not be found
 	 */
 	public EntityNotFoundException(Class<? extends Entity> entityClass, String id) {
-		super(entityClass.getSimpleName() + " with ID " + id + " not found.");
+		this(entityClass, id, Type.ID);
 	}
 }
