From 7a9609b7464c4c93b4fa95d4df5bb0a7c174fc18 Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Tue, 3 Jan 2023 16:44:47 +0100
Subject: [PATCH] Update approve structures for approve delete

Update approve structures for approve delete and delete sub structures.
Refactor delete structures.
Add integration tests for approve delete.
---
 .../names/service/DeviceGroupService.java     |  64 +-
 .../names/service/DeviceTypeService.java      |  37 ++
 .../names/service/DisciplineService.java      |  62 +-
 .../openepics/names/service/NamesService.java |   4 +-
 .../names/service/StructuresService.java      | 120 +---
 .../names/service/SubsystemService.java       |  37 ++
 .../names/service/SystemGroupService.java     |  63 +-
 .../names/service/SystemService.java          |  62 +-
 .../docker/complex/StructuresCUDDeleteIT.java | 583 ++++++++++++++++++
 ...amesIT.java => StructuresCUDUpdateIT.java} |   4 +-
 10 files changed, 925 insertions(+), 111 deletions(-)
 create mode 100644 src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java
 rename src/test/java/org/openepics/names/docker/complex/{StructuresCUDNamesIT.java => StructuresCUDUpdateIT.java} (99%)

diff --git a/src/main/java/org/openepics/names/service/DeviceGroupService.java b/src/main/java/org/openepics/names/service/DeviceGroupService.java
index 1203b1fd..aae236b4 100644
--- a/src/main/java/org/openepics/names/service/DeviceGroupService.java
+++ b/src/main/java/org/openepics/names/service/DeviceGroupService.java
@@ -25,8 +25,11 @@ import java.util.logging.Logger;
 
 import org.openepics.names.repository.DeviceGroupRepository;
 import org.openepics.names.repository.IDeviceGroupRepository;
+import org.openepics.names.repository.IDeviceTypeRepository;
 import org.openepics.names.repository.model.DeviceGroup;
+import org.openepics.names.repository.model.DeviceType;
 import org.openepics.names.rest.beans.Status;
+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.openepics.names.util.HolderSystemDeviceStructure;
@@ -40,6 +43,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.google.common.collect.Lists;
+
 /**
  * This class provides structures services for device group.
  *
@@ -56,15 +61,51 @@ public class DeviceGroupService {
     private static final Logger LOGGER = Logger.getLogger(DeviceGroupService.class.getName());
 
     private IDeviceGroupRepository iDeviceGroupRepository;
+    private IDeviceTypeRepository iDeviceTypeRepository;
     private DeviceGroupRepository deviceGroupRepository;
+    private DeviceTypeService deviceTypeService;
 
     @Autowired
     public DeviceGroupService(
             IDeviceGroupRepository iDeviceGroupRepository,
+            IDeviceTypeRepository iDeviceTypeRepository,
             DeviceGroupRepository deviceGroupRepository,
-            NamesService namesService) {
+            DeviceTypeService deviceTypeService) {
         this.iDeviceGroupRepository = iDeviceGroupRepository;
+        this.iDeviceTypeRepository = iDeviceTypeRepository;
         this.deviceGroupRepository = deviceGroupRepository;
+        this.deviceTypeService = deviceTypeService;
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<DeviceGroup> deviceGroups = deviceGroupRepository.readDeviceGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(deviceGroups, 1)) {
+            return null;
+        }
+        DeviceGroup toBeDeleted = deviceGroups.get(0);
+
+        // create
+        DeviceGroup deviceGroup = new DeviceGroup(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        deviceGroupRepository.createDeviceGroup(deviceGroup);
+
+        return StructureElementUtil.getStructureElementRequested(deviceGroup);
     }
 
     @Transactional(propagation = Propagation.MANDATORY)
@@ -91,6 +132,9 @@ public class DeviceGroupService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -124,9 +168,25 @@ public class DeviceGroupService {
         // find out previous
         List<DeviceGroup> previouses = iDeviceGroupRepository.findPreviousByUuidAndId(uuid, deviceGroup.getId());
         StructureCommand structureCommandCUD = StructureUtil.getStructureCommandCUD(previouses, deviceGroup);
-        DeviceGroup previous = previouses != null && !previouses.isEmpty() ? previouses.get(0) : null;
         LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD:        {0}", structureCommandCUD);
 
+        // approve delete
+        if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
+            // delete sub structures - delete, approve
+            List<StructureElementCommand> structureElementCommands = Lists.newArrayList();
+            List<DeviceType> deviceTypes = iDeviceTypeRepository.findLatestNotDeletedByParent(uuid);
+            for (DeviceType deviceType : deviceTypes) {
+                structureElementCommands.add(new StructureElementCommand(deviceType.getUuid(), Type.DEVICETYPE, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE));
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                deviceTypeService.deleteStructure(structureElementCommand, processed, processedBy);
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                deviceTypeService.approveStructure(structureElementCommand, processed, processedBy, holder);
+            }
+        }
+
         LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
         return StructureElementUtil.getStructureElementProcessed(deviceGroup, holder, StructureChoice.STRUCTURE);
     }
diff --git a/src/main/java/org/openepics/names/service/DeviceTypeService.java b/src/main/java/org/openepics/names/service/DeviceTypeService.java
index df0e34a1..10cab786 100644
--- a/src/main/java/org/openepics/names/service/DeviceTypeService.java
+++ b/src/main/java/org/openepics/names/service/DeviceTypeService.java
@@ -69,6 +69,37 @@ public class DeviceTypeService {
         this.namesService = namesService;
     }
 
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<DeviceType> deviceTypes = deviceTypeRepository.readDeviceTypes(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(deviceTypes, 1)) {
+            return null;
+        }
+        DeviceType toBeDeleted = deviceTypes.get(0);
+
+        // create
+        DeviceType deviceType = new DeviceType(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        deviceTypeRepository.createDeviceType(deviceType);
+
+        return StructureElementUtil.getStructureElementRequested(deviceType);
+    }
+
     @Transactional(propagation = Propagation.MANDATORY)
     public StructureElement approveStructure(StructureElementCommand structureElement,
             Date processed, String processedBy,
@@ -93,6 +124,9 @@ public class DeviceTypeService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -130,8 +164,11 @@ public class DeviceTypeService {
         LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD:        {0}", structureCommandCUD);
 
         // approve update
+        // approve delete
         if (StructureCommand.UPDATE.equals(structureCommandCUD)) {
             namesService.updateNames(previous, deviceType);
+        } else if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
         }
 
         LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
diff --git a/src/main/java/org/openepics/names/service/DisciplineService.java b/src/main/java/org/openepics/names/service/DisciplineService.java
index 31c84067..cccf5e88 100644
--- a/src/main/java/org/openepics/names/service/DisciplineService.java
+++ b/src/main/java/org/openepics/names/service/DisciplineService.java
@@ -24,9 +24,12 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.openepics.names.repository.DisciplineRepository;
+import org.openepics.names.repository.IDeviceGroupRepository;
 import org.openepics.names.repository.IDisciplineRepository;
+import org.openepics.names.repository.model.DeviceGroup;
 import org.openepics.names.repository.model.Discipline;
 import org.openepics.names.rest.beans.Status;
+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.openepics.names.util.HolderSystemDeviceStructure;
@@ -40,6 +43,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.google.common.collect.Lists;
+
 /**
  * This class provides structures services for discipline.
  *
@@ -56,17 +61,54 @@ public class DisciplineService {
     private static final Logger LOGGER = Logger.getLogger(DisciplineService.class.getName());
 
     private IDisciplineRepository iDisciplineRepository;
+    private IDeviceGroupRepository iDeviceGroupRepository;
     private DisciplineRepository disciplineRepository;
     private NamesService namesService;
+    private DeviceGroupService deviceGroupService;
 
     @Autowired
     public DisciplineService(
             IDisciplineRepository iDisciplineRepository,
+            IDeviceGroupRepository iDeviceGroupRepository,
             DisciplineRepository disciplineRepository,
-            NamesService namesService) {
+            NamesService namesService,
+            DeviceGroupService deviceGroupService) {
         this.iDisciplineRepository = iDisciplineRepository;
+        this.iDeviceGroupRepository = iDeviceGroupRepository;
         this.disciplineRepository = disciplineRepository;
         this.namesService = namesService;
+        this.deviceGroupService = deviceGroupService;
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<Discipline> disciplines = disciplineRepository.readDisciplines(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(disciplines, 1)) {
+            return null;
+        }
+        Discipline toBeDeleted = disciplines.get(0);
+
+        // create
+        Discipline discipline = new Discipline(toBeDeleted.getUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        disciplineRepository.createDiscipline(discipline);
+
+        return StructureElementUtil.getStructureElementRequested(discipline);
     }
 
     @Transactional(propagation = Propagation.MANDATORY)
@@ -93,6 +135,9 @@ public class DisciplineService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -129,8 +174,23 @@ public class DisciplineService {
         LOGGER.log(Level.FINE, "approveStructure, structureCommandCUD:        {0}", structureCommandCUD);
 
         // approve update
+        // approve delete
         if (StructureCommand.UPDATE.equals(structureCommandCUD)) {
             namesService.updateNames(previous, discipline);
+        } else if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
+            // delete sub structures - delete, approve
+            List<StructureElementCommand> structureElementCommands = Lists.newArrayList();
+            List<DeviceGroup> deviceGroups = iDeviceGroupRepository.findLatestNotDeletedByParent(uuid);
+            for (DeviceGroup deviceGroup : deviceGroups) {
+                structureElementCommands.add(new StructureElementCommand(deviceGroup.getUuid(), Type.DEVICEGROUP, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE));
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                deviceGroupService.deleteStructure(structureElementCommand, processed, processedBy);
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                deviceGroupService.approveStructure(structureElementCommand, processed, processedBy, holder);
+            }
         }
 
         LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java
index df34b773..0739f4d0 100644
--- a/src/main/java/org/openepics/names/service/NamesService.java
+++ b/src/main/java/org/openepics/names/service/NamesService.java
@@ -633,7 +633,7 @@ public class NamesService {
     public List<NameElement> updateNames(Structure previousStructure, Structure structure) {
         // validation outside method
         // transaction
-        //     use active transaction or, if not available, create new
+        //     use active transaction or, if not available, throw exception
         // do
         //     find out names referenced by structure
         //         not for device group
@@ -727,7 +727,7 @@ public class NamesService {
             }
 
             // update names
-            //     use active transaction or, if not available, create new
+            //     use active transaction or, if not available, throw exception
             LOGGER.log(Level.FINE, "updateNames, structure change, nameElements.size: {0}", nameElements.size());
             updatedNameElements = updateNames(nameElements);
         }
diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java
index f5355904..6b070de3 100644
--- a/src/main/java/org/openepics/names/service/StructuresService.java
+++ b/src/main/java/org/openepics/names/service/StructuresService.java
@@ -88,7 +88,8 @@ public class StructuresService {
 
     private static final Logger LOGGER = Logger.getLogger(StructuresService.class.getName());
 
-    protected static final String SYSTEM_STRUCTURE_ONLY = "System structure only";
+    protected static final String SYSTEM_STRUCTURE_ONLY                 = "System structure only";
+    protected static final String DELETE_AFTER_APPROVE_STRUCTURE_CHANGE = "Delete after APPROVE structure change";
 
     private EssNamingConvention namingConvention;
 
@@ -930,111 +931,26 @@ public class StructuresService {
         String requestedBy = TextUtil.TEST_WHO;
         final List<StructureElement> deletedStructureElements = Lists.newArrayList();
         for (StructureElementCommand structureElement : structureElements) {
-            String uuid = structureElement.getUuid().toString();
             Type type = structureElement.getType();
 
             if (Type.SYSTEMGROUP.equals(type)) {
-                // find
-                List<SystemGroup> systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(systemGroups, 1)) {
-                    continue;
-                }
-                SystemGroup toBeDeleted = systemGroups.get(0);
-
-                // create
-                SystemGroup systemGroup = new SystemGroup(toBeDeleted.getUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getSystemGroupRepository().createSystemGroup(systemGroup);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(systemGroup));
+                Utilities.addToCollection(deletedStructureElements,
+                        systemGroupService.deleteStructure(structureElement, requested, requestedBy));
             } else if (Type.SYSTEM.equals(type)) {
-                // find
-                List<System> systems = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(systems, 1)) {
-                    continue;
-                }
-                System toBeDeleted = systems.get(0);
-
-                // create
-                System system = new System(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getSystemRepository().createSystem(system);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(system));
+                Utilities.addToCollection(deletedStructureElements,
+                        systemService.deleteStructure(structureElement, requested, requestedBy));
             } else if (Type.SUBSYSTEM.equals(type)) {
-                // find
-                List<Subsystem> subsystems = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(subsystems, 1)) {
-                    continue;
-                }
-                Subsystem toBeDeleted = subsystems.get(0);
-
-                // create
-                Subsystem subsystem = new Subsystem(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getSubsystemRepository().createSubsystem(subsystem);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(subsystem));
+                Utilities.addToCollection(deletedStructureElements,
+                        subsystemService.deleteStructure(structureElement, requested, requestedBy));
             } else if (Type.DISCIPLINE.equals(type)) {
-                // find
-                List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(disciplines, 1)) {
-                    continue;
-                }
-                Discipline toBeDeleted = disciplines.get(0);
-
-                // create
-                Discipline discipline = new Discipline(toBeDeleted.getUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getDisciplineRepository().createDiscipline(discipline);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(discipline));
+                Utilities.addToCollection(deletedStructureElements,
+                        disciplineService.deleteStructure(structureElement, requested, requestedBy));
             } else if (Type.DEVICEGROUP.equals(type)) {
-                // find
-                List<DeviceGroup> deviceGroups = holderRepositories.getDeviceGroupRepository().readDeviceGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(deviceGroups, 1)) {
-                    continue;
-                }
-                DeviceGroup toBeDeleted = deviceGroups.get(0);
-
-                // create
-                DeviceGroup deviceGroup = new DeviceGroup(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getDeviceGroupRepository().createDeviceGroup(deviceGroup);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceGroup));
+                Utilities.addToCollection(deletedStructureElements,
+                        deviceGroupService.deleteStructure(structureElement, requested, requestedBy));
             } else if (Type.DEVICETYPE.equals(type)) {
-                // find
-                List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
-                if (ValidateUtil.isNullOrNotSize(deviceTypes, 1)) {
-                    continue;
-                }
-                DeviceType toBeDeleted = deviceTypes.get(0);
-
-                // create
-                DeviceType deviceType = new DeviceType(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
-                        toBeDeleted.getName(), toBeDeleted.getMnemonic(), namingConvention.equivalenceClassRepresentative(toBeDeleted.getMnemonic()),
-                        toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
-                        requested, requestedBy, structureElement.getComment());
-                holderRepositories.getDeviceTypeRepository().createDeviceType(deviceType);
-
-                // add
-                deletedStructureElements.add(StructureElementUtil.getStructureElementRequested(deviceType));
+                Utilities.addToCollection(deletedStructureElements,
+                        deviceTypeService.deleteStructure(structureElement, requested, requestedBy));
             }
         }
 
@@ -1068,6 +984,9 @@ public class StructuresService {
         //                         update related names
         //                         for different mnemonic
         //                         not for device group
+        //                     approve delete
+        //                         keep related names - legacy names
+        //                         delete sub structures
         //     return
         //         structure elements for approved structures
 
@@ -1079,10 +998,9 @@ public class StructuresService {
         // approve
         //     set not latest for current latest
         //     set approved, latest for pending
-        //     possibly
+        //     delete
         //         if deleted, names that belong to structure may be deleted, otherwise they are alive but become legacy names - legacy way for now
-        //         TODO if not deleted, rename names that belong to structure if different mnemonic
-        //            if that way, then compare what's about to be approved with what is latest
+        //         delete sub structures
 
         // do
         //     update
diff --git a/src/main/java/org/openepics/names/service/SubsystemService.java b/src/main/java/org/openepics/names/service/SubsystemService.java
index 3252263d..77424b9b 100644
--- a/src/main/java/org/openepics/names/service/SubsystemService.java
+++ b/src/main/java/org/openepics/names/service/SubsystemService.java
@@ -72,6 +72,37 @@ public class SubsystemService {
         this.namesService = namesService;
     }
 
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<Subsystem> subsystems = subsystemRepository.readSubsystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(subsystems, 1)) {
+            return null;
+        }
+        Subsystem toBeDeleted = subsystems.get(0);
+
+        // create
+        Subsystem subsystem = new Subsystem(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        subsystemRepository.createSubsystem(subsystem);
+
+        return StructureElementUtil.getStructureElementRequested(subsystem);
+    }
+
     @Transactional(propagation = Propagation.MANDATORY)
     public StructureElement approveStructure(StructureElementCommand structureElement,
             Date processed, String processedBy,
@@ -96,6 +127,9 @@ public class SubsystemService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -134,6 +168,7 @@ public class SubsystemService {
 
         // approve create
         // approve update
+        // approve delete
         if (StructureCommand.CREATE.equals(structureCommandCUD)) {
             boolean existsName = !StringUtils.isEmpty(subsystem.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(subsystem, holder));
             if (!existsName) {
@@ -143,6 +178,8 @@ public class SubsystemService {
             }
         } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) {
             namesService.updateNames(previous, subsystem);
+        } else if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
         }
 
         LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
diff --git a/src/main/java/org/openepics/names/service/SystemGroupService.java b/src/main/java/org/openepics/names/service/SystemGroupService.java
index bf3e2eb8..6ebabd10 100644
--- a/src/main/java/org/openepics/names/service/SystemGroupService.java
+++ b/src/main/java/org/openepics/names/service/SystemGroupService.java
@@ -25,9 +25,12 @@ import java.util.logging.Logger;
 
 import org.apache.commons.lang3.StringUtils;
 import org.openepics.names.repository.ISystemGroupRepository;
+import org.openepics.names.repository.ISystemRepository;
 import org.openepics.names.repository.SystemGroupRepository;
+import org.openepics.names.repository.model.System;
 import org.openepics.names.repository.model.SystemGroup;
 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;
@@ -43,6 +46,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.google.common.collect.Lists;
+
 /**
  * This class provides structures services for system group.
  *
@@ -59,17 +64,54 @@ public class SystemGroupService {
     private static final Logger LOGGER = Logger.getLogger(SystemGroupService.class.getName());
 
     private ISystemGroupRepository iSystemGroupRepository;
+    private ISystemRepository iSystemRepository;
     private SystemGroupRepository systemGroupRepository;
     private NamesService namesService;
+    private SystemService systemService;
 
     @Autowired
     public SystemGroupService(
             ISystemGroupRepository iSystemGroupRepository,
+            ISystemRepository iSystemRepository,
             SystemGroupRepository systemGroupRepository,
-            NamesService namesService) {
+            NamesService namesService,
+            SystemService systemService) {
         this.iSystemGroupRepository = iSystemGroupRepository;
+        this.iSystemRepository = iSystemRepository;
         this.systemGroupRepository = systemGroupRepository;
         this.namesService = namesService;
+        this.systemService = systemService;
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<SystemGroup> systemGroups = systemGroupRepository.readSystemGroups(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(systemGroups, 1)) {
+            return null;
+        }
+        SystemGroup toBeDeleted = systemGroups.get(0);
+
+        // create
+        SystemGroup systemGroup = new SystemGroup(toBeDeleted.getUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        systemGroupRepository.createSystemGroup(systemGroup);
+
+        return StructureElementUtil.getStructureElementRequested(systemGroup);
     }
 
     @Transactional(propagation = Propagation.MANDATORY)
@@ -96,6 +138,9 @@ public class SystemGroupService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -134,6 +179,7 @@ public class SystemGroupService {
 
         // approve create
         // approve update
+        // approve delete
         if (StructureCommand.CREATE.equals(structureCommandCUD)) {
             boolean existsName = !StringUtils.isEmpty(systemGroup.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(systemGroup, holder));
             if (!existsName) {
@@ -143,9 +189,22 @@ public class SystemGroupService {
             }
         } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) {
             namesService.updateNames(previous, systemGroup);
+        } else if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
+            // delete sub structures - delete, approve
+            List<StructureElementCommand> structureElementCommands = Lists.newArrayList();
+            List<System> systems = iSystemRepository.findLatestNotDeletedByParent(uuid);
+            for (System system : systems) {
+                structureElementCommands.add(new StructureElementCommand(system.getUuid(), Type.SYSTEM, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE));
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                systemService.deleteStructure(structureElementCommand, processed, processedBy);
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                systemService.approveStructure(structureElementCommand, processed, processedBy, holder);
+            }
         }
 
-        LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
         return StructureElementUtil.getStructureElementProcessed(systemGroup, holder, StructureChoice.STRUCTURE);
     }
 
diff --git a/src/main/java/org/openepics/names/service/SystemService.java b/src/main/java/org/openepics/names/service/SystemService.java
index 73e61ef2..05ab5b07 100644
--- a/src/main/java/org/openepics/names/service/SystemService.java
+++ b/src/main/java/org/openepics/names/service/SystemService.java
@@ -24,10 +24,13 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import org.apache.commons.lang3.StringUtils;
+import org.openepics.names.repository.ISubsystemRepository;
 import org.openepics.names.repository.ISystemRepository;
 import org.openepics.names.repository.SystemRepository;
+import org.openepics.names.repository.model.Subsystem;
 import org.openepics.names.repository.model.System;
 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;
@@ -43,6 +46,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.google.common.collect.Lists;
+
 /**
  * This class provides structures services for system.
  *
@@ -59,17 +64,54 @@ public class SystemService {
     private static final Logger LOGGER = Logger.getLogger(SystemService.class.getName());
 
     private ISystemRepository iSystemRepository;
+    private ISubsystemRepository iSubsystemRepository;
     private SystemRepository systemRepository;
     private NamesService namesService;
+    private SubsystemService subsystemService;
 
     @Autowired
     public SystemService(
             ISystemRepository iSystemRepository,
+            ISubsystemRepository iSubsystemRepository,
             SystemRepository systemRepository,
-            NamesService namesService) {
+            NamesService namesService,
+            SubsystemService subsystemService) {
         this.iSystemRepository = iSystemRepository;
+        this.iSubsystemRepository = iSubsystemRepository;
         this.systemRepository = systemRepository;
         this.namesService = namesService;
+        this.subsystemService = subsystemService;
+    }
+
+    @Transactional(propagation = Propagation.MANDATORY)
+    public StructureElement deleteStructure(StructureElementCommand structureElement,
+            Date requested, String requestedBy) {
+        // validation outside method
+        // transaction
+        //     do
+        //         find
+        //         create structure to pending, not latest, deleted, with data
+        //         possibly validate that deleted
+        //     return
+        //         structure element for deleted structure
+
+        String uuid = structureElement.getUuid().toString();
+
+        // find
+        List<System> systems = systemRepository.readSystems(Status.APPROVED, Boolean.FALSE, uuid, null, null, null, null, null, null);
+        if (ValidateUtil.isNullOrNotSize(systems, 1)) {
+            return null;
+        }
+        System toBeDeleted = systems.get(0);
+
+        // create
+        System system = new System(toBeDeleted.getUuid(), toBeDeleted.getParentUuid(),
+                toBeDeleted.getName(), toBeDeleted.getMnemonic(), toBeDeleted.getMnemonicEquivalence(),
+                toBeDeleted.getDescription(), Status.PENDING, Boolean.FALSE, Boolean.TRUE,
+                requested, requestedBy, structureElement.getComment());
+        systemRepository.createSystem(system);
+
+        return StructureElementUtil.getStructureElementRequested(system);
     }
 
     @Transactional(propagation = Propagation.MANDATORY)
@@ -96,6 +138,9 @@ public class SystemService {
         //                 update related names
         //                 for different mnemonic
         //                 not for device group
+        //             approve delete
+        //                 keep related names - legacy names
+        //                 delete sub structures
         //     return
         //         structure element for approved structure
 
@@ -134,6 +179,7 @@ public class SystemService {
 
         // approve create
         // approve update
+        // approve delete
         if (StructureCommand.CREATE.equals(structureCommandCUD)) {
             boolean existsName = !StringUtils.isEmpty(system.getMnemonic()) && namesService.existsName(StructureUtil.getMnemonicPath(system, holder));
             if (!existsName) {
@@ -143,6 +189,20 @@ public class SystemService {
             }
         } else if (StructureCommand.UPDATE.equals(structureCommandCUD)) {
             namesService.updateNames(previous, system);
+        } else if (StructureCommand.DELETE.equals(structureCommandCUD)) {
+            // not delete names - legacy names
+            // delete sub structures - delete, approve
+            List<StructureElementCommand> structureElementCommands = Lists.newArrayList();
+            List<Subsystem> subsystems = iSubsystemRepository.findLatestNotDeletedByParent(uuid);
+            for (Subsystem subsystem : subsystems) {
+                structureElementCommands.add(new StructureElementCommand(subsystem.getUuid(), Type.SUBSYSTEM, null, null, null, null, StructuresService.DELETE_AFTER_APPROVE_STRUCTURE_CHANGE));
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                subsystemService.deleteStructure(structureElementCommand, processed, processedBy);
+            }
+            for (StructureElementCommand structureElementCommand : structureElementCommands) {
+                subsystemService.approveStructure(structureElementCommand, processed, processedBy, holder);
+            }
         }
 
         LOGGER.log(Level.FINE, "approveStructure, structureElement:           {0}", structureElement);
diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java
new file mode 100644
index 00000000..ef551113
--- /dev/null
+++ b/src/test/java/org/openepics/names/docker/complex/StructuresCUDDeleteIT.java
@@ -0,0 +1,583 @@
+/*
+ * 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 java.io.File;
+import java.util.UUID;
+
+import org.junit.jupiter.api.BeforeAll;
+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.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;
+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 is names endpoint and rules for legacy name.
+ * In practice, this class contains tests for structures and names, before and after delete of structures.
+ * </p>
+ *
+ * @author Lars Johansson
+ */
+@Testcontainers
+class StructuresCUDDeleteIT {
+
+    // test
+    //     create update delete structures and ensure name is as expected
+    //
+    // setup
+    //     system structure
+    //         Sg
+    //         Sys
+    //         Sys-Sub
+    //     system structure + device structure + index
+    //         Sg:Di-Dt-Idx
+    //         Sys:Di-Dt-Idx
+    //         Sys-Sub:Di-Dt-Idx
+    //
+    // note
+    //     namecommand
+    //         cud - create update delete
+    //     structurecommand
+    //         cud - create update delete
+    //         acr - approve cancel reject
+
+    @Container
+    public static final DockerComposeContainer<?> ENVIRONMENT =
+        new DockerComposeContainer<>(new File("docker-compose-integrationtest.yml"))
+            .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
+
+    // system group
+    private static UUID sg1 = null;
+    private static UUID sg2 = null;
+
+    // system
+    private static UUID sys11, sys12, sys13 = null;
+    private static UUID sys21, sys22, sys23 = null;
+
+    // subsystem
+    //     sub111, sub112, sub113
+    //     sub121, sub122, sub123
+    //     sub131, sub132, sub133
+    //     sub211, sub212, sub213
+    //     sub221, sub222, sub223
+    //     sub231, sub232, sub233
+    private static UUID sub132 = null;
+    private static UUID sub231, sub232, sub233 = null;
+
+    // discipline
+    private static UUID di2 = null;
+
+    // device group
+    private static UUID dg21, dg22, dg23 = null;
+
+    // device type
+    private static UUID dt211, dt212, dt213 = null;
+    private static UUID dt221, dt222, dt223 = null;
+    private static UUID dt231, dt232, dt233 = null;
+
+    // name
+    //     n211, n212, n213
+    //     n221, n222, n223
+    //     n231, n232, n233
+
+    @BeforeAll
+    public static void initAll() {
+        // init system group, system, subsystem, discipline, device group, device type
+        //
+        // test create structure and ensure name is as expected
+
+        NameElementCommand nameElement = null;
+        StructureElementCommand structureElement  = null;
+        StructureElement approvedStructureElement = null;
+
+        String name = "name";
+        String description = "description";
+        String comment = "comment";
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEMGROUP, null, name, "Sg1", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sg1 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys11", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys11 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys12", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys12 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg1, name, "Sys13", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys13 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub111", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub112", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys11, name, "Sub113", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub121", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub122", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys12, name, "Sub123", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub131", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub132", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sub132 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys13, name, "Sub133", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        ITUtilStructureElement.assertRead("/SYSTEMGROUP", 1);
+        ITUtilStructureElement.assertRead("/SYSTEM", 3);
+        ITUtilStructureElement.assertRead("/SUBSYSTEM", 9);
+        ITUtilNameElement.assertRead("", 13);
+
+
+        // at this point
+        //     system group
+        //         Sg1
+        //     system
+        //         Sys11, Sys12, Sys13
+        //     subsystem
+        //         Sub111, Sub112, Sub113
+        //         Sub121, Sub122, Sub123
+        //         Sub131, Sub132, Sub133
+        //     name (system structure only)
+        //         Sg1
+        //         Sys11, Sys12, Sys13
+        //         Sys11-Sub111, Sys11-Sub112, Sys11-Sub113
+        //         Sys12-Sub121, Sys12-Sub122, Sys12-Sub123
+        //         Sys13-Sub131, Sys13-Sub132, Sys13-Sub133
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEMGROUP, null, name, "Sg2", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sg2 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys21", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys21 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys22", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys22 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SYSTEM, sg2, name, "Sys23", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sys23 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub211", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub212", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys21, name, "Sub213", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub221", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub222", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys22, name, "Sub223", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub231", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sub231 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub232", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sub232 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.SUBSYSTEM, sys23, name, "Sub233", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        sub233 = approvedStructureElement.getUuid();
+
+        ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2);
+        ITUtilStructureElement.assertRead("/SYSTEM", 6);
+        ITUtilStructureElement.assertRead("/SUBSYSTEM", 18);
+        ITUtilNameElement.assertRead("", 26);
+
+        // at this point
+        //     above
+        //     +
+        //     system group
+        //         Sg2
+        //     system
+        //         Sys21, Sys22, Sys23
+        //     subsystem
+        //         Sub211, Sub212, Sub213
+        //         Sub221, Sub222, Sub223
+        //         Sub231, Sub232, Sub233
+        //     name (system structure only)
+        //         Sg2
+        //         Sys21, Sys22, Sys23
+        //         Sys21-Sub211, Sys21-Sub212, Sys21-Sub213
+        //         Sys22-Sub221, Sys22-Sub222, Sys22-Sub223
+        //         Sys23-Sub231, Sys23-Sub232, Sys23-Sub233
+
+        structureElement = new StructureElementCommand(null, Type.DISCIPLINE, null, name, "Di2", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        di2 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dg21 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dg22 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICEGROUP, di2, name, "", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dg23 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt211", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt211 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt212", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt212 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg21, name, "Dt213", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt213 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt221", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt221 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt222", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt222 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg22, name, "Dt223", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt223 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt231", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt231 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt232", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt232 = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(null, Type.DEVICETYPE, dg23, name, "Dt233", description, comment);
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        dt233 = approvedStructureElement.getUuid();
+
+        ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2);
+        ITUtilStructureElement.assertRead("/SYSTEM", 6);
+        ITUtilStructureElement.assertRead("/SUBSYSTEM", 18);
+        ITUtilStructureElement.assertRead("/DISCIPLINE", 1);
+        ITUtilStructureElement.assertRead("/DEVICEGROUP", 3);
+        ITUtilStructureElement.assertRead("/DEVICETYPE", 9);
+        ITUtilNameElement.assertRead("", 26);
+
+        // at this point
+        //     above
+        //     +
+        //     discipline
+        //         Di2
+        //     device group
+        //         -, -, -
+        //     device type
+        //         Dt211, Dt212, Dt213
+        //         Dt221, Dt222, Dt223
+        //         Dt231, Dt232, Dt233
+
+        nameElement = new NameElementCommand(null, sg2, dt211, "211", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sg2, dt212, "212", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sg2, dt213, "213", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sys22, dt221, "221", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sys22, dt222, "222", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sys22, dt223, "223", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sub231, dt231, "231", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sub232, dt232, "232", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        nameElement = new NameElementCommand(null, sub233, dt233, "233", description, comment);
+        ITUtilNameElement.assertCreate(nameElement);
+
+        ITUtilStructureElement.assertRead("/SYSTEMGROUP", 2);
+        ITUtilStructureElement.assertRead("/SYSTEM", 6);
+        ITUtilStructureElement.assertRead("/SUBSYSTEM", 18);
+        ITUtilStructureElement.assertRead("/DISCIPLINE", 1);
+        ITUtilStructureElement.assertRead("/DEVICEGROUP", 3);
+        ITUtilStructureElement.assertRead("/DEVICETYPE", 9);
+        ITUtilNameElement.assertRead("", 35);
+
+        // at this point
+        //     above
+        //     +
+        //     name (system structure + device structure + index)
+        //         Sg2:Di2-Dt211-211
+        //         Sg2:Di2-Dt212-212
+        //         Sg2:Di2-Dt213-213
+        //         Sys22:Di2-Dt221-221
+        //         Sys22:Di2-Dt222-222
+        //         Sys22:Di2-Dt223-223
+        //         Sys23-Sub231:Di2-Dt231-231
+        //         Sys23-Sub232:Di2-Dt232-232
+        //         Sys23-Sub233:Di2-Dt233-233
+
+        ITUtilNameElement.assertExists("Sg1", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys11", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys13", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys11-Sub111", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys11-Sub112", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys11-Sub113", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys13-Sub131", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys13-Sub133", Boolean.TRUE);
+
+        ITUtilNameElement.assertExists("Sg2", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys21", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys21-Sub211", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys21-Sub212", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys21-Sub213", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22-Sub221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22-Sub222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22-Sub223", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub231", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub232", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub233", Boolean.TRUE);
+
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE);
+    }
+
+    @Test
+    void deleteSystemStructure() {
+        // purpose
+        //     test update system structure and ensure name is as expected
+
+        ResponsePageStructureElements responsePage = null;
+        StructureElementCommand structureElement = null;
+
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/SUBSYSTEM?uuid=" + sub132, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sys13-Sub132", Boolean.TRUE);
+
+        // ----------------------------------------
+
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/SYSTEM?uuid=" + sys12, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sys12", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub121", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub122", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys12-Sub123", Boolean.TRUE);
+
+        // ----------------------------------------
+
+        ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "Sg1", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys11", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys13", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub111", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub112", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub113", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub131", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub133", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg1", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/SYSTEMGROUP?uuid=" + sg1, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "Sg1", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys11", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys12", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys13", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub111", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub112", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys11-Sub113", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub121", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub122", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys12-Sub123", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub131", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub132", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys13-Sub133", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sg1", Boolean.TRUE);
+    }
+
+    @Test
+    void deleteDeviceStructure() {
+        // purpose
+        //     test update system structure and ensure name is as expected
+
+        ResponsePageStructureElements responsePage = null;
+        StructureElementCommand structureElement = null;
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/DEVICETYPE?uuid=" + dt232, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE);
+
+        // ----------------------------------------
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/DEVICEGROUP?uuid=" + dg22, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE);
+
+        // ----------------------------------------
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt211", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt212", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt213", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt231", Boolean.TRUE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt233", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE);
+
+        responsePage = ITUtilStructureElement.assertRead("/DISCIPLINE?uuid=" + di2, 1);
+        structureElement = responsePage.getList().get(0);
+        structureElement = ITUtilStructureElement.assertDeleteApprove(structureElement);
+
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt211", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt212", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt213", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt221", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt222", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt223", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt231", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt232", Boolean.FALSE);
+        ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di2-Dt233", Boolean.FALSE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt211-211", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt212-212", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sg2:Di2-Dt213-213", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt221-221", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt222-222", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys22:Di2-Dt223-223", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub231:Di2-Dt231-231", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub232:Di2-Dt232-232", Boolean.TRUE);
+        ITUtilNameElement.assertExists("Sys23-Sub233:Di2-Dt233-233", Boolean.TRUE);
+    }
+
+}
diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java
similarity index 99%
rename from src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java
rename to src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java
index fcdc10b2..bedfaa62 100644
--- a/src/test/java/org/openepics/names/docker/complex/StructuresCUDNamesIT.java
+++ b/src/test/java/org/openepics/names/docker/complex/StructuresCUDUpdateIT.java
@@ -42,13 +42,13 @@ import org.testcontainers.junit.jupiter.Testcontainers;
  *
  * <p>
  * Focus of this class is names endpoint and rules for legacy name.
- * In practice, this class contains tests for structures and names, before and after delete of structures.
+ * In practice, this class contains tests for structures and names, before and after update of structures.
  * </p>
  *
  * @author Lars Johansson
  */
 @Testcontainers
-class StructuresCUDNamesIT {
+class StructuresCUDUpdateIT {
 
     // test
     //     create update delete structures and ensure name is as expected
-- 
GitLab