diff --git a/search-core/src/main/java/org/opengroup/osdu/search/provider/impl/SearchAfterQueryServiceImpl.java b/search-core/src/main/java/org/opengroup/osdu/search/provider/impl/SearchAfterQueryServiceImpl.java
index 917b78fb024c4f50580e8e94cf90525abf221e2c..367fe60c3f69e818a2979576ac1c2aba9de26d27 100644
--- a/search-core/src/main/java/org/opengroup/osdu/search/provider/impl/SearchAfterQueryServiceImpl.java
+++ b/search-core/src/main/java/org/opengroup/osdu/search/provider/impl/SearchAfterQueryServiceImpl.java
@@ -86,8 +86,8 @@ public class SearchAfterQueryServiceImpl extends CoreQueryBase implements ISearc
         SearchRequest.Builder searchSourceBuilder = this.createSearchSourceBuilder(request);
         // Add PIT for SearchAfter Query. [indicesOptions] cannot be used with point in time
         String pitId = openPointInTime(index, this.elasticClientHandler.getOrCreateRestClient());
-        searchSourceBuilder.pit(pit -> pit.id(pitId).keepAlive(SEARCH_AFTER_TIMEOUT));
-        searchSourceBuilder.searchType(SearchType.QueryThenFetch).batchedReduceSize(512L);
+        searchSourceBuilder.pit(pit -> pit.id(pitId).keepAlive(SEARCH_AFTER_TIMEOUT))
+                .searchType(SearchType.QueryThenFetch).batchedReduceSize(512L);
 
         // All PIT search requests add an implicit sort tiebreaker field called _shard_doc
         if (request.getSort() == null) {
@@ -252,14 +252,17 @@ public class SearchAfterQueryServiceImpl extends CoreQueryBase implements ISearc
         searchRequest.setSort(cursorSettings.getSortQuery());
         SearchRequest.Builder sourceBuilder = this.createSearchSourceBuilder(searchRequest);
 
-        // The following 3 statements are required to support pagination with search_after
+        // Both SortOptions and FieldValue can't be cached properly with implementation
+        // org.opengroup.osdu.core.common.cache.RedisCache that uses Gson to serialize/deserialize.
+        // The serialization will lose critical information from SortOptions and FieldValue objects.
         List<SortOptions> sortOptionsList = this.getSortOptions(searchRequest, client);
         List<FieldValue> fieldValues = this.toFieldValues(cursorSettings.getSearchAfterValues());
-        sourceBuilder.pit(pit -> pit.id(cursorSettings.getPitId()).keepAlive(SEARCH_AFTER_TIMEOUT));
-        sourceBuilder.sort(sortOptionsList)
-                     .searchAfter(fieldValues);
-        sourceBuilder.searchType(SearchType.QueryThenFetch).batchedReduceSize(512L);
 
+        // The following statements are required to support pagination with search_after
+        sourceBuilder.pit(pit -> pit.id(cursorSettings.getPitId()).keepAlive(SEARCH_AFTER_TIMEOUT))
+                .sort(sortOptionsList)
+                .searchAfter(fieldValues)
+                .searchType(SearchType.QueryThenFetch).batchedReduceSize(512L);
         SearchRequest elasticSearchRequest = sourceBuilder.build();
         SearchResponse<Map<String, Object>> searchResponse = client.search(elasticSearchRequest, (Type) Map.class);
 
@@ -346,12 +349,7 @@ public class SearchAfterQueryServiceImpl extends CoreQueryBase implements ISearc
         for(FieldValue fieldValue : fieldValues) {
             KindValue kindValue = new KindValue();
             kindValue.setKind(fieldValue._kind().name());
-            if(fieldValue.isDouble() || fieldValue.isLong() || fieldValue.isBoolean()) {
-                kindValue.setValue(String.valueOf(fieldValue._get()));
-            }
-            else {
-                kindValue.setValue(fieldValue._get());
-            }
+            kindValue.setValue(fieldValue._get());
             kindValues.add(kindValue);
         }
         return kindValues;
@@ -365,24 +363,20 @@ public class SearchAfterQueryServiceImpl extends CoreQueryBase implements ISearc
         List<FieldValue> fieldValues = new ArrayList();
         for(KindValue kindValue : kindValues) {
             FieldValue fieldValue;
-            switch (kindValue.getKind()) {
-                case "Double":
-                    fieldValue = FieldValue.of(Double.parseDouble((String)kindValue.getValue()));
-                    break;
-                case "Long":
-                    fieldValue = FieldValue.of(Long.parseLong((String)kindValue.getValue()));
-                    break;
-                case "Boolean":
-                    fieldValue = FieldValue.of(Boolean.parseBoolean((String)kindValue.getValue()));
-                    break;
-                case "String":
-                    fieldValue = FieldValue.of((String) kindValue.getValue());
-                    break;
-                case "Null":
-                    fieldValue = FieldValue.NULL;
-                    break;
-                default:
-                    fieldValue = FieldValue.of(kindValue.getValue());
+            if(kindValue.getKind().equals(FieldValue.Kind.Null.name()) || kindValue.getValue() == null) {
+                fieldValue = FieldValue.NULL;
+            }
+            else if(kindValue.getKind().equals(FieldValue.Kind.Double.name())) {
+                fieldValue = FieldValue.of((double)kindValue.getValue());
+            }
+            else if(kindValue.getKind().equals(FieldValue.Kind.Long.name())) {
+                fieldValue = FieldValue.of((long)kindValue.getValue());
+            }
+            else if(kindValue.getKind().equals(FieldValue.Kind.Boolean.name())) {
+                fieldValue = FieldValue.of((boolean) kindValue.getValue());
+            }
+            else {
+                fieldValue = FieldValue.of(kindValue.getValue());
             }
             fieldValues.add(fieldValue);
         }