diff --git a/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java b/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
index 342a06f6a447ba4fb43cce8674730216953297c3..9d608063b609a959910c76d9bd5078d3e3ddbc11 100644
--- a/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
+++ b/src/main/java/org/openepics/names/repository/DeviceGroupRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.DeviceGroup;
@@ -86,7 +87,7 @@ public class DeviceGroupRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<DeviceGroup> from = cq.from(DeviceGroup.class);
 
-        cq.where(cb.and(preparePredicatesDeviceGroups(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDeviceGroups(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -167,7 +168,7 @@ public class DeviceGroupRepository {
         CriteriaQuery<DeviceGroup> cq = cb.createQuery(DeviceGroup.class);
         Root<DeviceGroup> from = cq.from(DeviceGroup.class);
 
-        cq.where(cb.and(preparePredicatesDeviceGroups(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDeviceGroups(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -216,6 +217,7 @@ public class DeviceGroupRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -224,18 +226,47 @@ public class DeviceGroupRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesDeviceGroups(
-            CriteriaBuilder cb, Root<DeviceGroup> from,
+            CriteriaBuilder cb, Root<DeviceGroup> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
-
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<DeviceGroup> fromSub = sub.from(DeviceGroup.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java b/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
index f06a8e161e2649f026ad94445743070048defeb5..133a728ce6d800ff7bc6532b11ffc28abb3db8d9 100644
--- a/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
+++ b/src/main/java/org/openepics/names/repository/DeviceTypeRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.DeviceType;
@@ -86,7 +87,7 @@ public class DeviceTypeRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<DeviceType> from = cq.from(DeviceType.class);
 
-        cq.where(cb.and(preparePredicatesDeviceTypes(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDeviceTypes(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -167,7 +168,7 @@ public class DeviceTypeRepository {
         CriteriaQuery<DeviceType> cq = cb.createQuery(DeviceType.class);
         Root<DeviceType> from = cq.from(DeviceType.class);
 
-        cq.where(cb.and(preparePredicatesDeviceTypes(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDeviceTypes(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -216,6 +217,7 @@ public class DeviceTypeRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -224,17 +226,47 @@ public class DeviceTypeRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesDeviceTypes(
-            CriteriaBuilder cb, Root<DeviceType> from,
+            CriteriaBuilder cb, Root<DeviceType> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<DeviceType> fromSub = sub.from(DeviceType.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/main/java/org/openepics/names/repository/DisciplineRepository.java b/src/main/java/org/openepics/names/repository/DisciplineRepository.java
index 77faa2e3dd8f99d30649f01139d94760dd7e342d..44e99978f2efa9272ca00b800939a6a1358e9af6 100644
--- a/src/main/java/org/openepics/names/repository/DisciplineRepository.java
+++ b/src/main/java/org/openepics/names/repository/DisciplineRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.Discipline;
@@ -86,7 +87,7 @@ public class DisciplineRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<Discipline> from = cq.from(Discipline.class);
 
-        cq.where(cb.and(preparePredicatesDisciplines(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDisciplines(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -167,7 +168,7 @@ public class DisciplineRepository {
         CriteriaQuery<Discipline> cq = cb.createQuery(Discipline.class);
         Root<Discipline> from = cq.from(Discipline.class);
 
-        cq.where(cb.and(preparePredicatesDisciplines(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesDisciplines(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -216,6 +217,7 @@ public class DisciplineRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -224,17 +226,47 @@ public class DisciplineRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesDisciplines(
-            CriteriaBuilder cb, Root<Discipline> from,
+            CriteriaBuilder cb, Root<Discipline> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<Discipline> fromSub = sub.from(Discipline.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/main/java/org/openepics/names/repository/NameRepository.java b/src/main/java/org/openepics/names/repository/NameRepository.java
index 4226d7a528bc789e625e0c4ed858b33319e1ffc3..be1ef023554c42996fef5cc7f3da29ef45ea3a66 100644
--- a/src/main/java/org/openepics/names/repository/NameRepository.java
+++ b/src/main/java/org/openepics/names/repository/NameRepository.java
@@ -220,7 +220,15 @@ public class NameRepository {
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (not latest)
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // exclude not latest
+            //     select * from Name n where
+            //         not(n.latest = false)
+
             Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
             Predicate predicateExclude   = cb.not(cb.and(predicateNotLatest));
             predicates.add(predicateExclude);
diff --git a/src/main/java/org/openepics/names/repository/SubsystemRepository.java b/src/main/java/org/openepics/names/repository/SubsystemRepository.java
index 461ab1396a137afece3419c3c06f44815a8623d9..da5c5b796f4e815fe52ed3cdfb61de5f10238026 100644
--- a/src/main/java/org/openepics/names/repository/SubsystemRepository.java
+++ b/src/main/java/org/openepics/names/repository/SubsystemRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.Subsystem;
@@ -86,7 +87,7 @@ public class SubsystemRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<Subsystem> from = cq.from(Subsystem.class);
 
-        cq.where(cb.and(preparePredicatesSubsystems(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSubsystems(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -167,7 +168,7 @@ public class SubsystemRepository {
         CriteriaQuery<Subsystem> cq = cb.createQuery(Subsystem.class);
         Root<Subsystem> from = cq.from(Subsystem.class);
 
-        cq.where(cb.and(preparePredicatesSubsystems(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSubsystems(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -216,6 +217,7 @@ public class SubsystemRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -224,17 +226,47 @@ public class SubsystemRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesSubsystems(
-            CriteriaBuilder cb, Root<Subsystem> from,
+            CriteriaBuilder cb, Root<Subsystem> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<Subsystem> fromSub = sub.from(Subsystem.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/main/java/org/openepics/names/repository/SystemGroupRepository.java b/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
index a87a7c30c56c8c4a1cf49848ccfb2794f37d55b4..1dac14308b8665176b9d6a4c1ff65a01956dd55f 100644
--- a/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
+++ b/src/main/java/org/openepics/names/repository/SystemGroupRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.SystemGroup;
@@ -84,7 +85,7 @@ public class SystemGroupRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<SystemGroup> from = cq.from(SystemGroup.class);
 
-        cq.where(cb.and(preparePredicatesSystemGroups(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSystemGroups(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -163,7 +164,7 @@ public class SystemGroupRepository {
         CriteriaQuery<SystemGroup> cq = cb.createQuery(SystemGroup.class);
         Root<SystemGroup> from = cq.from(SystemGroup.class);
 
-        cq.where(cb.and(preparePredicatesSystemGroups(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSystemGroups(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -212,6 +213,7 @@ public class SystemGroupRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -220,17 +222,47 @@ public class SystemGroupRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesSystemGroups(
-            CriteriaBuilder cb, Root<SystemGroup> from,
+            CriteriaBuilder cb, Root<SystemGroup> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<SystemGroup> fromSub = sub.from(SystemGroup.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/main/java/org/openepics/names/repository/SystemRepository.java b/src/main/java/org/openepics/names/repository/SystemRepository.java
index de838d4918e75eedda3d47994eb78bf5724480be..90c2fc7335df940ce789be122308e19d062760a4 100644
--- a/src/main/java/org/openepics/names/repository/SystemRepository.java
+++ b/src/main/java/org/openepics/names/repository/SystemRepository.java
@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Subquery;
 
 import org.apache.commons.lang3.BooleanUtils;
 import org.openepics.names.repository.model.System;
@@ -86,7 +87,7 @@ public class SystemRepository {
         CriteriaQuery<Long> cq = cb.createQuery(Long.class);
         Root<System> from = cq.from(System.class);
 
-        cq.where(cb.and(preparePredicatesSystems(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSystems(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(cb.count(from));
 
         return em.createQuery(cq).getSingleResult();
@@ -167,7 +168,7 @@ public class SystemRepository {
         CriteriaQuery<System> cq = cb.createQuery(System.class);
         Root<System> from = cq.from(System.class);
 
-        cq.where(cb.and(preparePredicatesSystems(cb, from, statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
+        cq.where(cb.and(preparePredicatesSystems(cb, from, cq.subquery(Long.class), statuses, deleted, queryFields, queryValues, includeHistory).toArray(new Predicate[0])));
         cq.select(from);
 
         if (orderBy != null) {
@@ -216,6 +217,7 @@ public class SystemRepository {
      *
      * @param cb criteria builder
      * @param from criteria query root
+     * @param sub sub query to be used if history not included
      * @param statuses statuses
      * @param deleted deleted
      * @param queryFields query fields
@@ -224,18 +226,47 @@ public class SystemRepository {
      * @return list of predicates
      */
     private List<Predicate> preparePredicatesSystems(
-            CriteriaBuilder cb, Root<System> from,
+            CriteriaBuilder cb, Root<System> from, Subquery<Long> sub,
             Status[] statuses, Boolean deleted, FieldStructure[] queryFields, String[] queryValues, Boolean includeHistory) {
 
         List<Predicate> predicates = new ArrayList<>();
 
         if (!Boolean.TRUE.equals(includeHistory)) {
-            // exclude (approved and not latest)
-            Predicate predicateApproved  = cb.equal(from.get("status"), Status.APPROVED);
-            Predicate predicateNotLatest = cb.equal(from.get("latest"), Boolean.FALSE);
-            Predicate predicateExclude   = cb.not(cb.and(predicateApproved, predicateNotLatest));
-            predicates.add(predicateExclude);
-
+            // purpose of Naming to show valid entries
+            //     therefore
+            //         exclude some values unless history requested
+            //         make sure to not exclude present and future values
+            //
+            // not only
+            //     exclude APPROVED and not latest
+            //          select * from Structure s where
+            //              not(s.status = 'APPROVED' and s.latest = false)
+            // not only
+            //     exclude earlier than APPROVED and latest (considered history)
+            //     include PENDING and not latest           (considered future)
+            //          select * from Structure s where
+            //                 (not s.id < (select id from structure s2 where s2.uuid = s.uuid and s2.latest = true))
+            //              or (s.status = 'PENDING' and s.latest = false)
+            // instead
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+            //         select * from Structure s where
+            //        	      (not s.id < (select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+            //             or (not  exists(select id from system s2 where s2.uuid = s.uuid and s2.latest = true))
+
+            Root<System> fromSub = sub.from(System.class);
+            sub.where(cb.and(
+                    cb.equal(fromSub.get("uuid"),   from.get("uuid")),
+                    cb.equal(fromSub.get("latest"), Boolean.TRUE)
+                    ));
+            sub.select(fromSub.get("id"));
+
+            Predicate predicateExcludeInclude =
+                    cb.or(
+                            cb.not(cb.lessThan(from.get("id").as(Long.class), sub)),
+                            cb.not(cb.exists(sub)));
+            predicates.add(predicateExcludeInclude);
         }
 
         if (statuses != null) {
diff --git a/src/test/java/org/openepics/names/docker/NamesIT.java b/src/test/java/org/openepics/names/docker/NamesIT.java
index 7dfd957a03d86b4672497edb123e3b3fb2c13366..0697e6c975bb7d40e6de4277f2b979f3ca672cba 100644
--- a/src/test/java/org/openepics/names/docker/NamesIT.java
+++ b/src/test/java/org/openepics/names/docker/NamesIT.java
@@ -157,6 +157,50 @@ public class NamesIT {
         deviceTypeTT = approvedStructureElement.getUuid();
     }
 
+    @Test
+    public void equivalenceName() {
+        // purpose
+        //     test name equivalence
+        //
+        // what
+        //     read        equivalence name
+
+        ITUtilNameElement.assertEquivalence("A2T-010PRL:RFS-PRLTap-071", "A2T-10PR1:RFS-PR1TAP-71");
+    }
+
+    @Test
+    public void existsName() {
+        // purpose
+        //     test if name exists
+        //
+        // what
+        //     read        exists name
+
+        ITUtilNameElement.assertExists("RFQ-010PRL:EMR-RFA-071", Boolean.FALSE, Boolean.TRUE);
+    }
+
+    @Test
+    public void isLegacyName() {
+        // purpose
+        //     test if name is legacy name
+        //
+        // what
+        //     read        is legacy name
+
+        ITUtilNameElement.assertIsLegacy("RFQ-010PRL:EMR-RFA-071", Boolean.FALSE);
+    }
+
+    @Test
+    public void isValidToCreateName() {
+        // purpose
+        //     test if name is valid to create
+        //
+        // what
+        //     read        is valid to create name
+
+        ITUtilNameElement.assertIsValidToCreate("RFQ-010PRL:EMR-RFA-071", Boolean.TRUE);
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -762,48 +806,4 @@ public class NamesIT {
         }
     }
 
-    @Test
-    public void equivalenceName() {
-        // purpose
-        //     test name equivalence
-        //
-        // what
-        //     read        equivalence name
-
-        ITUtilNameElement.assertEquivalence("A2T-010PRL:RFS-PRLTap-071", "A2T-10PR1:RFS-PR1TAP-71");
-    }
-
-    @Test
-    public void existsName() {
-        // purpose
-        //     test if name exists
-        //
-        // what
-        //     read        exists name
-
-        ITUtilNameElement.assertExists("RFQ-010PRL:EMR-RFA-071", Boolean.FALSE, Boolean.TRUE);
-    }
-
-    @Test
-    public void isLegacyName() {
-        // purpose
-        //     test if name is legacy name
-        //
-        // what
-        //     read        is legacy name
-
-        ITUtilNameElement.assertIsLegacy("RFQ-010PRL:EMR-RFA-071", Boolean.FALSE);
-    }
-
-    @Test
-    public void isValidToCreateName() {
-        // purpose
-        //     test if name is valid to create
-        //
-        // what
-        //     read        is valid to create name
-
-        ITUtilNameElement.assertIsValidToCreate("RFQ-010PRL:EMR-RFA-071", Boolean.TRUE);
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
index 33ab1437cf3487cef933dca6fea74e7b7ee190b6..42580d07fc6ca855bc11d86801b06d5d44dac225 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceGroupIT.java
@@ -66,6 +66,8 @@ public class StructuresDeviceGroupIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
@@ -99,6 +101,17 @@ public class StructuresDeviceGroupIT {
           discipline2Uuid = approvedStructureElement.getUuid();
     }
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Dg", "DG");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -906,7 +919,7 @@ public class StructuresDeviceGroupIT {
     @Test
     public void readSearchHistoryApprove() {
         // purpose
-        //     test read system group in various ways for create, approve
+        //     test read device group in various ways for create, approve
         //         search
         //         latest
         //         history
@@ -986,7 +999,7 @@ public class StructuresDeviceGroupIT {
     @Test
     public void readSearchHistoryCancel() {
         // purpose
-        //     test read system group in various ways for create, cancel
+        //     test read device group in various ways for create, cancel
         //         search
         //         latest
         //         history
@@ -1066,7 +1079,7 @@ public class StructuresDeviceGroupIT {
     @Test
     public void readSearchHistoryReject() {
         // purpose
-        //     test read system group in various ways for create, reject
+        //     test read device group in various ways for create, reject
         //         search
         //         latest
         //         history
@@ -1143,10 +1156,278 @@ public class StructuresDeviceGroupIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read device type in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 0, 0);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read device type in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DEVICEGROUP, null, disciplineUuid,
+                "name", null, "Di", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 0, 0);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
-        //     test read system group in various ways
+        //     test read device group in various ways
         //         status
         //       ( latest )
         //         deleted
@@ -1505,27 +1786,26 @@ public class StructuresDeviceGroupIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=MNEMONICPATH&queryValues=Di2", 30, 30);
-
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",    5,  5);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",  20, 20);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2",  0,  0);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",   5,  5);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2", 25, 25);
-
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&queryFields=MNEMONICPATH&queryValues=Di2", 15, 15);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",    0,  0);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",  15, 15);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2",  0,  0);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",   0,  0);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?queryFields=MNEMONICPATH&queryValues=Di2",                                                  30, 30);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",                                  5,  5);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",                                20, 20);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2",                                0,  0);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",                                 5,  5);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",               25, 25);
+
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&queryFields=MNEMONICPATH&queryValues=Di2",                                    15, 15);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",                    0,  0);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",                  15, 15);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2",                  0,  0);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",                   0,  0);
             ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2", 15, 15);
 
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&queryFields=MNEMONICPATH&queryValues=Di2", 15, 15);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",   5, 5);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",  5, 5);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2", 0, 0);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",  5, 5);
-            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2", 10, 10);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&queryFields=MNEMONICPATH&queryValues=Di2",                                     15, 15);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=PENDING&queryFields=MNEMONICPATH&queryValues=Di2",                     5,  5);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",                    5,  5);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=CANCELLED&queryFields=MNEMONICPATH&queryValues=Di2",                   0,  0);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=REJECTED&queryFields=MNEMONICPATH&queryValues=Di2",                    5,  5);
+            ITUtilStructureElement.assertRead("/DEVICEGROUP?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONICPATH&queryValues=Di2",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/DEVICEGROUP/" + uuid.toString(),           0, 0);
             ITUtilStructureElement.assertRead("/children/DISCIPLINE/" + disciplineUuid.toString(), -1, 1);
@@ -1534,15 +1814,4 @@ public class StructuresDeviceGroupIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Dg", "DG");
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
index 6cbf0be2670a868d2cbee00fd8c829f27d986ffd..93b75aa7d1ff7b8ed478ff99b5c427595ac26bbc 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDeviceTypeIT.java
@@ -66,6 +66,8 @@ public class StructuresDeviceTypeIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
@@ -99,6 +101,17 @@ public class StructuresDeviceTypeIT {
         deviceGroupUuid = approvedStructureElement.getUuid();
     }
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Dt", "DT");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -909,7 +922,7 @@ public class StructuresDeviceTypeIT {
     @Test
     public void readSearchHistoryApprove() {
         // purpose
-        //     test read system group in various ways for create, approve
+        //     test read device type in various ways for create, approve
         //         search
         //         latest
         //         history
@@ -989,7 +1002,7 @@ public class StructuresDeviceTypeIT {
     @Test
     public void readSearchHistoryCancel() {
         // purpose
-        //     test read system group in various ways for create, cancel
+        //     test read device type in various ways for create, cancel
         //         search
         //         latest
         //         history
@@ -1016,7 +1029,7 @@ public class StructuresDeviceTypeIT {
             // read (1)
             length = ITUtilStructureElement.assertRead("/DEVICETYPE", -1, 1);
 
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",    1, 1);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",   -1, 1);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=APPROVED",  -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=CANCELLED", -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=REJECTED",  -1, 0);
@@ -1042,7 +1055,7 @@ public class StructuresDeviceTypeIT {
             // read (2)
             assertEquals(length, ITUtilStructureElement.assertRead("/DEVICETYPE", -1, 1));
 
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",    0, 0);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",   -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=APPROVED",  -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=CANCELLED", -1, 1);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=REJECTED",  -1, 0);
@@ -1069,7 +1082,7 @@ public class StructuresDeviceTypeIT {
     @Test
     public void readSearchHistoryReject() {
         // purpose
-        //     test read system group in various ways for create, reject
+        //     test read device type in various ways for create, reject
         //         search
         //         latest
         //         history
@@ -1122,7 +1135,7 @@ public class StructuresDeviceTypeIT {
             // read (2)
             assertEquals(length, ITUtilStructureElement.assertRead("/DEVICETYPE", -1, 1));
 
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",    0, 0);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING",   -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=APPROVED",  -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=CANCELLED", -1, 0);
             ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=REJECTED",  -1, 1);
@@ -1146,10 +1159,278 @@ public class StructuresDeviceTypeIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read device type in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "P1", "Di-P1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "C1", "Di-C1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "R1", "Di-R1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "A1", "Di-A1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 1, 1);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read device type in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "P9", "Di-P9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "C9", "Di-C9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "R9", "Di-R9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DEVICETYPE, null, deviceGroupUuid,
+                "name", "A9", "Di-A9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 1, 1);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
-        //     test read system group in various ways
+        //     test read device type in various ways
         //         status
         //       ( latest )
         //         deleted
@@ -1508,27 +1789,26 @@ public class StructuresDeviceTypeIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=MNEMONIC&queryValues=A__", 45, 45);
-
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   10, 10);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  20, 20);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",    5,  5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  15, 15);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",   5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?queryFields=MNEMONIC&queryValues=A__",                                                  45, 45);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                                 10, 10);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                                20, 20);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                                5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                                10, 10);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",               30, 30);
+
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&queryFields=MNEMONIC&queryValues=A__",                                    30, 30);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                  15, 15);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                  5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                   5,  5);
             ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
 
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5, 5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 0, 0);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&queryFields=MNEMONIC&queryValues=A__",                                     15, 15);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                     5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                   0,  0);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DEVICETYPE?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/DEVICETYPE/" + uuid.toString(),              0, 0);
             ITUtilStructureElement.assertRead("/children/DEVICEGROUP/" + deviceGroupUuid.toString(), -1, 1);
@@ -1538,15 +1818,4 @@ public class StructuresDeviceTypeIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Dt", "DT");
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
index 5ad6aed10ec9beecf8974536ab8adbe9d1dca3b2..3f8bf24b12a3352018ee22ba47834b1c3595370e 100644
--- a/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresDisciplineIT.java
@@ -65,12 +65,25 @@ public class StructuresDisciplineIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
         new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml"))
             .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Di", "D1");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -1074,10 +1087,278 @@ public class StructuresDisciplineIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read discipline in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "P1", "P1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "C1", "C1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "R1", "R1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "A1", "A1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 1, 1);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read discipline in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "P9", "P9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "C9", "C9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "R9", "R9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.DISCIPLINE, null, null,
+                "name", "A9", "A9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 1, 1);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
-        //     test read system group in various ways
+        //     test read discipline in various ways
         //         status
         //       ( latest )
         //         deleted
@@ -1436,27 +1717,26 @@ public class StructuresDisciplineIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=MNEMONIC&queryValues=A__", 45, 45);
-
-            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   10, 10);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  20, 20);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",    5,  5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  15, 15);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",   5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?queryFields=MNEMONIC&queryValues=A__",                                                  45, 45);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                                 10, 10);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                                20, 20);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                                5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                                10, 10);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",               30, 30);
+
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&queryFields=MNEMONIC&queryValues=A__",                                    30, 30);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                  15, 15);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                  5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                   5,  5);
             ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
 
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5, 5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 0, 0);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&queryFields=MNEMONIC&queryValues=A__",                                     15, 15);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                     5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                   0,  0);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/DISCIPLINE?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/DISCIPLINE/" + uuid.toString(), 0, 0);
         } catch (Exception e) {
@@ -1464,15 +1744,4 @@ public class StructuresDisciplineIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Di", "D1");
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
index 76de6b5a72cfc45e18f02d6cf8dc8ba891a449d0..e42cb7dc442cc57d7d77530cc8508603c87bcfb9 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSubsystemIT.java
@@ -66,6 +66,8 @@ public class StructuresSubsystemIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
@@ -99,6 +101,17 @@ public class StructuresSubsystemIT {
         systemUuid = approvedStructureElement.getUuid();
     }
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Sub", "SUB");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -915,7 +928,7 @@ public class StructuresSubsystemIT {
     @Test
     public void readSearchHistoryApprove() {
         // purpose
-        //     test read system group in various ways for create, approve
+        //     test read subsystem in various ways for create, approve
         //         search
         //         latest
         //         history
@@ -1007,7 +1020,7 @@ public class StructuresSubsystemIT {
     @Test
     public void readSearchHistoryCancel() {
         // purpose
-        //     test read system group in various ways for create, cancel
+        //     test read subsystem in various ways for create, cancel
         //         search
         //         latest
         //         history
@@ -1099,7 +1112,7 @@ public class StructuresSubsystemIT {
     @Test
     public void readSearchHistoryReject() {
         // purpose
-        //     test read system group in various ways for create, reject
+        //     test read subsystem in various ways for create, reject
         //         search
         //         latest
         //         history
@@ -1188,10 +1201,278 @@ public class StructuresSubsystemIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read subsystem in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "P1", "Sys-P1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "C1", "Sys-C1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "R1", "Sys-R1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "A1", "Sys-A1", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 1, 1);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read subsystem in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "P9", "Sys-P9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "C9", "Sys-C9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "R9", "Sys-R9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SUBSYSTEM, null, systemUuid,
+                "name", "A9", "Sys-A9", 3,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 1, 1);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
-        //     test read system group in various ways
+        //     test read subsystem in various ways
         //         status
         //       ( latest )
         //         deleted
@@ -1550,27 +1831,26 @@ public class StructuresSubsystemIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=MNEMONIC&queryValues=A__", 45, 45);
-
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   10, 10);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  20, 20);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",    5,  5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  15, 15);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",   5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?queryFields=MNEMONIC&queryValues=A__",                                                  45, 45);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                                 10, 10);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                                20, 20);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                                5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                                10, 10);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",               30, 30);
+
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&queryFields=MNEMONIC&queryValues=A__",                                    30, 30);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                  15, 15);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                  5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                   5,  5);
             ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
 
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5, 5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 0, 0);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&queryFields=MNEMONIC&queryValues=A__",                                     15, 15);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                     5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                   0,  0);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SUBSYSTEM?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/SUBSYSTEM/" + uuid.toString(),               0, 0);
             ITUtilStructureElement.assertRead("/children/SYSTEM/" + systemUuid.toString(),           -1, 1);
@@ -1580,15 +1860,4 @@ public class StructuresSubsystemIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Sub", "SUB");
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
index 2493245c1de40717135b30bf5fd28919d1124801..60738c8c596810cc915723eb2cdf6efb5502fc7f 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemGroupIT.java
@@ -66,12 +66,25 @@ public class StructuresSystemGroupIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
         new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml"))
             .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Sg", "SG");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -1120,6 +1133,274 @@ public class StructuresSystemGroupIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read system group in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "P1", "P1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "C1", "C1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "R1", "R1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "A1", "A1", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 1, 1);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read system group in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "P9", "P9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "C9", "C9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "R9", "R9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SYSTEMGROUP, null, null,
+                "name", "A9", "A9", 1,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 1, 1);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
@@ -1482,27 +1763,26 @@ public class StructuresSystemGroupIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=MNEMONIC&queryValues=A__", 45, 45);
-
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",  10, 10);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?queryFields=MNEMONIC&queryValues=A__",                                                  45, 45);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                                 10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                                20, 20);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                                5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                                10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",               30, 30);
+
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&queryFields=MNEMONIC&queryValues=A__",                                    30, 30);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                  15, 15);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                  5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                   5,  5);
             ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
 
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 0, 0);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&queryFields=MNEMONIC&queryValues=A__",                                     15, 15);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                     5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                   0,  0);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEMGROUP?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/SYSTEMGROUP/" + uuid.toString(), 0, 0);
         } catch (Exception e) {
@@ -1510,15 +1790,4 @@ public class StructuresSystemGroupIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Sg", "SG");
-    }
-
 }
diff --git a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
index dd482fa5108d8bb414b4fcb7309cd9762dfdabd9..b25511a9d146da309d8dc93d9966961253e2c8d3 100644
--- a/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
+++ b/src/test/java/org/openepics/names/docker/StructuresSystemIT.java
@@ -66,6 +66,8 @@ public class StructuresSystemIT {
     //         client side
     //             type, uuid, parent uuid, name, mnemonic, description, comment
     //         may be set client side for test purposes
+    //     order of methods in test not known
+    //         therefore mnemonic values chosen to not interfere with mnemonic values in other methods
 
     @Container
     public static final DockerComposeContainer<?> ENVIRONMENT =
@@ -90,6 +92,17 @@ public class StructuresSystemIT {
         systemGroupUuid = approvedStructureElement.getUuid();
     }
 
+    @Test
+    public void equivalenceMnemonic() {
+        // purpose
+        //     test mnemonic equivalence
+        //
+        // what
+        //     read        equivalence mnemonic
+
+        ITUtilStructureElement.assertEquivalence("Sys", "SYS");
+    }
+
     @Test
     public void checkCreate() {
         // purpose
@@ -903,7 +916,7 @@ public class StructuresSystemIT {
     @Test
     public void readSearchHistoryApprove() {
         // purpose
-        //     test read system group in various ways for create, approve
+        //     test read system in various ways for create, approve
         //         search
         //         latest
         //         history
@@ -983,7 +996,7 @@ public class StructuresSystemIT {
     @Test
     public void readSearchHistoryCancel() {
         // purpose
-        //     test read system group in various ways for create, cancel
+        //     test read system in various ways for create, cancel
         //         search
         //         latest
         //         history
@@ -1063,7 +1076,7 @@ public class StructuresSystemIT {
     @Test
     public void readSearchHistoryReject() {
         // purpose
-        //     test read system group in various ways for create, reject
+        //     test read system in various ways for create, reject
         //         search
         //         latest
         //         history
@@ -1140,10 +1153,278 @@ public class StructuresSystemIT {
         }
     }
 
+    @Test
+    public void readSearchHistoryStatusLatest1() {
+        // purpose
+        //     test read system in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         1 entry for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "P1", "P1", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreate(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "C1", "C1", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateCancel(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "R1", "R1", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateReject(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "A1", "A1", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/C1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/R1", 0, 0);
+            ITUtilStructureElement.assertRead("/mnemonic/A1", 1, 1);
+
+            // normally expected number of entries are 1, 2, 2, 2
+            // since within 1 second from requested to processed, expected number of entries 1, 1, 1, 1
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 1, 1);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 1, 1);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    public void readSearchHistoryStatusLatest9() {
+        // purpose
+        //     test read system in various ways
+        //         status
+        //         latest
+        //       ( deleted )
+        //         history
+        //
+        // what
+        //     entries with different statuses
+        //
+        // note
+        //     create (and more) to read (with content)
+        //     4 different lines  of uuid with combinations of status and latest
+        //         9 entries for each line of uuid
+        //         in particular different statuses for last entry in lines of uuid
+        //         mnemonic - P, C, R, A (pending, cancelled, rejected, approved)
+        //
+        // note!
+        //     not only
+        //         exclude APPROVED and not latest
+        //     not only
+        //         exclude earlier than APPROVED and latest (considered history)
+        //         include PENDING and not latest           (considered future)
+        //     instead
+        //         exclude earlier than APPROVED and latest (considered history)
+        //       ( include if latest )
+        //         include if latest not exists             (considered present + future)
+
+        StructureElement structureElement         = null;
+        StructureElement responseStructureElement = null;
+        UUID uuid, uuid2, uuid3, uuid4 = null;
+
+        // a number of entries for which the last entry has status PENDING
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "P9", "P9", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdate(responseStructureElement);
+
+        // a number of entries for which the last entry has status CANCELLED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "C9", "C9", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid2 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+
+        // a number of entries for which the last entry has status REJECTED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "R9", "R9", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid3 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+
+        // a number of entries for which the last entry has status APPROVED
+        structureElement = new StructureElement(
+                Type.SYSTEM, null, systemGroupUuid,
+                "name", "A9", "A9", 2,
+                "description", Status.PENDING, Boolean.FALSE, Boolean.FALSE,
+                null, "test who", "test comment 1");
+        responseStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        uuid4 = responseStructureElement.getUuid();
+
+        responseStructureElement.setComment("test comment 2");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 3");
+        responseStructureElement = ITUtilStructureElement.assertUpdateCancel(responseStructureElement);
+        responseStructureElement.setComment("test comment 4");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 5");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 6");
+        responseStructureElement = ITUtilStructureElement.assertUpdateReject(responseStructureElement);
+        responseStructureElement.setComment("test comment 7");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 8");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+        responseStructureElement.setComment("test comment 9");
+        responseStructureElement = ITUtilStructureElement.assertUpdateApprove(responseStructureElement);
+
+        try {
+            // from first structure element
+            assertNotNull(uuid);
+
+            // note
+            //     exclude earlier than APPROVED and latest (considered history)
+            //   ( include if latest )
+            //     include if latest not exists             (considered present + future)
+
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid.toString(),  2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid2.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid3.toString(), 2, 2);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=UUID&queryValues=" + uuid4.toString(), 1, 1);
+
+            ITUtilStructureElement.assertRead("/mnemonic/P9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/C9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/R9", 1, 1);
+            ITUtilStructureElement.assertRead("/mnemonic/A9", 1, 1);
+
+            // normally expected number of entries are 17, 18, 18, 18
+            // since within 1 second from requested to processed, expected number of entries 9, 9, 9, 9
+            ITUtilStructureElement.assertRead("/history/" + uuid.toString(),  9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid2.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid3.toString(), 9, 9);
+            ITUtilStructureElement.assertRead("/history/" + uuid4.toString(), 9, 9);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
     @Test
     public void readSearchStatusDeletedChildren() {
         // purpose
-        //     test read system group in various ways
+        //     test read system in various ways
         //         status
         //       ( latest )
         //         deleted
@@ -1502,27 +1783,26 @@ public class StructuresSystemIT {
             // from first structure element
             assertNotNull(uuid);
 
-            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=MNEMONIC&queryValues=A__", 45, 45);
-
-            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   10, 10);
-            ITUtilStructureElement.assertRead("/SYSTEM?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  20, 20);
-            ITUtilStructureElement.assertRead("/SYSTEM?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEM?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
-            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&queryFields=MNEMONIC&queryValues=A__", 30, 30);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",    5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  15, 15);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",  5,  5);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",   5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?queryFields=MNEMONIC&queryValues=A__",                                                  45, 45);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                                 10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                                20, 20);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                                5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                                10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEM?statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",               30, 30);
+
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&queryFields=MNEMONIC&queryValues=A__",                                    30, 30);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                  15, 15);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                  5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                   5,  5);
             ITUtilStructureElement.assertRead("/SYSTEM?deleted=false&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 20, 20);
 
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&queryFields=MNEMONIC&queryValues=A__", 15, 15);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",   5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__", 0, 0);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",  5, 5);
-            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__", 10, 10);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&queryFields=MNEMONIC&queryValues=A__",                                     15, 15);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=PENDING&queryFields=MNEMONIC&queryValues=A__",                     5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=CANCELLED&queryFields=MNEMONIC&queryValues=A__",                   0,  0);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=REJECTED&queryFields=MNEMONIC&queryValues=A__",                    5,  5);
+            ITUtilStructureElement.assertRead("/SYSTEM?deleted=true&statuses=PENDING&statuses=APPROVED&queryFields=MNEMONIC&queryValues=A__",  10, 10);
 
             ITUtilStructureElement.assertRead("/children/SYSTEM/" + uuid.toString(),                  0, 0);
             ITUtilStructureElement.assertRead("/children/SYSTEMGROUP/" + systemGroupUuid.toString(), -1, 1);
@@ -1531,15 +1811,4 @@ public class StructuresSystemIT {
         }
     }
 
-    @Test
-    public void equivalenceMnemonic() {
-        // purpose
-        //     test mnemonic equivalence
-        //
-        // what
-        //     read        equivalence mnemonic
-
-        ITUtilStructureElement.assertEquivalence("Sys", "SYS");
-    }
-
 }