import external references from atfx files
diff --git a/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java b/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
index 1700f4f..857096c 100644
--- a/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
+++ b/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
@@ -339,16 +339,20 @@
 			ElemId elemId = new ElemId(((ODSEntityType) contextDescribableEntityType).getODSID(),
 					ODSConverter.toODSID(contextDescribable.getID()));
 			try {
-				T_LONGLONG[] contextRootIds = odsModelManager.getApplElemAccess().getRelInst(elemId,
-						contextDescribableEntityType.getRelation(entityType).getName());
+				Optional<Relation> relation = getRelation(contextDescribableEntityType, entityType);
 
-				if (contextRootIds != null && contextRootIds.length > 0) {
-					// There can only be one result per ContextType, thus we take the first one and
-					// ignore the rest
-					String instanceID = Long.toString(ODSConverter.fromODSLong(contextRootIds[0]));
+				if (relation.isPresent()) {
+					T_LONGLONG[] contextRootIds = odsModelManager.getApplElemAccess().getRelInst(elemId,
+							relation.get().getName());
 
-					contextRoots.put(contextType,
-							entityLoader.load(new Key<>(ContextRoot.class, contextType), instanceID));
+					if (contextRootIds != null && contextRootIds.length > 0) {
+						// There can only be one result per ContextType, thus we take the first one and
+						// ignore the rest
+						String instanceID = Long.toString(ODSConverter.fromODSLong(contextRootIds[0]));
+
+						contextRoots.put(contextType,
+								entityLoader.load(new Key<>(ContextRoot.class, contextType), instanceID));
+					}
 				}
 			} catch (AoException e) {
 				throw new DataAccessException("Cannot load contextRoot '" + entityType.getName() + "' for ID '"
@@ -363,6 +367,14 @@
 		return contextRoots;
 	}
 
+	private Optional<Relation> getRelation(EntityType contextDescribableEntityType, EntityType entityType) {
+		try {
+			return Optional.of(contextDescribableEntityType.getRelation(entityType));
+		} catch (IllegalArgumentException e) {
+			return Optional.empty();
+		}
+	}
+
 	private Map<ContextType, ContextRoot> mapAttributesWithExtSystem(Map<ContextType, ContextRoot> contextRoots) {
 
 		EntityFactory entityFactory = this.context.getEntityFactory()
diff --git a/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java b/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
index 7b17923..9236a1a 100644
--- a/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
+++ b/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
@@ -20,14 +20,17 @@
 import java.util.Map;

 

 import org.assertj.core.api.Assertions;

+import org.assertj.core.groups.Tuple;

 import org.eclipse.mdm.api.base.ConnectionException;

 import org.eclipse.mdm.api.base.massdata.ReadRequest;

 import org.eclipse.mdm.api.base.model.Channel;

 import org.eclipse.mdm.api.base.model.ChannelGroup;

 import org.eclipse.mdm.api.base.model.ContextRoot;

 import org.eclipse.mdm.api.base.model.ContextType;

+import org.eclipse.mdm.api.base.model.FileLink;

 import org.eclipse.mdm.api.base.model.MeasuredValues;

 import org.eclipse.mdm.api.base.model.Measurement;

+import org.eclipse.mdm.api.base.model.MimeType;

 import org.eclipse.mdm.api.base.model.Test;

 import org.eclipse.mdm.api.base.model.TestStep;

 import org.eclipse.mdm.api.base.model.ValueType;

@@ -98,6 +101,17 @@
 	}

 

 	@org.junit.Test

+	public void testLoadTestStepWithExtRef() {

+

+		EntityManager em = context.getEntityManager().get();

+

+		assertThat(em.load(TestStep.class, "1").getFileLinks())

+				.extracting(FileLink::getFileName, FileLink::getDescription, FileLink::getMimeType)

+				.contains(Tuple.tuple("extref.txt", "a simple text file", new MimeType("text/plain")),

+						Tuple.tuple("openmdm.png", "openMDM Logo", new MimeType("image/png")));

+	}

+

+	@org.junit.Test

 	public void testLoadAllMeasurements() {

 

 		EntityManager em = context.getEntityManager().get();

diff --git a/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx b/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
index a044f4f..f9594cc 100644
--- a/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
+++ b/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
@@ -2679,6 +2679,18 @@
       <DateCreated>20140314170908</DateCreated>
       <Optional>true</Optional>
       <Sortindex>40</Sortindex>
+      <MDMLinks>
+        <external_reference>
+          <description>a simple text file</description>
+          <mimetype>text/plain</mimetype>
+          <location>extref.txt</location>
+        </external_reference>
+        <external_reference>
+          <description>openMDM Logo</description>
+          <mimetype>image/png</mimetype>
+          <location>openmdm.png</location>
+        </external_reference>
+      </MDMLinks>
       <Test>1</Test>
       <MeaResults>1</MeaResults>
     </TestStep>
diff --git a/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt b/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt
new file mode 100644
index 0000000..9097b52
--- /dev/null
+++ b/org.eclipse.mdm.api.atfxadapter/src/test/resources/extref.txt
@@ -0,0 +1 @@
+This is a external reference file.
\ No newline at end of file
diff --git a/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png b/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png
new file mode 100644
index 0000000..437bb58
--- /dev/null
+++ b/org.eclipse.mdm.api.atfxadapter/src/test/resources/openmdm.png
Binary files differ
diff --git a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java
index a7b8eef..f35c17c 100644
--- a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java
+++ b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/EntityHolder.java
@@ -136,4 +136,8 @@
 		return true;
 	}
 
+	@Override
+	public String toString() {
+		return String.format("%s.%s.%s", getEntity().getSourceName(), getEntity().getTypeName(), getEntity().getID());
+	}
 }
diff --git a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
index ee1c96e..444195c 100644
--- a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
+++ b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
@@ -464,6 +464,7 @@
 							testStepSrc.getName(), templateTestStep.get().getName());
 					testStepDst = entityFactoryDst.createTestStep(testDst, templateTestStep.get(),
 							classificationUtil.getClassification(rootProjectName));
+					testStepDst.setName(testStepSrc.getName());
 				} else if (templateTestStep.isPresent()) {
 					LOG.trace("Importing TestStep '{}' using TestStepTemplate '{}' and create context roots",
 							testStepSrc.getName(), templateTestStep.get().getName());
@@ -471,7 +472,7 @@
 							classificationUtil.getClassification(rootProjectName));
 				} else {
 					LOG.trace("Importing TestStep '{}' using no TestStepTemplate", testStepSrc.getName());
-					testStepDst = entityFactoryDst.createTestStep(testSrc.getName(), testDst,
+					testStepDst = entityFactoryDst.createTestStep(testStepSrc.getName(), testDst,
 							classificationUtil.getClassification(rootProjectName));
 				}
 			} else {
diff --git a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java
index 3ef6751..f931eb4 100644
--- a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java
+++ b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/TransferBase.java
@@ -191,15 +191,23 @@
 			if (!ignoredAttributes.contains(key) && valueNamesDst.contains(key)) {
 				Value valueSrc = me.getValue();
 
-				if (onlyValid && valueSrc.isValid()) {
-					if (isFileLinkDataType(valueSrc.getValueType())) {
-						uploadFiles(srcEntity, dstEntity, valueSrc);
-					}
-
-					Value value = dstEntity.getValue(me.getKey());
-					value.set(valueSrc.extract());
-					value.setValid(valueSrc.isValid());
+				if (onlyValid && !valueSrc.isValid()) {
+					continue;
 				}
+
+				if (isFileLinkDataType(valueSrc.getValueType())) {
+					uploadFiles(srcEntity, dstEntity, valueSrc);
+				}
+
+				Value value = dstEntity.getValue(me.getKey());
+				try {
+					value.set(valueSrc.extract());
+				} catch (IllegalArgumentException e) {
+					throw new ApiCopyException(
+							"Cannot set value for " + dstEntity.getName() + "." + me.getKey() + ": " + e.getMessage(),
+							e);
+				}
+				value.setValid(valueSrc.isValid());
 			}
 		}