From 851c5a7e7e844fcc0d7dc6cf99135b554131ba8e Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Thu, 22 Jun 2023 13:13:29 +0200
Subject: [PATCH] Fix sorting

Fix sorting.
Fix equals method for beans.
Add integration tests for sorting.
---
 .../repository/DeviceGroupRepository.java     |  16 ++-
 .../repository/DeviceTypeRepository.java      |  16 ++-
 .../repository/DisciplineRepository.java      |  16 ++-
 .../names/repository/NameRepository.java      |  23 +++-
 .../names/repository/SubsystemRepository.java |  16 ++-
 .../repository/SystemGroupRepository.java     |  16 ++-
 .../names/repository/SystemRepository.java    |  16 ++-
 .../beans/element/NameElementCommand.java     |   4 -
 .../element/NameElementCommandConfirm.java    |   4 -
 .../element/NameElementCommandCreate.java     |   4 -
 .../StructureElementCommandConfirm.java       |   4 -
 .../StructureElementCommandCreate.java        |   4 -
 .../org/openepics/names/docker/NamesIT.java   |  22 ++++
 .../names/docker/StructuresDeviceGroupIT.java |  27 ++++
 .../names/docker/StructuresDeviceTypeIT.java  |  29 +++-
 .../names/docker/StructuresDisciplineIT.java  |  29 +++-
 .../names/docker/StructuresSubsystemIT.java   |  29 +++-
 .../names/docker/StructuresSystemGroupIT.java |  32 ++++-
 .../names/docker/StructuresSystemIT.java      |  29 +++-
 .../rest/beans/element/NameElementTest.java   | 123 +++++++++++++++++
 .../beans/element/StructureElementTest.java   | 124 ++++++++++++++++++
 21 files changed, 524 insertions(+), 59 deletions(-)
 create mode 100644 src/test/java/org/openepics/names/rest/beans/element/NameElementTest.java
 create mode 100644 src/test/java/org/openepics/names/rest/beans/element/StructureElementTest.java

diff --git a/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java b/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
index f517546f..771fd79d 100644
--- a/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
+++ b/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
@@ -209,7 +209,9 @@ public class DeviceGroupRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -225,7 +227,9 @@ public class DeviceGroupRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -444,7 +448,9 @@ public class DeviceGroupRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -460,7 +466,9 @@ public class DeviceGroupRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java b/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
index 91986672..a56c966b 100644
--- a/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
+++ b/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
@@ -209,7 +209,9 @@ public class DeviceTypeRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -225,7 +227,9 @@ public class DeviceTypeRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -444,7 +448,9 @@ public class DeviceTypeRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -460,7 +466,9 @@ public class DeviceTypeRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/repository/DisciplineRepository.java b/src/main/java/org/openepics/names/repository/DisciplineRepository.java
index 10826f77..b814225e 100644
--- a/src/main/java/org/openepics/names/repository/DisciplineRepository.java
+++ b/src/main/java/org/openepics/names/repository/DisciplineRepository.java
@@ -203,7 +203,9 @@ public class DisciplineRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -219,7 +221,9 @@ public class DisciplineRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -430,7 +434,9 @@ public class DisciplineRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -446,7 +452,9 @@ public class DisciplineRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/repository/NameRepository.java b/src/main/java/org/openepics/names/repository/NameRepository.java
index 31e2c1eb..e13e825f 100644
--- a/src/main/java/org/openepics/names/repository/NameRepository.java
+++ b/src/main/java/org/openepics/names/repository/NameRepository.java
@@ -201,10 +201,12 @@ public class NameRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldName.NAME.equals(orderBy)) {
+                if (FieldName.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldName.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME)));
                 } else if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
-                        cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME_EQUIVALENCE)));
+                    cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME_EQUIVALENCE)));
                 } else if (FieldName.SYSTEMSTRUCTURE.equals(orderBy)) {
                     cq.orderBy(cb.asc(cb.function(NameStructure.FUNCTION_GET_MNEMONIC_PATH_SYSTEM_STRUCTURE, String.class, from.get(Name.FIELD_CONVENTION_NAME))));
                 } else if (FieldName.DEVICESTRUCTURE.equals(orderBy)) {
@@ -219,7 +221,9 @@ public class NameRepository {
                     cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME)));
                 }
             } else {
-                if (FieldName.NAME.equals(orderBy)) {
+                if (FieldName.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldName.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Name.FIELD_CONVENTION_NAME)));
                 } else if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Name.FIELD_CONVENTION_NAME_EQUIVALENCE)));
@@ -410,7 +414,9 @@ public class NameRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldName.NAME.equals(orderBy)) {
+                if (FieldName.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldName.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME)));
                 } else if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Name.FIELD_CONVENTION_NAME_EQUIVALENCE)));
@@ -428,7 +434,9 @@ public class NameRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldName.NAME.equals(orderBy)) {
+                if (FieldName.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldName.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Name.FIELD_CONVENTION_NAME)));
                 } else if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Name.FIELD_CONVENTION_NAME_EQUIVALENCE)));
@@ -533,7 +541,10 @@ public class NameRepository {
         if (orderBy != null) {
             sqlOrderBy.append(" order by ");
 
-            if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
+            if (FieldName.UUID.equals(orderBy)) {
+                sqlOrderBy.append("n.");
+                sqlOrderBy.append(NameStructure.FIELD_UUID);
+            } else if (FieldName.NAMEEQUIVALENCE.equals(orderBy)) {
                 sqlOrderBy.append("n.");
                 sqlOrderBy.append(Name.FIELD_CONVENTION_NAME_EQUIVALENCE);
             } else if (FieldName.SYSTEMSTRUCTURE.equals(orderBy)) {
diff --git a/src/main/java/org/openepics/names/repository/SubsystemRepository.java b/src/main/java/org/openepics/names/repository/SubsystemRepository.java
index 5a1e667f..10109318 100644
--- a/src/main/java/org/openepics/names/repository/SubsystemRepository.java
+++ b/src/main/java/org/openepics/names/repository/SubsystemRepository.java
@@ -209,7 +209,9 @@ public class SubsystemRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -225,7 +227,9 @@ public class SubsystemRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -444,7 +448,9 @@ public class SubsystemRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -460,7 +466,9 @@ public class SubsystemRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/repository/SystemGroupRepository.java b/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
index cdce2192..aa126129 100644
--- a/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
+++ b/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
@@ -200,7 +200,9 @@ public class SystemGroupRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -216,7 +218,9 @@ public class SystemGroupRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -427,7 +431,9 @@ public class SystemGroupRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -443,7 +449,9 @@ public class SystemGroupRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/repository/SystemRepository.java b/src/main/java/org/openepics/names/repository/SystemRepository.java
index f3ba1296..021d263e 100644
--- a/src/main/java/org/openepics/names/repository/SystemRepository.java
+++ b/src/main/java/org/openepics/names/repository/SystemRepository.java
@@ -209,7 +209,9 @@ public class SystemRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -225,7 +227,9 @@ public class SystemRepository {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
@@ -444,7 +448,9 @@ public class SystemRepository {
 
         if (orderBy != null) {
             if (BooleanUtils.toBoolean(isAsc)) {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.asc(from.get(Structure.FIELD_MNEMONIC)));
@@ -460,7 +466,9 @@ public class SystemRepository {
                     cq.orderBy(cb.asc(from.get(NameStructure.FIELD_UUID)), cb.asc(from.get(Persistable.FIELD_ID)));
                 }
             } else {
-                if (FieldStructure.NAME.equals(orderBy)) {
+                if (FieldStructure.UUID.equals(orderBy)) {
+                    cq.orderBy(cb.desc(from.get(NameStructure.FIELD_UUID)));
+                } else if (FieldStructure.NAME.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_NAME)));
                 } else if (FieldStructure.MNEMONIC.equals(orderBy)) {
                     cq.orderBy(cb.desc(from.get(Structure.FIELD_MNEMONIC)));
diff --git a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommand.java b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommand.java
index 32ee57d2..ece6d3f9 100644
--- a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommand.java
+++ b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommand.java
@@ -135,10 +135,6 @@ public class NameElementCommand implements Serializable {
         if (other == null)
             return false;
 
-        if (!super.equals(other)) {
-            return false;
-        }
-
         if (getUuid() == null) {
             if (other.getUuid() != null)
                 return false;
diff --git a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandConfirm.java b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandConfirm.java
index 719dd458..c305db94 100644
--- a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandConfirm.java
+++ b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandConfirm.java
@@ -66,10 +66,6 @@ public class NameElementCommandConfirm implements Serializable {
         if (other == null)
             return false;
 
-        if (!super.equals(other)) {
-            return false;
-        }
-
         if (getUuid() == null) {
             if (other.getUuid() != null)
                 return false;
diff --git a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandCreate.java b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandCreate.java
index daff80ba..cfc9b5fa 100644
--- a/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandCreate.java
+++ b/src/main/java/org/openepics/names/rest/beans/element/NameElementCommandCreate.java
@@ -97,10 +97,6 @@ public class NameElementCommandCreate implements Serializable {
         if (other == null)
             return false;
 
-        if (!super.equals(other)) {
-            return false;
-        }
-
         if (getParentSystemStructure() == null) {
             if (other.getParentSystemStructure() != null)
                 return false;
diff --git a/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandConfirm.java b/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandConfirm.java
index 736d78c3..d7a2fb92 100644
--- a/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandConfirm.java
+++ b/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandConfirm.java
@@ -78,10 +78,6 @@ public class StructureElementCommandConfirm implements Serializable {
         if (other == null)
             return false;
 
-        if (!super.equals(other)) {
-            return false;
-        }
-
         if (getUuid() == null) {
             if (other.getUuid() != null)
                 return false;
diff --git a/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandCreate.java b/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandCreate.java
index 190680a5..2b6a201e 100644
--- a/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandCreate.java
+++ b/src/main/java/org/openepics/names/rest/beans/element/StructureElementCommandCreate.java
@@ -110,10 +110,6 @@ public class StructureElementCommandCreate implements Serializable {
         if (other == null)
             return false;
 
-        if (!super.equals(other)) {
-            return false;
-        }
-
         if (getType() == null) {
             if (other.getType() != null)
                 return false;
diff --git a/src/test/java/org/openepics/names/docker/NamesIT.java b/src/test/java/org/openepics/names/docker/NamesIT.java
index 9b4dc22c..dd49aa45 100644
--- a/src/test/java/org/openepics/names/docker/NamesIT.java
+++ b/src/test/java/org/openepics/names/docker/NamesIT.java
@@ -38,6 +38,7 @@ import org.openepics.names.rest.beans.element.NameElementCommandUpdate;
 import org.openepics.names.rest.beans.element.StructureElement;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
+import org.openepics.names.rest.beans.response.ResponsePageNameElements;
 import org.openepics.names.util.NameCommand;
 import org.openepics.names.util.NameElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -908,6 +909,7 @@ class NamesIT {
         NameElementCommandUpdate nameElementCommandUpdate = null;
         NameElementCommandConfirm nameElementCommandConfirm = null;
         NameElement responseNameElement = null;
+        ResponsePageNameElements response, response2 = null;
         UUID uuid, uuid2 = null;
 
         NameElement nameElement1, nameElement7, nameElement8 = null;
@@ -981,6 +983,12 @@ class NamesIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilNameElement.assertRead("", 13, -1);
 
@@ -1036,6 +1044,13 @@ class NamesIT {
             ITUtilNameElement.assertRead("?deviceStructure=EMR-FS&page=2&pageSize=3",                    2);
             ITUtilNameElement.assertRead("?deviceStructure=EMR-FS&page=3&pageSize=3",                    0);
 
+            response  = ITUtilNameElement.assertRead("?index=00_&page=0&pageSize=3&orderBy=WHEN&isAsc=true",   3);
+            response2 = ITUtilNameElement.assertRead("?index=00_&page=2&pageSize=3&orderBy=WHEN&isAsc=false",  2);
+            assertEquals(response.getList().get(0),  response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilNameElement.assertRead("?index=00_&page=0&pageSize=3&orderBy=WHEN&isAsc=false",  3);
+            response2 = ITUtilNameElement.assertRead("?index=00_&page=2&pageSize=3&orderBy=WHEN&isAsc=true",   2);
+            assertEquals(response.getList().get(0),  response2.getList().get(response2.getList().size()-1));
+
             // name or uuid
             //     /{name}
             ITUtilNameElement.assertRead("/" + systemGroupAcc.toString(),      0);
@@ -1097,6 +1112,13 @@ class NamesIT {
             ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=1&pageSize=5",            5);
             ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=2&pageSize=5",            2);
             ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=3&pageSize=5",            0);
+
+            response  = ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=0&pageSize=5&orderBy=WHEN&isAsc=true",   5);
+            response2 = ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=2&pageSize=5&orderBy=WHEN&isAsc=false",  2);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            response  = ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=0&pageSize=5&orderBy=WHEN&isAsc=false",  5);
+            response2 = ITUtilNameElement.assertRead("/history?deviceStructure=EMR-FS&page=2&pageSize=5&orderBy=WHEN&isAsc=true",   2);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
         } catch (Exception e) {
             fail();
         }
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
index 240a5bc0..ae18fec6 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
@@ -34,6 +34,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1612,6 +1613,7 @@ class StructuresDeviceGroupIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
 
@@ -1900,6 +1902,12 @@ class StructuresDeviceGroupIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2",                                                  30);
             ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&mnemonicPath=Di2",                                  5);
@@ -1968,6 +1976,18 @@ class StructuresDeviceGroupIT {
             ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=2&pageSize=12",                  6);
             ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=3&pageSize=12",                  0);
 
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&mnemonicPath=Di2&page=0&pageSize=12",       12);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&mnemonicPath=Di2&page=1&pageSize=12",       12);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&mnemonicPath=Di2&page=2&pageSize=12",        1);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&mnemonicPath=Di2&page=3&pageSize=12",        0);
+
+            response  = ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=0&pageSize=12&orderBy=WHEN&isAsc=true",      12);
+            response2 = ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=2&pageSize=12&orderBy=WHEN&isAsc=false",      6);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=0&pageSize=12&orderBy=WHEN&isAsc=false",     12);
+            response2 = ITUtilStructureElement.assertRead("/DEVICEGROUP?mnemonicPath=Di2&page=2&pageSize=12&orderBy=WHEN&isAsc=true",       6);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
@@ -2026,6 +2046,13 @@ class StructuresDeviceGroupIT {
             ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=2&pageSize=15",               10);
             ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=3&pageSize=15",                0);
 
+            ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=0&pageSize=15&orderBy=WHEN&isAsc=true",   15);
+            ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=2&pageSize=15&orderBy=WHEN&isAsc=false",  10);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=0&pageSize=15&orderBy=WHEN&isAsc=false",  15);
+            ITUtilStructureElement.assertRead("/history?type=DEVICEGROUP&description=%other%&page=2&pageSize=15&orderBy=WHEN&isAsc=true",   10);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "Di2", Boolean.FALSE);
         } catch (Exception e) {
             fail();
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
index a79869ab..7a686552 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
@@ -34,6 +34,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1620,6 +1621,7 @@ class StructuresDeviceTypeIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
 
@@ -1908,6 +1910,12 @@ class StructuresDeviceTypeIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__",                                                  45);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&mnemonic=A__",                                 10);
@@ -1978,6 +1986,18 @@ class StructuresDeviceTypeIT {
             ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=2&pageSize=20",                      5);
             ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=3&pageSize=20",                      0);
 
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",     6);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",     0);
+
+            response  = ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=true",   20);
+            response2 = ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=false",   5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=false",  20);
+            response2 = ITUtilStructureElement.assertRead("/DEVICETYPE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",    5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
@@ -2036,7 +2056,7 @@ class StructuresDeviceTypeIT {
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&description=%other%",                    40);
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&who=%wh%",                              100, -1);
 
-            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&uuid=" + uuid2.toString() + "&description=more%",   8);
+            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&uuid=" + uuid2.toString() + "&description=more%",           8);
 
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=0&pageSize=100",       20);
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=1&pageSize=100",        0);
@@ -2047,6 +2067,13 @@ class StructuresDeviceTypeIT {
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=2&pageSize=8",          4);
             ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=3&pageSize=8",          0);
 
+            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=true",    8);
+            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=false",   4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=false",   8);
+            ITUtilStructureElement.assertRead("/history?type=DEVICETYPE&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=true",    4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di-AA1", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di-AA2", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di-AA3", Boolean.TRUE);
diff --git a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
index 6a07a4a8..109a74ce 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
@@ -33,6 +33,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1517,6 +1518,7 @@ class StructuresDisciplineIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
         UUID uuidRandom = UUID.randomUUID();
@@ -1806,6 +1808,12 @@ class StructuresDisciplineIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__",                                                  45);
             ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&mnemonic=A__",                                 10);
@@ -1873,6 +1881,18 @@ class StructuresDisciplineIT {
             ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=2&pageSize=20",                 5);
             ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=3&pageSize=20",                 0);
 
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",     6);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",     0);
+
+            response  = ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=true",   20);
+            response2 = ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=false",   5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=false",  20);
+            response2 = ITUtilStructureElement.assertRead("/DISCIPLINE?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",    5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
@@ -1913,7 +1933,7 @@ class StructuresDisciplineIT {
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&description=%other%",               40);
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&who=%wh%",                         100, -1);
 
-            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&uuid=" + uuid2.toString() + "&description=more%",   8);
+            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&uuid=" + uuid2.toString() + "&description=more%",           8);
 
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=0&pageSize=100",  20);
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=1&pageSize=100",   0);
@@ -1924,6 +1944,13 @@ class StructuresDisciplineIT {
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=2&pageSize=8",     4);
             ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=3&pageSize=8",     0);
 
+            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=true",    8);
+            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=false",   4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=false",   8);
+            ITUtilStructureElement.assertRead("/history?type=DISCIPLINE&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=true",    4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.DISCIPLINE, "AA1", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.DISCIPLINE, "AA2", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.DISCIPLINE, "AA3", Boolean.TRUE);
diff --git a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
index f605160f..32f8948e 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
@@ -34,6 +34,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1668,6 +1669,7 @@ class StructuresSubsystemIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
 
@@ -1956,6 +1958,12 @@ class StructuresSubsystemIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__",                                                  45);
             ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&mnemonic=A__",                                 10);
@@ -2026,6 +2034,18 @@ class StructuresSubsystemIT {
             ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=2&pageSize=20",                      5);
             ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=3&pageSize=20",                      0);
 
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",     6);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",     0);
+
+            response  = ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=true",   20);
+            response2 = ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=false",   5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=false",  20);
+            response2 = ITUtilStructureElement.assertRead("/SUBSYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",    5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
@@ -2094,7 +2114,7 @@ class StructuresSubsystemIT {
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&description=%other%",                    40);
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&who=%wh%",                              100, -1);
 
-            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&uuid=" + uuid2.toString() + "&description=more%",   8);
+            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&uuid=" + uuid2.toString() + "&description=more%",           8);
 
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=0&pageSize=100",       20);
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=1&pageSize=100",        0);
@@ -2105,6 +2125,13 @@ class StructuresSubsystemIT {
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=2&pageSize=8",          4);
             ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=3&pageSize=8",          0);
 
+            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=true",    8);
+            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=false",   4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=false",   8);
+            ITUtilStructureElement.assertRead("/history?type=SUBSYSTEM&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=true",    4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys-AA1", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys-AA2", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys-AA3", Boolean.TRUE);
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
index d3c6d6bc..ffb14091 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
@@ -34,6 +34,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1579,6 +1580,7 @@ class StructuresSystemGroupIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
         UUID uuidRandom = UUID.randomUUID();
@@ -1868,6 +1870,12 @@ class StructuresSystemGroupIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__",                                                  45);
             ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&mnemonic=A__",                                 10);
@@ -1935,10 +1943,17 @@ class StructuresSystemGroupIT {
             ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=2&pageSize=20",                 5);
             ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=3&pageSize=20",                 0);
 
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",  12);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",  12);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",   6);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",   0);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",     6);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",     0);
+
+            response  = ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=true",   20);
+            response2 = ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=false",   5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=false",  20);
+            response2 = ITUtilStructureElement.assertRead("/SYSTEMGROUP?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",    5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
 
             // children
             //     /children/{uuid}
@@ -1980,7 +1995,7 @@ class StructuresSystemGroupIT {
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&description=%other%",               40);
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&who=%wh%",                         100, -1);
 
-            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&uuid=" + uuid2.toString() + "&description=more%",         8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&uuid=" + uuid2.toString() + "&description=more%",           8);
 
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=0&pageSize=100",  20);
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=1&pageSize=100",   0);
@@ -1991,6 +2006,13 @@ class StructuresSystemGroupIT {
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=2&pageSize=8",     4);
             ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=3&pageSize=8",     0);
 
+            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=true",    8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=false",   4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=false",   8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEMGROUP&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=true",    4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "AA1", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "AA2", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "AA3", Boolean.TRUE);
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
index 6438d2f2..bcfb360b 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
@@ -34,6 +34,7 @@ import org.openepics.names.rest.beans.element.StructureElementCommand;
 import org.openepics.names.rest.beans.element.StructureElementCommandConfirm;
 import org.openepics.names.rest.beans.element.StructureElementCommandCreate;
 import org.openepics.names.rest.beans.element.StructureElementCommandUpdate;
+import org.openepics.names.rest.beans.response.ResponsePageStructureElements;
 import org.openepics.names.util.StructureCommand;
 import org.openepics.names.util.StructureElementUtil;
 import org.testcontainers.containers.DockerComposeContainer;
@@ -1601,6 +1602,7 @@ class StructuresSystemIT {
         StructureElementCommandUpdate structureElementCommandUpdate = null;
         StructureElementCommandConfirm structureElementCommandConfirm = null;
         StructureElement createdStructureElement = null;
+        ResponsePageStructureElements response, response2 = null;
         UUID uuid = null;
         UUID uuid2 = null;
 
@@ -1889,6 +1891,12 @@ class StructuresSystemIT {
             //     pagination
             //         page, pageSize
             //         default pageSize 100
+            //     sorting
+            //         FieldStructure
+            //         data content give what kind of sorting may be done and tested in this way
+            //         compare in query result for sorting asc and desc
+            //             content for field in first and last items    -    always possible
+            //             first and last items                         -    not always possible
 
             ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__",                                                  45);
             ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&mnemonic=A__",                                 10);
@@ -1957,6 +1965,18 @@ class StructuresSystemIT {
             ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=2&pageSize=20",                         5);
             ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=3&pageSize=20",                         0);
 
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=0&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=1&pageSize=12",    12);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=2&pageSize=12",     6);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&mnemonic=A__&page=3&pageSize=12",     0);
+
+            response  = ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=true",   20);
+            response2 = ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=false",   5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+            response  = ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=0&pageSize=20&orderBy=WHEN&isAsc=false",  20);
+            response2 = ITUtilStructureElement.assertRead("/SYSTEM?mnemonic=A__&page=2&pageSize=20&orderBy=WHEN&isAsc=true",    5);
+            assertEquals(response.getList().get(0), response2.getList().get(response2.getList().size()-1));
+
             // children
             //     /children/{uuid}
             //     uuid, type, statuses, deleted, name, mnemonic, mnemonicEquivalence, mnemonicPath, description
@@ -2006,7 +2026,7 @@ class StructuresSystemIT {
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&description=%other%",                       40);
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&who=%wh%",                                 100, -1);
 
-            ITUtilStructureElement.assertRead("/history?type=SYSTEM&uuid=" + uuid2.toString() + "&description=more%",   8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEM&uuid=" + uuid2.toString() + "&description=more%",           8);
 
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=0&pageSize=100",          20);
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=1&pageSize=100",           0);
@@ -2017,6 +2037,13 @@ class StructuresSystemIT {
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=2&pageSize=8",             4);
             ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=3&pageSize=8",             0);
 
+            ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=true",    8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=false",   4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+            ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=0&pageSize=8&orderBy=WHEN&isAsc=false",   8);
+            ITUtilStructureElement.assertRead("/history?type=SYSTEM&mnemonic=AF_&page=2&pageSize=8&orderBy=WHEN&isAsc=true",    4);
+            assertEquals(response.getList().get(0).getWhen(),  response2.getList().get(response2.getList().size()-1).getWhen());
+
             ITUtilStructureElement.assertExists(Type.SYSTEM, "AA1", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SYSTEM, "AA2", Boolean.TRUE);
             ITUtilStructureElement.assertExists(Type.SYSTEM, "AA3", Boolean.TRUE);
diff --git a/src/test/java/org/openepics/names/rest/beans/element/NameElementTest.java b/src/test/java/org/openepics/names/rest/beans/element/NameElementTest.java
new file mode 100644
index 00000000..ad82eee1
--- /dev/null
+++ b/src/test/java/org/openepics/names/rest/beans/element/NameElementTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2023 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.rest.beans.element;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.Date;
+import java.util.UUID;
+
+import org.junit.jupiter.api.Test;
+import org.openepics.names.rest.beans.Status;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Unit tests for NameElement class.
+ *
+ * @author Lars Johansson
+ *
+ * @see NameElement
+ */
+class NameElementTest {
+
+    @Test
+    void equals() {
+        NameElement ne1 = null, ne2 = null;
+        Date date = new Date();
+
+        ne1 = new NameElement(
+                UUID.fromString("45bdc415-cf5a-4650-b6dd-478540830c2a"), UUID.fromString("eb7e55c2-012b-419d-881a-58a858894e92"), null, null,
+                "System structure only", null,
+                "Acc", null, "Acc",
+                Status.APPROVED, true, false,
+                date, "test who");
+        ne2 = new NameElement(
+                UUID.fromString("45bdc415-cf5a-4650-b6dd-478540830c2a"), UUID.fromString("eb7e55c2-012b-419d-881a-58a858894e92"), null, null,
+                "System structure only", null,
+                "Acc", null, "Acc",
+                Status.APPROVED, true, false,
+                date, "test who");
+
+        assertEquals(ne1, ne2);
+    }
+
+    @Test
+    void equals2() {
+        ObjectMapper mapper = new ObjectMapper();
+        NameElement ne1 = null, ne2 = null;
+        String json = "{\"uuid\": \"45bdc415-cf5a-4650-b6dd-478540830c2a\", \"parentSystemStructure\": \"eb7e55c2-012b-419d-881a-58a858894e92\", \"parentDeviceStructure\": null, \"systemStructure\": \"Acc\", \"deviceStructure\": null, \"index\": null, \"name\": \"Acc\", \"description\": \"System structure only\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": null}";
+
+        try {
+            ne1 = mapper.readValue(json, NameElement.class);
+            ne2 = mapper.readValue(json, NameElement.class);
+        } catch (JsonMappingException e) {
+            fail();
+        } catch (JsonProcessingException e) {
+            fail();
+        }
+
+        assertEquals(ne1, ne2);
+    }
+
+    @Test
+    void notEquals() {
+        NameElement ne1 = null, ne2 = null;
+        Date date = new Date();
+
+        ne1 = new NameElement(
+                UUID.fromString("45bdc415-cf5a-4650-b6dd-478540830c2a"), UUID.fromString("eb7e55c2-012b-419d-881a-58a858894e92"), null, null,
+                "System structure only", null,
+                "Acc", null, "Acc",
+                Status.APPROVED, true, false,
+                date, "test who");
+        ne2 = new NameElement(
+                UUID.fromString("55bdc415-cf5a-4650-b6dd-478540830c2a"), UUID.fromString("eb7e55c2-012b-419d-881a-58a858894e92"), null, null,
+                "System structure only", null,
+                "Acc", null, "Acc",
+                Status.APPROVED, true, false,
+                date, "test who");
+
+        assertNotEquals(ne1, ne2);
+    }
+
+    @Test
+    void notEquals2() {
+        ObjectMapper mapper = new ObjectMapper();
+        NameElement ne1 = null, ne2 = null;
+        String json  = "{\"uuid\": \"45bdc415-cf5a-4650-b6dd-478540830c2a\", \"parentSystemStructure\": \"eb7e55c2-012b-419d-881a-58a858894e92\", \"parentDeviceStructure\": null, \"systemStructure\": \"Acc\", \"deviceStructure\": null, \"index\": null, \"name\": \"Acc\", \"description\": \"System structure only\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": null}";
+        String json2 = "{\"uuid\": \"55bdc415-cf5a-4650-b6dd-478540830c2a\", \"parentSystemStructure\": \"eb7e55c2-012b-419d-881a-58a858894e92\", \"parentDeviceStructure\": null, \"systemStructure\": \"Acc\", \"deviceStructure\": null, \"index\": null, \"name\": \"Acc\", \"description\": \"System structure only\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": null}";
+
+        try {
+            ne1 = mapper.readValue(json,  NameElement.class);
+            ne2 = mapper.readValue(json2, NameElement.class);
+        } catch (JsonMappingException e) {
+            fail();
+        } catch (JsonProcessingException e) {
+            fail();
+        }
+
+        assertNotEquals(ne1, ne2);
+    }
+
+}
diff --git a/src/test/java/org/openepics/names/rest/beans/element/StructureElementTest.java b/src/test/java/org/openepics/names/rest/beans/element/StructureElementTest.java
new file mode 100644
index 00000000..dfa483c6
--- /dev/null
+++ b/src/test/java/org/openepics/names/rest/beans/element/StructureElementTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2023 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.rest.beans.element;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.Date;
+import java.util.UUID;
+
+import org.junit.jupiter.api.Test;
+import org.openepics.names.rest.beans.Status;
+import org.openepics.names.rest.beans.Type;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Unit tests for StructureElement class.
+ *
+ * @author Lars Johansson
+ *
+ * @see StructureElement
+ */
+class StructureElementTest {
+
+    @Test
+    void equals() {
+        StructureElement se1 = null, se2 = null;
+        Date date = new Date();
+
+        se1 = new StructureElement(
+                UUID.fromString("a14a8565-de10-4026-97e3-ab129ffaba96"), Type.SYSTEM, UUID.fromString("05d52f1c-391e-41e3-a48f-dc8f36f8329b"), "name", "AA1",
+                "description", "comment",
+                "AA1", 2,
+                Status.APPROVED, true, false,
+                date, "test who");
+        se2 = new StructureElement(
+                UUID.fromString("a14a8565-de10-4026-97e3-ab129ffaba96"), Type.SYSTEM, UUID.fromString("05d52f1c-391e-41e3-a48f-dc8f36f8329b"), "name", "AA1",
+                "description", "comment",
+                "AA1", 2,
+                Status.APPROVED, true, false,
+                date, "test who");
+
+        assertEquals(se1, se2);
+    }
+
+    @Test
+    void equals2() {
+        ObjectMapper mapper = new ObjectMapper();
+        StructureElement se1 = null, se2 = null;
+        String json = "{\"uuid\": \"a14a8565-de10-4026-97e3-ab129ffaba96\", \"type\": \"SYSTEM\", \"parent\": \"05d52f1c-391e-41e3-a48f-dc8f36f8329b\", \"name\": \"name\", \"mnemonic\": \"AA1\", \"mnemonicPath\": \"AA1\", \"level\": \"2\", \"description\": \"description\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": \"comment\"};";
+
+        try {
+            se1 = mapper.readValue(json, StructureElement.class);
+            se2 = mapper.readValue(json, StructureElement.class);
+        } catch (JsonMappingException e) {
+            fail();
+        } catch (JsonProcessingException e) {
+            fail();
+        }
+
+        assertEquals(se1, se2);
+    }
+
+    @Test
+    void notEquals() {
+        StructureElement se1 = null, se2 = null;
+        Date date = new Date();
+
+        se1 = new StructureElement(
+                UUID.fromString("a14a8565-de10-4026-97e3-ab129ffaba96"), Type.SYSTEM, UUID.fromString("05d52f1c-391e-41e3-a48f-dc8f36f8329b"), "name", "AA1",
+                "description", "comment",
+                "AA1", 2,
+                Status.APPROVED, true, false,
+                date, "test who");
+        se2 = new StructureElement(
+                UUID.fromString("b14a8565-de10-4026-97e3-ab129ffaba96"), Type.SYSTEM, UUID.fromString("05d52f1c-391e-41e3-a48f-dc8f36f8329b"), "name", "AA1",
+                "description", "comment",
+                "AA1", 2,
+                Status.APPROVED, true, false,
+                date, "test who");
+
+        assertNotEquals(se1, se2);
+    }
+
+    @Test
+    void notEquals2() {
+        ObjectMapper mapper = new ObjectMapper();
+        StructureElement se1 = null, se2 = null;
+        String json  = "{\"uuid\": \"a14a8565-de10-4026-97e3-ab129ffaba96\", \"type\": \"SYSTEM\", \"parent\": \"05d52f1c-391e-41e3-a48f-dc8f36f8329b\", \"name\": \"name\", \"mnemonic\": \"AA1\", \"mnemonicPath\": \"AA1\", \"level\": \"2\", \"description\": \"description\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": \"comment\"};";
+        String json2 = "{\"uuid\": \"b14a8565-de10-4026-97e3-ab129ffaba96\", \"type\": \"SYSTEM\", \"parent\": \"05d52f1c-391e-41e3-a48f-dc8f36f8329b\", \"name\": \"name\", \"mnemonic\": \"AA1\", \"mnemonicPath\": \"AA1\", \"level\": \"2\", \"description\": \"description\", \"status\": \"APPROVED\", \"latest\": true, \"deleted\": false, \"when\": null, \"who\": \"test who\", \"comment\": \"comment\"};";
+
+        try {
+            se1 = mapper.readValue(json,  StructureElement.class);
+            se2 = mapper.readValue(json2, StructureElement.class);
+        } catch (JsonMappingException e) {
+            fail();
+        } catch (JsonProcessingException e) {
+            fail();
+        }
+
+        assertNotEquals(se1, se2);
+    }
+
+}
-- 
GitLab