diff --git a/src/grb_read.c b/src/grb_read.c
index 9570246fc693c469c9a530d882fbe3c4272f0acc..26a8979b145d6a8d7356b699eb565f4859c501fb 100644
--- a/src/grb_read.c
+++ b/src/grb_read.c
@@ -141,10 +141,10 @@ DecodeArgs grb_read_raw_data(stream_t *streamptr, int recID, int memtype, void *
 
   if (streamptr->fdbRetrieve)
     {
+#ifdef HAVE_LIBFDB5
       void *fdbItem = streamptr->tsteps[tsID].records[recID].fdbItem;
       if (!fdbItem) Error("fdbItem not available!");
 
-#ifdef HAVE_LIBFDB5
       fdb_handle_t *fdb;
       fdb_new_handle(&fdb);
 
diff --git a/src/stream.c b/src/stream.c
index 2d47e40fa27e1d9b2c5cb8d7613a8bebb4653c40..7b20bb57821e6780a879aec31abc67bc6dc73a24 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -385,10 +385,7 @@ int cdiInqContents(stream_t *streamptr)
     case CDI_FILETYPE_GRB:
     case CDI_FILETYPE_GRB2:
       {
-        if (streamptr->fdbRetrieve)
-          status = fdbInqContents(streamptr);
-        else
-          status = grbInqContents(streamptr);
+        status = (streamptr->fdbRetrieve) ? fdbInqContents(streamptr) : grbInqContents(streamptr);
 	break;
       }
 #endif
@@ -610,10 +607,10 @@ int cdiStreamOpenDefaultDelegate(const char *filename, char filemode, int filety
 
 int streamOpenID(const char *filename, char filemode, int filetype, int resH)
 {
-  if ( CDI_Debug )
+  if (CDI_Debug)
     Message("Open %s mode %c file %s", strfiletype(filetype), filemode, filename ? filename : "(NUL)");
 
-  if ( ! filename || filetype < 0 ) return CDI_EINVAL;
+  if (! filename || filetype < 0) return CDI_EINVAL;
 
   stream_t *streamptr = stream_new_entry(resH);
   int streamID = CDI_ESYSTEM;
@@ -623,7 +620,7 @@ int streamOpenID(const char *filename, char filemode, int filetype, int resH)
     = (int (*)(const char *, char, int, stream_t *, int))
     namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func;
 
-  int fileID = streamOpenDelegate(filename, filemode, filetype, streamptr, 1);
+  const int fileID = streamOpenDelegate(filename, filemode, filetype, streamptr, 1);
   if (fileID < 0)
     {
       streamID = fileID;
@@ -639,13 +636,13 @@ int streamOpenID(const char *filename, char filemode, int filetype, int resH)
 
       if (filemode == 'r')
         {
-          int vlistID = vlistCreate();
+          const int vlistID = vlistCreate();
           if (vlistID < 0) return CDI_ELIMIT;
 
           cdiVlistMakeInternal(vlistID);
           streamptr->vlistID = vlistID;
           // cdiReadByteorder(streamID);
-          int status = cdiInqContents(streamptr);
+          const int status = cdiInqContents(streamptr);
           if (status < 0)
             {
               streamID = status;
diff --git a/src/stream_gribapi.c b/src/stream_gribapi.c
index c82b662af333ce8367eb0260b57c5b2b9c8fef8c..2ef233d7d92767f30a770c91cea8ace4fa14e53d 100644
--- a/src/stream_gribapi.c
+++ b/src/stream_gribapi.c
@@ -996,6 +996,10 @@ void decode_fdbitem(const char *fdbItem, KeyValueEntry *keyValue)
               i += 2;
             }
         }
+      else if (i > start && i == (len - 1))
+        {
+          numKeys++;
+        }
     }
 
   keyValue->numKeys = numKeys;
@@ -1024,8 +1028,7 @@ void fdbitem_to_request(const char *fdbItem, fdb_request_t *request)
   keyValue.item = NULL;
   decode_fdbitem(fdbItem, &keyValue);
 
-  int numKeys = keyValue.numKeys;
-  for (int i = 0; i < numKeys; i++)
+  for (int i = 0; i < keyValue.numKeys; i++)
     {
       // printf("key <%s> value <%s>\n", keyValue.keys[i], keyValue.values[i]);
       fdb_request_add1(request, keyValue.keys[i], keyValue.values[i]);
@@ -1254,12 +1257,26 @@ int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords,
 
   for (int i = 1; i < numTimesteps; ++i)
     {
+      int k = 0;
+      for (k = 0; k < numTimesteps; k++)
+        {
+          const int index = (i + k) * numRecords;
+          if (date != recordInfoList[index].date || time != recordInfoList[index].time) break;
+        }
+
       int index = i * numRecords;
-      if (date == recordInfoList[index].date && time == recordInfoList[index].time)
+      if (k > 0 && k < numTimesteps)
         {
-          Message("Skip timestep %d", i + 1);
-          numTimestepsNew--;
-          for (int j = i; j < numTimestepsNew; j++) timestepRecordOffset[j] = timestepRecordOffset[j + 1];
+          index = (i + k) * numRecords;
+          int n = k;
+          for (k = 0; k < n; k++)
+            {
+              Message("Skip timestep %d", i + k + 1);
+              numTimestepsNew--;
+              for (int j = i; j < numTimestepsNew; j++) timestepRecordOffset[j] = timestepRecordOffset[j + 1];
+            }
+          i += k;
+          if (i >= numTimesteps) break;
         }
 
       date = recordInfoList[index].date;
@@ -1269,20 +1286,38 @@ int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords,
   return numTimestepsNew;
 }
 
-#endif
-
-int fdbScanTimesteps(stream_t *streamptr)
+static
+fdb_request_t *create_fdb_request(const char *filename)
 {
-#ifdef HAVE_LIBFDB5
-  void *gribbuffer = NULL;
-  size_t buffersize = 0;
-  grib_handle *gh = NULL;
+  size_t len = strlen(filename);
+  if (len == 4) Error("Empty FDB request!");
 
-  fdb_handle_t *fdb = NULL;
-  fdb_new_handle(&fdb);
+  KeyValueEntry keyValue;
+  keyValue.item = NULL;
+  decode_fdbitem(filename + 4, &keyValue);
+
+  if (keyValue.numKeys == 0) Error("Empty FDB request!");
 
   fdb_request_t *request = NULL;
   fdb_new_request(&request);
+
+  bool classDefined = false;
+  bool streamDefined = false;
+  bool expverDefined = false;
+  for (int i = 0; i < keyValue.numKeys; i++)
+    {
+      if      (strcmp(keyValue.keys[i], "class") == 0) classDefined = true;
+      else if (strcmp(keyValue.keys[i], "stream") == 0) streamDefined = true;
+      else if (strcmp(keyValue.keys[i], "expver") == 0) expverDefined = true;
+
+      fdb_request_add1(request, keyValue.keys[i], keyValue.values[i]);
+    }
+
+  if (!classDefined) Error("FDB parameter <class> undefined!");
+  if (!streamDefined) Error("FDB parameter <stream> undefined!");
+  if (!expverDefined) Error("FDB parameter <expver> undefined!");
+
+  /*
   fdb_request_add1(request, "class", "ea");
   fdb_request_add1(request, "expver", "0001");
   fdb_request_add1(request, "stream", "oper");
@@ -1294,10 +1329,30 @@ int fdbScanTimesteps(stream_t *streamptr)
   fdb_request_add1(request, "step", "0");
   fdb_request_add1(request, "param", "139");
   // fdb_request_add1(request, "levelist", "300");
+  */
+  if (keyValue.item) free(keyValue.item);
+
+  return request;
+}
+
+#endif
+
+int fdbScanTimesteps(stream_t *streamptr)
+{
+#ifdef HAVE_LIBFDB5
+  void *gribbuffer = NULL;
+  size_t buffersize = 0;
+  grib_handle *gh = NULL;
+
+  fdb_request_t *request = create_fdb_request(streamptr->filename);
+
+  fdb_handle_t *fdb = NULL;
+  fdb_new_handle(&fdb);
 
   char **fdbItemList = NULL;
   int numItems = fdb_fill_itemlist(fdb, request, &fdbItemList);
   fdb_delete_request(request);
+  if (numItems == 0) Error("FDB request does not find any database entries!");
   for (int i = 0; i < numItems; ++i) printf("item[%d] = %s\n", i, fdbItemList[i]);
 
   KeyValueEntry *keyValueList = (KeyValueEntry *) malloc(numItems * sizeof(KeyValueEntry));
@@ -1430,7 +1485,7 @@ int fdbScanTimesteps(stream_t *streamptr)
       cdi_create_records(streamptr, tsID);
       record_t *records = streamptr->tsteps[tsID].records;
 
-      int nrecs = (tsID == 1) ? streamScanInitRecords2(streamptr) : streamScanInitRecords(streamptr, tsID);
+      const int nrecs = (tsID == 1) ? streamScanInitRecords2(streamptr) : streamScanInitRecords(streamptr, tsID);
       if (nrecs != numRecords) Error("Internal error. nrecs = %d", nrecs);
 
       taxis->vdate = vdate;