diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java
index c1e1d29be94eb45198b8354cb06bae4c6431095a..97cb80a9d2b30184e8aa2ca51b39fa13100af9b2 100644
--- a/src/main/java/org/openepics/names/service/NamesService.java
+++ b/src/main/java/org/openepics/names/service/NamesService.java
@@ -404,7 +404,7 @@ public class NamesService {
 
         // validate input
         // do
-        //     exists
+        //     name exists but either parent does not exist (latest, not deleted, by uuid)
 
         // validate input
         ValidateUtil.validateInputName(name);
@@ -417,77 +417,63 @@ public class NamesService {
 
         // system structure
         if (toBeChecked.getSystemgroupUuid() != null) {
-            SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(toBeChecked.getSystemgroupUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(systemGroup != null,
-                    TextUtil.SYSTEMGROUP_IS_NOT_AVAILABLE, name, null);
+            // system group
 
-            if (systemGroup.isDeleted()) {
+            SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(toBeChecked.getSystemgroupUuid().toString());
+            if (systemGroup == null) {
                 return Boolean.TRUE;
             }
         } else if (toBeChecked.getSystemUuid() != null) {
-            org.openepics.names.repository.model.System system = holderIRepositories.getSystemRepository().findLatestNotDeletedByUuid(toBeChecked.getSystemUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(system != null,
-                    TextUtil.SYSTEM_IS_NOT_AVAILABLE, name, null);
+            // system
+            // system group
 
-            if (system.isDeleted()) {
+            org.openepics.names.repository.model.System system = holderIRepositories.getSystemRepository().findLatestNotDeletedByUuid(toBeChecked.getSystemUuid().toString());
+            if (system == null) {
                 return Boolean.TRUE;
             }
 
             SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(system.getParentUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(systemGroup != null,
-                    TextUtil.SYSTEMGROUP_IS_NOT_AVAILABLE, name, null);
-
-            if (systemGroup.isDeleted()) {
+            if (systemGroup == null) {
                 return Boolean.TRUE;
             }
         } else if (toBeChecked.getSubsystemUuid() != null) {
-            Subsystem subsystem = holderIRepositories.getSubsystemRepository().findLatestNotDeletedByUuid(toBeChecked.getSubsystemUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(subsystem != null,
-                    TextUtil.SUBSYSTEM_IS_NOT_AVAILABLE, name, null);
+            // subsystem
+            // system
+            // system group
 
-            if (subsystem.isDeleted()) {
+            Subsystem subsystem = holderIRepositories.getSubsystemRepository().findLatestNotDeletedByUuid(toBeChecked.getSubsystemUuid().toString());
+            if (subsystem == null) {
                 return Boolean.TRUE;
             }
 
             org.openepics.names.repository.model.System system = holderIRepositories.getSystemRepository().findLatestNotDeletedByUuid(subsystem.getParentUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(system != null,
-                    TextUtil.SYSTEM_IS_NOT_AVAILABLE, name, null);
-
-            if (system.isDeleted()) {
+            if (system == null) {
                 return Boolean.TRUE;
             }
 
             SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(system.getParentUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(systemGroup != null,
-                    TextUtil.SYSTEMGROUP_IS_NOT_AVAILABLE, name, null);
-
-            if (systemGroup.isDeleted()) {
+            if (systemGroup == null) {
                 return Boolean.TRUE;
             }
         }
         // device structure
         if (toBeChecked.getDevicetypeUuid() != null) {
-            DeviceType deviceType = holderIRepositories.getDeviceTypeRepository().findLatestNotDeletedByUuid(toBeChecked.getDevicetypeUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(deviceType != null,
-                    TextUtil.DEVICETYPE_IS_NOT_AVAILABLE, name, null);
+            // devie type
+            // device group
+            // discipline
 
-            if (deviceType.isDeleted()) {
+            DeviceType deviceType = holderIRepositories.getDeviceTypeRepository().findLatestNotDeletedByUuid(toBeChecked.getDevicetypeUuid().toString());
+            if (deviceType == null) {
                 return Boolean.TRUE;
             }
 
             DeviceGroup deviceGroup = holderIRepositories.getDeviceGroupRepository().findLatestNotDeletedByUuid(deviceType.getParentUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(deviceGroup != null,
-                    TextUtil.DEVICEGROUP_IS_NOT_AVAILABLE, name, null);
-
-            if (deviceGroup.isDeleted()) {
+            if (deviceGroup == null) {
                 return Boolean.TRUE;
             }
 
-            Discipline discipline = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByUuid(deviceType.getParentUuid().toString());
-            ExceptionUtil.validateConditionDataNotAvailableException(discipline != null,
-                    TextUtil.DEVICEGROUP_IS_NOT_AVAILABLE, name, null);
-
-            if (discipline.isDeleted()) {
+            Discipline discipline = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByUuid(deviceGroup.getParentUuid().toString());
+            if (discipline == null) {
                 return Boolean.TRUE;
             }
         }
diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java
index 065a923207fe80e9da9855eb89a33f6dbb252ebd..f80d0df8be7c1afd818c67099bc61d6ef33e92be 100644
--- a/src/main/java/org/openepics/names/service/StructuresService.java
+++ b/src/main/java/org/openepics/names/service/StructuresService.java
@@ -62,6 +62,7 @@ import org.openepics.names.util.TextUtil;
 import org.openepics.names.util.Utilities;
 import org.openepics.names.util.ValidateStructureElementUtil;
 import org.openepics.names.util.StructureElementUtil.StructureChoice;
+import org.openepics.names.util.StructureUtil;
 import org.openepics.names.util.ValidateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -1147,8 +1148,13 @@ public class StructuresService {
                 holderRepositories.getSystemGroupRepository().updateSystemGroup(systemGroup);
 
                 // automatically create name when system structure is approved (after create)
+                //     condition on name and structure entry
+                //         system structure should exist (uuid), one entry that is not deleted
+                //         name should not exist (system structure mnemonic)
                 // create name within current transaction
-                if (!StringUtils.isEmpty(systemGroup.getMnemonic())) {
+                systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(null, Boolean.FALSE, queryValue, null, null, null, null, null);
+                boolean existsName = !StringUtils.isEmpty(systemGroup.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(systemGroup, holder));
+                if (ValidateUtil.isSize(systemGroups, 1) && !existsName) {
                     NameElementCommand nameElement = new NameElementCommand(null, systemGroup.getUuid(), null, null, SYSTEM_STRUCTURE_ONLY, null);
                     NameElement createdNameElement = namesService.createName(nameElement, holder, processed, processedBy);
                     LOGGER.log(Level.FINE, "approveStructures, nameElement created, name:  {0}", createdNameElement.getName());
@@ -1181,8 +1187,13 @@ public class StructuresService {
                 holderRepositories.getSystemRepository().updateSystem(system);
 
                 // automatically create name when system structure is approved (after create)
+                //     condition on name and structure entry
+                //         system structure should exist (uuid), one entry that is not deleted
+                //         name should not exist (system structure mnemonic)
                 // create name within current transaction
-                if (!StringUtils.isEmpty(system.getMnemonic())) {
+                systems = holderRepositories.getSystemRepository().readSystems(null, Boolean.FALSE, queryValue, null, null, null, null, null, null);
+                boolean existsName = !StringUtils.isEmpty(system.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(system, holder));
+                if (ValidateUtil.isSize(systems, 1) && !existsName) {
                     NameElementCommand nameElement = new NameElementCommand(null, system.getUuid(), null, null, SYSTEM_STRUCTURE_ONLY, null);
                     NameElement createdNameElement = namesService.createName(nameElement, holder, processed, processedBy);
                     LOGGER.log(Level.FINE, "approveStructures, nameElement created, name:  {0}", createdNameElement.getName());
@@ -1215,8 +1226,13 @@ public class StructuresService {
                 holderRepositories.getSubsystemRepository().updateSubsystem(subsystem);
 
                 // automatically create name when system structure is approved (after create)
+                //     condition on name and structure entry
+                //         system structure should exist (uuid), one entry that is not deleted
+                //         name should not exist (system structure mnemonic)
                 // create name within current transaction
-                if (!StringUtils.isEmpty(subsystem.getMnemonic())) {
+                subsystems = holderRepositories.getSubsystemRepository().readSubsystems(null, Boolean.FALSE, queryValue, null, null, null, null, null, null);
+                boolean existsName = !StringUtils.isEmpty(subsystem.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(subsystem, holder));
+                if (ValidateUtil.isSize(subsystems, 1) && !existsName) {
                     NameElementCommand nameElement = new NameElementCommand(null, subsystem.getUuid(), null, null, SYSTEM_STRUCTURE_ONLY, null);
                     NameElement createdNameElement = namesService.createName(nameElement, holder, processed, processedBy);
                     LOGGER.log(Level.FINE, "approveStructures, nameElement created, name:  {0}", createdNameElement.getName());
diff --git a/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java b/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java
index 97d1cfea6734fa215bd4dae95e5eb9362d09fd9d..b5a262e25ff78a7fbfd7b7da5ad22ab70cd3dab9 100644
--- a/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java
+++ b/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java
@@ -280,6 +280,8 @@ public class ValidateNameElementUtil {
             // name
             //     name not exists
             //     name equivalence not exists
+            //     name is not legacy         - done by checking system structure and device structure
+            //                                  corresponds to legacy check, need not call is legacy
 
             // find out system group, system, subsystem
             //     one of the three expected to be non-null, other two expected to be null
diff --git a/src/test/java/org/openepics/names/docker/NamesIT.java b/src/test/java/org/openepics/names/docker/NamesIT.java
index da8e305eeb422ffe3aefddc9bee5f62b32603422..42dd8c4bee9dabc08c6e55c5e289da06892361d9 100644
--- a/src/test/java/org/openepics/names/docker/NamesIT.java
+++ b/src/test/java/org/openepics/names/docker/NamesIT.java
@@ -18,6 +18,8 @@
 
 package org.openepics.names.docker;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.File;
@@ -181,10 +183,81 @@ class NamesIT {
         // purpose
         //     test if name is legacy name
         //
-        // what
+        // what - combination of
+        //     read        exists name
         //     read        is legacy name
+        //     read        is valid to create name
+        //     create      create names
+        //     delete      delete structures
+        //     patch       approve structures
 
         ITUtilNameElement.assertIsLegacy("RFQ-010PRL:EMR-RFA-071", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+
+        try {
+            NameElementCommand nameElement = null;
+            NameElement createdNameElement = null;
+            StructureElementCommand structureElement = null;
+
+            nameElement = new NameElementCommand(
+                    null, subsystemN1U1, deviceTypeRFA, "071",
+                    "description", "comment");
+
+            Long totalCount = ITUtilNameElement.assertRead("").getTotalCount();
+            assertNotNull(totalCount);
+
+            ITUtilNameElement.assertExists("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertIsLegacy("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("RFQ-N1U1:EMR-RFA-071", Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.UPDATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.DELETE, Boolean.FALSE);
+
+            // create
+            createdNameElement = ITUtilNameElement.assertCreate(nameElement);
+            nameElement.setUuid(createdNameElement.getUuid());
+
+            Long totalCount2 = ITUtilNameElement.assertRead("").getTotalCount();
+            assertNotNull(totalCount2);
+            assertEquals(totalCount + 1, totalCount2);
+
+            ITUtilNameElement.assertExists("RFQ-N1U1:EMR-RFA-071", Boolean.TRUE);
+            ITUtilNameElement.assertIsLegacy("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.CREATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.UPDATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.DELETE, Boolean.TRUE);
+
+            // delete, approve
+            structureElement = new StructureElementCommand(
+                    subsystemN1U1, Type.SUBSYSTEM, systemRFQ,
+                    "name", "N1U1",
+                    "description", "comment");
+
+            ITUtilStructureElement.assertDelete(structureElement);
+
+            ITUtilNameElement.assertExists("RFQ-N1U1:EMR-RFA-071", Boolean.TRUE);
+            ITUtilNameElement.assertIsLegacy("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.CREATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.UPDATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.DELETE, Boolean.TRUE);
+
+            ITUtilStructureElement.assertApprove(structureElement);
+
+            totalCount = ITUtilNameElement.assertRead("").getTotalCount();
+            assertNotNull(totalCount);
+            assertEquals(totalCount2, totalCount);
+
+            ITUtilNameElement.assertExists("RFQ-N1U1:EMR-RFA-071", Boolean.TRUE);
+            ITUtilNameElement.assertIsLegacy("RFQ-N1U1:EMR-RFA-071", Boolean.TRUE);
+            ITUtilNameElement.assertIsValidToCreate("RFQ-N1U1:EMR-RFA-071", Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.CREATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.UPDATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElement,  NameChoice.DELETE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
     }
 
     @Test
@@ -491,8 +564,8 @@ class NamesIT {
             nameElement.setParentsystemstructure(null);
             ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE);
 
-            nameElement.setParentsystemstructure(subsystemN1U1);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.TRUE);
+            // subsystemN1U1 used in isLegacyName but not here
+            // order of tests not guaranteed
 
             nameElement.setParentsystemstructure(subsystem010PRL);
             ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.TRUE);
@@ -810,7 +883,7 @@ class NamesIT {
             ITUtilNameElement.assertRead("?systemstructure=RFQ-010",  6, -1);
             ITUtilNameElement.assertRead("?systemstructure=RFQ-0",    0);
             ITUtilNameElement.assertRead("?systemstructure=RFQ-0__",  6, -1);
-            ITUtilNameElement.assertRead("?systemstructure=RFQ-N1U1", 1);
+            ITUtilNameElement.assertRead("?systemstructure=RFQ-N1U1", 0, -1);
 
             ITUtilNameElement.assertRead("?devicestructure=EMR-FS",   6, -1);
             ITUtilNameElement.assertRead("?devicestructure=EMR-F",    0);
@@ -846,7 +919,7 @@ class NamesIT {
             ITUtilNameElement.assertRead("/systemstructure/RFQ-010",      6, -1);
             ITUtilNameElement.assertRead("/systemstructure/RFQ-0",        0);
             ITUtilNameElement.assertRead("/systemstructure/RFQ-0__",      6, -1);
-            ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1",     1);
+            ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1",     0, -1);
 
             // device structure mnemonic path
             //     /devicestructure/{mnemonicpath}