diff --git a/src/pio_server.c b/src/pio_server.c
index 9dd29db3c0a98c4b6e703c90cc2ee2c91019570e..c4131969bc8bc380a22738e03e98ccc04d81e01f 100644
--- a/src/pio_server.c
+++ b/src/pio_server.c
@@ -2153,19 +2153,27 @@ cdiPioServerStreamClose(stream_t *streamptr, int recordBufIsToBeDeleted)
     = (void (*)(int))conf->callbacks[CDIPIO_CALLBACK_POSTSTREAMCLOSE];
   streamCloseCallBack(streamptr->self);
 }
+#if defined HAVE_NC4HDF5 && defined HAVE_PARALLEL_NC4
+bool parH5ZeroCountProblem = false;
+#endif
 
 #ifdef HAVE_LIBNETCDF
 static void
-cdiPioCdfDefTimestep(stream_t *streamptr, int tsID)
+cdiPioCdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount)
 {
   int streamID = streamptr->self,
     rankOpen = cdiPioStream2Owner(streamID);
+#ifdef HAVE_PARALLEL_NC4
+  valCount = rankOpen != CDI_PIO_COLLECTIVE_OPEN
+    || parH5ZeroCountProblem
+    || commInqRankColl() == 0;
+#endif
   if (commInqIOMode() == PIO_NONE
 #ifdef HAVE_PARALLEL_NC4
       || rankOpen == CDI_PIO_COLLECTIVE_OPEN
 #endif
       || commInqRankColl() == rankOpen)
-    cdfDefTimestep(streamptr, tsID);
+    cdfDefTimestep(streamptr, tsID, valCount);
 }
 #endif
 
@@ -2380,6 +2388,15 @@ void cdiPioCollectorMessageLoop()
   cdiPioEnableNetCDFParAccess();
   numPioPrimes = PPM_prime_factorization_32((uint32_t)commInqSizeColl(),
                                             &pioPrimes);
+#  ifdef HAVE_NC4HDF5
+  {
+    unsigned majnum, minnum, relnum;
+    extern int H5get_libversion(unsigned *, unsigned *, unsigned *);
+    H5get_libversion(&majnum, &minnum, &relnum);
+    parH5ZeroCountProblem = (majnum == 1 && ((minnum == 8 && relnum <= 8)
+                                             || (minnum < 8)));
+  }
+#  endif
 #endif
 #ifdef HAVE_LIBNETCDF
   cdiSerialOpenFileCount = Calloc(sizeof (cdiSerialOpenFileCount[0]),
diff --git a/src/stream.c b/src/stream.c
index 1f45c1acace0f9028d0542d82937511ce5cf1007..47558b368e8663f17f45c624b02d0bdcdfc7b505 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1200,10 +1200,10 @@ int cdiStreamDefTimestep_(stream_t *streamptr, int tsID)
       /* usually points to cdfDefTimestep in serial mode but
        * to cdiPioCdfDefTimestep on servers and to a null-op on
        * clients in client/server mode */
-      void (*myCdfDefTimestep)(stream_t *streamptr, int tsID)
-        = (void (*)(stream_t *, int))
+      void (*myCdfDefTimestep)(stream_t *streamptr, int tsID, size_t)
+        = (void (*)(stream_t *, int, size_t))
         namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func;
-      myCdfDefTimestep(streamptr, tsID);
+      myCdfDefTimestep(streamptr, tsID, 1);
     }
 #endif
 
diff --git a/src/stream_cdf.h b/src/stream_cdf.h
index 55bb99d09db15e1452381f80a75c9869eb15a8c0..38084d2cecbf13ca49cdbf4b6f61237b9badee55 100644
--- a/src/stream_cdf.h
+++ b/src/stream_cdf.h
@@ -19,7 +19,7 @@ enum {
 
 int    cdfDefVar(stream_t *streamptr, int varID);
 void   cdfDefVars(stream_t *streamptr);
-void   cdfDefTimestep(stream_t *streamptr, int tsID);
+void   cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount);
 int    cdfInqTimestep(stream_t *streamptr, int tsID);
 int    cdfInqContents(stream_t *streamptr);
 void   cdfDefHistory(stream_t *streamptr, int size, const char *history);
diff --git a/src/stream_cdf_time.c b/src/stream_cdf_time.c
index c249ec7fa29c2e82e52a106be6d6202763997e24..56f1aaf4dd6733aa4db8a68f144a5d4ebcf183fa 100644
--- a/src/stream_cdf_time.c
+++ b/src/stream_cdf_time.c
@@ -256,7 +256,7 @@ void cdfDefTime(stream_t* streamptr)
 
 
 static void
-cdfDefTimeValue(stream_t *streamptr, int tsID)
+cdfDefTimeValue(stream_t *streamptr, int tsID, size_t valCount)
 {
   int fileID = streamptr->fileID;
 
@@ -272,7 +272,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID)
     }
 
   const size_t start[2] = { [0] = (size_t)tsID, [1] = 0 },
-    count[2] = { [0] = 1, [1] = 2 };
+    count[2] = { [0] = valCount, [1] = 2 * valCount };
 
   double timevalue[2] = {
     cdiEncodeTimeval(taxis->vdate, taxis->vtime, &streamptr->tsteps[0].taxis)
@@ -298,7 +298,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID)
 }
 
 
-void cdfDefTimestep(stream_t *streamptr, int tsID)
+void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount)
 {
   int vlistID = streamptr->vlistID;
 
@@ -319,7 +319,7 @@ void cdfDefTimestep(stream_t *streamptr, int tsID)
           */
         }
     }
-  cdfDefTimeValue(streamptr, tsID);
+  cdfDefTimeValue(streamptr, tsID, valCount);
 }
 
 #endif