diff --git a/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java b/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java
index 0791e946cace9ba9327fb6168668575f834ae42c..6c622b05884c07014a7252bc38e5df697cbd12a1 100644
--- a/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java
+++ b/solidify-oai-model/src/main/java/ch/unige/solidify/model/oai/OAIToken.java
@@ -9,12 +9,12 @@
  * it under the terms of the GNU General Public License as
  * published by the Free Software Foundation, either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public
  * License along with this program.  If not, see
  * <http://www.gnu.org/licenses/gpl-2.0.html>.
@@ -79,15 +79,20 @@ public class OAIToken {
     return this.pageable;
   }
 
-  public ResumptionTokenType getToken(long totalItems, long previousItems, int oaiPmhTokenLifeTime) {
+  public ResumptionTokenType getToken(long totalItems, long previousItems, int oaiPmhTokenLifeTime, boolean lastPage) {
     final ResumptionTokenType resumptionToken = new ResumptionTokenType();
-    this.setExpirationDate(oaiPmhTokenLifeTime);
+    // set total items
     this.setTotalItems(BigInteger.valueOf(totalItems));
-    this.setCurrentItems(BigInteger.valueOf(previousItems));
     resumptionToken.setCompleteListSize(this.getTotalItems());
+    // set cursor = items already read
+    this.setCurrentItems(BigInteger.valueOf(previousItems));
     resumptionToken.setCursor(this.getCurrentItems());
-    resumptionToken.setExpirationDate(this.getExpirationDate());
-    resumptionToken.setValue(this.encodeResumptionToken());
+    if (!lastPage) {
+      // If token is not on the last page, fill its value
+      this.setExpirationDate(oaiPmhTokenLifeTime);
+      resumptionToken.setExpirationDate(this.getExpirationDate());
+      resumptionToken.setValue(this.encodeResumptionToken());
+    }
     return resumptionToken;
   }
 
diff --git a/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java b/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java
index 19e6532ccd0d77489075e48262eabc7e294704f7..ecb9606bb637308e7b2413a68edadec28a7300a9 100644
--- a/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java
+++ b/solidify-oai-pmh/src/main/java/ch/unige/solidify/service/OAIService.java
@@ -251,7 +251,11 @@ public class OAIService {
     }
     if (collection.getPage().hasNext()) {
       idList.setResumptionToken(
-              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime));
+              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, false));
+    } else if (token != null) {
+      // If results are paginated, a resumptionToken must be present on the last page, but with an empty value
+      idList.setResumptionToken(
+              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, true));
     }
     return idList;
   }
@@ -302,8 +306,13 @@ public class OAIService {
 
     if (collection.getPage().hasNext()) {
       recList.setResumptionToken(
-              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime));
+              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, false));
+    } else if (token != null) {
+      // If results are paginated, a resumptionToken must be present on the last page, but with an empty value
+      recList.setResumptionToken(
+              oaiToken.getToken(collection.getPage().getTotalItems(), collection.getPage().getPreviousItems(), this.oaiPmhTokenLifeTime, true));
     }
+
     return recList;
   }
 
diff --git a/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java b/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java
index 5cd8588b9730650c8c463e8f3899e1a06b1f8ad2..9544fc7410436b30c461f055bf2a69d545439076 100644
--- a/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java
+++ b/solidify-util/src/main/java/ch/unige/solidify/util/OffsetDateTimeAdapter.java
@@ -31,11 +31,17 @@ import ch.unige.solidify.SolidifyConstants;
 public class OffsetDateTimeAdapter {
 
   public static OffsetDateTime parseDateTime(String value) {
-    return OffsetDateTime.parse(value);
+    if (value != null) {
+      return OffsetDateTime.parse(value);
+    }
+    return null;
   }
 
   public static String printDateTime(OffsetDateTime value) {
-    return value.format(DateTimeFormatter.ISO_INSTANT);
+    if (value != null) {
+      return value.format(DateTimeFormatter.ISO_INSTANT);
+    }
+    return null;
   }
 
   /**