diff --git a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
index 45d962ad63206959d7a94d7e82cf3ccae9f521d3..ff7ee6a0ff73ebe17119c5a87fe740ca84d299db 100644
--- a/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
+++ b/src/main/java/org/openepics/names/rest/api/v1/IStructures.java
@@ -1572,6 +1572,10 @@ public interface IStructures {
      * Approve structures (proposals) by list of structure elements.
      * Return list of structure elements for approved structures.
      *
+     * <p>
+     * Name is automatically created name when creation of system structure is approved.
+     * </p>
+     *
      * @param structureElements list of structure elements
      * @return list of structure elements for approved structures
      */
@@ -1581,6 +1585,8 @@ public interface IStructures {
                           Approve structures (proposals) by array of structure elements.
                           Return array of structure elements for approved structures.
 
+                          Name is automatically created name when creation of system structure is approved.
+
                           Required attributes:
                           - uuid
                           - type
@@ -1644,6 +1650,10 @@ public interface IStructures {
      * Approve structures (proposals) by upload Excel file.
      * Return Excel file with structure elements for approved structures.
      *
+     * <p>
+     * Name is automatically created name when creation of system structure is approved.
+     * </p>
+     *
      * @param structureElements list of structure elements
      * @return Excel file
      */
@@ -1653,6 +1663,8 @@ public interface IStructures {
                           Approve structures (proposals) by upload Excel file.
                           Return Excel file with structure elements for for approved structures.
 
+                          Name is automatically created name when creation of system structure is approved.
+
                           Expected columns as in Excel template for structures.
 
                           Required attributes:
diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java
index fbb09ba661d10b06f203ca1dd818f1f62d795ccb..a7dff5e0ff1cac26af3c3b77017ab96518c4e0da 100644
--- a/src/main/java/org/openepics/names/service/NamesService.java
+++ b/src/main/java/org/openepics/names/service/NamesService.java
@@ -62,6 +62,7 @@ import org.openepics.names.util.NameUtil;
 import org.openepics.names.util.ValidateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import com.google.common.collect.Lists;
@@ -152,46 +153,54 @@ public class NamesService {
         String requestedBy = "test who";
         final List<NameElement> createdNameElements = Lists.newArrayList();
         for (NameElementCommand nameElement : nameElements) {
-            // find out
-            //     system structure - system group, system, subsystem - one of the three expected to be non-null, other two expected to be null
-            //     device structure - device type - may be null
-            SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            DeviceType  deviceType  = null;
-            if (nameElement.getParentdevicestructure() != null) {
-                deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
-            }
+            // create name within current transaction
+            createdNameElements.add(createName(nameElement, holder, requestedBy));
+        }
 
-            String derivedName = null;
-            if (systemGroup != null) {
-                derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder);
-            } else if (system != null) {
-                derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder);
-            } else if (subsystem != null) {
-                derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder);
-            }
+        LOGGER.log(Level.INFO, "createNames, createdNameElements.size: " + createdNameElements.size());
+        return createdNameElements;
+    }
+    @Transactional(propagation = Propagation.MANDATORY)
+    NameElement createName(NameElementCommand nameElement, HolderSystemDeviceStructure holder, String requestedBy) {
+        // transaction
+        //     support a current transaction, throw an exception if none exists
+
+        // find out
+        //     system structure - system group, system, subsystem - one of the three expected to be non-null, other two expected to be null
+        //     device structure - device type - may be null
+        SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
+        System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
+        Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
+        DeviceType  deviceType  = null;
+        if (nameElement.getParentdevicestructure() != null) {
+            deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+        }
 
-            // create
-            Name name = new Name();
-            setAttributes(name,
-                    UUID.randomUUID(),
-                    systemGroup != null ? systemGroup.getUuid() : null, system != null ? system.getUuid() : null, subsystem != null ? subsystem.getUuid() : null, nameElement.getParentdevicestructure(),
-                    nameElement.getIndex(), derivedName, namingConvention.equivalenceClassRepresentative(derivedName),
-                    nameElement.getDescription(), Status.APPROVED, Boolean.TRUE, Boolean.FALSE,
-                    new Date(), requestedBy, nameElement.getComment());
+        String derivedName = null;
+        if (systemGroup != null) {
+            derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder);
+        } else if (system != null) {
+            derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder);
+        } else if (subsystem != null) {
+            derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder);
+        }
 
-            nameRepository.createName(name);
+        // create
+        Name name = new Name();
+        setAttributes(name,
+                UUID.randomUUID(),
+                systemGroup != null ? systemGroup.getUuid() : null, system != null ? system.getUuid() : null, subsystem != null ? subsystem.getUuid() : null, nameElement.getParentdevicestructure(),
+                nameElement.getIndex(), derivedName, namingConvention.equivalenceClassRepresentative(derivedName),
+                nameElement.getDescription(), Status.APPROVED, Boolean.TRUE, Boolean.FALSE,
+                new Date(), requestedBy, nameElement.getComment());
 
-            // possibly validate that created
-            //     approved, latest, not deleted, uuid
+        nameRepository.createName(name);
 
-            // add
-            createdNameElements.add(NameElementUtil.getNameElement(name));
-        }
+        // possibly validate that created
+        //     approved, latest, not deleted, uuid
 
-        LOGGER.log(Level.INFO, "createNames, createdNameElements.size: " + createdNameElements.size());
-        return createdNameElements;
+        // add
+        return NameElementUtil.getNameElement(name);
     }
 
     // ----------------------------------------------------------------------------------------------------
diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java
index 7d3425da1869a3f5f9034d34eb201227edc33800..648b86072fdbf4a4a5991f95012e4777fdea371d 100644
--- a/src/main/java/org/openepics/names/service/StructuresService.java
+++ b/src/main/java/org/openepics/names/service/StructuresService.java
@@ -51,6 +51,8 @@ import org.openepics.names.repository.model.SystemGroup;
 import org.openepics.names.rest.beans.FieldStructure;
 import org.openepics.names.rest.beans.Status;
 import org.openepics.names.rest.beans.Type;
+import org.openepics.names.rest.beans.element.NameElement;
+import org.openepics.names.rest.beans.element.NameElementCommand;
 import org.openepics.names.rest.beans.element.StructureElement;
 import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
@@ -92,6 +94,7 @@ public class StructuresService {
 
     private HolderIRepositories holderIRepositories;
     private HolderRepositories holderRepositories;
+    private NamesService namesService;
 
     @Autowired
     public StructuresService(
@@ -108,7 +111,8 @@ public class StructuresService {
             SubsystemRepository subsystemRepository,
             DisciplineRepository disciplineRepository,
             DeviceGroupRepository deviceGroupRepository,
-            DeviceTypeRepository deviceTypeRepository) {
+            DeviceTypeRepository deviceTypeRepository,
+            NamesService namesService) {
 
         this.namingConvention = new EssNamingConvention();
         this.holderIRepositories = new HolderIRepositories(
@@ -127,6 +131,7 @@ public class StructuresService {
                 disciplineRepository,
                 deviceGroupRepository,
                 deviceTypeRepository);
+        this.namesService = namesService;
     }
 
     @Transactional
@@ -1170,6 +1175,14 @@ public class StructuresService {
 
                 // possibly validate that approved
 
+                // automatically create name when system structure is approved (after create)
+                // create name within current transaction
+                if (!StringUtils.isEmpty(systemGroup.getMnemonic())) {
+                    NameElementCommand nameElement = new NameElementCommand(null, systemGroup.getUuid(), null, null, "System structure only", null);
+                    NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy);
+                    LOGGER.log(Level.INFO, "approveStructures, nameElement created, name:      " + createdNameElement.getName());
+                }
+
                 // add
                 approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(systemGroup, holder));
             } else if (Type.SYSTEM.equals(structureElement.getType())) {
@@ -1198,6 +1211,14 @@ public class StructuresService {
 
                 // possibly validate that approved
 
+                // automatically create name when system structure is approved (after create)
+                // create name within current transaction
+                if (!StringUtils.isEmpty(system.getMnemonic())) {
+                    NameElementCommand nameElement = new NameElementCommand(null, system.getUuid(), null, null, "System structure only", null);
+                    NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy);
+                    LOGGER.log(Level.INFO, "approveStructures, nameElement created, name:      " + createdNameElement.getName());
+                }
+
                 // add
                 approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(system, holder));
             } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
@@ -1226,6 +1247,14 @@ public class StructuresService {
 
                 // possibly validate that approved
 
+                // automatically create name when system structure is approved (after create)
+                // create name within current transaction
+                if (!StringUtils.isEmpty(subsystem.getMnemonic())) {
+                    NameElementCommand nameElement = new NameElementCommand(null, subsystem.getUuid(), null, null, "System structure only", null);
+                    NameElement createdNameElement = namesService.createName(nameElement, holder, processedBy);
+                    LOGGER.log(Level.INFO, "approveStructures, nameElement created, name:      " + createdNameElement.getName());
+                }
+
                 // add
                 approvedStructureElements.add(StructureElementUtil.getStructureElementProcessed(subsystem, holder));
             } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
diff --git a/src/test/java/org/openepics/names/docker/NamesIT.java b/src/test/java/org/openepics/names/docker/NamesIT.java
index c6be3e09157f793c537b907aa5d919cb5dcd773e..648d9526f4a0e28eeebacca1220c730635c8ea24 100644
--- a/src/test/java/org/openepics/names/docker/NamesIT.java
+++ b/src/test/java/org/openepics/names/docker/NamesIT.java
@@ -246,8 +246,10 @@ class NamesIT {
             ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
             ITUtilNameElement.assertCreate(nameElement, ITUtil.HTTP_UNPROCESSABLE_ENTITY);
 
+            // convention name exists
+            // already exists since create subsystem was approved
             nameElement.setParentsystemstructure(subsystem010PRL);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
 
             // ----------
             // system structure + device structure + index
@@ -277,8 +279,10 @@ class NamesIT {
             // description
             // comment
 
+            // convention name exists
+            // already exists since create system was approved
             nameElement.setParentsystemstructure(systemRFQ);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
 
             // ----------
             // system structure + device structure + index
@@ -308,8 +312,10 @@ class NamesIT {
             // description
             // comment
 
+            // convention name exists
+            // already exists since create system group was approved
             nameElement.setParentsystemstructure(systemGroupAcc);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
 
             // ----------
             // system structure + device structure + index
@@ -342,8 +348,10 @@ class NamesIT {
             // description
             // comment
 
+            // convention name exists
+            // already exists since create system was approved
             nameElement.setParentsystemstructure(systemRFQ);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
 
             nameElement.setParentdevicestructure(deviceTypeRFA);
             ITUtilNameElement.assertValidate(nameElement, NameChoice.CREATE, Boolean.FALSE);
@@ -494,8 +502,10 @@ class NamesIT {
             nameElement.setParentdevicestructure(null);
             ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE);
 
+            // convention name exists
+            // already exists since create subsystem was approved
             nameElement.setIndex(null);
-            ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE);
 
             nameElement.setIndex("053");
             ITUtilNameElement.assertValidate(nameElement, NameChoice.UPDATE, Boolean.FALSE);
@@ -798,7 +808,7 @@ class NamesIT {
             ITUtilNameElement.assertRead("/systemstructure/RFQ-010", -1, 6);
             ITUtilNameElement.assertRead("/systemstructure/RFQ-0",    0, 0);
             ITUtilNameElement.assertRead("/systemstructure/RFQ-0__", -1, 6);
-            ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1", 0, 0);
+            ITUtilNameElement.assertRead("/systemstructure/RFQ-N1U1", 1, 1);
 
             ITUtilNameElement.assertRead("/devicestructure/EMR-FS", -1, 6);
             ITUtilNameElement.assertRead("/devicestructure/EMR-F",   0, 0);
diff --git a/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
index c2c9c875e9c6491c1c6f61ea9743653dac97c157..d1376ec5910b85cf96efbb0ba28c17484cf92740 100644
--- a/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
+++ b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
@@ -223,6 +223,7 @@ class NamesMultipleIT {
         try {
             NameElementCommand[] nameElements = null;
             NameElement[] createdNameElements = null;
+            int nbrNames = -1;
 
             nameElements = new NameElementCommand[] {
                     new NameElementCommand(null, systemGroupAcc,  null,               null,  "create 1.0.0",   "create 1.0.0"),
@@ -237,6 +238,22 @@ class NamesMultipleIT {
                     new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "023", "create 3.3.023", "create 3.3.023")
             };
 
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+            nameElements = new NameElementCommand[] {
+                    nameElements[1],
+                    nameElements[2],
+                    nameElements[3],
+                    nameElements[4],
+                    nameElements[5],
+                    nameElements[6],
+                    nameElements[7],
+                    nameElements[8],
+                    nameElements[9]
+            };
+
             ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.FALSE);
             ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE);
             ITUtilNameElement.assertIsValidToCreate("Acc:Cryo-FS-023", Boolean.TRUE);
@@ -244,9 +261,13 @@ class NamesMultipleIT {
             ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
             ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
 
+            nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
             createdNameElements = ITUtilNameElement.assertCreate(nameElements);
             assertNotNull(createdNameElements);
-            assertEquals(10, createdNameElements.length);
+            assertEquals(9, createdNameElements.length);
+
+            assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
 
             ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.TRUE);
             ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE);
@@ -279,6 +300,7 @@ class NamesMultipleIT {
 
         NameElementCommand[] nameElements = null;
         NameElement[] createdNameElements = null;
+        int nbrNames = -1;
         UUID uuid = null;
         String value = null;
 
@@ -301,10 +323,14 @@ class NamesMultipleIT {
         ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
 
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
         createdNameElements = ITUtilNameElement.assertCreate(nameElements);
         assertNotNull(createdNameElements);
         assertEquals(9, createdNameElements.length);
 
+        assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
         ITUtilNameElement.assertExists("RFQ:Cryo-FS-031", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-031", Boolean.FALSE);
         ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-031", Boolean.FALSE);
@@ -369,6 +395,7 @@ class NamesMultipleIT {
         NameElementCommand[] nameElements = null;
         NameElement[] createdNameElements = null;
         NameElement[] updatedNameElements = null;
+        int nbrNames = -1;
 
         nameElements = new NameElementCommand[] {
                 new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "041", "update 1.3.041", "update 1.3.041"),
@@ -383,16 +410,36 @@ class NamesMultipleIT {
                 new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "043", "update 3.3.043", "update 3.3.043")
         };
 
-        ITUtilNameElement.assertExists("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        nameElements = new NameElementCommand[] {
+                nameElements[0],
+                nameElements[1],
+                nameElements[2],
+                nameElements[4],
+                nameElements[5],
+                nameElements[6],
+                nameElements[7],
+                nameElements[8],
+                nameElements[9]
+        };
+
+        ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
-        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.TRUE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.FALSE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
 
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
         createdNameElements = ITUtilNameElement.assertCreate(nameElements);
         assertNotNull(createdNameElements);
-        assertEquals(10, createdNameElements.length);
+        assertEquals(9, createdNameElements.length);
+
+        assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
 
         ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
@@ -410,7 +457,6 @@ class NamesMultipleIT {
         createdNameElements[6].setDescription("6");
         createdNameElements[7].setDescription("7");
         createdNameElements[8].setDescription("8");
-        createdNameElements[9].setDescription("9");
 
         ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
@@ -421,7 +467,9 @@ class NamesMultipleIT {
 
         updatedNameElements = ITUtilNameElement.assertUpdate(createdNameElements);
         assertNotNull(updatedNameElements);
-        assertEquals(10, updatedNameElements.length);
+        assertEquals(9, updatedNameElements.length);
+
+        assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
 
         ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
@@ -453,6 +501,7 @@ class NamesMultipleIT {
 
         NameElementCommand[] nameElements = null;
         NameElement[] createdNameElements = null;
+        int nbrNames = -1;
         UUID uuid = null;
         String value = null;
 
@@ -475,10 +524,14 @@ class NamesMultipleIT {
         ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
 
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
         createdNameElements = ITUtilNameElement.assertCreate(nameElements);
         assertNotNull(createdNameElements);
         assertEquals(9, createdNameElements.length);
 
+        assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
         ITUtilNameElement.assertExists("RFQ:Cryo-FS-051", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-051", Boolean.FALSE);
         ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-051", Boolean.FALSE);
@@ -551,6 +604,7 @@ class NamesMultipleIT {
         NameElementCommand[] nameElements = null;
         NameElement[] createdNameElements = null;
         NameElement[] deletedNameElements = null;
+        int nbrNames = -1;
 
         nameElements = new NameElementCommand[] {
                 new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "061", "delete 1.3.061", "delete 1.3.061"),
@@ -565,6 +619,22 @@ class NamesMultipleIT {
                 new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "063", "delete 3.3.063", "delete 3.3.063")
         };
 
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        nameElements = new NameElementCommand[] {
+                nameElements[0],
+                nameElements[1],
+                nameElements[2],
+                nameElements[3],
+                nameElements[4],
+                nameElements[5],
+                nameElements[7],
+                nameElements[8],
+                nameElements[9]
+        };
+
         ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE);
         ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
         ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-061", Boolean.TRUE);
@@ -572,9 +642,13 @@ class NamesMultipleIT {
         ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
         ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
 
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
         createdNameElements = ITUtilNameElement.assertCreate(nameElements);
         assertNotNull(createdNameElements);
-        assertEquals(10, createdNameElements.length);
+        assertEquals(9, createdNameElements.length);
+
+        assertEquals(nbrNames + 9, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
 
         ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.TRUE);
         ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
@@ -585,7 +659,9 @@ class NamesMultipleIT {
 
         deletedNameElements = ITUtilNameElement.assertDelete(createdNameElements);
         assertNotNull(deletedNameElements);
-        assertEquals(10, deletedNameElements.length);
+        assertEquals(9, deletedNameElements.length);
+
+        assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
 
         ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE);
         ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java
new file mode 100644
index 0000000000000000000000000000000000000000..cc2b23b1956467656b1f9083037e67ee71441d11
--- /dev/null
+++ b/src/test/java/org/openepics/names/docker/complex/StructuresNamesIT.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2022 European Spallation Source ERIC.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+package org.openepics.names.docker.complex;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.File;
+import java.util.UUID;
+
+import org.junit.jupiter.api.Test;
+import org.openepics.names.docker.ITUtil;
+import org.openepics.names.docker.ITUtilNameElement;
+import org.openepics.names.docker.ITUtilStructureElement;
+import org.openepics.names.rest.beans.Type;
+import org.openepics.names.rest.beans.element.StructureElement;
+import org.openepics.names.rest.beans.element.StructureElementCommand;
+import org.testcontainers.containers.DockerComposeContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+/**
+ * Integration tests for Naming and PostgreSQL that make use of existing dockerization
+ * with docker-compose.yml / Dockerfile.
+ *
+ * <p>
+ * Focus of this class are names and structures endpoints.
+ * In particular, purpose is to test automatic add of names when system structure only
+ * structures are approved (after being added).
+ * </p>
+ *
+ * @author Lars Johansson
+ */
+@Testcontainers
+class StructuresNamesIT {
+
+    // names are to be automatically created after system structure only structures are approved (after being added)
+    //
+    // test combinations
+    //     structure - system, device
+    //     number of entries - one, multiple
+    //     operations - add, approve
+
+    @Container
+    public static final DockerComposeContainer<?> ENVIRONMENT =
+        new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml"))
+            .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
+
+    private static UUID systemGroupUuid = null;
+    private static UUID systemUuid = null;
+
+    private static UUID systemGroupAcc  = null;
+    private static UUID systemRFQ       = null;
+
+    private static UUID disciplineUuid = null;
+    private static UUID deviceGroupUuid = null;
+
+    // no @BeforeAll
+
+    @Test
+    void checkSystemStructure1() {
+        // systemGroupUuid
+        // systemUuid
+        // subsystemUuid
+
+        StructureElementCommand structureElement  = null;
+        StructureElement createdStructureElement = null;
+        int nbrNames = -1;
+
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEMGROUP, null,
+                "name", "Sg",
+                "description", "comment");
+        createdStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        systemGroupUuid = createdStructureElement.getUuid();
+
+        assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+        ITUtilStructureElement.assertApprove(createdStructureElement);
+        assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEM, systemGroupUuid,
+                "name", "Sys",
+                "description", "comment");
+        createdStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        systemUuid = createdStructureElement.getUuid();
+
+        assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+        ITUtilStructureElement.assertApprove(createdStructureElement);
+        assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElement = new StructureElementCommand(
+                null, Type.SUBSYSTEM, systemUuid,
+                "name", "Sub",
+                "description", "comment");
+        createdStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+
+        assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+        ITUtilStructureElement.assertApprove(createdStructureElement);
+        assertEquals(nbrNames + 3, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+    }
+
+    @Test
+    void checkSystemStructure2() {
+        // systemGroupAcc
+        // systemRFQ
+        // subsystem010PRL
+        // subsystem010
+        // subsystemN1U1
+
+        StructureElementCommand[] structureElements  = null;
+        StructureElementCommand structureElement  = null;
+        StructureElement approvedStructureElement = null;
+        int nbrNames = -1;
+
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEMGROUP, null,
+                "Accelerator", "Acc",
+                "The ESS Linear Accelerator", "approved by alfio");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemGroupAcc = approvedStructureElement.getUuid();
+
+        assertEquals(nbrNames + 1, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEM, systemGroupAcc,
+                "Radio Frequency Quadrupole", "RFQ",
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemRFQ = approvedStructureElement.getUuid();
+
+        assertEquals(nbrNames + 2, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElements = new StructureElementCommand[] {
+                structureElement = new StructureElementCommand(
+                        null, Type.SUBSYSTEM, systemRFQ,
+                        "01 Phase Reference Line", "010PRL",
+                        "empty", "Approved by Daniel Piso"),
+                structureElement = new StructureElementCommand(
+                        null, Type.SUBSYSTEM, systemRFQ,
+                        "RFQ-010", "010",
+                        "empty", "Approved by Daniel Piso"),
+                structureElement = new StructureElementCommand(
+                        null, Type.SUBSYSTEM, systemRFQ,
+                        "Power switch board 01", "N1U1",
+                        "Electrical power cabinets", "Approved by Daniel Piso")
+        };
+
+        ITUtilStructureElement.assertCreateApprove(structureElements);
+
+        assertEquals(nbrNames + 5, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+    }
+
+    @Test
+    void checkDeviceStructure() {
+        // disciplineUuid
+        // deviceGroupUuid
+        // deviceTypeUuid
+
+        StructureElementCommand structureElement  = null;
+        StructureElement approvedStructureElement = null;
+        int nbrNames = -1;
+
+        nbrNames = ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DISCIPLINE, null,
+                "name", "Di",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        disciplineUuid = approvedStructureElement.getUuid();
+
+        assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICEGROUP, disciplineUuid,
+                "name", null,
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        deviceGroupUuid = approvedStructureElement.getUuid();
+
+        assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICETYPE, deviceGroupUuid,
+                "name", "Dt",
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        assertEquals(nbrNames, ITUtilNameElement.assertRead("?deleted=false", -1, -1).getListSize());
+    }
+
+}