diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
index f59edf8af827b9536910eae0c75e2e8aa9dfef78..835d05314fb830968cdab5095aa70d08cd5385ab 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreBuilder.java
@@ -114,7 +114,7 @@ public final class DublinCoreBuilder {
     for (String dcdate : dates) {
       ElementType dateElement = new ElementType();
       JAXBElement<ElementType> dcCoreDate = oaiDcObj.createDate(dateElement);
-      dateElement.setValue(OaipmhUtilities.oaiDatestampAsString(dcdate));
+      dateElement.setValue(dcdate);
       this.tgMappedDC.getTitleOrCreatorOrSubject().add(dcCoreDate);
     }
   }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
index 2d780b859efed754b7f2dcd0d896bd3b6ef27803..6801e39c535d5a46202f2ad5ac34ac337e588c1b 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/DublinCoreFieldLoader.java
@@ -15,14 +15,12 @@ import org.elasticsearch.search.SearchHit;
  * </p>
  * 
  * <p>
- * For each element two functions are necessary because the datatype "SeachHit" could contain more
+ * For each element two functions are necessary because the data type "SeachHit" could contain more
  * then one results and the GetResponse just one.
  * </p>
  * 
  * @author Maximilian Brodhun, SUB Göttingen
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2019-10-29
- * @since 2014-02-18
  */
 public class DublinCoreFieldLoader {
 
@@ -49,25 +47,15 @@ public class DublinCoreFieldLoader {
    */
   public static List<String> setDate(GetResponse responseWorkValues, String[] fields) {
 
-    // TODO We don't need this here, I suppose? We have to check the dates here!
-    // return fillList(responseWorkValues, fields);
-
     List<String> dates = new ArrayList<String>();
 
     // Transform to OAI-PMH certificated time stamp
     if (responseWorkValues.isExists()) {
       for (String field : fields) {
-        try {
-          // TODO Set values in config file!
-          if (responseWorkValues.getField(field) != null) {
-            dates.add(OaipmhUtilities
-                .oaiDatestampAsString(responseWorkValues.getField(field).getValue().toString()));
-          }
-        } catch (ParseException e) {
-          // TODO Do not use invalid dates here!
+        // TODO Set values in config file!
+        if (responseWorkValues.getField(field) != null) {
+          // We need ISO8601 here, take entries as they come from ElasticSearch!
           dates.add(responseWorkValues.getField(field).getValue().toString());
-          log.fine("tried to parse date value: "
-              + responseWorkValues.getField(field).getValue().toString());
         }
       }
     }
@@ -86,13 +74,8 @@ public class DublinCoreFieldLoader {
 
     for (String field : fields) {
       if (hit.getFields().get(field) != null) {
-        try {
-          dates.add(OaipmhUtilities
-              .oaiDatestampAsString(hit.getFields().get(field).getValues().get(0).toString()));
-        } catch (ParseException e) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-        }
+        // We need ISO8601 here, take entries as they come from ElasticSearch!
+        dates.add(hit.getFields().get(field).getValues().get(0).toString());
       }
     }
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
index c6206eba11c01b87e3093605b887ea1e6b2dd20f..f5ab2f45d001c71e1460fde292911d84b41b0fe3 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererAbstract.java
@@ -1,7 +1,5 @@
 package info.textgrid.middleware;
 
-
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -18,8 +16,6 @@ import info.textgrid.middleware.oaipmh.ResumptionTokenType;
 
 /**
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2023-01-10
- * @since 2014-02-20
  */
 public abstract class IdentifierListDelivererAbstract implements IdentifierListDelivererInterface {
 
@@ -47,7 +43,6 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
   protected long resultSize;
   protected int searchResponseSize;
   protected ResumptionTokenType resTokenForResponse;
-  protected String datestamp;
   protected boolean idExist = true;
   protected String[] identifierListFields; // Fields for the elasticsearch request
   protected String rangeField; // Field for the optional range query
@@ -128,20 +123,14 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
   public SearchResponse hitHandling(SearchResponse listFurtherValues, ListIdentifiersType lit,
       String set, String resumptionToken, Map<String, Integer> cursorCollector) {
 
-    int i = 0;
     long size = listFurtherValues.getHits().totalHits;
     setResultSize(size);
 
     for (SearchHit hit : listFurtherValues.getHits().getHits()) {
-      i++;
       // Handle TextGrid.
       if (this.textgrid) {
         String datestamp = hit.getSourceAsMap().get(this.dateOfObjectCreation).toString();
-        try {
-          datestamp = OaipmhUtilities.oaiDatestampAsString(datestamp);
-        } catch (ParseException e) {
-          log.severe(e.getMessage());
-        }
+        datestamp = OaipmhUtilities.getUTCDateAsString(datestamp);
         String identifier = hit.getSourceAsMap().get(this.identifierField).toString();
         lit = setListIdentifierHeader(datestamp, identifier, lit, set);
       }
@@ -149,26 +138,17 @@ public abstract class IdentifierListDelivererAbstract implements IdentifierListD
       // Handle DARIAH.
       else if (this.dariah) {
         JSONObject json = new JSONObject(hit.getSourceAsMap());
-
-        // Get modifiedDate field and convert datestamp.
-        this.datestamp = OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation);
-        try {
-          this.datestamp = OaipmhUtilities.oaiDatestampAsString(this.datestamp);
-        } catch (ParseException e) {
-          log.severe(e.getMessage());
-          // TODO Go to ERROR state!
-        }
-
-        // Get identifier field.
-        String identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField);
-        lit = setListIdentifierHeader(this.datestamp, identifier, lit, set);
+        String datestamp = OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation);
+        datestamp = OaipmhUtilities.getUTCDateAsString(datestamp);
+        String identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField);
+        lit = setListIdentifierHeader(datestamp, identifier, lit, set);
       }
     }
 
     // Check the need for a resumption token!
     ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken(
         listFurtherValues.getHits().getTotalHits(), resumptionToken, cursorCollector,
-        listFurtherValues.getScrollId(), this.searchResponseSize, i);
+        listFurtherValues.getScrollId(), this.searchResponseSize);
     if (responseToken != null) {
       lit.setResumptionToken(responseToken);
     }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
index 489a00624e24bf3e7f6523670d737a5e680d5fb2..4b483374e9bedd653d955222f854bec7b2003696 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdentifierListDelivererIdiom.java
@@ -141,22 +141,19 @@ public class IdentifierListDelivererIdiom extends IdentifierListDelivererAbstrac
 
     if (completeListSize > 0) {
       setFoundItems(true);
-      int i = 0;
 
       for (SearchHit hit : scrollResp.getHits().getHits()) {
-        i++;
         String textgridURI = OaipmhUtilities
-            .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField);
-        String createdDate = OaipmhUtilities.oaiDatestampAsString(OaipmhUtilities
-            .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.rangeField));
-
+            .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField);
+        String createdDate = OaipmhUtilities.getUTCDateAsString(OaipmhUtilities
+            .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.rangeField));
         identifierList.getHeader().add(OaipmhUtilities.computeResponseHeader(createdDate,
             OaipmhUtilities.getTextGridBaseURI(textgridURI), ""));
       }
 
       // Check the need for a resumption token!
       ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken(completeListSize,
-          resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE, i);
+          resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE);
       if (responseToken != null) {
         identifierList.setResumptionToken(responseToken);
       }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java b/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
index de9a118f29a2daeb26113d52d72fe6929e3093fe..76283c910403ea13ec0e489e1ab4a3ddf77273d7 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/IdiomImages.java
@@ -220,7 +220,7 @@ public class IdiomImages implements RecordDelivererInterface, RecordListDelivere
       // Use base URI for IDIOM image delivery!
       String tgBaseURI = OaipmhUtilities.getTextGridBaseURI(changedID);
       conedaKorRecord.setHeader(buildOAIPMHRecordHeader(
-          OaipmhUtilities.oaiDatestampAsString(immByTGObject.getCreationDate()), tgBaseURI));
+          OaipmhUtilities.getUTCDateAsString(immByTGObject.getCreationDate()), tgBaseURI));
 
       singleImageMetsMods.setRecord(conedaKorRecord);
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java
index 8439befbad719f87786d171bb569e1fbae1e1c74..0e4bce6e3a9910b1664acd82a68b95a1671cec41 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererAbstract.java
@@ -16,16 +16,6 @@ public abstract class MetadataFormatListDelivererAbstract
 
   protected OaipmhElasticSearchClient oaiEsClient;
 
-  private boolean idExist = true;
-
-  /**
-   * @param textgrid
-   * @param dariah
-   */
-  public MetadataFormatListDelivererAbstract() {
-    //
-  }
-
   /**
    *
    */
@@ -41,7 +31,7 @@ public abstract class MetadataFormatListDelivererAbstract
     mft.setSchema(OaipmhConstants.OAIDC_SCHEMA_LOCATION);
     result.getMetadataFormat().add(mft);
 
-    // Add metadata format for OPEN AIRE.
+    // Add metadata format for (oai_datacite).
     MetadataFormatType mftOpenAire = new MetadataFormatType();
     mftOpenAire.setMetadataNamespace(OaipmhConstants.DATACITE_NAMESPACE);
     mftOpenAire.setMetadataPrefix(OaipmhConstants.METADATA_OPENAIRE_PREFIX);
@@ -75,20 +65,6 @@ public abstract class MetadataFormatListDelivererAbstract
   // GETTERS & SETTERS
   //
 
-  /**
-   * @return
-   */
-  public boolean isIdExist() {
-    return this.idExist;
-  }
-
-  /**
-   * @param idExist
-   */
-  public void setIdExist(boolean idExist) {
-    this.idExist = idExist;
-  }
-
   /**
    * @return
    */
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java
index 38ac270b2d45cd9715da22c98373cdf7df13d103..c2d361a1f2ef9d9ac2549a391ad7752b8ab0f89d 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererDH.java
@@ -7,20 +7,13 @@ import info.textgrid.middleware.oaipmh.ListMetadataFormatsType;
  */
 public class MetadataFormatListDelivererDH extends MetadataFormatListDelivererAbstract {
 
-  /**
-   * @param textgrid
-   * @param dariah
-   */
-  public MetadataFormatListDelivererDH() {
-    // NOTE We do not have specific metadata formats for DHREP right now.
-  }
-
   /**
    *
    */
   @Override
   public ListMetadataFormatsType setMetadataFormatList(String id) {
-    // Get things from abstract class.
+    // Get things from abstract class, we do not have different metadata formats for different
+    // identifiers! Get the two defaults here.
     return super.setMetadataFormatList();
   }
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java
index 2ad0e6512d83f937619e8d10ee8f17a5dcc07369..334fe565fbe3827cf7f662fefdab26889f3f5ac2 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/MetadataFormatListDelivererTG.java
@@ -20,13 +20,6 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb
 
   public static final String URI = "textgridUri";
 
-  /**
-   * 
-   */
-  public MetadataFormatListDelivererTG() {
-    //
-  }
-
   /**
    * <p>
    * Get metadata format list for specific ID.
@@ -35,14 +28,12 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb
   @Override
   public ListMetadataFormatsType setMetadataFormatList(String id) {
 
+    ListMetadataFormatsType result = new ListMetadataFormatsType();
+
     String[] includes = new String[] {URI};
     String[] excludes = Strings.EMPTY_ARRAY;
     FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
 
-    ListMetadataFormatsType lmft = new ListMetadataFormatsType();
-    MetadataFormatType mft = new MetadataFormatType();
-    MetadataFormatType openAireMetadataFormat = new MetadataFormatType();
-
     GetRequest getRequest =
         new GetRequest(this.oaiEsClient.getEsIndex(), this.oaiEsClient.getEsType(),
             id.replace("textgrid:", "")).fetchSourceContext(fetchSourceContext);
@@ -51,29 +42,18 @@ public class MetadataFormatListDelivererTG extends MetadataFormatListDelivererAb
     try {
       tgObject = this.oaiEsClient.getEsClient().get(getRequest, RequestOptions.DEFAULT);
 
+      // Check if object is existing in TG.
       if (tgObject.isExists()) {
-        setIdExist(true);
-        mft.setMetadataPrefix(OaipmhConstants.METADATA_OAIDC_PREFIX);
-        mft.setMetadataNamespace(OaipmhConstants.OAIDC_NAMESPACE);
-        mft.setSchema(OaipmhConstants.OAIDC_SCHEMA_LOCATION);
-
-        openAireMetadataFormat.setMetadataPrefix(OaipmhConstants.METADATA_OPENAIRE_PREFIX);
-        openAireMetadataFormat.setMetadataNamespace(OaipmhConstants.DATACITE_NAMESPACE);
-        openAireMetadataFormat.setSchema(OaipmhConstants.DATACITE_SCHEMA_LOCATION);
+        result = setMetadataFormatList();
 
-        lmft.getMetadataFormat().add(mft);
-        lmft.getMetadataFormat().add(openAireMetadataFormat);
-
-      } else {
-        setIdExist(false);
-        lmft = null;
+        // TODO Check here, if object is existing in IDIOM?
       }
     } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
 
-    return lmft;
+    return result;
   }
 
   /**
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
index f02e9f374be049a7bf45516900c7aec830745ef4..710d26b77a3d6e0b2713cc6ea13fbdd677e170b6 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhConstants.java
@@ -19,7 +19,7 @@ public final class OaipmhConstants {
   // Namespaces
   public static final String OAIPMH_NAMESPACE = "http://www.openarchives.org/OAI/2.0/";
   public static final String OAIPMH_SCHEMA_LOCATION =
-      "https://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
+      "http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";
 
   public static final String OAIDC_NAMESPACE = "http://www.openarchives.org/OAI/2.0/oai_dc/";
   public static final String OAIDC_SCHEMA_LOCATION =
@@ -30,14 +30,14 @@ public final class OaipmhConstants {
       "https://dublincore.org/schemas/xmls/simpledc20021212.xsd";
 
   public static final String METS_NAMESPACE = "http://www.loc.gov/METS/";
-  public static final String METS_SCHEMA_LOCATION = "https://www.loc.gov/standards/mets/mets.xsd";
+  public static final String METS_SCHEMA_LOCATION = "http://www.loc.gov/standards/mets/mets.xsd";
 
   public static final String IDIOM_IMAGE_NAMESPACE = METS_NAMESPACE;
   public static final String IDIOM_IMAGE_SCHEMA_LOCATION = METS_SCHEMA_LOCATION;
 
   public static final String DATACITE_NAMESPACE = "http://datacite.org/schema/kernel-3";
   public static final String DATACITE_SCHEMA_LOCATION =
-      "https://schema.datacite.org/meta/kernel-3/metadata.xsd";
+      "http://schema.datacite.org/meta/kernel-3/metadata.xsd";
 
   // Error String Constants.
   public static final String OAI_BAD_ARGUMENT = "BadArgument";
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java
index a7cad1e61a3e63a1aaa60bd141ab7c6ea631d615..a566ecc7daf07d0fe2675911d038912699a76d3e 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhImpl.java
@@ -30,8 +30,6 @@ import info.textgrid.middleware.oaipmh.VerbType;
  * 
  * @author Maximilian Brodhun, SUB Göttingen
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2023-01-06
- * @since 2014-01-29
  */
 public class OaipmhImpl implements OaipmhProducer {
 
@@ -419,6 +417,9 @@ public class OaipmhImpl implements OaipmhProducer {
       }
 
       if (listIdentifiers != null) {
+        if (listIdentifiers.getHeader() == null || listIdentifiers.getHeader().isEmpty()) {
+          return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, "");
+        }
         oaipmhRoot.setListIdentifiers(listIdentifiers);
       } else {
         return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH,
@@ -481,9 +482,10 @@ public class OaipmhImpl implements OaipmhProducer {
   public OAIPMHtype listMetadataFormatsRequest(String id, OAIPMHtype oaipmhRoot,
       RequestType request) {
 
-    List<String> errorValues = new ArrayList<String>();
     ListMetadataFormatsType listMF = new ListMetadataFormatsType();
 
+    List<String> errorValues = new ArrayList<String>();
+
     if (this.metadataFormatList.requestChecker(request)) {
 
       if (id.isEmpty()) {
@@ -492,7 +494,7 @@ public class OaipmhImpl implements OaipmhProducer {
         listMF = this.metadataFormatList.setMetadataFormatList(request.getIdentifier());
       }
 
-      if (listMF != null) {
+      if (listMF != null && !listMF.getMetadataFormat().isEmpty()) {
         oaipmhRoot.setListMetadataFormats(listMF);
       } else {
         return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, ILLEGAL_ID);
@@ -617,6 +619,9 @@ public class OaipmhImpl implements OaipmhProducer {
       }
 
       if (listRecords != null) {
+        if (listRecords.getRecord() == null || listRecords.getRecord().isEmpty()) {
+          return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_NO_RECORD_MATCH, "");
+        }
         oaipmhRoot.setListRecords(listRecords);
       } else {
         return oaipmhError(oaipmhRoot, OaipmhConstants.OAI_BAD_ARGUMENT, ILLEGAL_OTHER);
@@ -778,7 +783,7 @@ public class OaipmhImpl implements OaipmhProducer {
 
     // Set the responseDate of today.
     try {
-      oaipmhRoot.setResponseDate(OaipmhUtilities.getXMLGregorianCalendarNow());
+      oaipmhRoot.setResponseDate(OaipmhUtilities.getCurrentUTCDateAsGregorian());
     } catch (DatatypeConfigurationException e) {
       log.severe("datatype configuration failed");
     }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
index c4638b946e7d8f874859fdbf60a9992cad11904b..c9f4017dd8cf26358bd331c55e5b975d12d23875 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/OaipmhUtilities.java
@@ -5,16 +5,18 @@ import java.io.StringWriter;
 import java.math.BigInteger;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
-import java.util.GregorianCalendar;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import java.util.TimeZone;
 import java.util.logging.Logger;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
@@ -33,8 +35,6 @@ import info.textgrid.clients.AuthClient;
 import info.textgrid.clients.tgauth.AuthClientException;
 import info.textgrid.middleware.oaipmh.GetRecordType;
 import info.textgrid.middleware.oaipmh.HeaderType;
-import info.textgrid.middleware.oaipmh.ListMetadataFormatsType;
-import info.textgrid.middleware.oaipmh.MetadataFormatType;
 import info.textgrid.middleware.oaipmh.MetadataType;
 import info.textgrid.middleware.oaipmh.RecordType;
 import info.textgrid.middleware.oaipmh.Resource;
@@ -52,6 +52,10 @@ import info.textgrid.namespaces.middleware.tgauth.ProjectInfo;
  */
 public class OaipmhUtilities {
 
+  // **
+  // STATICS
+  // **
+
   private static Logger log = Logger.getLogger(OaipmhUtilities.class.getName());
 
   // **
@@ -64,9 +68,15 @@ public class OaipmhUtilities {
   public static final String PREFIX_DEVIDER = ":";
   public static final String PREFIX_HDL = "hdl";
   public static final String PREFIX_TEXTGRID = "textgrid";
-  public static final Set<String> IDENTIFIER_PREFIXES_TO_FILTER = new HashSet<String>(Arrays.asList(
-      PREFIX_HDL,
-      PREFIX_TEXTGRID));
+  public static final Set<String> IDENTIFIER_PREFIXES_TO_FILTER =
+      new HashSet<String>(Arrays.asList(PREFIX_HDL, PREFIX_TEXTGRID));
+
+  // Define date formats.
+  public static final String OAIDC_UTC_TIME_FORMAT_String = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+  public static final DateTimeFormatter UTC_FORMATTER =
+      DateTimeFormatter.ofPattern(OAIDC_UTC_TIME_FORMAT_String).withZone(ZoneId.of("UTC"));
+  public static final SimpleDateFormat FROM_UNTIL_FORMAT =
+      new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
 
   // **
   // CLASS
@@ -84,32 +94,6 @@ public class OaipmhUtilities {
   // STATICS
   // **
 
-  /**
-   * @param verb
-   * @return
-   */
-  public static boolean isOAIPMH_RequestArgument(String verb) {
-    String allowedArgument = "^[identifier,from,until,set,resumptionToken,metadataPrefix]*$";
-    return verb.matches(allowedArgument);
-  }
-
-  /**
-   * <p>
-   * Since TextGrid just supports DC the only returned MetadataFormat is DublinCore.
-   * </p>
-   * 
-   * @return
-   */
-  public MetadataFormatType setMetadataFormats() {
-
-    MetadataFormatType tgDublinCore = new MetadataFormatType();
-    tgDublinCore.setMetadataNamespace("http://www.openarchives.org/OAI/2.0/oai_dc/");
-    tgDublinCore.setMetadataPrefix("oai_dc");
-    tgDublinCore.setSchema("http://www.openarchives.org/OAI/2.0/oai_dc.xsd");
-
-    return tgDublinCore;
-  }
-
   /**
    * @return
    * @throws AuthClientException
@@ -135,87 +119,82 @@ public class OaipmhUtilities {
 
   /**
    * <p>
-   * Producing the list of all metadata formats.
+   * Get the current UTC date string for OAI-PMH response dates from current system millis.
    * </p>
    * 
-   * @return tgRepMetadaFormats
+   * @return
    */
-  public ListMetadataFormatsType setMetadataFormatList() {
-
-    ListMetadataFormatsType tgRepMetadataFormats = new ListMetadataFormatsType();
-    MetadataFormatType tgDublinCore = setMetadataFormats();
-    tgRepMetadataFormats.getMetadataFormat().add(tgDublinCore);
-
-    return tgRepMetadataFormats;
+  public static String getCurrentUTCDateAsString() {
+    return UTC_FORMATTER.format(Instant.now());
   }
 
   /**
    * <p>
-   * Calculating the current date and give it back as XMLGregorianCalendar.
+   * Converting a given string representing a date value into the date format required for OAIPMH
+   * and give it back as string.
    * </p>
    * 
-   * @return now
-   * @throws DatatypeConfigurationException
+   * @param originalDateTimeString
+   * @return
    */
-  public static XMLGregorianCalendar getXMLGregorianCalendarNow()
-      throws DatatypeConfigurationException {
-
-    GregorianCalendar gregorianCalendar = new GregorianCalendar();
-    DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
-    XMLGregorianCalendar now = datatypeFactory.newXMLGregorianCalendar(gregorianCalendar);
-
-    return now;
+  public static String getUTCDateAsString(String originalDateTimeString) {
+    return UTC_FORMATTER.format(Instant.from(OffsetDateTime.parse(originalDateTimeString)));
   }
 
   /**
    * <p>
-   * Converting a given string representing a date value into the date format required for OAIPMH
-   * and give it back as XMLGregorianCalendar.
+   * Converting a given string representing a date value into XMLGregorianCalendar.
    * </p>
    * 
    * @param originalDateTimeString
-   * @return xmlCal
-   * @throws ParseException
+   * @return
    * @throws DatatypeConfigurationException
    */
-  public static XMLGregorianCalendar oaiDatestampAsGregorian(String originalDateTimeString)
-      throws ParseException, DatatypeConfigurationException {
-
-    log.fine("original date time string: " + originalDateTimeString);
-
-    SimpleDateFormat tgItemTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
-    Date date = tgItemTime.parse(originalDateTimeString);
-    SimpleDateFormat outFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-    outFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
-    String output2 = outFormatter.format(date);
-    XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(output2);
+  public static XMLGregorianCalendar getUTCDateAsGregorian(String originalDateTimeString)
+      throws DatatypeConfigurationException {
+    return DatatypeFactory.newInstance()
+        .newXMLGregorianCalendar(getUTCDateAsString(originalDateTimeString));
+  }
 
-    return xmlCal;
+  /**
+   * @param originalDateTimeString
+   * @return
+   * @throws DatatypeConfigurationException
+   */
+  public static XMLGregorianCalendar getCurrentUTCDateAsGregorian()
+      throws DatatypeConfigurationException {
+    return getUTCDateAsGregorian(getCurrentUTCDateAsString());
   }
 
   /**
    * <p>
-   * Converting a given string representing a date value into the date format required for OAIPMH
-   * and give it back as string.
+   * Parse incoming date for UTS format.
    * </p>
    * 
-   * @param originalDateTimeString
-   * @return dateOutputAsString
-   * @throws ParseException
+   * @param incomingDate
+   * @return
    */
-  public static String oaiDatestampAsString(String originalDateTimeString) throws ParseException {
+  public static boolean isCorrectFromUntilDate(String incomingDate) {
+
+    boolean result = false;
+
+    log.fine("incoming date: " + incomingDate);
 
-    log.fine("incoming date: " + originalDateTimeString);
+    try {
+      Date d = FROM_UNTIL_FORMAT.parse(incomingDate);
+      FROM_UNTIL_FORMAT.format(d);
+
+      log.fine("date used: " + result);
 
-    SimpleDateFormat tgItemTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
-    Date date = tgItemTime.parse(originalDateTimeString);
-    SimpleDateFormat outFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-    outFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
-    String dateOutputAsString = outFormatter.format(date);
+      result = true;
+    } catch (ParseException e) {
 
-    log.fine("outgoing date: " + dateOutputAsString);
+      log.warning("date not usable for from/until: " + incomingDate);
+
+      result = false;
+    }
 
-    return dateOutputAsString;
+    return result;
   }
 
   /**
@@ -223,140 +202,71 @@ public class OaipmhUtilities {
    * Returns a resumptionToken for a search, if necessary.
    * </p>
    * 
-   * TODO Check if we really must put all these references in!
-   * 
    * @param completeListSize
    * @param resumptionToken
    * @param cursorCollector
    * @param scrollID
    * @param searchResponseSize
-   * @param i
    * @return A resumption token if applicable, null otherwise.
    */
   public static ResumptionTokenType getResumptionToken(final long completeListSize,
       final String resumptionToken, Map<String, Integer> cursorCollector, final String scrollID,
-      final int searchResponseSize, final int i) {
+      final int searchResponseSize) {
 
-    log.fine("Creating a ResumptionToken:\n" + "  CompleteListSize: " + completeListSize + "\n"
-        + "  ResumptionToken: " + resumptionToken + "\n" + "  CursorCollector: " + cursorCollector
-        + "\n" + "  ScrollID: " + scrollID + "\n" + "  SearchResponseSize: " + searchResponseSize
-        + "\n" + "  IterationStep: " + i);
+    ResumptionTokenType result = null;
 
-    int cursor;
+    log.fine("need a resumption token?\n"
+        + "  completeListSize: " + completeListSize + "\n"
+        + "  searchResponseSize: " + searchResponseSize + "\n"
+        + "  resumptionToken: " + resumptionToken + "\n"
+        + "  scrollID: " + scrollID + "\n"
+        + "  cursorCollector (size:" + cursorCollector.size() + "): " + cursorCollector + "\n");
 
-    // Three cases here:
-    // 1. Complete list size is > searchResponseSize and a token already is existing: we need to
-    // check hash map!
-    // 2. Complete list size is > searchResponseSize and we have no token: we do need one!
-    // 3. Complete list size is <= searchResponseSize (we do not need a token! do nothing!)
     if (completeListSize > searchResponseSize) {
-      ResumptionTokenType resTokenForResponse = new ResumptionTokenType();
+      int cursor;
+      result = new ResumptionTokenType();
 
-      if (resumptionToken != null && cursorCollector.containsKey(resumptionToken)) {
-
-        cursor = cursorCollector.get(resumptionToken).intValue() + i;
-        if (cursor == searchResponseSize) {
-          // TODO Why not "cursor += searchResponseSize;" ??
-          cursor = 2 * searchResponseSize;
-        }
-        resTokenForResponse.setCursor(BigInteger.valueOf((long) cursor));
-        cursorCollector.put(scrollID, cursor);
-      } else {
-        resTokenForResponse.setCursor(BigInteger.valueOf(searchResponseSize));
-        cursorCollector.put(scrollID, searchResponseSize);
-        cursor = searchResponseSize;
-        resTokenForResponse.setCursor(BigInteger.valueOf((long) cursor));
+      log.fine("yes, we NEED a restok");
 
-        log.fine("New ResumptionToken created from scroll ID: " + cursorCollector.get(scrollID));
-      }
-
-      // Set resumption token string if cursor is less then complete list size: More objects can be
-      // delivered!
-      if (cursor < completeListSize) {
-        resTokenForResponse.setValue(scrollID);
+      // 1. Complete list size is > searchResponseSize and a token already is existing: we need to
+      // check hash map!
+      if (resumptionToken != null && cursorCollector.containsKey(resumptionToken)) {
+        // Get cursor from resumption token map and increase.
+        cursor = cursorCollector.get(resumptionToken).intValue() + searchResponseSize;
       }
-
-      // Remove resumption token string if cursor is bigger then or equal complete list size: This
-      // is the last response, no more objects are available!
-      if (cursor >= completeListSize) {
-        resTokenForResponse.setValue("");
+      // 2. Complete list size is > searchResponseSize and we have no token: we do need one!
+      else {
+        // Cursor must be 0 in first response.
+        cursor = 0;
       }
+      // Set cursor, token value, and complete list size.
+      result.setCursor(BigInteger.valueOf(cursor));
+      result.setValue(scrollID);
+      result.setCompleteListSize(BigInteger.valueOf(completeListSize));
+      // Update token map.
+      cursorCollector.put(scrollID, cursor);
 
-      // Set complete list size.
-      resTokenForResponse.setCompleteListSize(BigInteger.valueOf(completeListSize));
-
-      return resTokenForResponse;
-    }
-
-    return null;
-  }
-
-  /**
-   * @param dateToValidate
-   * @return
-   */
-  public static boolean isThisDateValid(String dateToValidate) {
-
-    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
-
-    dateFormat.setLenient(false);
-    try {
-      dateFormat.parse(dateToValidate.trim());
-    } catch (ParseException pe) {
-      return false;
-    }
-    return true;
-  }
+      log.fine("restok from scroll id (cursor: " + cursor + "): " + result.getValue());
 
-  /**
-   * @param dateToValidate
-   * @return
-   */
-  public static boolean isThisDateValidToOtherTimeStamp(String dateToValidate) {
+      // Last response, no more objects are available!
+      if ((cursor + searchResponseSize) >= completeListSize) {
+        // Remove resumption token string from response, and clear token map.
+        result.setValue("");
+        cursorCollector.remove(scrollID);
 
-    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        log.fine("last response, restok deleted");
 
-    dateFormat.setLenient(false);
-    dateFormat.setLenient(false);
-    try {
-      dateFormat.parse(dateToValidate.trim());
-    } catch (ParseException pe) {
-      return false;
+        // FIXME See, how large the map is getting! Add expiration date to response and delete
+        // expired tokens!!
+      }
     }
-    return true;
-  }
 
-  /**
-   * 
-   */
-  private static final String[] formats = {
-      "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ssZ",
-      "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
-      "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd HH:mm:ss",
-      "MM/dd/yyyy HH:mm:ss", "MM/dd/yyyy'T'HH:mm:ss.SSS'Z'",
-      "MM/dd/yyyy'T'HH:mm:ss.SSSZ", "MM/dd/yyyy'T'HH:mm:ss.SSS",
-      "MM/dd/yyyy'T'HH:mm:ssZ", "MM/dd/yyyy'T'HH:mm:ss",
-      "yyyy:MM:dd HH:mm:ss", "yyyyMMdd",};
-
-  /**
-   * @param d
-   * @return
-   */
-  public static String getFormatOfDate(String d) {
-
-    if (d != null) {
-      for (String parse : formats) {
-        SimpleDateFormat sdf = new SimpleDateFormat(parse);
-        try {
-          sdf.parse(d);
-          return parse;
-        } catch (ParseException e) {
-          // TODO Handle Exception!
-        }
-      }
+    // 3. Complete list size is <= searchResponseSize (we do not need a token! do nothing!)
+    else {
+      log.fine("no, we do NOT need a restok!");
     }
 
-    return d;
+    return result;
   }
 
   /**
@@ -456,7 +366,7 @@ public class OaipmhUtilities {
    * @param field
    * @return Returns only the first String from the result list, or "" if list is empty.
    */
-  public static String firstEnrtryFieldLoader(JSONObject resultFromGetRequestInES, String field) {
+  public static String firstEntryFieldLoader(JSONObject resultFromGetRequestInES, String field) {
 
     String result = "";
 
@@ -500,9 +410,15 @@ public class OaipmhUtilities {
 
     log.fine("get request id: " + getRequest.id());
 
-    // Declaration of the result from the get-request
+    // Declaration of the result from the get-request.
     GetResponse esResultObject = theESClient.getEsClient().get(getRequest, RequestOptions.DEFAULT);
 
+    log.fine("es result object is existing: " + esResultObject.isExists());
+
+    if (!esResultObject.isExists()) {
+      throw new IOException("es record with id " + idInElasticSearchIndex + " is not existing!");
+    }
+
     return esResultObject;
   }
 
@@ -537,31 +453,6 @@ public class OaipmhUtilities {
     return getRecordType;
   }
 
-  /**
-   * @param propertyName
-   * @param propFile
-   * @return
-   */
-  @Deprecated
-  public static String[][] fetchArrayFromPropFile(String propertyName, Properties propFile) {
-
-    // TODO Why get a 2D array and only use the first element in RecordDelivererDatacite?
-    // BTW Where does the ";" come from anyway?
-
-    // Get array split up by the semicolon.
-    String[] a = propFile.getProperty(propertyName).split(";");
-
-    // Create the two dimensional array with correct size.
-    String[][] array = new String[a.length][a.length];
-
-    // Combine the arrays split by semicolon and comma.
-    for (int i = 0; i < a.length; i++) {
-      array[i] = a[i].split(",");
-    }
-
-    return array;
-  }
-
   /**
    * @param propertyName
    * @param propFile
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
index c7e41b8d92fff52b859a20a00b98a491e1a895c5..5a3e2f30be9c75b2a8b1c9c323c8a952b3d49b7b 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDC.java
@@ -77,20 +77,15 @@ public class RecordDelivererDC extends RecordDelivererAbstract {
     if (this.dariah == true) {
       dublinCoreBuilder = putContentIntoDCFieldListsDH(esResultObject);
       JSONObject json = new JSONObject(esResultObject.getSourceAsMap());
-      identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField);
+      identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField);
 
       String dateOfCreation = "NO_DATE_SET!";
-      if (OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation) != null) {
-        try {
-          dateOfCreation = OaipmhUtilities.oaiDatestampAsString(
-              OaipmhUtilities.firstEnrtryFieldLoader(json, this.dateOfObjectCreation).toString());
-        } catch (ParseException e) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-        }
+      if (OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation) != null) {
+        dateOfCreation = OaipmhUtilities.getUTCDateAsString(
+            OaipmhUtilities.firstEntryFieldLoader(json, this.dateOfObjectCreation).toString());
       }
 
-      String setSpec = OaipmhUtilities.firstEnrtryFieldLoader(json, this.specField);
+      String setSpec = OaipmhUtilities.firstEntryFieldLoader(json, this.specField);
       String setSpecValue =
           OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier);
 
@@ -125,13 +120,14 @@ public class RecordDelivererDC extends RecordDelivererAbstract {
       String dateOfCreation =
           esResultObject.getSourceAsMap().get(this.dateOfObjectCreation).toString();
 
+      log.fine("date of creation: " + dateOfCreation);
+
       String setSpec = DublinCoreFieldLoader
           .fillListFromTGWorkValues(esResultObject, this.relationList).get(0);
       String setSpecValue =
           OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier);
 
-      String convertedCreationDate =
-          OaipmhUtilities.oaiDatestampAsString(dateOfCreation).toString();
+      String convertedCreationDate = OaipmhUtilities.getUTCDateAsString(dateOfCreation).toString();
       record.setHeader(
           OaipmhUtilities.computeResponseHeader(convertedCreationDate, identifier, setSpecValue));
       record.setMetadata(dublinCoreBuilder.getDC());
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
index fcf30a2abb238b78059260a0609a087d978a1193..8a2a116797fbc00f2cace627fdfcf0fb5f96e233 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererDatacite.java
@@ -161,8 +161,8 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     }
 
     // Set response header.
-    String datestamp = OaipmhUtilities.oaiDatestampAsString(
-        OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation));
+    String datestamp = OaipmhUtilities.getUTCDateAsString(
+        OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.dateOfObjectCreation));
 
     String identifier = "";
     if (!idInElasticSearchIndex.startsWith(this.repositoryObjectURIPrefix)) {
@@ -170,8 +170,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     } else {
       identifier = idInElasticSearchIndex;
     }
-
-    String setSpec = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.specField);
+    String setSpec = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.specField);
     String setSpecValue = OaipmhUtilities.getSetSpec(setSpec, this.specFieldPrefix, identifier);
 
     HeaderType header = OaipmhUtilities.computeResponseHeader(datestamp, identifier, setSpecValue);
@@ -282,7 +281,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     Sizes sizes = new Sizes();
 
     String size =
-        OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.oarSizeField) + " " + BYTES;
+        OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.oarSizeField) + " " + BYTES;
     sizes.getSize().add(size);
 
     return sizes;
@@ -305,17 +304,17 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       if (this.textgrid) {
         Subject subject = new Subject();
         String value =
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_VALUE);
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_VALUE);
         if (!value.isEmpty()) {
           subject.setValue(value);
         }
         String scheme =
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_VALUE);
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_VALUE);
         if (!scheme.isEmpty()) {
           subject.setSubjectScheme(scheme);
         }
         String schemeURI =
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_TYPE);
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, subjectField + DOT_ID + DOT_TYPE);
         if (schemeURI.isEmpty()) {
           subject.setSchemeURI(schemeURI);
         }
@@ -351,7 +350,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     String version = "";
 
     for (String versionField : this.oarVersionFields) {
-      version = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, versionField);
+      version = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, versionField);
     }
 
     return version;
@@ -372,7 +371,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       // **
 
       if (this.textgrid) {
-        String resourceValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, format);
+        String resourceValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, format);
         resourceType.setValue(resourceValue);
         // Set collection for all aggregation types, take also into account: images and text.
         if (TextGridMimetypes.AGGREGATION_SET.contains(format)) {
@@ -400,7 +399,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       // **
 
       else if (this.dariah) {
-        String resourceValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, format);
+        String resourceValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, format);
         resourceType.setValue(resourceValue);
         // Set collection for DARIAH collection type here, data object for everything else.
         if (TextGridMimetypes.DARIAH_COLLECTION.equals(format)) {
@@ -430,7 +429,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
 
     for (String geoLocationField : this.oarGeoLocationFields) {
       GeoLocation geoLocation = new GeoLocation();
-      String place = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, geoLocationField);
+      String place = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, geoLocationField);
       geoLocation.setGeoLocationPlace(place);
       if (!place.isEmpty()) {
         geoLocations.getGeoLocation().add(geoLocation);
@@ -468,12 +467,12 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
         // relatedIdentifier.setSchemeURI(TGConstants.TEXTGRID_METADATASCHEME_URI);
 
         String uriForWork =
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, relatedIdentifierField)
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, relatedIdentifierField)
                 .replace(this.repositoryObjectURIPrefix, "");
         relatedIdentifier
             .setValue(
                 OaipmhUtilities
-                    .firstEnrtryFieldLoader(
+                    .firstEntryFieldLoader(
                         new JSONObject(
                             OaipmhUtilities.getRcordByIDFromElasticSearch(this.oaiEsClient,
                                 uriForWork, workFields, Strings.EMPTY_ARRAY).getSource()),
@@ -535,7 +534,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
 
       if (this.textgrid) {
         String idForWorkObject =
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.relationToWorkObject);
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.relationToWorkObject);
         if (idForWorkObject != null) {
           idForWorkObject = idForWorkObject.replace(this.repositoryObjectURIPrefix, "");
           JSONObject resultOfFurtherObject =
@@ -590,9 +589,9 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       if (this.textgrid) {
         Rights rights = new Rights();
         rights.setRightsURI(
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, rightsField + LICENSE_URI));
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, rightsField + LICENSE_URI));
         rights.setValue(
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, rightsField + DOT_VALUE));
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, rightsField + DOT_VALUE));
         rightsResultList.getRights().add(rights);
       }
 
@@ -658,7 +657,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
       if (this.textgrid) {
         AlternateIdentifier alternateIdentifier = new AlternateIdentifier();
         alternateIdentifier.setValue(
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, alternateIdentifierField));
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, alternateIdentifierField));
         alternateIdentifier.setAlternateIdentifierType(ID_TYPE_URI);
         alternateIdentifiers.getAlternateIdentifier().add(alternateIdentifier);
       }
@@ -727,7 +726,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
         Contributor contributor = new Contributor();
         if (contributorField.equals("project")) {
           String fieldContent =
-              OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField + DOT_VALUE);
+              OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField + DOT_VALUE);
           if (fieldContent != null && !fieldContent.isEmpty()) {
             contributor.setContributorName(fieldContent);
             contributor.setContributorType(ContributorType.OTHER);
@@ -735,7 +734,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
                 new info.textgrid.middleware.oaipmh.Resource.Contributors.Contributor.NameIdentifier();
             name.setNameIdentifierScheme(TG_PROJECT_CONTRIBUTOR_SCHEME);
             name.setValue(
-                OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField + DOT_ID));
+                OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField + DOT_ID));
             name.setSchemeURI(TG_PROJECT_CONTRIBUTOR_SCHEME_URI);
             if (!name.getValue().isEmpty() && !name.getNameIdentifierScheme().isEmpty()
                 && !name.getSchemeURI().isEmpty()) {
@@ -745,7 +744,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
           }
         } else {
           String fieldContent =
-              OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, contributorField);
+              OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, contributorField);
           if (fieldContent != null && !fieldContent.isEmpty()) {
             contributor.setContributorName(fieldContent);
             contributor.setContributorType(ContributorType.DATA_MANAGER);
@@ -798,34 +797,31 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
     for (String dateField : this.oarDateFields) {
 
       Date dateInOpenAireRecord = new Date();
-      try {
-        // Only one value per field is needed here (I think).
-        String dateValue = OaipmhUtilities
-            .oaiDatestampAsString(OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, dateField));
-        dateInOpenAireRecord.setValue(dateValue);
 
-        // TODO Use extra created, issued, and updated fields in configuration!
+      // Only one value per field is needed here (I think).
+      // We need ISO8601 here, take entries as they come from ElasticSearch!
+      String dateValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, dateField);
+      dateInOpenAireRecord.setValue(dateValue);
 
-        // Filter TextGrid values for date type.
-        if (dateField.equals("created")) {
-          dateInOpenAireRecord.setDateType(DateType.CREATED);
-        }
-        if (dateField.equals("issued")) {
-          dateInOpenAireRecord.setDateType(DateType.ISSUED);
-        }
-        if (dateField.equals("lastModified")) {
-          dateInOpenAireRecord.setDateType(DateType.UPDATED);
-        }
+      // TODO Use extra created, issued, and updated fields in configuration!
 
-        // Filter DARIAH values for date type.
-        if (dateField.equals("administrativeMetadata.dcterms:created")) {
-          dateInOpenAireRecord.setDateType(DateType.CREATED);
-        }
-        if (dateField.equals("administrativeMetadata.dcterms:modified")) {
-          dateInOpenAireRecord.setDateType(DateType.UPDATED);
-        }
-      } catch (ParseException e) {
-        log.severe("could not parse date field: " + e.getMessage());
+      // Filter TextGrid values for date type.
+      if (dateField.equals("created")) {
+        dateInOpenAireRecord.setDateType(DateType.CREATED);
+      }
+      if (dateField.equals("issued")) {
+        dateInOpenAireRecord.setDateType(DateType.ISSUED);
+      }
+      if (dateField.equals("lastModified")) {
+        dateInOpenAireRecord.setDateType(DateType.UPDATED);
+      }
+
+      // Filter DARIAH values for date type.
+      if (dateField.equals("administrativeMetadata.dcterms:created")) {
+        dateInOpenAireRecord.setDateType(DateType.CREATED);
+      }
+      if (dateField.equals("administrativeMetadata.dcterms:modified")) {
+        dateInOpenAireRecord.setDateType(DateType.UPDATED);
       }
 
       dates.getDate().add(dateInOpenAireRecord);
@@ -840,7 +836,7 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
   private Identifier addIdentifier() {
 
     Identifier identifier = new Identifier();
-    String idValue = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.oarIdentifierField);
+    String idValue = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.oarIdentifierField);
 
     // **
     // TextGrid
@@ -884,10 +880,10 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
 
       if (this.textgrid) {
         Creator creator = new Creator();
-        creator.setCreatorName(OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, creatorField));
+        creator.setCreatorName(OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, creatorField));
         NameIdentifier nameIdentifier = new NameIdentifier();
         // TODO: creatorID Field from config file
-        String creatorID = OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj,
+        String creatorID = OaipmhUtilities.firstEntryFieldLoader(this.jsonObj,
             "edition.source.bibliographicCitation.author.id");
         if (creatorID != null && creatorID.contains(":")) {
           nameIdentifier.setValue(creatorID.split(":")[1]);
@@ -996,8 +992,8 @@ public class RecordDelivererDatacite extends RecordDelivererAbstract {
    */
   private String addPublicationYear() throws ParseException, DatatypeConfigurationException {
     return Integer.toString(OaipmhUtilities
-        .oaiDatestampAsGregorian(
-            OaipmhUtilities.firstEnrtryFieldLoader(this.jsonObj, this.dateOfObjectCreation))
+        .getUTCDateAsGregorian(
+            OaipmhUtilities.firstEntryFieldLoader(this.jsonObj, this.dateOfObjectCreation))
         .getYear());
   }
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
index 028538d587a07ad2f0fd77e438e12313a8951be5..2017672bd1cc7fa47988e5cd9782db2f74f973bf 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordDelivererIdiom.java
@@ -87,6 +87,10 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract {
     String creationDate = getIdiomInfoFromES(textgridRevisionURI, CREATED);
     String modificationDate = getIdiomInfoFromES(textgridRevisionURI, LAST_MODIFIED);
 
+    log.fine("object type: " + objectType);
+    log.fine("textgrid creationDate: " + creationDate);
+    log.fine("textgrid modificationDate: " + modificationDate);
+
     // Get TG URI from ID.
     if (!textgridRevisionURI.startsWith(TEXTGRID_URI_PREFIX)) {
       textgridRevisionURI = TEXTGRID_URI_PREFIX + textgridRevisionURI;
@@ -96,7 +100,6 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract {
     String textgridBaseURI = OaipmhUtilities.getTextGridBaseURI(textgridRevisionURI);
 
     log.fine("textgrid base uri: " + textgridBaseURI);
-    log.fine("object type is: " + objectType);
     log.fine(objectType + " doc/dom: " + creationDate + "/" + modificationDate);
 
     if (objectType.equals("ARTEFACT")) {
@@ -148,8 +151,7 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract {
     // No setSpec needed here! It COULD be the IDIOM project ID, but we do not need it at the
     // moment.
     String setSpec = "";
-    String convertedModificationDate =
-        OaipmhUtilities.oaiDatestampAsString(modificationDate).toString();
+    String convertedModificationDate = OaipmhUtilities.getUTCDateAsString(modificationDate);
     // We need to have the base URI here in header (and record), it is used as Record ID of Mayan
     // artifacts here!
     HeaderType header =
@@ -222,7 +224,7 @@ public class RecordDelivererIdiom extends RecordDelivererAbstract {
     json = new JSONObject(OaipmhUtilities.getRcordByIDFromElasticSearch(this.oaiEsClient, changedId,
         searchField, Strings.EMPTY_ARRAY).getSource());
 
-    result = OaipmhUtilities.firstEnrtryFieldLoader(json, theSearchField);
+    result = OaipmhUtilities.firstEntryFieldLoader(json, theSearchField);
 
     return result;
   }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
index e4d7b740c997a8c7a0353539ac58477f7d95bb44..38b81998c7d256a7d63d44853a2f26c8c4e504a9 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererAbstract.java
@@ -9,8 +9,6 @@ import info.textgrid.middleware.oaipmh.ResumptionTokenType;
 /**
  * @author Maximilian Brodhun, SUB Göttingen
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-07
- * @since
  */
 public abstract class RecordListDelivererAbstract implements RecordListDelivererInterface {
 
@@ -85,16 +83,16 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
     if (request.getIdentifier() != null) {
       errorValues.add("identifier");
     }
-    /*
-     * if(request.getFrom()!= null && (!OAIPMHUtilities.isThisDateValid(request.getFrom()) &&
-     * !OAIPMHUtilities.isThisDateValidToOtherTimeStamp(request.getFrom()))) {
-     * errorValues.add("from"); } if(request.getUntil() != null &&
-     * (!OAIPMHUtilities.isThisDateValid(request.getUntil()) &&
-     * !OAIPMHUtilities.isThisDateValidToOtherTimeStamp(request.getUntil()))) {
-     * errorValues.add("until"); } if(request.getFrom()!= null && request.getUntil()!=null &&
-     * !OAIPMHUtilities.getFormatOfDate(request.getFrom()).equals(OAIPMHUtilities.getFormatOfDate(
-     * request.getFrom()))) { errorValues.add("until, from"); }
-     */
+
+    // Check from and util.
+    if (request.getFrom() != null && !OaipmhUtilities.isCorrectFromUntilDate(request.getFrom())) {
+      errorValues.add("from");
+    }
+    if (request.getUntil() != null && !OaipmhUtilities.isCorrectFromUntilDate(request.getUntil())) {
+      errorValues.add("until");
+    }
+
+    // Set error messages.
     if (errorValues.size() > 0) {
       result.setError(OaipmhConstants.OAI_BAD_ARGUMENT, "The request includes illegal arguments "
           + "or is missing required arguments: " + errorValues);
@@ -205,7 +203,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
     this.resTokenForResponse = resTokenForResponse;
   }
 
-
   /**
    * @return
    */
@@ -220,7 +217,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
     this.modifiedField = modifiedField;
   }
 
-
   /**
    * @return
    */
@@ -326,7 +322,6 @@ public abstract class RecordListDelivererAbstract implements RecordListDeliverer
     return this.formatToFilter;
   }
 
-
   /**
    * @return
    */
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
index 5ca6ce5bcbce300d15db2c001731776ac7892c63..976f99c6f5c9ef2608a8f91946beac382d92861c 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDC.java
@@ -185,13 +185,10 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
     if (completeListSize > 0) {
       setFoundItems(true);
 
-      int i = 0;
       for (SearchHit hit : scrollResp.getHits().getHits()) {
-        i++;
-
         if (hit != null && hit.getFields() != null) {
           JSONObject json = new JSONObject(hit.getSourceAsMap());
-          this.modifiedValue = OaipmhUtilities.firstEnrtryFieldLoader(json, this.modifiedField);
+          this.modifiedValue = OaipmhUtilities.firstEntryFieldLoader(json, this.modifiedField);
 
           // **
           // TEXTGRID SEARCH
@@ -219,7 +216,7 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
                 String identifier = hit.getSourceAsMap().get(this.identifierField).toString();
 
                 HeaderType header = OaipmhUtilities.computeResponseHeader(
-                    OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier,
+                    OaipmhUtilities.getUTCDateAsString(this.modifiedValue).toString(), identifier,
                     setSpec);
                 buildRecord(recordList, header, dublinCoreBuilder);
 
@@ -240,14 +237,14 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
           else if (this.dariah) {
 
             // Get identifier and setSpec field, add setSpec prefix if not already set.
-            String identifier = OaipmhUtilities.firstEnrtryFieldLoader(json, this.identifierField);
+            String identifier = OaipmhUtilities.firstEntryFieldLoader(json, this.identifierField);
             String setSpec = OaipmhUtilities.getSetSpec(set, this.specFieldPrefix, identifier);
 
             try {
               dublinCoreBuilder = putContentIntoDCFieldListsDH(hit);
 
               HeaderType header = OaipmhUtilities.computeResponseHeader(
-                  OaipmhUtilities.oaiDatestampAsString(this.modifiedValue).toString(), identifier,
+                  OaipmhUtilities.getUTCDateAsString(this.modifiedValue).toString(), identifier,
                   setSpec);
               buildRecord(recordList, header, dublinCoreBuilder);
 
@@ -262,16 +259,8 @@ public class RecordListDelivererDC extends RecordListDelivererAbstract {
         }
       }
 
-      // Check the need for a resumption token!
-
-      log.fine("completeListSize: " + completeListSize);
-      log.fine("resumptionToken: " + resumptionToken);
-      log.fine("scrollid: " + scrollID);
-      log.fine("searchResponseSize: " + this.searchResponseSize);
-
       ResumptionTokenType resTokenForResponse = OaipmhUtilities.getResumptionToken(completeListSize,
-          resumptionToken, cursorCollector, scrollID, this.searchResponseSize, i);
-
+          resumptionToken, cursorCollector, scrollID, this.searchResponseSize);
       if (resTokenForResponse != null) {
         log.fine("resTokenForResponse: " + resTokenForResponse.getValue());
       }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java
index 13ad6559fa06843c6ac0ff489d5a32b19115213c..ee8c57385d7568c5bbd9e31bc9972fc18a2e6b71 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererDatacite.java
@@ -207,10 +207,7 @@ public class RecordListDelivererDatacite extends RecordListDelivererAbstract {
     if (completeListSize > 0) {
 
       setFoundItems(true);
-      int i = 0;
-
       for (SearchHit hit : scrollResp.getHits().getHits()) {
-        i++;
         if (hit != null && hit.getFields() != null) {
           String id2add;
           // TODO Could we not use hit.getId() also for TG hits? Where is the difference?
@@ -232,14 +229,13 @@ public class RecordListDelivererDatacite extends RecordListDelivererAbstract {
         this.resTokenForResponse.setValue("");
       } else {
         this.resTokenForResponse = OaipmhUtilities.getResumptionToken(completeListSize,
-            resumptionToken, cursorCollector, scrollID, this.searchResponseSize, i);
+            resumptionToken, cursorCollector, scrollID, this.searchResponseSize);
       }
 
     } else {
       setFoundItems(false);
     }
 
-
     return uriList;
   }
 
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java
index 14bbe724680da889860f15adbe90e2a668d1f6de..87a9f872409bdff85edf9c8fdfee5bda860563e3 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererIdiom.java
@@ -141,15 +141,13 @@ public class RecordListDelivererIdiom extends RecordListDelivererAbstract {
 
     if (completeListSize > 0) {
       setFoundItems(true);
-      int i = 0;
 
       for (SearchHit hit : scrollResp.getHits().getHits()) {
-        i++;
 
-        log.fine("hit no." + i + ": id=" + hit.getId());
+        log.fine("hit no." + hit.getIndex() + ": id=" + hit.getId());
 
         String textgridURI = OaipmhUtilities
-            .firstEnrtryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField);
+            .firstEntryFieldLoader(new JSONObject(hit.getSourceAsMap()), this.identifierField);
 
         log.fine("textgrid uri: " + textgridURI);
 
@@ -173,7 +171,7 @@ public class RecordListDelivererIdiom extends RecordListDelivererAbstract {
 
       // Check the need for a resumption token!
       ResumptionTokenType responseToken = OaipmhUtilities.getResumptionToken(completeListSize,
-          resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE, i);
+          resumptionToken, cursorCollector, scrollID, IDIOM_RESPONSE_SIZE);
       if (responseToken != null) {
         recordList.setResumptionToken(responseToken);
       }
diff --git a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
index b79343d8158fd6400f52105d8ac9318a9b87231b..c22a2b06ac689e127eec7c5b6e56f2b19ae37e55 100644
--- a/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
+++ b/oaipmh-core/src/main/java/info/textgrid/middleware/RecordListDelivererInterface.java
@@ -9,7 +9,6 @@ import info.textgrid.middleware.oaipmh.ListRecordsType;
  */
 public interface RecordListDelivererInterface {
 
-
   /**
    * @param from
    * @param to
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java
index 9d18a65b00bf38c5b17ca1a0bf88ad400585acf0..fa8f5a8af7bfbd8a2053dd25b7542231127d5168 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestDHOaipmhLocally.java
@@ -281,7 +281,7 @@ public class TestDHOaipmhLocally {
     // System.out.println(json);
     DublinCoreBuilder result = new DublinCoreBuilder();
     List<String> identifier = new ArrayList<String>();
-    System.out.println(OaipmhUtilities.firstEnrtryFieldLoader(json, TEST_DARIAH_IDENTIFIER));
+    System.out.println(OaipmhUtilities.firstEntryFieldLoader(json, TEST_DARIAH_IDENTIFIER));
     identifier = OaipmhUtilities.listFieldLoader(json, "descriptiveMetadata.dc:identifier");
     for (String id : identifier) {
       System.out.println(id);
@@ -330,7 +330,7 @@ public class TestDHOaipmhLocally {
     JSONObject json = new JSONObject(jsonAsString);
     DublinCoreBuilder result = new DublinCoreBuilder();
     List<String> identifier = new ArrayList<String>();
-    System.out.println(OaipmhUtilities.firstEnrtryFieldLoader(json, TEST_DARIAH_IDENTIFIER));
+    System.out.println(OaipmhUtilities.firstEntryFieldLoader(json, TEST_DARIAH_IDENTIFIER));
     identifier = OaipmhUtilities.listFieldLoader(json, "descriptiveMetadata.dc:identifier");
     for (String id : identifier) {
       System.out.println(id);
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
index f941fa50c5c1a97b3b39233920705e22f86656e6..f1168648d88880882aa266b7629bff7f6fff53cb 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestOaipmhUtilities.java
@@ -1,6 +1,11 @@
 package info.textgrid.middleware.test;
 
 import static org.junit.Assert.assertTrue;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.XMLGregorianCalendar;
 import org.junit.Test;
 import info.textgrid.middleware.OaipmhUtilities;
 
@@ -178,4 +183,106 @@ public class TestOaipmhUtilities {
     }
   }
 
+  /**
+   * @throws DatatypeConfigurationException
+   */
+  @Test
+  public void testGetUTCDateAsString() throws DatatypeConfigurationException {
+
+    String tgDateStamp = "2012-02-10T23:45:00.507+01:00";
+    String expectedUTCDate = "2012-02-10T22:45:00Z";
+    String utcDate = OaipmhUtilities.getUTCDateAsString(tgDateStamp);
+
+    if (!utcDate.equals(expectedUTCDate)) {
+      assertTrue(utcDate + " != " + expectedUTCDate, false);
+    }
+  }
+
+  /**
+   * @throws ParseException
+   * @throws DatatypeConfigurationException
+   */
+  @Test
+  public void testGetUTCDateAsGregorian() throws DatatypeConfigurationException {
+
+    String tgDateStamp = "2022-07-22T14:28:13.139+02:00";
+    String expectedUTCDate = "2022-07-22T12:28:13Z";
+    XMLGregorianCalendar utcDate = OaipmhUtilities.getUTCDateAsGregorian(tgDateStamp);
+
+    if (!utcDate.toString().equals(expectedUTCDate)) {
+      assertTrue(utcDate + " != " + expectedUTCDate, false);
+    }
+  }
+
+  /**
+   * @throws DatatypeConfigurationException
+   * @throws ParseException
+   */
+  @Test
+  public void testIsCorrectFromUntilDate() throws DatatypeConfigurationException, ParseException {
+
+    String date = "1970-12-10T18:30:00";
+    List<String> result = new ArrayList<String>();
+    if (!OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "1970-12-10T18:30";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "1970-12-10T18";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "1970-12-10";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "1970-12";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "1970";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "kakki";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+    date = "kakki-fakki";
+    if (OaipmhUtilities.isCorrectFromUntilDate(date)) {
+      result.add(date);
+    }
+
+    if (!result.isEmpty()) {
+      assertTrue(result.toString() + ": not ISO8691!", false);
+    }
+  }
+
+  /**
+   * @throws DatatypeConfigurationException
+   * @throws ParseException
+   */
+  @Test
+  public void testGetCurrentUTCDateAsString()
+      throws DatatypeConfigurationException, ParseException {
+
+    String currentUTCDate = OaipmhUtilities.getCurrentUTCDateAsString();
+
+    System.out.println("UTC from current millies: " + currentUTCDate);
+  }
+
+  /**
+   * @throws DatatypeConfigurationException
+   * @throws ParseException
+   */
+  @Test
+  public void testGetCurrentUTCg() throws DatatypeConfigurationException, ParseException {
+
+    XMLGregorianCalendar currentUTCDate = OaipmhUtilities.getCurrentUTCDateAsGregorian();
+
+    System.out.println("UTC from current millies: " + currentUTCDate);
+  }
+
 }
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
index fac84975f4128d595773debb9079c0a3d32a12d7..bb826ba8ba24d1318b844cdbf2b317af221e97c2 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/TestTGOaipmhLocally.java
@@ -218,7 +218,7 @@ public class TestTGOaipmhLocally {
   public void testDateNow() throws DatatypeConfigurationException {
 
     System.out.println("---------------Test Datestamp Parsing with now date -----------------");
-    XMLGregorianCalendar nowTest = OaipmhUtilities.getXMLGregorianCalendarNow();
+    String nowTest = OaipmhUtilities.getCurrentUTCDateAsString();
     System.out.println(nowTest);
     System.out.println("-------------------------------------------");
   }
@@ -233,7 +233,7 @@ public class TestTGOaipmhLocally {
     String dateformatbefore = "2012-02-06T20:48:39.614+01:00";
     System.out.println("--------- Test Datestamp Parsing with a given date ---------------");
     System.out.println("Original date: " + dateformatbefore);
-    XMLGregorianCalendar testDate = OaipmhUtilities.oaiDatestampAsGregorian(dateformatbefore);
+    XMLGregorianCalendar testDate = OaipmhUtilities.getUTCDateAsGregorian(dateformatbefore);
     System.out.println("Date after conversion: " + testDate);
     System.out.println("---------------------------------------------");
   }
@@ -248,7 +248,7 @@ public class TestTGOaipmhLocally {
     String dateformatbefore = "2012-02-06T20:48:39.614+01:00";
     System.out.println("------------String Version-------------------");
     System.out.println("Original date: " + dateformatbefore);
-    String testDate = OaipmhUtilities.oaiDatestampAsString(dateformatbefore);
+    String testDate = OaipmhUtilities.getUTCDateAsString(dateformatbefore);
     System.out.println("Date after conversion: " + testDate);
     System.out.println("---------------------------------------------");
   }
@@ -289,17 +289,6 @@ public class TestTGOaipmhLocally {
     System.out.println("-----------------------------------\n");
   }
 
-  /**
-   * @throws ParseException
-   */
-  @Test
-  public void testGetDateFormat() throws ParseException {
-
-    System.out.println("Test get time format");
-    System.out.println(OaipmhUtilities.getFormatOfDate("2019-12-02T15:36:13Z"));
-    System.out.println("-----------------------------------\n");
-  }
-
   /**
    * @throws ParseException
    */
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
index 470c4be16e9b4b61e2db6d147d4d63afe10b7738..36603a88d1e72d48d18d86b4c7ab0b2806fe7196 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/OaipmhUtilitiesOnline.java
@@ -479,7 +479,8 @@ public class OaipmhUtilitiesOnline {
     int size = Integer.parseInt(sizeStr.substring(0, sizeStr.indexOf("\"")));
     String cursorStr = toktag.substring(toktag.indexOf("cursor=\"") + 8);
     int cursor = Integer.parseInt(cursorStr.substring(0, cursorStr.indexOf("\"")));
-    System.out.println("\t" + theThreadName + "size: " + size + " / " + cursor);
+    System.out.println("\t" + theThreadName + "complete list size: " + size);
+    System.out.println("\tdelivered with last response: " + cursor);
 
     // If token is provided, test cursor and element count!
     if (!restok.isEmpty()) {
@@ -495,7 +496,7 @@ public class OaipmhUtilitiesOnline {
               + recordsExpectedPerRequest + " if token is provided, but is " + size;
           assertTrue(message, false);
         }
-        if (cursor != recordsExpectedPerRequest * loopCount) {
+        if (cursor != recordsExpectedPerRequest * (loopCount - 1)) {
           String message = "cursor must be " + (loopCount * recordsExpectedPerRequest)
               + " in loop " + loopCount + ", but is " + cursor;
           assertTrue(message, false);
@@ -629,13 +630,10 @@ public class OaipmhUtilitiesOnline {
     String headerDate =
         theResponseString.substring(theResponseString.indexOf(datestampTag) + datestampTag.length(),
             theResponseString.indexOf("</datestamp>")).trim();
-
-    System.out.println(headerDate);
-
-    String recordChangeDate = theResponseString
+    String recordChangeDate = OaipmhUtilities.getUTCDateAsString(theResponseString
         .substring(theResponseString.indexOf(recordChangeTag) + recordChangeTag.length(),
             theResponseString.indexOf("</recordChangeDate>"))
-        .trim();
+        .trim());
 
     if (!headerDate.equals(recordChangeDate)) {
       assertTrue(headerDate + " != " + recordChangeDate, false);
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
index 8c91a2c0eb74b97a0d1dc62cf16f9718d8f6156d..78ee5b7891a1a70efcbda7e7aec2bf418c858ffe 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGGetRecordOnline.java
@@ -35,8 +35,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2023-01-11
- * @since 2022-09-08
  */
 @Ignore
 public class TestTGGetRecordOnline {
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
index 52d488e5983b8dfa97219ee0a3d54e2763aa52fe..3a373f61077851782feecad0ced0600693584051 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListIdentifiersOnline.java
@@ -25,8 +25,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-23
- * @since 2022-09-12
  */
 @Ignore
 public class TestTGListIdentifiersOnline {
diff --git a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
index 20431afaf5aa719eea036811c2df4dff4c396a96..500dae534dfabdc131b22c39537f444b63b780a8 100644
--- a/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
+++ b/oaipmh-core/src/test/java/info/textgrid/middleware/test/online/tg/TestTGListRecordsOnline.java
@@ -25,8 +25,6 @@ import info.textgrid.middleware.test.online.OaipmhUtilitiesOnline;
  * </p>
  * 
  * @author Stefan E. Funk, SUB Göttingen
- * @version 2022-09-28
- * @since 2022-09-12
  */
 @Ignore
 public class TestTGListRecordsOnline {
diff --git a/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml b/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml
index 1a468037a5e32c55d4015d5ffe8ad72ab3560e4c..d098e2f02f4b1a7de4b302bef2d0d97c5be3dc74 100644
--- a/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml
+++ b/oaipmh-webapp/src/main/webapp/WEB-INF/beans.xml
@@ -93,6 +93,7 @@
 
 	<bean id="MetadataFormatListDelivererTG"
 		class="info.textgrid.middleware.MetadataFormatListDelivererTG">
+		<property name="oaiEsClient" ref="ElasticSearchClient" />
 	</bean>
 
 	<!-- Bean for verb=Identify -->
diff --git a/pom.xml b/pom.xml
index ad93c4cef716c9cbf1dd17ee74e7170db33f62a4..0996fddb0734040362d829ee680b440002df8ad7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 		<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
 		<maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
 		<maven-jaxb2-plugin.version>0.15.2</maven-jaxb2-plugin.version>
-		<mets-mods-mapping.version>2.1.4</mets-mods-mapping.version>
+		<mets-mods-mapping.version>2.1.5-SNAPSHOT</mets-mods-mapping.version>
 		<package-info-maven-plugin.version>1.4.5</package-info-maven-plugin.version>
 		<properties-maven-plugin.version>1.0-alpha-2</properties-maven-plugin.version>
 		<rdf4j-repository-api.version>3.0.2</rdf4j-repository-api.version>