diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java
index 2d91491c82e5709a63e8b6e8fea0dea36d1f666a..ae2845a5fe896c284222e924e3ecc47ee30d60d1 100644
--- a/src/main/java/org/openepics/names/service/NamesService.java
+++ b/src/main/java/org/openepics/names/service/NamesService.java
@@ -60,6 +60,7 @@ import org.openepics.names.util.HolderSystemDeviceStructure;
 import org.openepics.names.util.NameElementUtil;
 import org.openepics.names.util.NameUtil;
 import org.openepics.names.util.TextUtil;
+import org.openepics.names.util.ValidateNameElementUtil;
 import org.openepics.names.util.ValidateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -243,7 +244,7 @@ public class NamesService {
         //     name elements for names
 
         // validate input
-        ValidateUtil.validateNamesInputRead(
+        ValidateNameElementUtil.validateNamesInputRead(
                 deleted, queryFields, queryValues,
                 includeHistory,
                 orderBy, isAsc,
@@ -507,7 +508,7 @@ public class NamesService {
         HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories, false);
 
         // validate data
-        ValidateUtil.validateNameDataCreate(name, namingConvention, holderRepositories, holder);
+        ValidateNameElementUtil.validateNameDataCreate(name, namingConvention, holderRepositories, holder);
 
         return Boolean.TRUE;
     }
@@ -529,10 +530,10 @@ public class NamesService {
         //         validate towards repository
 
         // validate input
-        ValidateUtil.validateNameElementInputCreate(nameElement);
+        ValidateNameElementUtil.validateNameElementInputCreate(nameElement);
 
         // validate data
-        ValidateUtil.validateNameElementDataCreate(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
+        ValidateNameElementUtil.validateNameElementDataCreate(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
     }
     public void validateNamesCreate(List<NameElementCommand> nameElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -558,10 +559,10 @@ public class NamesService {
         //         validate towards repository
 
         // validate input
-        ValidateUtil.validateNameElementInputUpdate(nameElement);
+        ValidateNameElementUtil.validateNameElementInputUpdate(nameElement);
 
         // validate data
-        ValidateUtil.validateNameElementDataUpdate(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
+        ValidateNameElementUtil.validateNameElementDataUpdate(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
     }
     public void validateNamesUpdate(List<NameElementCommand> nameElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -585,10 +586,10 @@ public class NamesService {
         //         retrieve name (uuid, latest, not deleted)
 
         // validate input
-        ValidateUtil.validateNameElementInputDelete(nameElement);
+        ValidateNameElementUtil.validateNameElementInputDelete(nameElement);
 
         // validate data
-        ValidateUtil.validateNameElementDataDelete(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
+        ValidateNameElementUtil.validateNameElementDataDelete(nameElement, namingConvention, holderIRepositories, nameRepository, holder);
     }
     public void validateNamesDelete(List<NameElementCommand> nameElements) {
         //     validate authority
diff --git a/src/main/java/org/openepics/names/service/StructuresService.java b/src/main/java/org/openepics/names/service/StructuresService.java
index 4bb6b9c97a0f31d9a46406f4bbfbde012a4e83c6..97c1b3e72c0b93c9de16853452a51e9297b6c02b 100644
--- a/src/main/java/org/openepics/names/service/StructuresService.java
+++ b/src/main/java/org/openepics/names/service/StructuresService.java
@@ -61,6 +61,7 @@ import org.openepics.names.util.HolderRepositories;
 import org.openepics.names.util.HolderSystemDeviceStructure;
 import org.openepics.names.util.StructureElementUtil;
 import org.openepics.names.util.TextUtil;
+import org.openepics.names.util.ValidateStructureElementUtil;
 import org.openepics.names.util.StructureElementUtil.StructureChoice;
 import org.openepics.names.util.ValidateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -308,7 +309,7 @@ public class StructuresService {
         //     structure elements for structures
 
         // validate input
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 type, statuses, deleted, queryFields, queryValues,
                 includeHistory,
                 orderBy, isAsc,
@@ -640,7 +641,7 @@ public class StructuresService {
         HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories, false);
 
         // validate data
-        ValidateUtil.validateStructureDataCreate(type, mnemonicpath, namingConvention, holderIRepositories, holder);
+        ValidateStructureElementUtil.validateStructureDataCreate(type, mnemonicpath, namingConvention, holderIRepositories, holder);
 
         return Boolean.TRUE;
     }
@@ -662,10 +663,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputCreate(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputCreate(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataCreate(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataCreate(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresCreate(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -691,10 +692,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputUpdate(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputUpdate(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataUpdate(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataUpdate(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresUpdate(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -720,10 +721,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputDelete(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputDelete(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataDelete(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataDelete(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresDelete(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -749,10 +750,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputApprove(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputApprove(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataApprove(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataApprove(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresApprove(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -778,10 +779,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputCancel(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputCancel(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataCancel(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataCancel(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresCancel(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
@@ -807,10 +808,10 @@ public class StructuresService {
         //             relative other data
 
         // validate input
-        ValidateUtil.validateStructureElementInputReject(structureElement, namingConvention);
+        ValidateStructureElementUtil.validateStructureElementInputReject(structureElement, namingConvention);
 
         // validate data
-        ValidateUtil.validateStructureElementDataReject(structureElement, namingConvention, holderRepositories, holder);
+        ValidateStructureElementUtil.validateStructureElementDataReject(structureElement, namingConvention, holderRepositories, holder);
     }
     public void validateStructuresReject(List<StructureElementCommand> structureElements) {
         // initiate holder of containers for system and device structure content, for performance reasons
diff --git a/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java b/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..be50a152b2e7436c25b667ed9746ca404f4b1ab1
--- /dev/null
+++ b/src/main/java/org/openepics/names/util/ValidateNameElementUtil.java
@@ -0,0 +1,479 @@
+/*
+ * 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.util;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openepics.names.repository.NameRepository;
+import org.openepics.names.repository.model.DeviceType;
+import org.openepics.names.repository.model.Name;
+import org.openepics.names.repository.model.Subsystem;
+import org.openepics.names.repository.model.System;
+import org.openepics.names.repository.model.SystemGroup;
+import org.openepics.names.rest.beans.FieldName;
+import org.openepics.names.rest.beans.FieldStructure;
+import org.openepics.names.rest.beans.Status;
+import org.openepics.names.rest.beans.element.NameElementCommand;
+
+/**
+ * Utility class to assist in handling of validation.
+ *
+ * @author Lars Johansson
+ */
+public class ValidateNameElementUtil {
+
+    // note
+    //     handling of system structure, device structure
+    //         parent system structure uuid (system group, system, subsystem)
+    //         parent device structure uuid (device type)
+    //
+    //     NameElement
+    //         uuid,
+    //         systemgroup, system, subsystem, devicetype, systemstructure, devicestructure,
+    //         index, name,
+    //         description, status, latest, deleted, when, who, comment
+    //
+    //     NameElementCommand
+    //	       create -       parentsystemstructure, parentdevicestructure (optional), index, description, comment
+    //	       update - uuid, parentsystemstructure, parentdevicestructure (optional), index, description, comment
+    //	       delete - uuid,                                                                              comment
+
+    private enum NameChoice      {CREATE, UPDATE, DELETE}
+
+    /**
+     * This class is not to be instantiated.
+     */
+    private ValidateNameElementUtil() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * Validate parameters for read names.
+     *
+     * @param deleted deleted
+     * @param queryFields query fields
+     * @param queryValues query values
+     * @param includeHistory include history
+     * @param orderBy order by
+     * @param isAsc is ascending
+     * @param offset offset
+     * @param limit limit
+     */
+    public static void validateNamesInputRead(
+            Boolean deleted, FieldName[] queryFields, String[] queryValues,
+            Boolean includeHistory,
+            FieldName orderBy, Boolean isAsc,
+            Integer offset, Integer limit) {
+
+        // validate input
+        //     queryFields and queryValues
+        //         either
+        //             both null
+        //             both non-null, same length, non-empty
+        //         uuid
+
+        boolean condition = ((queryFields == null && queryValues == null)
+                || (queryFields != null && queryValues != null && queryFields.length == queryValues.length && queryFields.length > 0));
+        ExceptionUtil.validateConditionInputNotCorrectException(condition,
+                TextUtil.VALUES_ARE_NOT_CORRECT, "url and parameters (queryFields, queryValues) have different lengths or are empty", null);
+
+        if (queryFields != null) {
+            for (int i=0; i<queryFields.length; i++) {
+                if (FieldName.UUID.equals(queryFields[i])) {
+                    ValidateUtil.validateInputUuid(queryValues[i]);
+                }
+            }
+        }
+    }
+
+    /**
+     * Validate name element parameters (input) for create.
+     *
+     * @param nameElement name element
+     */
+    public static void validateNameElementInputCreate(NameElementCommand nameElement) {
+        validateNameElementInput(nameElement, NameChoice.CREATE);
+    }
+
+    /**
+     * Validate name element parameters (input) for update.
+     *
+     * @param nameElement name element
+     */
+    public static void validateNameElementInputUpdate(NameElementCommand nameElement) {
+        validateNameElementInput(nameElement, NameChoice.UPDATE);
+    }
+
+    /**
+     * Validate name element parameters (input) for delete.
+     *
+     * @param nameElement name element
+     */
+    public static void validateNameElementInputDelete(NameElementCommand nameElement) {
+        validateNameElementInput(nameElement, NameChoice.DELETE);
+    }
+
+    /**
+     * Validate name element parameters (input).
+     *
+     * @param nameElement name element
+     * @param nameChoice name choice
+     */
+    private static void validateNameElementInput(NameElementCommand nameElement, NameChoice nameChoice) {
+        // attributes
+        //     uuid                            - required if not create, required empty if create
+        //     parentsystemstructure (uuid)
+        //     parentdevicestructure (uuid)
+        //     index
+        //     description
+        //     comment
+
+        if (nameElement == null || nameChoice == null) {
+            return;
+        }
+
+        UUID uuid = nameElement.getUuid();
+        UUID parentSystemstructure = nameElement.getParentsystemstructure();
+        UUID parentDevicestructure = nameElement.getParentdevicestructure();
+        String index = nameElement.getIndex();
+        String description = nameElement.getDescription();
+        String comment = nameElement.getComment();
+
+        if (NameChoice.CREATE.equals(nameChoice)) {
+            ExceptionUtil.validateConditionInputNotEmptyException(uuid == null,
+                    TextUtil.VALUE_IS_NOT_EMPTY,
+                    uuid != null ? uuid.toString() : null,
+                    TextUtil.UUID);
+        } else {
+            ValidateUtil.validateInputUuid(uuid != null ? uuid.toString() : null);
+        }
+
+        if (!NameChoice.DELETE.equals(nameChoice)) {
+            ExceptionUtil.validateConditionInputNotAvailableException(parentSystemstructure != null,
+                    TextUtil.VALUE_IS_NOT_AVAILABLE, nameElement.toString(), TextUtil.PARENTSYSTEMSTRUCTURE);
+
+            // optional (either none or both)
+            //     parentdevicestructure
+            // 	   index
+            if (parentDevicestructure != null && index == null) {
+                throw ExceptionUtil.createInputNotCorrectException(null, nameElement.toString(), TextUtil.INDEX);
+            } else if (parentDevicestructure == null && index != null) {
+                throw ExceptionUtil.createInputNotCorrectException(null, nameElement.toString(), TextUtil.PARENTDEVICESTRUCTURE);
+            }
+
+            ValidateUtil.validateInputDescription(description);
+        }
+
+        ValidateUtil.validateInputComment(comment);
+    }
+
+    // ----------------------------------------------------------------------------------------------------
+
+    /**
+     * Validate name element data for create.
+     *
+     * @param nameElement name element
+     * @param namingConvention naming convention
+     * @param holderIRepositories holder repositories
+     * @param nameRepository name repository
+     * @param holder holder
+     */
+    public static void validateNameElementDataCreate(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
+        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.CREATE);
+    }
+
+    /**
+     * Validate name element data for update.
+     *
+     * @param nameElement name element
+     * @param namingConvention naming convention
+     * @param holderIRepositories holder repositories
+     * @param nameRepository name repositories
+     * @param holder holder
+     */
+    public static void validateNameElementDataUpdate(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
+        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.UPDATE);
+    }
+
+    /**
+     * Validate name element data for delete.
+     *
+     * @param nameElement name element
+     * @param namingConvention naming convention
+     * @param holderIRepositories holder repositories
+     * @param nameRepository name repositories
+     * @param holder holder
+     */
+    public static void validateNameElementDataDelete(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
+        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.DELETE);
+    }
+
+    /**
+     * Validate name element data.
+     *
+     * @param nameElement name element
+     * @param namingConvention naming convention
+     * @param holderIRepositories holder repositories
+     * @param nameRepository name repository
+     * @param holder holder
+     * @param nameChoice name choice
+     */
+    private static void validateNameElementData(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder, NameChoice nameChoice) {
+        // attributes
+        //     uuid
+        //     parentsystemstructure
+        //     parentdevicestructure
+        //     index
+        //     description
+        //     comment
+        //
+        // name
+        //      - system structure uuid
+        //    ( - system structure uuid, device structure uuid )
+        //      - system structure uuid, device structure uuid, index
+
+        if (nameElement == null || namingConvention == null || holderIRepositories == null || nameRepository == null || holder == null || nameChoice == null) {
+            return;
+        }
+
+        String details = nameElement.toString();
+
+        // name
+        //     update, delete - uuid available, not deleted
+        //     retrieve for uuid and check
+        if (NameChoice.UPDATE.equals(nameChoice) || NameChoice.DELETE.equals(nameChoice)) {
+            List<Name> names = nameRepository.readNames(false, FieldName.UUID, nameElement.getUuid().toString());
+            ExceptionUtil.validateConditionDataNotCorrectException(names != null && names.size() == 1,
+                    TextUtil.VALUE_IS_NOT_CORRECT, details, TextUtil.UUID);
+        }
+
+        SystemGroup systemGroup = null;
+        System      system      = null;
+        Subsystem   subsystem   = null;
+        DeviceType  deviceType  = null;
+
+        int countDevicestructureIndex = 0;
+        String derivedName = null;
+
+        boolean condition = true;
+
+        UUID uuid = nameElement.getUuid();
+        UUID parentSystemstructure = nameElement.getParentsystemstructure();
+        UUID parentDevicestructure = nameElement.getParentdevicestructure();
+        String index = nameElement.getIndex();
+
+        if (NameChoice.CREATE.equals(nameChoice) || NameChoice.UPDATE.equals(nameChoice)) {
+            // systemgroup, system, subsystem - in repository
+            //     found
+            //     not deleted
+            // devicetype                     - possibly, in repository
+            //     found
+            //     not deleted
+            // name                           - naming convention rules
+            //     derive name from system structure, device structure, index
+            // index                          - possibly, naming convention rules
+            //     valid
+            // name
+            //     name not exists
+            //     name equivalence not exists
+
+            // find out system group, system, subsystem
+            //     one of the three expected to be non-null, other two expected to be null
+            systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(parentSystemstructure.toString());
+            system      = holderIRepositories.getSystemRepository().findLatestByUuid(parentSystemstructure.toString());
+            subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(parentSystemstructure.toString());
+
+            // device structure
+            if (parentDevicestructure != null) {
+                countDevicestructureIndex++;
+                deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(parentDevicestructure.toString());
+                ExceptionUtil.validateConditionDataNotAvailableException(deviceType != null, TextUtil.DATA_IS_NOT_AVAILABLE, details, TextUtil.PARENTDEVICESTRUCTURE);
+                ExceptionUtil.validateConditionDataDeletedException(!deviceType.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTDEVICESTRUCTURE);
+            }
+
+            // system structure
+            if (systemGroup != null) {
+                ExceptionUtil.validateConditionDataDeletedException(!systemGroup.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+                derivedName = NameUtil.getName(systemGroup, deviceType, index, holder);
+            } else if (system != null) {
+                ExceptionUtil.validateConditionDataDeletedException(!system.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+                derivedName = NameUtil.getName(system, deviceType, index, holder);
+            } else if (subsystem != null) {
+                ExceptionUtil.validateConditionDataDeletedException(!subsystem.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+                derivedName = NameUtil.getName(subsystem, deviceType, index, holder);
+            } else {
+                throw ExceptionUtil.createDataNotCorrectException(TextUtil.DATA_IS_NOT_CORRECT, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+            }
+
+            // index
+            if (!StringUtils.isEmpty(index)) {
+                countDevicestructureIndex++;
+                // TODO overrideRuleset depend on user authority
+                condition = namingConvention.isInstanceIndexValid(derivedName, false);
+                ExceptionUtil.validateConditionDataNotValidException(condition, TextUtil.DATA_IS_NOT_VALID, details, TextUtil.INDEX);
+            }
+
+            condition = countDevicestructureIndex == 0 || countDevicestructureIndex == 2;
+            ExceptionUtil.validateConditionDataNotAvailableException(condition, TextUtil.DEVICETYPE_OR_INDEX_IS_NOT_AVAILABLE, details, TextUtil.PARENTDEVICESTRUCTURE);
+
+            // name
+            //     ok with same name, name equivalence if same uuid
+            List<Name> names = nameRepository.readNames(false, FieldName.NAME, derivedName);
+            if (NameChoice.CREATE.equals(nameChoice)) {
+                condition = names == null || names.isEmpty();
+            } else {
+                // NameChoice.UPDATE.equals(nameChoice)
+                condition = names == null || names.isEmpty() || names.size() == 1 && names.get(0).getUuid().equals(uuid);
+            }
+            ExceptionUtil.validateConditionDataExistException(condition, TextUtil.CONVENTION_NAME_EXISTS, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+
+            names = nameRepository.readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(derivedName));
+            if (NameChoice.CREATE.equals(nameChoice)) {
+                condition = names == null || names.isEmpty();
+            } else {
+                // NameChoice.UPDATE.equals(nameChoice)
+                condition = names == null || names.isEmpty() || names.size() == 1 && names.get(0).getUuid().equals(uuid);
+            }
+            ExceptionUtil.validateConditionDataExistException(condition, TextUtil.CONVENTION_NAME_EQUIVALENCE_EXISTS, details, TextUtil.PARENTSYSTEMSTRUCTURE);
+        } else if (NameChoice.DELETE.equals(nameChoice)) {
+            // n.a.
+            //     uuid    - already handled
+            //     comment - already handled
+        }
+    }
+
+    // ----------------------------------------------------------------------------------------------------
+
+    /**
+     * Validate name data.
+     * This method corresponds to name element data for create, albeit in a different way.
+     *
+     * @param name name
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     *
+     * @see ValidateUtil#validateNameDataCreate(NameElement, EssNamingConvention, HolderIRepositories, NameRepository, HolderSystemDeviceStructure)
+     */
+    public static void validateNameDataCreate(String name, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        if (name == null || namingConvention == null || holderRepositories == null || holder == null) {
+            return;
+        }
+
+        String details = name;
+        String field = TextUtil.NAME;
+
+        // find out system group, system, subsystem       + check if valid
+        // find out discipline, device group, device type + check if valid
+        // find out instance index                        + check if valid
+        // check name equivalence
+
+        String sg  = NamingConventionUtil.extractSystemGroup(name);
+        String sys = NamingConventionUtil.extractSystem(name);
+        String sub = NamingConventionUtil.extractSubsystem(name);
+        String dt  = NamingConventionUtil.extractDeviceType(name);
+        String idx = NamingConventionUtil.extractInstanceIndex(name);
+
+        String mnemonicPathSystemstructure = NamingConventionUtil.extractMnemonicPathSystemStructure(name);
+        String mnemonicPathDevicestructure = NamingConventionUtil.extractMnemonicPathDeviceStructure(name);
+
+        int count = 0;
+        int countSgSys = 0;
+        int countSgSub = 0;
+        if (sg != null) {
+            count++;
+            countSgSys++;
+            countSgSub++;
+        }
+        if (sys != null) {
+            count++;
+            countSgSys++;
+        }
+        if (sub != null) {
+            count++;
+            countSgSub++;
+        }
+
+        // one or two system structure mnemonics + not system group and system + not system group and subsystem
+        if (count < 1 || count > 2 || countSgSys == 2 || countSgSub == 2) {
+            throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
+        }
+
+        SystemGroup systemGroup = null;
+        System system           = null;
+        Subsystem subsystem     = null;
+        DeviceType deviceType   = null;
+
+        String derivedName = null;
+
+        // ensure that system structure parents and device structure parents are available, latest and not deleted
+        //     if device type
+        //     if system group
+        //     else
+        //         if system
+        //         else
+        //             (if not system then error)
+        //         if subsystem
+
+        // device structure
+        if (!StringUtils.isEmpty(dt)) {
+            List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathDevicestructure);
+            ExceptionUtil.validateConditionDataNotAvailableException(deviceTypes != null && deviceTypes.size() == 1, TextUtil.DEVICETYPE_IS_NOT_AVAILABLE, details, field);
+            deviceType = deviceTypes.get(0);
+        }
+
+        // system structure
+        List<Subsystem>   subsystems   = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+        List<System>      systems      = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+        List<SystemGroup> systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+
+        if (subsystems != null && subsystems.size() == 1) {
+            subsystem = subsystems.get(0);
+            derivedName = NameUtil.getName(subsystem, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
+        } else if (systems != null && systems.size() == 1) {
+            system = systems.get(0);
+            derivedName = NameUtil.getName(system, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
+        } else if (systemGroups != null && systemGroups.size() == 1) {
+            systemGroup = systemGroups.get(0);
+            derivedName = NameUtil.getName(systemGroup, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
+        } else  {
+            throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
+        }
+
+        // index
+        if (!StringUtils.isEmpty(idx)) {
+            // TODO overrideRuleset depend on user authority
+            ExceptionUtil.validateConditionDataNotValidException(namingConvention.isInstanceIndexValid(name, false), TextUtil.INDEX_IS_NOT_VALID, details, field);
+        }
+
+        // name
+        //     name corresponds to derived name
+        //     convention name not exists
+        //     convention name equivalence not exists
+        ExceptionUtil.validateConditionDataNotCorrectException(StringUtils.equals(name, derivedName), TextUtil.CONVENTION_NAME_IS_NOT_CORRECT, details, field);
+
+        List<Name> names = holderRepositories.getNameRepository().readNames(false, FieldName.NAME, name);
+        ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EXISTS, details, field);
+
+        names = holderRepositories.getNameRepository().readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(name));
+        ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EQUIVALENCE_EXISTS, details, field);
+    }
+
+}
diff --git a/src/main/java/org/openepics/names/util/ValidateStructureElementUtil.java b/src/main/java/org/openepics/names/util/ValidateStructureElementUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..352c4e1265244d1d586ee07cbea2ec1301e42797
--- /dev/null
+++ b/src/main/java/org/openepics/names/util/ValidateStructureElementUtil.java
@@ -0,0 +1,892 @@
+/*
+ * 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.util;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openepics.names.repository.model.Discipline;
+import org.openepics.names.repository.model.System;
+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.StructureElementCommand;
+import org.openepics.names.service.exception.DataConflictException;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Utility class to assist in handling of validation.
+ *
+ * @author Lars Johansson
+ */
+public class ValidateStructureElementUtil {
+
+    // note
+    //     handling of system structure, device structure
+    //         parent system structure uuid (system group, system, subsystem)
+    //         parent device structure uuid (device type)
+    //
+    //     StructureElement
+    //         type, uuid, parent uuid,
+    //         name, mnemonic, mnemonic path, level,
+    //         description, status, latest, deleted, when, who, comment
+    //
+    //     StructureElementCommand
+    //	       create -       type, parent, name, mnemonic, description, comment
+    //	       update - uuid, type, parent, name, mnemonic, description, comment
+    //	       delete - uuid, type                                       comment
+
+    private enum StructureChoice {CREATE, UPDATE, DELETE, APPROVE, REJECT, CANCEL}
+
+    /**
+     * This class is not to be instantiated.
+     */
+    private ValidateStructureElementUtil() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    /**
+     * Validate parameters for read structures.
+     *
+     * @param type type
+     * @param statuses statuses
+     * @param deleted deleted
+     * @param queryFields query fields
+     * @param queryValues query values
+     * @param includeHistory include history
+     * @param orderBy order by
+     * @param isAsc is ascending
+     * @param offset offset
+     * @param limit limit
+     */
+    public static void validateStructuresInputRead(
+            Type type, Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues,
+            Boolean includeHistory,
+            FieldStructure orderBy, Boolean isAsc,
+            Integer offset, Integer limit) {
+
+        // validate input
+        //     type
+        //     queryFields and queryValues
+        //         either
+        //             both null
+        //             both non-null, same length, non-empty
+        //         uuid
+
+        ValidateUtil.validateInputType(type);
+        boolean condition = ((queryFields == null && queryValues == null)
+                || (queryFields != null && queryValues != null && queryFields.length == queryValues.length && queryFields.length > 0));
+        ExceptionUtil.validateConditionInputNotCorrectException(condition,
+                TextUtil.VALUES_ARE_NOT_CORRECT, "url and parameters (queryFields, queryValues) have different lengths or are empty", null);
+
+        if (queryFields != null) {
+            for (int i=0; i<queryFields.length; i++) {
+                if (FieldStructure.UUID.equals(queryFields[i])) {
+                    ValidateUtil.validateInputUuid(queryValues[i]);
+                }
+            }
+
+        }
+    }
+
+    /**
+     * Validate structure element parameters (input) for create.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputCreate(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.CREATE);
+    }
+
+    /**
+     * Validate structure element parameters (input) for update.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputUpdate(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.UPDATE);
+    }
+
+    /**
+     * Validate structure element parameters (input) for delete.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputDelete(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.DELETE);
+    }
+
+    /**
+     * Validate structure element parameters (input) for approve.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputApprove(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.APPROVE);
+    }
+
+    /**
+     * Validate structure element parameters (input) for cancel.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputCancel(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.CANCEL);
+    }
+
+    /**
+     * Validate structure element parameters (input) for reject.
+     *
+     * @param structureElement structure element
+     */
+    public static void validateStructureElementInputReject(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
+        validateStructureElementInput(structureElement, namingConvention, StructureChoice.REJECT);
+    }
+
+    /**
+     * Validate structure element parameters (input).
+     *
+     * @param structureElement structure element
+     * @param structureChoice structure choice
+     */
+    private static void validateStructureElementInput(StructureElementCommand structureElement, EssNamingConvention namingConvention, StructureChoice structureChoice) {
+        // check structure element input
+        //     uuid             - required if not create, required empty if create
+        //     type             - required
+        //     parent (uuid)    - also validate data, parent uuid available if type is system, subsystem, device group, device type
+        //     name             - required
+        //     mnemonic         - required except for device group
+        //     description      - required
+        //     comment          - required
+
+        if (structureElement == null || structureChoice == null) {
+            return;
+        }
+
+        Type type = structureElement.getType();
+        UUID uuid = structureElement.getUuid();
+        UUID parentUuid = structureElement.getParent();
+        String name = structureElement.getName();
+        String mnemonic = structureElement.getMnemonic();
+        String description = structureElement.getDescription();
+        String comment = structureElement.getComment();
+
+        if (StructureChoice.CREATE.equals(structureChoice)) {
+            ExceptionUtil.validateConditionInputNotEmptyException(uuid == null,
+                    TextUtil.VALUE_IS_NOT_EMPTY,
+                    uuid != null ? uuid.toString() : null,
+                    TextUtil.UUID);
+        } else {
+            ValidateUtil.validateInputUuid(uuid != null ? uuid.toString() : null);
+        }
+
+        ValidateUtil.validateInputType(type);
+
+        if (!StructureChoice.DELETE.equals(structureChoice)) {
+            if (Type.SYSTEM.equals(type)
+                    || Type.SUBSYSTEM.equals(type)
+                    || Type.DEVICEGROUP.equals(type)
+                    || Type.DEVICETYPE.equals(type)) {
+                ExceptionUtil.validateConditionInputNotAvailableException(parentUuid != null,
+                        TextUtil.PARENT_IS_NOT_AVAILABLE, structureElement.toString(), TextUtil.PARENT);
+                ValidateUtil.validateInputUuid(parentUuid.toString());
+            }
+
+            ValidateUtil.validateInputName(name);
+
+            // validate mnemonic
+            //     validate mnemonic input (value itself, not in relation to other values)
+            //     validateMnemonic takes isMnemonicRequired into account
+            MnemonicValidation mnemonicValidation = namingConvention.validateMnemonic(type, mnemonic);
+            ExceptionUtil.validateConditionInputNotValidException(MnemonicValidation.VALID.equals(mnemonicValidation),
+                    TextUtil.MNEMONIC_IS_NOT_VALID, structureElement.toString(), TextUtil.MNEMONIC);
+
+            ValidateUtil.validateInputDescription(description);
+        }
+
+        ValidateUtil.validateInputComment(comment);
+    }
+
+    // ----------------------------------------------------------------------------------------------------
+
+    /**
+     * Validate structure element data for create.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataCreate(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CREATE);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CREATE);
+    }
+
+    /**
+     * Validate structure element data for update.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataUpdate(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.UPDATE);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.UPDATE);
+    }
+
+    /**
+     * Validate structure element data for delete.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataDelete(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.DELETE);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.DELETE);
+    }
+
+    /**
+     * Validate structure element data for approve.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataApprove(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.APPROVE);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.APPROVE);
+    }
+
+    /**
+     * Validate structure element data for cancel.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataCancel(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CANCEL);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CANCEL);
+    }
+
+    /**
+     * Validate structure element data for reject.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureElementDataReject(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.REJECT);
+        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.REJECT);
+    }
+
+    /**
+     * Validate structure element data in itself.
+     *
+     * @param structureElement
+     * @param namingConvention
+     * @param holderRepositories
+     * @param holder
+     * @param structureChoice
+     */
+    public static void validateStructureElementDataInItself(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder, StructureChoice structureChoice) {
+        // check structure element data in itself
+        //     update, delete
+        //         definitely (not possibly)
+        //             no pending entry waiting to be approved, cancelled, rejected (pending with higher id than currently approved)
+        //         uuid - approved, latest, not deleted - list size 1
+        //     approve, reject, cancel
+        //         uuid - pending, latest, not deleted  - list size 1
+
+        if (structureElement == null || namingConvention == null || holderRepositories == null || holder == null || structureChoice == null) {
+            return;
+        }
+
+        String message = structureElement.getType().toString().toLowerCase() + TextUtil.SPACE + TextUtil.IS_NOT_CORRECT;
+        String details = structureElement.toString();
+        String field   = TextUtil.UUID;
+
+        // validate data in itself
+        //     systemgroup, discipline
+        //         not have parent
+        //     update, delete
+        //         entry not pending
+        //         entry approved and not deleted
+        //     approve, cancel, reject
+        //         entry pending
+
+        Type type = structureElement.getType();
+        UUID uuid = structureElement.getUuid();
+        UUID parentUuid = structureElement.getParent();
+
+        if ((Type.SYSTEMGROUP.equals(type) || Type.DISCIPLINE.equals(type))
+                && parentUuid != null) {
+            throw ExceptionUtil.createDataNotCorrectException(TextUtil.PARENT_IS_NOT_CORRECT, details, field);
+        } else if (StructureChoice.UPDATE.equals(structureChoice) || StructureChoice.DELETE.equals(structureChoice)) {
+            validateStructuresStatusSize0(
+                    uuid, type, Status.PENDING, null,
+                    holderRepositories, message, details, field);
+
+            validateStructuresStatusSize1(
+                    uuid, type, Status.APPROVED, Boolean.FALSE,
+                    holderRepositories, message, details, field);
+        } else if (StructureChoice.APPROVE.equals(structureChoice) || StructureChoice.CANCEL.equals(structureChoice) || StructureChoice.REJECT.equals(structureChoice)) {
+            validateStructuresStatusSize1(
+                    uuid, type, Status.PENDING, null,
+                    holderRepositories, message, details, field);
+        }
+    }
+
+    private static void validateStructuresStatusSize0(UUID uuid, Type type, Status status, Boolean deleted,
+            HolderRepositories holderRepositories, String message, String details, String field) {
+        ExceptionUtil.validateConditionDataNotCorrectException(
+                getStructuresSize(uuid, type, status, deleted, holderRepositories) == 0, message, details, field);
+    }
+    private static void validateStructuresStatusSize1(UUID uuid, Type type, Status status, Boolean deleted,
+            HolderRepositories holderRepositories, String message, String details, String field) {
+        ExceptionUtil.validateConditionDataNotCorrectException(
+                getStructuresSize(uuid, type, status, deleted, holderRepositories) == 1, message, details, field);
+    }
+    private static int getStructuresSize(UUID uuid, Type type, Status status, Boolean deleted,
+            HolderRepositories holderRepositories) {
+        if (Type.SYSTEMGROUP.equals(type)) {
+            return holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        } else if (Type.SYSTEM.equals(type)) {
+            return holderRepositories.getSystemRepository().readSystems(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        } else if (Type.SUBSYSTEM.equals(type)) {
+            return holderRepositories.getSubsystemRepository().readSubsystems(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        } else if (Type.DISCIPLINE.equals(type)) {
+            return holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        } else if (Type.DEVICEGROUP.equals(type)) {
+            return holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        } else if (Type.DEVICETYPE.equals(type)) {
+            return holderRepositories.getDeviceTypeRepository().readDeviceTypes(status, deleted, FieldStructure.UUID, uuid.toString()).size();
+        }
+        return 0;
+    }
+
+    /**
+     * Validate structure element data relative other data.
+     *
+     * @param structureElement structure element
+     * @param namingConvention naming convention
+     * @param holderRepositories holder repositories
+     * @param holder holder
+     * @param structureChoice structure choice
+     */
+    public static void validateStructureElementDataRelativeOtherData(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder, StructureChoice structureChoice) {
+        // check structure element data in relation to other data
+        //     create, update
+        //         parent uuid          - (if applicable) approved, latest, not deleted
+        //         mnemonic             - (if not same)   not exists
+        //         mnemonic equivalence - (if not same)   equivalence not exists
+        //     approve
+        //         uuid - pending, not latest, deleted
+        //         no or less checks if entry to be deleted                - approve (delete)
+        //         more or same checks as above if entry is not be deleted - approve (create), approve (update)
+        //         need checks as content may have changed from time of create, update, delete to time of approve
+        //     checks on mnemonic, mnemonic equivalence are to ensure can coexist, can move
+        //     possibly
+        //         additional checks if names are affected
+        //         comment not same as previous comment
+
+        if (structureElement == null || namingConvention == null || holderRepositories == null || holder == null || structureChoice == null) {
+            return;
+        }
+
+        String message = null;
+        String details = structureElement.toString();
+        String field   = TextUtil.MNEMONIC;
+
+        // validate data relative other data
+        //     create, update
+        //         entry (uuid,) status, mnemonic
+        //         entry (uuid,) status, mnemonic equivalence
+        //     approve
+        //         entry uuid, status
+
+        Type type = structureElement.getType();
+        UUID uuid = structureElement.getUuid();
+        UUID parentUuid = structureElement.getParent();
+        String mnemonic = structureElement.getMnemonic();
+
+        if (StructureChoice.CREATE.equals(structureChoice) || StructureChoice.UPDATE.equals(structureChoice)) {
+            if (Type.SYSTEMGROUP.equals(type)) {
+                // note rules for mnemonic for system group
+                if (!StringUtils.isEmpty(mnemonic)) {
+                    // status, mnemonic
+                    message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
+                    validateStructuresStatusMnemonic(uuid, type, parentUuid, mnemonic,
+                            namingConvention, holderRepositories, structureChoice, message, details, field);
+
+                    // status, mnemonic equivalence
+                    validateStructuresStatusMnemonicequivalence(uuid, type, parentUuid, mnemonic,
+                            namingConvention, holderRepositories, structureChoice, message, details, field);
+                }
+            } else if (Type.SYSTEM.equals(type)) {
+                // status, parent
+                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
+                validateStructuresParent(type, parentUuid, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, mnemonic
+                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
+                validateStructuresStatusMnemonic(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+
+                // status, mnemonic equivalence
+                validateStructuresStatusMnemonicequivalence(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+            } else if (Type.SUBSYSTEM.equals(type)) {
+                // status, parent
+                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
+                validateStructuresParent(type, parentUuid, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, mnemonic
+                message = TextUtil.SUBSYSTEM_IS_NOT_CORRECT;
+                validateStructuresStatusMnemonic(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+
+                // status, mnemonic equivalence
+                validateStructuresStatusMnemonicequivalence(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+            } else if (Type.DISCIPLINE.equals(type)) {
+                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
+
+                // status, mnemonic
+                validateStructuresStatusMnemonic(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+
+                // status, mnemonic equivalence
+                validateStructuresStatusMnemonicequivalence(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+            } else if (Type.DEVICEGROUP.equals(type)) {
+                // status, parent
+                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
+                List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, false, FieldStructure.UUID, parentUuid.toString());
+                ExceptionUtil.validateConditionDataConflictException(disciplines != null && disciplines.size() == 1, message, details, TextUtil.PARENT);
+
+                // note rules for mnemonic for device group
+
+                // mnemonic
+                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
+                ExceptionUtil.validateConditionDataConflictException(StringUtils.isEmpty(mnemonic), message, details, field);
+            } else if (Type.DEVICETYPE.equals(type)) {
+                // status, parent
+                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
+                validateStructuresParent(type, parentUuid, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, mnemonic
+                message = TextUtil.DEVICETYPE_IS_NOT_CORRECT;
+                validateStructuresStatusMnemonic(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+
+                // status, mnemonic equivalence
+                validateStructuresStatusMnemonicequivalence(uuid, type, parentUuid, mnemonic,
+                        namingConvention, holderRepositories, structureChoice, message, details, field);
+            }
+        } else if (StructureChoice.APPROVE.equals(structureChoice)) {
+            // possibly additional checks to ensure (status, mnemonic) and (status, mnemonic equivalence)
+            // however that would be duplicate checks as already checked at time of create, update
+
+            if (Type.SYSTEMGROUP.equals(type)) {
+                // status, uuid
+                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+            } else if (Type.SYSTEM.equals(type)) {
+                // status, parent
+                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(parentUuid, Type.SYSTEMGROUP, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, uuid
+                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+            } else if (Type.SUBSYSTEM.equals(type)) {
+                // status, parent
+                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(parentUuid, Type.SYSTEM, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, uuid
+                message = TextUtil.SUBSYSTEM_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+            } else if (Type.DISCIPLINE.equals(type)) {
+                // status, uuid
+                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+            } else if (Type.DEVICEGROUP.equals(type)) {
+                // status, parent
+                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(parentUuid, Type.DISCIPLINE, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, uuid
+                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+
+                // no mnemonic for device group
+                ExceptionUtil.validateConditionDataConflictException(StringUtils.isEmpty(mnemonic), message, details, field);
+            } else if (Type.DEVICETYPE.equals(type)) {
+                // status, parent
+                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(parentUuid, Type.DEVICEGROUP, Status.APPROVED, false,
+                        holderRepositories, message, details, field);
+
+                // status, uuid
+                message = TextUtil.DEVICETYPE_IS_NOT_CORRECT;
+                validateStructuresStatusSize1(uuid, type, Status.PENDING, null,
+                        holderRepositories, message, details, field);
+            }
+        }
+    }
+
+    private static void validateStructuresParent(Type type, UUID parent, Status status, Boolean deleted,
+            HolderRepositories holderRepositories, String message, String details, String field){
+        ExceptionUtil.validateConditionDataConflictException(
+                getStructuresParentSize(type, parent, status, deleted, holderRepositories) == 1, message, details, field);
+    }
+    private static void validateStructuresStatusMnemonic(UUID uuid, Type type, UUID parent, String mnemonic,
+            EssNamingConvention namingConvention, HolderRepositories holderRepositories, StructureChoice structureChoice,
+            String message, String details, String field){
+
+        // parent may be null
+        List<UUID> listUuid = null;
+
+        listUuid = getStructures(type, parent, mnemonic, Status.PENDING, false, false, namingConvention, holderRepositories);
+        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
+        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
+
+        listUuid = getStructures(type, parent, mnemonic, Status.APPROVED, false, false, namingConvention, holderRepositories);
+        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
+        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
+    }
+    private static void validateStructuresStatusMnemonicequivalence(UUID uuid, Type type, UUID parent, String mnemonic,
+            EssNamingConvention namingConvention, HolderRepositories holderRepositories, StructureChoice structureChoice,
+            String message, String details, String field){
+
+        // parent may be null
+        List<UUID> listUuid = null;
+
+        listUuid = getStructures(type, parent, mnemonic, Status.PENDING, false, true, namingConvention, holderRepositories);
+        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
+        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
+
+        listUuid = getStructures(type, parent, mnemonic, Status.APPROVED, false, true, namingConvention, holderRepositories);
+        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
+        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
+    }
+    private static int getStructuresParentSize(Type type, UUID parent, Status status, Boolean deleted,
+            HolderRepositories holderRepositories) {
+        String queryValue = parent.toString();
+        if (Type.SYSTEM.equals(type)) {
+            return holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, FieldStructure.UUID, queryValue).size();
+        } else if (Type.SUBSYSTEM.equals(type)) {
+            return holderRepositories.getSystemRepository().readSystems(status, deleted, FieldStructure.UUID, queryValue).size();
+        } else if (Type.DEVICEGROUP.equals(type)) {
+            return holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, FieldStructure.UUID, queryValue).size();
+        } else if (Type.DEVICETYPE.equals(type)) {
+            return holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, FieldStructure.UUID, queryValue).size();
+        }
+        return 0;
+    }
+    private static List<UUID> getStructures(Type type, UUID parent, String mnemonic, Status status, Boolean deleted, Boolean equivalence,
+            EssNamingConvention namingConvention, HolderRepositories holderRepositories) {
+
+        boolean hasMnemonic = !StringUtils.isEmpty(mnemonic);
+        FieldStructure mnemonicField = null;
+        String mnemonicValue = null;
+        if (hasMnemonic) {
+            mnemonicField = Boolean.TRUE.equals(equivalence)
+                    ? FieldStructure.MNEMONICEQUIVALENCE
+                    : FieldStructure.MNEMONIC;
+            mnemonicValue = Boolean.TRUE.equals(equivalence)
+                    ? namingConvention.equivalenceClassRepresentative(mnemonic)
+                    : mnemonic;
+        }
+
+        // uuid, parent, mnemonic
+        boolean queryParentTable = false;
+        FieldStructure[] queryFields = null;
+        String[] queryValues = null;
+        if (Type.SYSTEMGROUP.equals(type) || Type.DISCIPLINE.equals(type)) {
+            // no parent - query table for type
+            if (hasMnemonic) {
+                queryFields = new FieldStructure[]{mnemonicField};
+                queryValues = new String[]{mnemonicValue};
+            } else {
+                return Lists.newArrayList();
+            }
+        } else {
+            // parent
+            if (hasMnemonic) {
+                // query table for type
+                queryFields = new FieldStructure[]{FieldStructure.PARENT, mnemonicField};
+                queryValues = new String[]{parent.toString(), mnemonicValue};
+            } else {
+                // query table for parent to type
+                queryParentTable = true;
+                queryFields = new FieldStructure[]{FieldStructure.UUID};
+                queryValues = new String[]{parent.toString()};
+            }
+        }
+
+        // query table and return list with uuid
+        if (Type.SYSTEMGROUP.equals(type)) {
+            return StructureUtil.listSystemGroup2Uuid(holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, queryFields, queryValues));
+        } else if (Type.SYSTEM.equals(type)) {
+            if (queryParentTable) {
+                return StructureUtil.listSystemGroup2Uuid(holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, queryFields, queryValues));
+            } else {
+                return StructureUtil.listSystem2Uuid(holderRepositories.getSystemRepository().readSystems(status, deleted, queryFields, queryValues));
+            }
+        } else if (Type.SUBSYSTEM.equals(type)) {
+            if (queryParentTable) {
+                return StructureUtil.listSystem2Uuid(holderRepositories.getSystemRepository().readSystems(status, deleted, queryFields, queryValues));
+            } else {
+                return StructureUtil.listSubsystem2Uuid(holderRepositories.getSubsystemRepository().readSubsystems(status, deleted, queryFields, queryValues));
+            }
+        } else if (Type.DISCIPLINE.equals(type)) {
+            return StructureUtil.listDiscipline2Uuid(holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, queryFields, queryValues));
+        } else if (Type.DEVICEGROUP.equals(type)) {
+            if (queryParentTable) {
+                return StructureUtil.listDiscipline2Uuid(holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, queryFields, queryValues));
+            } else {
+                return StructureUtil.listDeviceGroup2Uuid(holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, queryFields, queryValues));            }
+        } else if (Type.DEVICETYPE.equals(type)) {
+            if (queryParentTable) {
+                return StructureUtil.listDeviceGroup2Uuid(holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, queryFields, queryValues));
+            } else {
+                return StructureUtil.listDeviceType2Uuid(holderRepositories.getDeviceTypeRepository().readDeviceTypes(status, deleted, queryFields, queryValues));
+            }
+        }
+        return Lists.newArrayList();
+    }
+
+    // ----------------------------------------------------------------------------------------------------
+
+    /**
+     * Validate structure data.
+     * This method corresponds to structure element data for create, albeit in a different way.
+     *
+     * @param type type
+     * @param mnemonicpath mnemonic path
+     * @param namingConvention naming convention
+     * @param holderIRepositories holder repositories
+     * @param holder holder
+     */
+    public static void validateStructureDataCreate(Type type, String mnemonicpath, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, HolderSystemDeviceStructure holder) {
+        if (type == null || mnemonicpath == null || namingConvention == null || holderIRepositories == null || holder == null) {
+            return;
+        }
+
+        String details = mnemonicpath;
+        String field = TextUtil.MNEMONIC_PATH;
+
+        String[] path = NamingConventionUtil.string2MnemonicPath(mnemonicpath);
+        ExceptionUtil.validateConditionDataNotValidException(path != null && path.length >= 1 && path.length <= 2,
+                TextUtil.STRUCTURE_MNEMONIC_PATH_IS_NOT_VALID, details, field);
+        String mnemonicpathEquivalence = namingConvention.equivalenceClassRepresentative(mnemonicpath);
+
+        if (Type.SYSTEMGROUP.equals(type)) {
+            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
+
+            // system group may have empty path but there will be mnemonicpath in this context
+
+            // mnemonic path
+            SystemGroup sg = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByMnemonic(path[0]);
+            validateStructuresMnemonicpathDuplicate(type, sg == null, details, field);
+
+            // mnemonic path equivalence
+            List<SystemGroup> systemGroups = holderIRepositories.getSystemGroupRepository().findLatestNotDeleted();
+            for (SystemGroup systemGroup : systemGroups) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(systemGroup.getMnemonicEquivalence(), namingConvention.equivalenceClassRepresentative(path[0])), details, field);
+            }
+        } else if (Type.SYSTEM.equals(type)) {
+            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
+
+            // path with 1 element  - system group or  system ---> check both individually
+            // check mnemonic, mnemonic equivalence
+
+            // mnemonic path system group
+            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsSystemGroup(holder, false, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
+            }
+
+            // mnemonic path equivalence system group
+            mnemonicPaths = StructureUtil.getMnemonicPathsSystemGroup(holder, true, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
+            }
+
+            // mnemonic path
+            mnemonicPaths = StructureUtil.getMnemonicPathsSystem(holder, false, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
+            }
+
+            // mnemonic path equivalence
+            mnemonicPaths = StructureUtil.getMnemonicPathsSystem(holder, true, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
+            }
+        } else if (Type.SUBSYSTEM.equals(type)) {
+            validateStructuresMnemonicpathNotValid(type, path.length == 2, details, field);
+
+            System sys = holderIRepositories.getSystemRepository().findLatestNotDeletedByMnemonic(path[0]);
+            validateStructuresMnemonicpathNotAvailable(type, sys != null, details, field);
+            SystemGroup sg = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(sys.getParentUuid().toString());
+
+            // mnemonic path
+            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(path[0], path[1]), details, field);
+            if (!StringUtils.isEmpty(sg.getMnemonic())) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(sg.getMnemonic(), path[1]), details, field);
+            }
+
+            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsSubsystem(holder, false, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
+            }
+
+            // mnemonic path equivalence
+            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(path[0]), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
+            if (!StringUtils.isEmpty(sg.getMnemonic())) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(sg.getMnemonic()), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
+            }
+
+            mnemonicPaths = StructureUtil.getMnemonicPathsSubsystem(holder, true, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);            }
+        } else if (Type.DISCIPLINE.equals(type)) {
+            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
+
+            // mnemonic path
+            Discipline di = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByMnemonic(path[0]);
+            validateStructuresMnemonicpathDuplicate(type, di == null, details, field);
+
+            // mnemonic path equivalence
+            List<Discipline> disciplines = holderIRepositories.getDisciplineRepository().findLatestNotDeleted();
+            for (Discipline discipline : disciplines) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(discipline.getMnemonicEquivalence(), namingConvention.equivalenceClassRepresentative(path[0])), details, field);
+            }
+        } else if (Type.DEVICEGROUP.equals(type)) {
+            throw ExceptionUtil.createDataNotValidException(TextUtil.DEVICEGROUP_IS_NOT_VALID, details, field);
+        } else if (Type.DEVICETYPE.equals(type)) {
+            // since device group is between discipline and device type and device group has no mnemonic,
+            //     it can not be traced to which device group that this device type belongs,
+            //     therefore it can not be known to which mnemonic line it belongs
+            //     by looking at mnemonic
+            // instead similar approach as for other Type, i.e. compare with list of mnemonic paths
+            //     rest of checks in validatecreate
+
+            validateStructuresMnemonicpathNotValid(type, path.length == 2, details, field);
+
+            // discipline
+            Discipline discipline = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByMnemonic(path[0]);
+            ExceptionUtil.validateConditionDataNotValidException(discipline != null,
+                    TextUtil.DISCIPLINE_IS_NOT_VALID, details, field);
+
+            // mnemonic path
+            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(path[0], path[1]), details, field);
+
+            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsDeviceType(holder, false, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
+            }
+
+            // mnemonic path equivalence
+            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(path[0]), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
+
+            mnemonicPaths = StructureUtil.getMnemonicPathsDeviceType(holder, true, namingConvention);
+            for (String existingPath : mnemonicPaths) {
+                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
+            }
+        }
+    }
+
+    private static void validateStructuresMnemonicpathNotAvailable(Type type, boolean condition, String details, String field) {
+        ExceptionUtil.validateConditionDataNotValidException(condition,
+                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_IS_NOT_AVAILABLE, details, field);
+    }
+    private static void validateStructuresMnemonicpathNotValid(Type type, boolean condition, String details, String field) {
+        ExceptionUtil.validateConditionDataNotValidException(condition,
+                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_IS_NOT_VALID, details, field);
+    }
+    private static void validateStructuresMnemonicpathDuplicate(Type type, boolean condition, String details, String field) {
+        ExceptionUtil.validateConditionDataConflictException(condition,
+                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_HAS_DUPLICATE, details, field);
+    }
+    private static void validateStructuresMnemonicpathequivalenceDuplicate(Type type, boolean condition, String details, String field) {
+        ExceptionUtil.validateConditionDataConflictException(condition,
+                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_EQUIVALENCE_HAS_DUPLICATE, details, field);
+    }
+
+    // ----------------------------------------------------------------------------------------------------
+
+    /**
+     * Validate condition if precondition is fulfilled and throw data conflict exception with reason if validation fails.
+     *
+     * @param precondition precondition
+     * @param condition condition
+     * @param message message
+     * @param details details
+     * @param field field
+     *
+     * @see DataConflictException
+     */
+    private static void validateConditionIfPrecondition(boolean precondition, boolean condition, String message, String details, String field) {
+        if (precondition) {
+            ExceptionUtil.validateConditionDataConflictException(condition, message, details, field);
+        }
+    }
+
+    /**
+     * Validate condition if precondition (StructureChoice) is fulfilled and throw data conflict exception with reason if validation fails.
+     *
+     * @param expected expected structure choice
+     * @param actual actual structure choice
+     * @param condition condition
+     * @param message message
+     * @param details details
+     * @param field field
+     *
+     * @see DataConflictException
+     */
+    private static void validateConditionIfStructureChoice(StructureChoice expected, StructureChoice actual, boolean condition, String message, String details, String field) {
+        validateConditionIfPrecondition(expected != null && expected.equals(actual), condition, message, details, field);
+    }
+
+}
diff --git a/src/main/java/org/openepics/names/util/ValidateUtil.java b/src/main/java/org/openepics/names/util/ValidateUtil.java
index 70d11e3913e89f74f2c6c3c8811734aec4a4d32d..71c7f7b71c67bde90a2ecef9ac34ed5397d0c428 100644
--- a/src/main/java/org/openepics/names/util/ValidateUtil.java
+++ b/src/main/java/org/openepics/names/util/ValidateUtil.java
@@ -18,26 +18,11 @@
 
 package org.openepics.names.util;
 
-import java.util.List;
 import java.util.UUID;
 
 import org.apache.commons.lang3.StringUtils;
-import org.openepics.names.repository.NameRepository;
-import org.openepics.names.repository.model.DeviceType;
-import org.openepics.names.repository.model.Discipline;
-import org.openepics.names.repository.model.Name;
-import org.openepics.names.repository.model.Subsystem;
-import org.openepics.names.repository.model.System;
-import org.openepics.names.repository.model.SystemGroup;
-import org.openepics.names.rest.beans.FieldName;
-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.NameElementCommand;
-import org.openepics.names.rest.beans.element.StructureElementCommand;
-import org.openepics.names.service.exception.DataConflictException;
-
-import com.google.common.collect.Lists;
 
 /**
  * Utility class to assist in handling of validation.
@@ -46,33 +31,6 @@ import com.google.common.collect.Lists;
  */
 public class ValidateUtil {
 
-    // note
-    //     handling of system structure, device structure
-    //         parent system structure uuid (system group, system, subsystem)
-    //         parent device structure uuid (device type)
-    //
-    //     NameElement
-    //         uuid,
-    //         systemgroup, system, subsystem, devicetype, systemstructure, devicestructure,
-    //         index, name,
-    //         description, status, latest, deleted, when, who, comment
-    //     StructureElement
-    //         type, uuid, parent uuid,
-    //         name, mnemonic, mnemonic path, level,
-    //         description, status, latest, deleted, when, who, comment
-    //
-    //     NameElementCommand
-    //	       create -       parentsystemstructure, parentdevicestructure (optional), index, description, comment
-    //	       update - uuid, parentsystemstructure, parentdevicestructure (optional), index, description, comment
-    //	       delete - uuid,                                                                              comment
-    //     StructureElementCommand
-    //	       create -       type, parent, name, mnemonic, description, comment
-    //	       update - uuid, type, parent, name, mnemonic, description, comment
-    //	       delete - uuid, type                                       comment
-
-    private enum NameChoice      {CREATE, UPDATE, DELETE}
-    private enum StructureChoice {CREATE, UPDATE, DELETE, APPROVE, REJECT, CANCEL}
-
     /**
      * This class is not to be instantiated.
      */
@@ -217,1216 +175,4 @@ public class ValidateUtil {
         }
     }
 
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate parameters for read names.
-     *
-     * @param deleted deleted
-     * @param queryFields query fields
-     * @param queryValues query values
-     * @param includeHistory include history
-     * @param orderBy order by
-     * @param isAsc is ascending
-     * @param offset offset
-     * @param limit limit
-     */
-    public static void validateNamesInputRead(
-            Boolean deleted, FieldName[] queryFields, String[] queryValues,
-            Boolean includeHistory,
-            FieldName orderBy, Boolean isAsc,
-            Integer offset, Integer limit) {
-
-        // validate input
-        //     queryFields and queryValues
-        //         either
-        //             both null
-        //             both non-null, same length, non-empty
-        //         uuid
-
-        boolean condition = ((queryFields == null && queryValues == null)
-                || (queryFields != null && queryValues != null && queryFields.length == queryValues.length && queryFields.length > 0));
-        ExceptionUtil.validateConditionInputNotCorrectException(condition,
-                TextUtil.VALUES_ARE_NOT_CORRECT, "url and parameters (queryFields, queryValues) have different lengths or are empty", null);
-
-        if (queryFields != null) {
-            for (int i=0; i<queryFields.length; i++) {
-                if (FieldName.UUID.equals(queryFields[i])) {
-                    ValidateUtil.validateInputUuid(queryValues[i]);
-                }
-            }
-        }
-    }
-
-    /**
-     * Validate name element parameters (input) for create.
-     *
-     * @param nameElement name element
-     */
-    public static void validateNameElementInputCreate(NameElementCommand nameElement) {
-        validateNameElementInput(nameElement, NameChoice.CREATE);
-    }
-
-    /**
-     * Validate name element parameters (input) for update.
-     *
-     * @param nameElement name element
-     */
-    public static void validateNameElementInputUpdate(NameElementCommand nameElement) {
-        validateNameElementInput(nameElement, NameChoice.UPDATE);
-    }
-
-    /**
-     * Validate name element parameters (input) for delete.
-     *
-     * @param nameElement name element
-     */
-    public static void validateNameElementInputDelete(NameElementCommand nameElement) {
-        validateNameElementInput(nameElement, NameChoice.DELETE);
-    }
-
-    /**
-     * Validate name element parameters (input).
-     *
-     * @param nameElement name element
-     * @param nameChoice name choice
-     */
-    private static void validateNameElementInput(NameElementCommand nameElement, NameChoice nameChoice) {
-        // attributes
-        //     uuid                            - required if not create, required empty if create
-        //     parentsystemstructure (uuid)
-        //     parentdevicestructure (uuid)
-        //     index
-        //     description
-        //     comment
-
-        if (nameElement == null || nameChoice == null) {
-            return;
-        }
-
-        if (NameChoice.CREATE.equals(nameChoice)) {
-            ExceptionUtil.validateConditionInputNotEmptyException(nameElement.getUuid() == null,
-                    TextUtil.VALUE_IS_NOT_EMPTY,
-                    nameElement.getUuid() != null ? nameElement.getUuid().toString() : null,
-                    TextUtil.UUID);
-        } else {
-            validateInputUuid(nameElement.getUuid() != null ? nameElement.getUuid().toString() : null);
-        }
-
-        if (!NameChoice.DELETE.equals(nameChoice)) {
-            ExceptionUtil.validateConditionInputNotAvailableException(nameElement.getParentsystemstructure() != null,
-                    TextUtil.VALUE_IS_NOT_AVAILABLE, nameElement.toString(), TextUtil.PARENTSYSTEMSTRUCTURE);
-
-            // optional (either none or both)
-            //     parentdevicestructure
-            // 	   index
-            if (nameElement.getParentdevicestructure() != null && nameElement.getIndex() == null) {
-                throw ExceptionUtil.createInputNotCorrectException(null, nameElement.toString(), TextUtil.INDEX);
-            } else if (nameElement.getParentdevicestructure() == null && nameElement.getIndex() != null) {
-                throw ExceptionUtil.createInputNotCorrectException(null, nameElement.toString(), TextUtil.PARENTDEVICESTRUCTURE);
-            }
-
-            validateInputDescription(nameElement.getDescription());
-        }
-
-        validateInputComment(nameElement.getComment());
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate name element data for create.
-     *
-     * @param nameElement name element
-     * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param nameRepository name repository
-     * @param holder holder
-     */
-    public static void validateNameElementDataCreate(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
-        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.CREATE);
-    }
-
-    /**
-     * Validate name element data for update.
-     *
-     * @param nameElement name element
-     * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param nameRepository name repositories
-     * @param holder holder
-     */
-    public static void validateNameElementDataUpdate(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
-        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.UPDATE);
-    }
-
-    /**
-     * Validate name element data for delete.
-     *
-     * @param nameElement name element
-     * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param nameRepository name repositories
-     * @param holder holder
-     */
-    public static void validateNameElementDataDelete(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
-        validateNameElementData(nameElement, namingConvention, holderIRepositories, nameRepository, holder, NameChoice.DELETE);
-    }
-
-    /**
-     * Validate name element data.
-     *
-     * @param nameElement name element
-     * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param nameRepository name repository
-     * @param holder holder
-     * @param nameChoice name choice
-     */
-    private static void validateNameElementData(NameElementCommand nameElement, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder, NameChoice nameChoice) {
-        // attributes
-        //     uuid
-        //     parentsystemstructure
-        //     parentdevicestructure
-        //     index
-        //     description
-        //     comment
-        //
-        // name
-        //      - system structure uuid
-        //    ( - system structure uuid, device structure uuid )
-        //      - system structure uuid, device structure uuid, index
-
-        if (nameElement == null || namingConvention == null || holderIRepositories == null || nameRepository == null || holder == null || nameChoice == null) {
-            return;
-        }
-
-        String details = nameElement.toString();
-
-        // name
-        //     update, delete - uuid available, not deleted
-        //     retrieve for uuid and check
-        if (NameChoice.UPDATE.equals(nameChoice) || NameChoice.DELETE.equals(nameChoice)) {
-            List<Name> names = nameRepository.readNames(false, FieldName.UUID, nameElement.getUuid().toString());
-            ExceptionUtil.validateConditionDataNotCorrectException(names != null && names.size() == 1,
-                    TextUtil.VALUE_IS_NOT_CORRECT, details, TextUtil.UUID);
-        }
-
-        SystemGroup systemGroup = null;
-        System      system      = null;
-        Subsystem   subsystem   = null;
-        DeviceType  deviceType  = null;
-
-        int countDevicestructureIndex = 0;
-        String derivedName = null;
-
-        boolean condition = true;
-
-        if (NameChoice.CREATE.equals(nameChoice) || NameChoice.UPDATE.equals(nameChoice)) {
-            // systemgroup, system, subsystem - in repository
-            //     found
-            //     not deleted
-            // devicetype                     - possibly, in repository
-            //     found
-            //     not deleted
-            // name                           - naming convention rules
-            //     derive name from system structure, device structure, index
-            // index                          - possibly, naming convention rules
-            //     valid
-            // name
-            //     name not exists
-            //     name equivalence not exists
-
-            // find out system group, system, subsystem
-            //     one of the three expected to be non-null, other two expected to be null
-            systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-
-            // device structure
-            if (nameElement.getParentdevicestructure() != null) {
-                countDevicestructureIndex++;
-                deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
-                ExceptionUtil.validateConditionDataNotAvailableException(deviceType != null, TextUtil.DATA_IS_NOT_AVAILABLE, details, TextUtil.PARENTDEVICESTRUCTURE);
-                ExceptionUtil.validateConditionDataDeletedException(!deviceType.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTDEVICESTRUCTURE);
-            }
-
-            // system structure
-            if (systemGroup != null) {
-                ExceptionUtil.validateConditionDataDeletedException(!systemGroup.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-                derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder);
-            } else if (system != null) {
-                ExceptionUtil.validateConditionDataDeletedException(!system.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-                derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder);
-            } else if (subsystem != null) {
-                ExceptionUtil.validateConditionDataDeletedException(!subsystem.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-                derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder);
-            } else {
-                throw ExceptionUtil.createDataNotCorrectException(TextUtil.DATA_IS_NOT_CORRECT, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-            }
-
-            // index
-            if (!StringUtils.isEmpty(nameElement.getIndex())) {
-                countDevicestructureIndex++;
-                // TODO overrideRuleset depend on user authority
-                condition = namingConvention.isInstanceIndexValid(derivedName, false);
-                ExceptionUtil.validateConditionDataNotValidException(condition, TextUtil.DATA_IS_NOT_VALID, details, TextUtil.INDEX);
-            }
-
-            condition = countDevicestructureIndex == 0 || countDevicestructureIndex == 2;
-            ExceptionUtil.validateConditionDataNotAvailableException(condition, TextUtil.DEVICETYPE_OR_INDEX_IS_NOT_AVAILABLE, details, TextUtil.PARENTDEVICESTRUCTURE);
-
-            // name
-            //     ok with same name, name equivalence if same uuid
-            List<Name> names = nameRepository.readNames(false, FieldName.NAME, derivedName);
-            if (NameChoice.CREATE.equals(nameChoice)) {
-                condition = names == null || names.isEmpty();
-            } else {
-                // NameChoice.UPDATE.equals(nameChoice)
-                condition = names == null || names.isEmpty() || names.size() == 1 && names.get(0).getUuid().equals(nameElement.getUuid());
-            }
-            ExceptionUtil.validateConditionDataExistException(condition, TextUtil.CONVENTION_NAME_EXISTS, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-
-            names = nameRepository.readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(derivedName));
-            if (NameChoice.CREATE.equals(nameChoice)) {
-                condition = names == null || names.isEmpty();
-            } else {
-                // NameChoice.UPDATE.equals(nameChoice)
-                condition = names == null || names.isEmpty() || names.size() == 1 && names.get(0).getUuid().equals(nameElement.getUuid());
-            }
-            ExceptionUtil.validateConditionDataExistException(condition, TextUtil.CONVENTION_NAME_EQUIVALENCE_EXISTS, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-        } else if (NameChoice.DELETE.equals(nameChoice)) {
-            // n.a.
-            //     uuid    - already handled
-            //     comment - already handled
-        }
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate name data.
-     * This method corresponds to name element data for create, albeit in a different way.
-     *
-     * @param name name
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     *
-     * @see ValidateUtil#validateNameDataCreate(NameElement, EssNamingConvention, HolderIRepositories, NameRepository, HolderSystemDeviceStructure)
-     */
-    public static void validateNameDataCreate(String name, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        if (name == null || namingConvention == null || holderRepositories == null || holder == null) {
-            return;
-        }
-
-        String details = name;
-        String field = TextUtil.NAME;
-
-        // find out system group, system, subsystem       + check if valid
-        // find out discipline, device group, device type + check if valid
-        // find out instance index                        + check if valid
-        // check name equivalence
-
-        String sg  = NamingConventionUtil.extractSystemGroup(name);
-        String sys = NamingConventionUtil.extractSystem(name);
-        String sub = NamingConventionUtil.extractSubsystem(name);
-        String dt  = NamingConventionUtil.extractDeviceType(name);
-        String idx = NamingConventionUtil.extractInstanceIndex(name);
-
-        String mnemonicPathSystemstructure = NamingConventionUtil.extractMnemonicPathSystemStructure(name);
-        String mnemonicPathDevicestructure = NamingConventionUtil.extractMnemonicPathDeviceStructure(name);
-
-        int count = 0;
-        int countSgSys = 0;
-        int countSgSub = 0;
-        if (sg != null) {
-            count++;
-            countSgSys++;
-            countSgSub++;
-        }
-        if (sys != null) {
-            count++;
-            countSgSys++;
-        }
-        if (sub != null) {
-            count++;
-            countSgSub++;
-        }
-
-        // one or two system structure mnemonics + not system group and system + not system group and subsystem
-        if (count < 1 || count > 2 || countSgSys == 2 || countSgSub == 2) {
-            throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
-        }
-
-        SystemGroup systemGroup = null;
-        System system           = null;
-        Subsystem subsystem     = null;
-        DeviceType deviceType   = null;
-
-        String derivedName = null;
-
-        // ensure that system structure parents and device structure parents are available, latest and not deleted
-        //     if device type
-        //     if system group
-        //     else
-        //         if system
-        //         else
-        //             (if not system then error)
-        //         if subsystem
-
-        // device structure
-        if (!StringUtils.isEmpty(dt)) {
-            List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathDevicestructure);
-            ExceptionUtil.validateConditionDataNotAvailableException(deviceTypes != null && deviceTypes.size() == 1, TextUtil.DEVICETYPE_IS_NOT_AVAILABLE, details, field);
-            deviceType = deviceTypes.get(0);
-        }
-
-        // system structure
-        List<Subsystem>   subsystems   = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
-        List<System>      systems      = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
-        List<SystemGroup> systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
-
-        if (subsystems != null && subsystems.size() == 1) {
-            subsystem = subsystems.get(0);
-            derivedName = NameUtil.getName(subsystem, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-        } else if (systems != null && systems.size() == 1) {
-            system = systems.get(0);
-            derivedName = NameUtil.getName(system, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-        } else if (systemGroups != null && systemGroups.size() == 1) {
-            systemGroup = systemGroups.get(0);
-            derivedName = NameUtil.getName(systemGroup, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-        } else  {
-            throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
-        }
-
-        // index
-        if (!StringUtils.isEmpty(idx)) {
-            // TODO overrideRuleset depend on user authority
-            ExceptionUtil.validateConditionDataNotValidException(namingConvention.isInstanceIndexValid(name, false), TextUtil.INDEX_IS_NOT_VALID, details, field);
-        }
-
-        // name
-        //     name corresponds to derived name
-        //     convention name not exists
-        //     convention name equivalence not exists
-        ExceptionUtil.validateConditionDataNotCorrectException(StringUtils.equals(name, derivedName), TextUtil.CONVENTION_NAME_IS_NOT_CORRECT, details, field);
-
-        List<Name> names = holderRepositories.getNameRepository().readNames(false, FieldName.NAME, name);
-        ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EXISTS, details, field);
-
-        names = holderRepositories.getNameRepository().readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(name));
-        ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EQUIVALENCE_EXISTS, details, field);
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate parameters for read structures.
-     *
-     * @param type type
-     * @param statuses statuses
-     * @param deleted deleted
-     * @param queryFields query fields
-     * @param queryValues query values
-     * @param includeHistory include history
-     * @param orderBy order by
-     * @param isAsc is ascending
-     * @param offset offset
-     * @param limit limit
-     */
-    public static void validateStructuresInputRead(
-            Type type, Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues,
-            Boolean includeHistory,
-            FieldStructure orderBy, Boolean isAsc,
-            Integer offset, Integer limit) {
-
-        // validate input
-        //     type
-        //     queryFields and queryValues
-        //         either
-        //             both null
-        //             both non-null, same length, non-empty
-        //         uuid
-
-        ValidateUtil.validateInputType(type);
-        boolean condition = ((queryFields == null && queryValues == null)
-                || (queryFields != null && queryValues != null && queryFields.length == queryValues.length && queryFields.length > 0));
-        ExceptionUtil.validateConditionInputNotCorrectException(condition,
-                TextUtil.VALUES_ARE_NOT_CORRECT, "url and parameters (queryFields, queryValues) have different lengths or are empty", null);
-
-        if (queryFields != null) {
-            for (int i=0; i<queryFields.length; i++) {
-                if (FieldStructure.UUID.equals(queryFields[i])) {
-                    ValidateUtil.validateInputUuid(queryValues[i]);
-                }
-            }
-
-        }
-    }
-
-    /**
-     * Validate structure element parameters (input) for create.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputCreate(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.CREATE);
-    }
-
-    /**
-     * Validate structure element parameters (input) for update.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputUpdate(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.UPDATE);
-    }
-
-    /**
-     * Validate structure element parameters (input) for delete.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputDelete(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.DELETE);
-    }
-
-    /**
-     * Validate structure element parameters (input) for approve.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputApprove(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.APPROVE);
-    }
-
-    /**
-     * Validate structure element parameters (input) for cancel.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputCancel(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.CANCEL);
-    }
-
-    /**
-     * Validate structure element parameters (input) for reject.
-     *
-     * @param structureElement structure element
-     */
-    public static void validateStructureElementInputReject(StructureElementCommand structureElement, EssNamingConvention namingConvention) {
-        validateStructureElementInput(structureElement, namingConvention, StructureChoice.REJECT);
-    }
-
-    /**
-     * Validate structure element parameters (input).
-     *
-     * @param structureElement structure element
-     * @param structureChoice structure choice
-     */
-    private static void validateStructureElementInput(StructureElementCommand structureElement, EssNamingConvention namingConvention, StructureChoice structureChoice) {
-        // check structure element input
-        //     uuid             - required if not create, required empty if create
-        //     type             - required
-        //     parent (uuid)    - also validate data, parent uuid available if type is system, subsystem, device group, device type
-        //     name             - required
-        //     mnemonic         - required except for device group
-        //     description      - required
-        //     comment          - required
-
-        if (structureElement == null || structureChoice == null) {
-            return;
-        }
-
-        if (StructureChoice.CREATE.equals(structureChoice)) {
-            ExceptionUtil.validateConditionInputNotEmptyException(structureElement.getUuid() == null,
-                    TextUtil.VALUE_IS_NOT_EMPTY,
-                    structureElement.getUuid() != null ? structureElement.getUuid().toString() : null,
-                    TextUtil.UUID);
-        } else {
-            validateInputUuid(structureElement.getUuid() != null ? structureElement.getUuid().toString() : null);
-        }
-
-        validateInputType(structureElement.getType());
-
-        if (!StructureChoice.DELETE.equals(structureChoice)) {
-            if (Type.SYSTEM.equals(structureElement.getType())
-                    || Type.SUBSYSTEM.equals(structureElement.getType())
-                    || Type.DEVICEGROUP.equals(structureElement.getType())
-                    || Type.DEVICETYPE.equals(structureElement.getType())) {
-                ExceptionUtil.validateConditionInputNotAvailableException(structureElement.getParent() != null,
-                        TextUtil.PARENT_IS_NOT_AVAILABLE, structureElement.toString(), TextUtil.PARENT);
-                ValidateUtil.validateInputUuid(structureElement.getParent().toString());
-            }
-
-            validateInputName(structureElement.getName());
-
-            // validate mnemonic
-            //     validate mnemonic input (value itself, not in relation to other values)
-            //     validateMnemonic takes isMnemonicRequired into account
-            MnemonicValidation mnemonicValidation = namingConvention.validateMnemonic(structureElement.getType(), structureElement.getMnemonic());
-            ExceptionUtil.validateConditionInputNotValidException(MnemonicValidation.VALID.equals(mnemonicValidation),
-                    TextUtil.MNEMONIC_IS_NOT_VALID, structureElement.toString(), TextUtil.MNEMONIC);
-
-            validateInputDescription(structureElement.getDescription());
-        }
-
-        validateInputComment(structureElement.getComment());
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate structure element data for create.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataCreate(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CREATE);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CREATE);
-    }
-
-    /**
-     * Validate structure element data for update.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataUpdate(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.UPDATE);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.UPDATE);
-    }
-
-    /**
-     * Validate structure element data for delete.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataDelete(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.DELETE);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.DELETE);
-    }
-
-    /**
-     * Validate structure element data for approve.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataApprove(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.APPROVE);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.APPROVE);
-    }
-
-    /**
-     * Validate structure element data for cancel.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataCancel(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CANCEL);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.CANCEL);
-    }
-
-    /**
-     * Validate structure element data for reject.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureElementDataReject(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
-        validateStructureElementDataInItself(structureElement, namingConvention, holderRepositories, holder, StructureChoice.REJECT);
-        validateStructureElementDataRelativeOtherData(structureElement, namingConvention, holderRepositories, holder, StructureChoice.REJECT);
-    }
-
-    /**
-     * Validate structure element data in itself.
-     *
-     * @param structureElement
-     * @param namingConvention
-     * @param holderRepositories
-     * @param holder
-     * @param structureChoice
-     */
-    public static void validateStructureElementDataInItself(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder, StructureChoice structureChoice) {
-        // check structure element data in itself
-        //     update, delete
-        //         definitely (not possibly)
-        //             no pending entry waiting to be approved, cancelled, rejected (pending with higher id than currently approved)
-        //         uuid - approved, latest, not deleted - list size 1
-        //     approve, reject, cancel
-        //         uuid - pending, latest, not deleted  - list size 1
-
-        if (structureElement == null || namingConvention == null || holderRepositories == null || holder == null || structureChoice == null) {
-            return;
-        }
-
-        String message = structureElement.getType().toString().toLowerCase() + TextUtil.SPACE + TextUtil.IS_NOT_CORRECT;
-        String details = structureElement.toString();
-        String field   = TextUtil.UUID;
-
-        // validate data in itself
-        //     systemgroup, discipline
-        //         not have parent
-        //     update, delete
-        //         entry not pending
-        //         entry approved and not deleted
-        //     approve, cancel, reject
-        //         entry pending
-
-        if ((Type.SYSTEMGROUP.equals(structureElement.getType()) || Type.DISCIPLINE.equals(structureElement.getType()))
-                && structureElement.getParent() != null) {
-            throw ExceptionUtil.createDataNotCorrectException(TextUtil.PARENT_IS_NOT_CORRECT, details, field);
-        } else if (StructureChoice.UPDATE.equals(structureChoice) || StructureChoice.DELETE.equals(structureChoice)) {
-            ValidateUtil.validateStructuresStatusSize0(
-                    structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                    holderRepositories, message, details, field);
-
-            ValidateUtil.validateStructuresStatusSize1(
-                    structureElement.getUuid(), structureElement.getType(), Status.APPROVED, Boolean.FALSE,
-                    holderRepositories, message, details, field);
-        } else if (StructureChoice.APPROVE.equals(structureChoice) || StructureChoice.CANCEL.equals(structureChoice) || StructureChoice.REJECT.equals(structureChoice)) {
-            ValidateUtil.validateStructuresStatusSize1(
-                    structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                    holderRepositories, message, details, field);
-        }
-    }
-
-    private static void validateStructuresStatusSize0(UUID uuid, Type type, Status status, Boolean deleted,
-            HolderRepositories holderRepositories, String message, String details, String field) {
-        ExceptionUtil.validateConditionDataNotCorrectException(
-                getStructuresSize(uuid, type, status, deleted, holderRepositories) == 0, message, details, field);
-    }
-    private static void validateStructuresStatusSize1(UUID uuid, Type type, Status status, Boolean deleted,
-            HolderRepositories holderRepositories, String message, String details, String field) {
-        ExceptionUtil.validateConditionDataNotCorrectException(
-                getStructuresSize(uuid, type, status, deleted, holderRepositories) == 1, message, details, field);
-    }
-    private static int getStructuresSize(UUID uuid, Type type, Status status, Boolean deleted,
-            HolderRepositories holderRepositories) {
-        if (Type.SYSTEMGROUP.equals(type)) {
-            return holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        } else if (Type.SYSTEM.equals(type)) {
-            return holderRepositories.getSystemRepository().readSystems(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        } else if (Type.SUBSYSTEM.equals(type)) {
-            return holderRepositories.getSubsystemRepository().readSubsystems(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        } else if (Type.DISCIPLINE.equals(type)) {
-            return holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        } else if (Type.DEVICEGROUP.equals(type)) {
-            return holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        } else if (Type.DEVICETYPE.equals(type)) {
-            return holderRepositories.getDeviceTypeRepository().readDeviceTypes(status, deleted, FieldStructure.UUID, uuid.toString()).size();
-        }
-        return 0;
-    }
-
-    /**
-     * Validate structure element data relative other data.
-     *
-     * @param structureElement structure element
-     * @param namingConvention naming convention
-     * @param holderRepositories holder repositories
-     * @param holder holder
-     * @param structureChoice structure choice
-     */
-    public static void validateStructureElementDataRelativeOtherData(StructureElementCommand structureElement, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder, StructureChoice structureChoice) {
-        // check structure element data in relation to other data
-        //     create, update
-        //         parent uuid          - (if applicable) approved, latest, not deleted
-        //         mnemonic             - (if not same)   not exists
-        //         mnemonic equivalence - (if not same)   equivalence not exists
-        //     approve
-        //         uuid - pending, not latest, deleted
-        //         no or less checks if entry to be deleted                - approve (delete)
-        //         more or same checks as above if entry is not be deleted - approve (create), approve (update)
-        //         need checks as content may have changed from time of create, update, delete to time of approve
-        //     checks on mnemonic, mnemonic equivalence are to ensure can coexist, can move
-        //     possibly
-        //         additional checks if names are affected
-        //         comment not same as previous comment
-
-        if (structureElement == null || namingConvention == null || holderRepositories == null || holder == null || structureChoice == null) {
-            return;
-        }
-
-        String message = null;
-        String details = structureElement.toString();
-        String field   = TextUtil.MNEMONIC;
-
-        // validate data relative other data
-        //     create, update
-        //         entry (uuid,) status, mnemonic
-        //         entry (uuid,) status, mnemonic equivalence
-        //     approve
-        //         entry uuid, status
-
-        if (StructureChoice.CREATE.equals(structureChoice) || StructureChoice.UPDATE.equals(structureChoice)) {
-            if (Type.SYSTEMGROUP.equals(structureElement.getType())) {
-                // note rules for mnemonic for system group
-                if (!StringUtils.isEmpty(structureElement.getMnemonic())) {
-                    // status, mnemonic
-                    message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
-                    validateStructuresStatusMnemonic(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                            namingConvention, holderRepositories, structureChoice, message, details, field);
-
-                    // status, mnemonic equivalence
-                    validateStructuresStatusMnemonicequivalence(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                            namingConvention, holderRepositories, structureChoice, message, details, field);
-                }
-            } else if (Type.SYSTEM.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
-                validateStructuresParent(structureElement.getType(), structureElement.getParent(), Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, mnemonic
-                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
-                validateStructuresStatusMnemonic(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-
-                // status, mnemonic equivalence
-                validateStructuresStatusMnemonicequivalence(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-            } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
-                validateStructuresParent(structureElement.getType(), structureElement.getParent(), Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, mnemonic
-                message = TextUtil.SUBSYSTEM_IS_NOT_CORRECT;
-                validateStructuresStatusMnemonic(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-
-                // status, mnemonic equivalence
-                validateStructuresStatusMnemonicequivalence(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-            } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
-                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
-
-                // status, mnemonic
-                validateStructuresStatusMnemonic(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-
-                // status, mnemonic equivalence
-                validateStructuresStatusMnemonicequivalence(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-            } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
-                List<Discipline> disciplines = holderRepositories.getDisciplineRepository().readDisciplines(Status.APPROVED, false, FieldStructure.UUID, structureElement.getParent().toString());
-                ExceptionUtil.validateConditionDataConflictException(disciplines != null && disciplines.size() == 1, message, details, TextUtil.PARENT);
-
-                // note rules for mnemonic for device group
-
-                // mnemonic
-                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
-                ExceptionUtil.validateConditionDataConflictException(StringUtils.isEmpty(structureElement.getMnemonic()), message, details, field);
-            } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
-                validateStructuresParent(structureElement.getType(), structureElement.getParent(), Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, mnemonic
-                message = TextUtil.DEVICETYPE_IS_NOT_CORRECT;
-                validateStructuresStatusMnemonic(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-
-                // status, mnemonic equivalence
-                validateStructuresStatusMnemonicequivalence(structureElement.getUuid(), structureElement.getType(), structureElement.getParent(), structureElement.getMnemonic(),
-                        namingConvention, holderRepositories, structureChoice, message, details, field);
-            }
-        } else if (StructureChoice.APPROVE.equals(structureChoice)) {
-            // possibly additional checks to ensure (status, mnemonic) and (status, mnemonic equivalence)
-            // however that would be duplicate checks as already checked at time of create, update
-
-            if (Type.SYSTEMGROUP.equals(structureElement.getType())) {
-                // status, uuid
-                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-            } else if (Type.SYSTEM.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.SYSTEMGROUP_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getParent(), Type.SYSTEMGROUP, Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, uuid
-                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-            } else if (Type.SUBSYSTEM.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.SYSTEM_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getParent(), Type.SYSTEM, Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, uuid
-                message = TextUtil.SUBSYSTEM_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-            } else if (Type.DISCIPLINE.equals(structureElement.getType())) {
-                // status, uuid
-                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-            } else if (Type.DEVICEGROUP.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getParent(), Type.DISCIPLINE, Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, uuid
-                message = TextUtil.DEVICEGROUP_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-
-                // no mnemonic for device group
-                ExceptionUtil.validateConditionDataConflictException(StringUtils.isEmpty(structureElement.getMnemonic()), message, details, field);
-            } else if (Type.DEVICETYPE.equals(structureElement.getType())) {
-                // status, parent
-                message = TextUtil.DISCIPLINE_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getParent(), Type.DEVICEGROUP, Status.APPROVED, false,
-                        holderRepositories, message, details, field);
-
-                // status, uuid
-                message = TextUtil.DEVICETYPE_IS_NOT_CORRECT;
-                validateStructuresStatusSize1(structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
-                        holderRepositories, message, details, field);
-            }
-        }
-    }
-
-    private static void validateStructuresParent(Type type, UUID parent, Status status, Boolean deleted,
-            HolderRepositories holderRepositories, String message, String details, String field){
-        ExceptionUtil.validateConditionDataConflictException(
-                getStructuresParentSize(type, parent, status, deleted, holderRepositories) == 1, message, details, field);
-    }
-    private static void validateStructuresStatusMnemonic(UUID uuid, Type type, UUID parent, String mnemonic,
-            EssNamingConvention namingConvention, HolderRepositories holderRepositories, StructureChoice structureChoice,
-            String message, String details, String field){
-
-        // parent may be null
-        List<UUID> listUuid = null;
-
-        listUuid = getStructures(type, parent, mnemonic, Status.PENDING, false, false, namingConvention, holderRepositories);
-        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
-        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
-
-        listUuid = getStructures(type, parent, mnemonic, Status.APPROVED, false, false, namingConvention, holderRepositories);
-        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
-        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
-    }
-    private static void validateStructuresStatusMnemonicequivalence(UUID uuid, Type type, UUID parent, String mnemonic,
-            EssNamingConvention namingConvention, HolderRepositories holderRepositories, StructureChoice structureChoice,
-            String message, String details, String field){
-
-        // parent may be null
-        List<UUID> listUuid = null;
-
-        listUuid = getStructures(type, parent, mnemonic, Status.PENDING, false, true, namingConvention, holderRepositories);
-        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
-        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
-
-        listUuid = getStructures(type, parent, mnemonic, Status.APPROVED, false, true, namingConvention, holderRepositories);
-        validateConditionIfStructureChoice(StructureChoice.CREATE, structureChoice, listUuid.isEmpty(), message, details, field);
-        validateConditionIfStructureChoice(StructureChoice.UPDATE, structureChoice, listUuid.isEmpty() || listUuid.size() == 1 && listUuid.get(0).equals(uuid), message, details, field);
-    }
-    private static int getStructuresParentSize(Type type, UUID parent, Status status, Boolean deleted,
-            HolderRepositories holderRepositories) {
-        if (Type.SYSTEM.equals(type)) {
-            return holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, FieldStructure.UUID, parent.toString()).size();
-        } else if (Type.SUBSYSTEM.equals(type)) {
-            return holderRepositories.getSystemRepository().readSystems(status, deleted, FieldStructure.UUID, parent.toString()).size();
-        } else if (Type.DEVICEGROUP.equals(type)) {
-            return holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, FieldStructure.UUID, parent.toString()).size();
-        } else if (Type.DEVICETYPE.equals(type)) {
-            return holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, FieldStructure.UUID, parent.toString()).size();
-        }
-        return 0;
-    }
-    private static List<UUID> getStructures(Type type, UUID parent, String mnemonic, Status status, Boolean deleted, Boolean equivalence,
-            EssNamingConvention namingConvention, HolderRepositories holderRepositories) {
-
-        boolean hasMnemonic = !StringUtils.isEmpty(mnemonic);
-        FieldStructure mnemonicField = null;
-        String mnemonicValue = null;
-        if (hasMnemonic) {
-            mnemonicField = Boolean.TRUE.equals(equivalence)
-                    ? FieldStructure.MNEMONICEQUIVALENCE
-                    : FieldStructure.MNEMONIC;
-            mnemonicValue = Boolean.TRUE.equals(equivalence)
-                    ? namingConvention.equivalenceClassRepresentative(mnemonic)
-                    : mnemonic;
-        }
-
-        // uuid, parent, mnemonic
-        boolean queryParentTable = false;
-        FieldStructure[] queryFields = null;
-        String[] queryValues = null;
-        if (Type.SYSTEMGROUP.equals(type) || Type.DISCIPLINE.equals(type)) {
-            // no parent - query table for type
-            if (hasMnemonic) {
-                queryFields = new FieldStructure[]{mnemonicField};
-                queryValues = new String[]{mnemonicValue};
-            } else {
-                return Lists.newArrayList();
-            }
-        } else {
-            // parent
-            if (hasMnemonic) {
-                // query table for type
-                queryFields = new FieldStructure[]{FieldStructure.PARENT, mnemonicField};
-                queryValues = new String[]{parent.toString(), mnemonicValue};
-            } else {
-                // query table for parent to type
-                queryParentTable = true;
-                queryFields = new FieldStructure[]{FieldStructure.UUID};
-                queryValues = new String[]{parent.toString()};
-            }
-        }
-
-        // query table and return list with uuid
-        if (Type.SYSTEMGROUP.equals(type)) {
-            return StructureUtil.listSystemGroup2Uuid(holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, queryFields, queryValues));
-        } else if (Type.SYSTEM.equals(type)) {
-            if (queryParentTable) {
-                return StructureUtil.listSystemGroup2Uuid(holderRepositories.getSystemGroupRepository().readSystemGroups(status, deleted, queryFields, queryValues));
-            } else {
-                return StructureUtil.listSystem2Uuid(holderRepositories.getSystemRepository().readSystems(status, deleted, queryFields, queryValues));
-            }
-        } else if (Type.SUBSYSTEM.equals(type)) {
-            if (queryParentTable) {
-                return StructureUtil.listSystem2Uuid(holderRepositories.getSystemRepository().readSystems(status, deleted, queryFields, queryValues));
-            } else {
-                return StructureUtil.listSubsystem2Uuid(holderRepositories.getSubsystemRepository().readSubsystems(status, deleted, queryFields, queryValues));
-            }
-        } else if (Type.DISCIPLINE.equals(type)) {
-            return StructureUtil.listDiscipline2Uuid(holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, queryFields, queryValues));
-        } else if (Type.DEVICEGROUP.equals(type)) {
-            if (queryParentTable) {
-                return StructureUtil.listDiscipline2Uuid(holderRepositories.getDisciplineRepository().readDisciplines(status, deleted, queryFields, queryValues));
-            } else {
-                return StructureUtil.listDeviceGroup2Uuid(holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, queryFields, queryValues));            }
-        } else if (Type.DEVICETYPE.equals(type)) {
-            if (queryParentTable) {
-                return StructureUtil.listDeviceGroup2Uuid(holderRepositories.getDeviceGroupRepository().readDeviceGroups(status, deleted, queryFields, queryValues));
-            } else {
-                return StructureUtil.listDeviceType2Uuid(holderRepositories.getDeviceTypeRepository().readDeviceTypes(status, deleted, queryFields, queryValues));
-            }
-        }
-        return Lists.newArrayList();
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate structure data.
-     * This method corresponds to structure element data for create, albeit in a different way.
-     *
-     * @param type type
-     * @param mnemonicpath mnemonic path
-     * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param holder holder
-     */
-    public static void validateStructureDataCreate(Type type, String mnemonicpath, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, HolderSystemDeviceStructure holder) {
-        if (type == null || mnemonicpath == null || namingConvention == null || holderIRepositories == null || holder == null) {
-            return;
-        }
-
-        String details = mnemonicpath;
-        String field = TextUtil.MNEMONIC_PATH;
-
-        String[] path = NamingConventionUtil.string2MnemonicPath(mnemonicpath);
-        ExceptionUtil.validateConditionDataNotValidException(path != null && path.length >= 1 && path.length <= 2,
-                TextUtil.STRUCTURE_MNEMONIC_PATH_IS_NOT_VALID, details, field);
-        String mnemonicpathEquivalence = namingConvention.equivalenceClassRepresentative(mnemonicpath);
-
-        if (Type.SYSTEMGROUP.equals(type)) {
-            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
-
-            // system group may have empty path but there will be mnemonicpath in this context
-
-            // mnemonic path
-            SystemGroup sg = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByMnemonic(path[0]);
-            validateStructuresMnemonicpathDuplicate(type, sg == null, details, field);
-
-            // mnemonic path equivalence
-            List<SystemGroup> systemGroups = holderIRepositories.getSystemGroupRepository().findLatestNotDeleted();
-            for (SystemGroup systemGroup : systemGroups) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(systemGroup.getMnemonicEquivalence(), namingConvention.equivalenceClassRepresentative(path[0])), details, field);
-            }
-        } else if (Type.SYSTEM.equals(type)) {
-            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
-
-            // path with 1 element  - system group or  system ---> check both individually
-            // check mnemonic, mnemonic equivalence
-
-            // mnemonic path system group
-            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsSystemGroup(holder, false, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
-            }
-
-            // mnemonic path equivalence system group
-            mnemonicPaths = StructureUtil.getMnemonicPathsSystemGroup(holder, true, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
-            }
-
-            // mnemonic path
-            mnemonicPaths = StructureUtil.getMnemonicPathsSystem(holder, false, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
-            }
-
-            // mnemonic path equivalence
-            mnemonicPaths = StructureUtil.getMnemonicPathsSystem(holder, true, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
-            }
-        } else if (Type.SUBSYSTEM.equals(type)) {
-            validateStructuresMnemonicpathNotValid(type, path.length == 2, details, field);
-
-            System sys = holderIRepositories.getSystemRepository().findLatestNotDeletedByMnemonic(path[0]);
-            validateStructuresMnemonicpathNotAvailable(type, sys != null, details, field);
-            SystemGroup sg = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByUuid(sys.getParentUuid().toString());
-
-            // mnemonic path
-            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(path[0], path[1]), details, field);
-            if (!StringUtils.isEmpty(sg.getMnemonic())) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(sg.getMnemonic(), path[1]), details, field);
-            }
-
-            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsSubsystem(holder, false, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
-            }
-
-            // mnemonic path equivalence
-            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(path[0]), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
-            if (!StringUtils.isEmpty(sg.getMnemonic())) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(sg.getMnemonic()), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
-            }
-
-            mnemonicPaths = StructureUtil.getMnemonicPathsSubsystem(holder, true, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);            }
-        } else if (Type.DISCIPLINE.equals(type)) {
-            validateStructuresMnemonicpathNotValid(type, path.length == 1, details, field);
-
-            // mnemonic path
-            Discipline di = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByMnemonic(path[0]);
-            validateStructuresMnemonicpathDuplicate(type, di == null, details, field);
-
-            // mnemonic path equivalence
-            List<Discipline> disciplines = holderIRepositories.getDisciplineRepository().findLatestNotDeleted();
-            for (Discipline discipline : disciplines) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(discipline.getMnemonicEquivalence(), namingConvention.equivalenceClassRepresentative(path[0])), details, field);
-            }
-        } else if (Type.DEVICEGROUP.equals(type)) {
-            throw ExceptionUtil.createDataNotValidException(TextUtil.DEVICEGROUP_IS_NOT_VALID, details, field);
-        } else if (Type.DEVICETYPE.equals(type)) {
-            // since device group is between discipline and device type and device group has no mnemonic,
-            //     it can not be traced to which device group that this device type belongs,
-            //     therefore it can not be known to which mnemonic line it belongs
-            //     by looking at mnemonic
-            // instead similar approach as for other Type, i.e. compare with list of mnemonic paths
-            //     rest of checks in validatecreate
-
-            validateStructuresMnemonicpathNotValid(type, path.length == 2, details, field);
-
-            // discipline
-            Discipline discipline = holderIRepositories.getDisciplineRepository().findLatestNotDeletedByMnemonic(path[0]);
-            ExceptionUtil.validateConditionDataNotValidException(discipline != null,
-                    TextUtil.DISCIPLINE_IS_NOT_VALID, details, field);
-
-            // mnemonic path
-            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(path[0], path[1]), details, field);
-
-            List<String> mnemonicPaths = StructureUtil.getMnemonicPathsDeviceType(holder, false, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(mnemonicpath, existingPath), details, field);
-            }
-
-            // mnemonic path equivalence
-            validateStructuresMnemonicpathDuplicate(type, !StringUtils.equals(namingConvention.equivalenceClassRepresentative(path[0]), namingConvention.equivalenceClassRepresentative(path[1])), details, field);
-
-            mnemonicPaths = StructureUtil.getMnemonicPathsDeviceType(holder, true, namingConvention);
-            for (String existingPath : mnemonicPaths) {
-                validateStructuresMnemonicpathequivalenceDuplicate(type, !StringUtils.equals(mnemonicpathEquivalence, namingConvention.equivalenceClassRepresentative(existingPath)), details, field);
-            }
-        }
-    }
-
-    private static void validateStructuresMnemonicpathNotAvailable(Type type, boolean condition, String details, String field) {
-        ExceptionUtil.validateConditionDataNotValidException(condition,
-                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_IS_NOT_AVAILABLE, details, field);
-    }
-    private static void validateStructuresMnemonicpathNotValid(Type type, boolean condition, String details, String field) {
-        ExceptionUtil.validateConditionDataNotValidException(condition,
-                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_IS_NOT_VALID, details, field);
-    }
-    private static void validateStructuresMnemonicpathDuplicate(Type type, boolean condition, String details, String field) {
-        ExceptionUtil.validateConditionDataConflictException(condition,
-                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_HAS_DUPLICATE, details, field);
-    }
-    private static void validateStructuresMnemonicpathequivalenceDuplicate(Type type, boolean condition, String details, String field) {
-        ExceptionUtil.validateConditionDataConflictException(condition,
-                type.toString().toLowerCase() + TextUtil.SPACE + TextUtil.MNEMONIC_PATH_EQUIVALENCE_HAS_DUPLICATE, details, field);
-    }
-
-    // ----------------------------------------------------------------------------------------------------
-
-    /**
-     * Validate condition if precondition is fulfilled and throw data conflict exception with reason if validation fails.
-     *
-     * @param precondition precondition
-     * @param condition condition
-     * @param message message
-     * @param details details
-     * @param field field
-     *
-     * @see DataConflictException
-     */
-    private static void validateConditionIfPrecondition(boolean precondition, boolean condition, String message, String details, String field) {
-        if (precondition) {
-            ExceptionUtil.validateConditionDataConflictException(condition, message, details, field);
-        }
-    }
-
-    /**
-     * Validate condition if precondition (StructureChoice) is fulfilled and throw data conflict exception with reason if validation fails.
-     *
-     * @param expected expected structure choice
-     * @param actual actual structure choice
-     * @param condition condition
-     * @param message message
-     * @param details details
-     * @param field field
-     *
-     * @see DataConflictException
-     */
-    private static void validateConditionIfStructureChoice(StructureChoice expected, StructureChoice actual, boolean condition, String message, String details, String field) {
-        validateConditionIfPrecondition(expected != null && expected.equals(actual), condition, message, details, field);
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/util/ValidateUtilTest.java b/src/test/java/org/openepics/names/util/ValidateUtilTest.java
index d2e19534b149286f30c5d179fa3e3dd46a51c159..b4a9910bf5e0934b3c6595298be42500419d03e5 100644
--- a/src/test/java/org/openepics/names/util/ValidateUtilTest.java
+++ b/src/test/java/org/openepics/names/util/ValidateUtilTest.java
@@ -281,7 +281,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateInputReadNames() {
-        ValidateUtil.validateNamesInputRead(
+        ValidateNameElementUtil.validateNamesInputRead(
                 null, null, null,
                 null,
                 null, null,
@@ -293,7 +293,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateInputCreateNameElement() {
-        ValidateUtil.validateNameElementInputCreate(null);
+        ValidateNameElementUtil.validateNameElementInputCreate(null);
     }
 
     /**
@@ -301,7 +301,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataCreateNameElement() {
-        ValidateUtil.validateNameElementDataCreate(null, null, null, null, null);
+        ValidateNameElementUtil.validateNameElementDataCreate(null, null, null, null, null);
     }
 
     /**
@@ -309,14 +309,14 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataCreateName() {
-        ValidateUtil.validateNameDataCreate(null, null, null, null);
+        ValidateNameElementUtil.validateNameDataCreate(null, null, null, null);
     }
     /**
      * Test of validate input update name element.
      */
     @Test
     void validateInputUpdateNameElement() {
-        ValidateUtil.validateNameElementInputUpdate(null);
+        ValidateNameElementUtil.validateNameElementInputUpdate(null);
     }
 
     /**
@@ -324,7 +324,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataUpdateNameElement() {
-        ValidateUtil.validateNameElementDataUpdate(null, null, null, null, null);
+        ValidateNameElementUtil.validateNameElementDataUpdate(null, null, null, null, null);
     }
 
     // ----------------------------------------------------------------------------------------------------
@@ -335,7 +335,7 @@ class ValidateUtilTest {
     @Test
     void validateInputReadStructuresTypeNull() {
         try {
-            ValidateUtil.validateStructuresInputRead(
+            ValidateStructureElementUtil.validateStructuresInputRead(
                     null, null, null, null, null,
                     null,
                     null, null,
@@ -352,32 +352,32 @@ class ValidateUtilTest {
      */
     @Test
     void validateInputReadStructures() {
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.SYSTEMGROUP, null, null, null, null,
                 null,
                 null, null,
                 null, null);
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.SYSTEM, null, null, null, null,
                 null,
                 null, null,
                 null, null);
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.SUBSYSTEM, null, null, null, null,
                 null,
                 null, null,
                 null, null);
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.DISCIPLINE, null, null, null, null,
                 null,
                 null, null,
                 null, null);
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.DEVICEGROUP, null, null, null, null,
                 null,
                 null, null,
                 null, null);
-        ValidateUtil.validateStructuresInputRead(
+        ValidateStructureElementUtil.validateStructuresInputRead(
                 Type.DEVICETYPE, null, null, null, null,
                 null,
                 null, null,
@@ -389,7 +389,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataCreateStructureElement() {
-        ValidateUtil.validateStructureElementDataCreate(null, null, null, null);
+        ValidateStructureElementUtil.validateStructureElementDataCreate(null, null, null, null);
     }
 
     /**
@@ -397,7 +397,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataCreateStructuret() {
-        ValidateUtil.validateStructureDataCreate(null, null, null, null, null);
+        ValidateStructureElementUtil.validateStructureDataCreate(null, null, null, null, null);
     }
 
     /**
@@ -405,7 +405,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateInputUpdateStructureElement() {
-        ValidateUtil.validateStructureElementInputUpdate(null, null);
+        ValidateStructureElementUtil.validateStructureElementInputUpdate(null, null);
     }
 
     /**
@@ -413,7 +413,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataUpdateStructureElement() {
-        ValidateUtil.validateStructureElementDataUpdate(null, null, null, null);
+        ValidateStructureElementUtil.validateStructureElementDataUpdate(null, null, null, null);
     }
 
 }