diff --git a/src/cdf_read.c b/src/cdf_read.c
index a4c55bf0e8ccaaed2e3659075745a102e77ef6bf..e786713859e0f0804d119120191d654cc669bdad 100644
--- a/src/cdf_read.c
+++ b/src/cdf_read.c
@@ -24,8 +24,9 @@ cdfReadGridTraj(stream_t *streamptr, int gridID)
   int fileID = streamptr->fileID;
 
   int gridindex = vlistGridIndex(vlistID, gridID);
-  int ncLonId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
-  int ncLatId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+  int ncLonId = cdfGrid->ncIdVec[CDF_VARID_X];
+  int ncLatId = cdfGrid->ncIdVec[CDF_VARID_Y];
 
   int tsID = streamptr->curTsID;
   size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
@@ -47,6 +48,7 @@ cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENS
   int zaxisID = vlistInqVarZaxis(vlistID, varID);
   int timetype = vlistInqVarTimetype(vlistID, varID);
   int gridindex = vlistGridIndex(vlistID, gridID);
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
   size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
 
   int xid = CDI_UNDEFID, yid = CDI_UNDEFID;
@@ -56,11 +58,11 @@ cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENS
     }
   else
     {
-      xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
-      yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+      xid = cdfGrid->ncIdVec[CDF_DIMID_X];
+      yid = cdfGrid->ncIdVec[CDF_DIMID_Y];
     }
   int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-  int zid = streamptr->zaxisID[zaxisindex];
+  int zid = streamptr->cdfInfo.zaxisIdVec[zaxisindex];
 
   int ndims = 0;
 #define addDimension(startCoord, length) \
@@ -376,7 +378,7 @@ cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4])
   int vlistID = streamptr->vlistID;
   int gridId = vlistInqVarGrid(vlistID, varId);
   int gridindex = vlistGridIndex(vlistID, gridId);
-  const int *ncIDs = streamptr->ncgrid[gridindex].ncIDs;
+  const int *ncIDs = streamptr->cdfInfo.cdfGridVec[gridindex].ncIdVec;
 
   switch (gridInqType(gridId))
     {
@@ -395,15 +397,16 @@ cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4])
 
   int zaxisID = vlistInqVarZaxis(vlistID, varId);
   int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-  (*outDimIds)[2] = streamptr->zaxisID[zaxisindex];
+  (*outDimIds)[2] = streamptr->cdfInfo.zaxisIdVec[zaxisindex];
 }
 
 static size_t
 stream_inq_dimlen(stream_t *streamptr, int dimid)
 {
-  int ndims = streamptr->ncNumDims;
-  int *ncdimid = streamptr->ncDimID;
-  size_t *ncdimlen = streamptr->ncDimLen;
+  const CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  int ndims = cdfInfo->ncNumDims;
+  const int *ncdimid = cdfInfo->ncDimIdVec;
+  const size_t *ncdimlen = cdfInfo->ncDimLenVec;
   for (int i = 0; i < ndims; ++i)
     {
       if (dimid == ncdimid[i]) return ncdimlen[i];
@@ -490,8 +493,8 @@ cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelI
   if (skipdim == 1) addDimension(0, 1);
 
   int gridindex = vlistGridIndex(vlistID, gridId);
-  const ncgrid_t *ncGrid = &streamptr->ncgrid[gridindex];
-  bool readPart = (ncGrid->gridID == gridId && ncGrid->start != -1 && ncGrid->count != -1);
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+  bool readPart = (cdfGrid->gridID == gridId && cdfGrid->start != -1 && cdfGrid->count != -1);
 
   for (int id = 0; id < 4; ++id)
     {
@@ -503,7 +506,7 @@ cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelI
         case 2:
         case 4:
           if (readPart && curDimId == dimIds[0])
-            addDimension((size_t) ncGrid->start, (size_t) ncGrid->count);
+            addDimension((size_t) cdfGrid->start, (size_t) cdfGrid->count);
           else
             addDimension(0, stream_inq_dimlen(streamptr, curDimId));
           break;
diff --git a/src/cdf_write.c b/src/cdf_write.c
index 1e73c949e05de87536b0ae001f9e45fcaa4d1463..709a6b07e8ed0e59dac22ff8ed1a073326369f31 100644
--- a/src/cdf_write.c
+++ b/src/cdf_write.c
@@ -73,9 +73,10 @@ cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block)
 static nc_type
 cdfTypeComplexFloat(stream_t *streamptr)
 {
-  if (streamptr->nc_complex_float_id == CDI_UNDEFID)
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  if (cdfInfo->complexFloatId == CDI_UNDEFID)
     {
-      typedef struct complex_float
+      typedef struct
       {
         float r, i;
       } complex_float;
@@ -88,18 +89,19 @@ cdfTypeComplexFloat(stream_t *streamptr)
       if (status != NC_NOERR) Error("%s", nc_strerror(status));
       status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_float, i), NC_FLOAT);
       if (status != NC_NOERR) Error("%s", nc_strerror(status));
-      streamptr->nc_complex_float_id = nc_complex_id;
+      cdfInfo->complexFloatId = nc_complex_id;
     }
 
-  return (nc_type) streamptr->nc_complex_float_id;
+  return (nc_type) cdfInfo->complexFloatId;
 }
 
 static nc_type
 cdfTypeComplexDouble(stream_t *streamptr)
 {
-  if (streamptr->nc_complex_double_id == CDI_UNDEFID)
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  if (cdfInfo->complexDoubleId == CDI_UNDEFID)
     {
-      typedef struct complex_double
+      typedef struct
       {
         double r, i;
       } complex_double;
@@ -112,10 +114,10 @@ cdfTypeComplexDouble(stream_t *streamptr)
       if (status != NC_NOERR) Error("%s", nc_strerror(status));
       status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_double, i), NC_DOUBLE);
       if (status != NC_NOERR) Error("%s", nc_strerror(status));
-      streamptr->nc_complex_double_id = nc_complex_id;
+      cdfInfo->complexDoubleId = nc_complex_id;
     }
 
-  return (nc_type) streamptr->nc_complex_double_id;
+  return (nc_type) cdfInfo->complexDoubleId;
 }
 #endif
 
@@ -414,7 +416,7 @@ nc_grid_index(stream_t *streamptr, int gridID)
   int vlistID = streamptr->vlistID;
   int ngrids = vlistNumGrids(vlistID);
   for (index = 0; index < ngrids; ++index)
-    if (streamptr->ncgrid[index].gridID == gridID) break;
+    if (streamptr->cdfInfo.cdfGridVec[index].gridID == gridID) break;
 
   assert(index < ngrids);
 
@@ -577,9 +579,10 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g
       if (numLPE > 0) cdf_put_att_int(fileID, ncvarID, "CDI_grid_num_LPE", NC_INT, 1, &numLPE);
     }
 
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
   if (gridtype == GRID_GAUSSIAN_REDUCED)
     {
-      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y];
       if (ncyvarID != CDI_UNDEFID)
         {
           char name[CDI_MAX_NAME];
@@ -589,7 +592,7 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g
           cdf_put_att_text(fileID, ncvarID, "CDI_grid_latitudes", len, name);
         }
 
-      int ncrpvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_RP];
+      int ncrpvarID = cdfGrid->ncIdVec[CDF_VARID_RP];
       if (ncrpvarID != CDI_UNDEFID)
         {
           char name[CDI_MAX_NAME];
@@ -613,25 +616,25 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g
     }
   else if (gridtype == GRID_LONLAT && xid == CDI_UNDEFID && yid == CDI_UNDEFID && gridsize == 1)
     {
-      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
-      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X];
+      int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y];
       cdfAppendCoordinates(fileID, ncyvarID, coordinates);
       cdfAppendCoordinates(fileID, ncxvarID, coordinates);
     }
   else if (gridtype == GRID_GAUSSIAN_REDUCED)
     {
       /*
-      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
-      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      int ncxvarID = ncgrid->ncIDs[CDF_VARID_X];
+      int ncyvarID = ncgrid->ncIDs[CDF_VARID_Y];
       cdfAppendCoordinates(fileID, ncyvarID, coordinates);
       cdfAppendCoordinates(fileID, ncxvarID, coordinates);
       */
     }
   else if (gridtype == GRID_UNSTRUCTURED || gridtype == GRID_CURVILINEAR)
     {
-      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
-      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
-      int ncavarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_A];
+      int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X];
+      int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y];
+      int ncavarID = cdfGrid->ncIdVec[CDF_VARID_A];
       // CMOR order: coordinates = "lat lon"
       if (CDI_Coordinates_Lon_Lat)
         {
@@ -671,12 +674,12 @@ cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int g
     {
       if (gridInqXIsc(gridID))
         {
-          int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+          int ncxvarID = cdfGrid->ncIdVec[CDF_VARID_X];
           cdfAppendCoordinates(fileID, ncxvarID, coordinates);
         }
       else if (gridInqYIsc(gridID))
         {
-          int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+          int ncyvarID = cdfGrid->ncIdVec[CDF_VARID_Y];
           cdfAppendCoordinates(fileID, ncyvarID, coordinates);
         }
     }
@@ -950,14 +953,15 @@ cdfDefVar(stream_t *streamptr, int varID)
   SizeType gridsize = gridInqSize(gridID);
   int gridtype = gridInqType(gridID);
   int gridindex = nc_grid_index(streamptr, gridID);
-  int xid = (gridtype != GRID_TRAJECTORY) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X] : CDI_UNDEFID;
-  int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]
-                                                                               : CDI_UNDEFID;
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+  int xid = (gridtype != GRID_TRAJECTORY) ? cdfGrid->ncIdVec[CDF_DIMID_X] : CDI_UNDEFID;
+  int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? cdfGrid->ncIdVec[CDF_DIMID_Y] : CDI_UNDEFID;
 
   int zaxisID = vlistInqVarZaxis(vlistID, varID);
   int zaxistype = zaxisInqType(zaxisID);
   int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-  int zid = streamptr->zaxisID[zaxisindex];
+  int zid = cdfInfo->zaxisIdVec[zaxisindex];
 
   int dimorder[3];  // ZYX/321 and ZXY/312
   vlistInqVarDimorder(vlistID, varID, dimorder);
@@ -1062,7 +1066,7 @@ cdfDefVar(stream_t *streamptr, int varID)
     }
 
   bool zaxisIsScalar = (zid == CDI_UNDEFID) ? (zaxisInqScalar(zaxisID) > 0) : false;
-  int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->nczvarID[zaxisindex] : CDI_UNDEFID;
+  int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->cdfInfo.ncZvarIdVec[zaxisindex] : CDI_UNDEFID;
 
   cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, (size_t) gridsize, axis, iax);
 
@@ -1129,8 +1133,9 @@ static void
 cdfWriteGridTraj(stream_t *streamptr, int gridID)
 {
   int gridindex = nc_grid_index(streamptr, gridID);
-  int lonID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
-  int latID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+  const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+  int lonID = cdfGrid->ncIdVec[CDF_DIMID_X];
+  int latID = cdfGrid->ncIdVec[CDF_DIMID_Y];
   size_t index = (size_t) streamptr->curTsID;
 
   double xlon = gridInqXval(gridID, 0);
@@ -1375,13 +1380,14 @@ cdfGetXYZid(stream_t *streamptr, int gridID, int zaxisID, int *xid, int *yid, in
   else
     {
       int gridindex = nc_grid_index(streamptr, gridID);
-      *xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
-      if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+      const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+      *xid = cdfGrid->ncIdVec[CDF_DIMID_X];
+      if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = cdfGrid->ncIdVec[CDF_DIMID_Y];
     }
 
   int vlistID = streamptr->vlistID;
   int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-  *zid = streamptr->zaxisID[zaxisindex];
+  *zid = streamptr->cdfInfo.zaxisIdVec[zaxisindex];
 }
 
 static void
diff --git a/src/cdi_int.h b/src/cdi_int.h
index e39998429b72e7a52371d5540775cb4e817ffb5f..93d1381205ec1f215ed71906a79da7fd2f64495b 100644
--- a/src/cdi_int.h
+++ b/src/cdi_int.h
@@ -259,16 +259,31 @@ enum cdfIDIdx
   CDF_VARID_Y,
   CDF_VARID_RP,  // reducedPoints
   CDF_VARID_A,
-  CDF_SIZE_ncIDs,
+  CDF_SIZE_NCID,
 };
 
 typedef struct
 {
-  int ncIDs[CDF_SIZE_ncIDs];
+  int ncIdVec[CDF_SIZE_NCID];
   int gridID;
   long start;
   long count;
-} ncgrid_t;
+} CdfGrid;
+
+typedef struct
+{
+  int complexFloatId;
+  int complexDoubleId;
+  CdfGrid cdfGridVec[MAX_GRIDS_PS];
+  int zaxisIdVec[MAX_ZAXES_PS];  // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs
+  int ncZvarIdVec[MAX_ZAXES_PS];
+  int ncDimIdVec[MAX_DIMS_PS];
+  size_t ncDimLenVec[MAX_DIMS_PS];
+  int ncNumDims;
+  size_t chunkSizeTdim;
+  size_t chunkSizeZdim;
+  VCT vct;
+} CdfInfo;
 #endif
 
 typedef struct
@@ -299,17 +314,7 @@ typedef struct
   int ncmode;
   int vlistID;
 #ifdef HAVE_LIBNETCDF
-  int nc_complex_float_id;
-  int nc_complex_double_id;
-  ncgrid_t ncgrid[MAX_GRIDS_PS];
-  int zaxisID[MAX_ZAXES_PS];  // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs
-  int nczvarID[MAX_ZAXES_PS];
-  int ncNumDims;
-  int ncDimID[MAX_DIMS_PS];
-  size_t ncDimLen[MAX_DIMS_PS];
-  VCT vct;
-  size_t chunkSizeTdim;
-  size_t chunkSizeZdim;
+  CdfInfo cdfInfo;
 #endif
   long maxGlobalRecs;
   int globalatts;
diff --git a/src/stream.c b/src/stream.c
index 646219c5ca1021c47ba461e553e429fc726b3d5c..0ad1151050767fe2f473688dc6d26c8948b57d8d 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -251,9 +251,10 @@ streamDefNumWorker(int streamID, int numWorker)
               if (streamptr->maxGlobalRecs == -1) xabort("Internal error: number of timesteps missing!");
               if (streamptr->maxGlobalRecs == 1) numWorker = 0;
               if (numWorker > streamptr->maxGlobalRecs) numWorker = (int) streamptr->maxGlobalRecs;
-              if (streamptr->chunkSizeTdim > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars;
-              if (streamptr->chunkSizeZdim > 1) numWorker = 0;
-              if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", streamptr->chunkSizeTdim, streamptr->chunkSizeZdim);
+              CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+              if (cdfInfo->chunkSizeTdim > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars;
+              if (cdfInfo->chunkSizeZdim > 1) numWorker = 0;
+              if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", cdfInfo->chunkSizeTdim, cdfInfo->chunkSizeZdim);
             }
 #endif
           else
@@ -1076,31 +1077,32 @@ streamDefaultValue(stream_t *streamptr)
   basetimeInit(&streamptr->basetime);
 
 #ifdef HAVE_LIBNETCDF
-  streamptr->nc_complex_float_id = CDI_UNDEFID;
-  streamptr->nc_complex_double_id = CDI_UNDEFID;
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  cdfInfo->complexFloatId = CDI_UNDEFID;
+  cdfInfo->complexDoubleId = CDI_UNDEFID;
 
-  for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->zaxisID[i] = CDI_UNDEFID;
-  for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->nczvarID[i] = CDI_UNDEFID;
+  for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->zaxisIdVec[i] = CDI_UNDEFID;
+  for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->ncZvarIdVec[i] = CDI_UNDEFID;
 
   for (int i = 0; i < MAX_GRIDS_PS; i++)
     {
-      streamptr->ncgrid[i].start = CDI_UNDEFID;
-      streamptr->ncgrid[i].count = CDI_UNDEFID;
-      streamptr->ncgrid[i].gridID = CDI_UNDEFID;
-      for (size_t j = 0; j < CDF_SIZE_ncIDs; ++j) streamptr->ncgrid[i].ncIDs[j] = CDI_UNDEFID;
+      cdfInfo->cdfGridVec[i].start = CDI_UNDEFID;
+      cdfInfo->cdfGridVec[i].count = CDI_UNDEFID;
+      cdfInfo->cdfGridVec[i].gridID = CDI_UNDEFID;
+      for (size_t j = 0; j < CDF_SIZE_NCID; ++j) cdfInfo->cdfGridVec[i].ncIdVec[j] = CDI_UNDEFID;
     }
 
-  streamptr->ncNumDims = 0;
-  for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimID[i] = CDI_UNDEFID;
-  for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimLen[i] = 0;
+  cdfInfo->ncNumDims = 0;
+  for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimIdVec[i] = CDI_UNDEFID;
+  for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimLenVec[i] = 0;
 
-  streamptr->vct.ilev = 0;
-  streamptr->vct.mlev = 0;
-  streamptr->vct.ilevID = CDI_UNDEFID;
-  streamptr->vct.mlevID = CDI_UNDEFID;
+  cdfInfo->chunkSizeTdim = 0;
+  cdfInfo->chunkSizeZdim = 0;
 
-  streamptr->chunkSizeTdim = 0;
-  streamptr->chunkSizeZdim = 0;
+  cdfInfo->vct.ilev = 0;
+  cdfInfo->vct.mlev = 0;
+  cdfInfo->vct.ilevID = CDI_UNDEFID;
+  cdfInfo->vct.mlevID = CDI_UNDEFID;
 #endif
   streamptr->maxGlobalRecs = CDI_UNDEFID;
 
diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c
index 7c3255c2fd9a89db4acb6fc8b23af9a418449ab9..ca2ffdfa361353179cfb2267f97b47cc1223be71 100644
--- a/src/stream_cdf_i.c
+++ b/src/stream_cdf_i.c
@@ -344,7 +344,8 @@ cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned)
   else if (xtype == NC_UINT64)  datatype = CDI_DATATYPE_FLT64;
   else
     {
-      if (xtype != streamptr->nc_complex_float_id && xtype != streamptr->nc_complex_double_id)
+      CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+      if (xtype != cdfInfo->complexFloatId && xtype != cdfInfo->complexDoubleId)
         {
           bool isUserDefinedType = false;
 #ifdef NC_FIRSTUSERTYPEID
@@ -363,14 +364,14 @@ cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned)
                   nc_inq_compound_field(fileID, xtype, 1, NULL, NULL, &field_type2, &field_dims2, NULL);
                   if (field_type1 == field_type2 && field_dims1 == 0 && field_dims2 == 0)
                     {
-                      if      (field_type1 == NC_FLOAT)  streamptr->nc_complex_float_id = xtype;
-                      else if (field_type1 == NC_DOUBLE) streamptr->nc_complex_double_id = xtype;
+                      if      (field_type1 == NC_FLOAT)  cdfInfo->complexFloatId = xtype;
+                      else if (field_type1 == NC_DOUBLE) cdfInfo->complexDoubleId = xtype;
                     }
                 }
             }
         }
-      if      (xtype == streamptr->nc_complex_float_id )  datatype = CDI_DATATYPE_CPX32;
-      else if (xtype == streamptr->nc_complex_double_id)  datatype = CDI_DATATYPE_CPX64;
+      if      (xtype == cdfInfo->complexFloatId )  datatype = CDI_DATATYPE_CPX32;
+      else if (xtype == cdfInfo->complexDoubleId)  datatype = CDI_DATATYPE_CPX64;
     }
 #endif
   // clang-format on
@@ -1643,6 +1644,7 @@ scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int model
 static void
 cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars)
 {
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
   for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
     {
       ncvar_t *ncvar = &ncvars[ncvarid];
@@ -1657,8 +1659,8 @@ cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars)
                 {
                   int dimType = ncvar->dimtypes[i];
                   // clang-format off
-                  if      (dimType == T_AXIS && chunkSize > streamptr->chunkSizeTdim) streamptr->chunkSizeTdim = chunkSize;
-                  else if (dimType == Z_AXIS && chunkSize > streamptr->chunkSizeZdim) streamptr->chunkSizeZdim = chunkSize;
+                  if      (dimType == T_AXIS && chunkSize > cdfInfo->chunkSizeTdim) cdfInfo->chunkSizeTdim = chunkSize;
+                  else if (dimType == Z_AXIS && chunkSize > cdfInfo->chunkSizeZdim) cdfInfo->chunkSizeZdim = chunkSize;
                   // clang-format on
                 }
             }
@@ -2117,7 +2119,7 @@ cdf_load_vals(size_t size, int ndims, int varid, ncvar_t *ncvar, double **gridva
 {
   if (CDI_Netcdf_Lazy_Grid_Load)
     {
-      *valsGet = (struct xyValGet){
+      *valsGet = (struct xyValGet) {
         .scalefactor = ncvar->scalefactor,
         .addoffset = ncvar->addoffset,
         .start = { start[0], start[1], start[2] },
@@ -2983,7 +2985,7 @@ destroy_grid(struct cdfLazyGrid *lazyGrid, grid_t *grid)
 }
 
 static int
-cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars,
+cdf_define_all_grids(stream_t *streamptr, CdfGrid *ncgrid, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars,
                      GridInfo *gridInfo)
 {
   for (int ncvarid = 0; ncvarid < nvars; ++ncvarid)
@@ -3157,14 +3159,14 @@ cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t
           ncgrid[gridindex].gridID = gridID;
           if (grid->type == GRID_TRAJECTORY)
             {
-              ncgrid[gridindex].ncIDs[CDF_VARID_X] = xvarid;
-              ncgrid[gridindex].ncIDs[CDF_VARID_Y] = yvarid;
+              ncgrid[gridindex].ncIdVec[CDF_VARID_X] = xvarid;
+              ncgrid[gridindex].ncIdVec[CDF_VARID_Y] = yvarid;
             }
           else
             {
-              if (xdimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_X] = ncdims[xdimid].dimid;
-              if (ydimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_Y] = ncdims[ydimid].dimid;
-              if (ncvar->isCubeSphere) ncgrid[gridindex].ncIDs[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid;
+              if (xdimid != CDI_UNDEFID) ncgrid[gridindex].ncIdVec[CDF_DIMID_X] = ncdims[xdimid].dimid;
+              if (ydimid != CDI_UNDEFID) ncgrid[gridindex].ncIdVec[CDF_DIMID_Y] = ncdims[ydimid].dimid;
+              if (ncvar->isCubeSphere) ncgrid[gridindex].ncIdVec[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid;
             }
 
           if (xdimid == CDI_UNDEFID && ydimid == CDI_UNDEFID && grid->size == 1) gridDefHasDims(gridID, CoordVar);
@@ -3263,12 +3265,12 @@ cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvar
 	          if      (ncvars[zvarid].xtype == NC_FLOAT) zdatatype = CDI_DATATYPE_FLT32;
 	          else if (ncvars[zvarid].xtype == NC_INT)   zdatatype = CDI_DATATYPE_INT32;
 	          else if (ncvars[zvarid].xtype == NC_SHORT) zdatatype = CDI_DATATYPE_INT16;
-                // clang-format on
-                // don't change the name !!!
-                /*
-                  if ((len = strlen(pname)) > 2)
-                  if (pname[len-2] == '_' && isdigit((int) pname[len-1])) pname[len-2] = 0;
-                */
+              // clang-format on
+              // don't change the name !!!
+              /*
+                if ((len = strlen(pname)) > 2)
+                if (pname[len-2] == '_' && isdigit((int) pname[len-1])) pname[len-2] = 0;
+              */
 #ifndef USE_MPI
               if (zaxisType == ZAXIS_CHAR && ncvars[zvarid].ndims == 2)
                 {
@@ -3389,7 +3391,7 @@ cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvar
             }
 
           int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-          streamptr->zaxisID[zaxisindex] = zdimid >= 0 ? ncdims[zdimid].dimid : zdimid;
+          streamptr->cdfInfo.zaxisIdVec[zaxisindex] = zdimid >= 0 ? ncdims[zdimid].dimid : zdimid;
 
           if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid, ncvar->name);
 
@@ -3671,11 +3673,12 @@ cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, i
         Message("varID = %d  gridID = %d  zaxisID = %d", varID, vlistInqVarGrid(vlistID, varID), vlistInqVarZaxis(vlistID, varID));
 
       int gridindex = vlistGridIndex(vlistID, gridID);
-      int xdimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
-      int ydimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+      const CdfGrid *ncGrid = &(streamptr->cdfInfo.cdfGridVec[gridindex]);
+      int xdimid = ncGrid->ncIdVec[CDF_DIMID_X];
+      int ydimid = ncGrid->ncIdVec[CDF_DIMID_Y];
 
       int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
-      int zdimid = streamptr->zaxisID[zaxisindex];
+      int zdimid = streamptr->cdfInfo.zaxisIdVec[zaxisindex];
 
       int ndims = ncvar->ndims;
       static const int ipow10[4] = { 1, 10, 100, 1000 };
@@ -4449,9 +4452,10 @@ static void
 stream_set_ncdims(stream_t *streamptr, int ndims, ncdim_t *ncdims)
 {
   int n = (ndims > MAX_DIMS_PS) ? MAX_DIMS_PS : ndims;
-  streamptr->ncNumDims = n;
-  for (int i = 0; i < n; i++) streamptr->ncDimID[i] = ncdims[i].dimid;
-  for (int i = 0; i < n; i++) streamptr->ncDimLen[i] = ncdims[i].len;
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  cdfInfo->ncNumDims = n;
+  for (int i = 0; i < n; i++) cdfInfo->ncDimIdVec[i] = ncdims[i].dimid;
+  for (int i = 0; i < n; i++) cdfInfo->ncDimLenVec[i] = ncdims[i].len;
 }
 
 static void
@@ -4726,7 +4730,7 @@ cdfInqContents(stream_t *streamptr)
 
   // define all grids
   gridInfo.timedimid = timedimid;
-  int status = cdf_define_all_grids(streamptr, streamptr->ncgrid, vlistID, ncdims, nvars, ncvars, &gridInfo);
+  int status = cdf_define_all_grids(streamptr, streamptr->cdfInfo.cdfGridVec, vlistID, ncdims, nvars, ncvars, &gridInfo);
   if (status < 0) return status;
 
   // define all zaxes
diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c
index 196eba54bb1df566857742d6503b3f2f8165ce3a..22b50d769565f4d2ea0835c8de64e5b12c7400df 100644
--- a/src/stream_cdf_o.c
+++ b/src/stream_cdf_o.c
@@ -49,17 +49,17 @@ static void
 cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex)
 {
   int dimID;
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
   for (int index = 0; index < gridIndex; ++index)
     {
-      if (ncgrid[index].ncIDs[CDF_DIMID_X] != CDI_UNDEFID)
+      if (cdfGridVec[index].ncIdVec[CDF_DIMID_X] != CDI_UNDEFID)
         {
-          int gridID0 = ncgrid[index].gridID;
+          int gridID0 = cdfGridVec[index].gridID;
           int gridtype0 = gridInqType(gridID0);
           if (gridtype0 == GRID_SPECTRAL || gridtype0 == GRID_FOURIER)
             {
-              dimID = ncgrid[index].ncIDs[CDF_DIMID_X];
+              dimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X];
               goto dimIDEstablished;
             }
         }
@@ -87,8 +87,8 @@ cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex)
   }
 
 dimIDEstablished:
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID;
 }
 
 struct idSearch
@@ -98,22 +98,22 @@ struct idSearch
 };
 
 static inline struct idSearch
-cdfSearchIDBySize(size_t startIdx, size_t numIDs, const ncgrid_t ncgrid[/*numIDs*/], int ncIDType, int searchType,
+cdfSearchIDBySize(size_t startIdx, size_t numIDs, const CdfGrid cdfGridVec[/*numIDs*/], int ncIDType, int searchType,
                   SizeType searchSize, int (*typeInq)(int id), SizeType (*sizeInq)(int id))
 {
   int numNonMatching = 0, foundID = CDI_UNDEFID;
   size_t foundIdx = SIZE_MAX;
   for (size_t index = startIdx; index < numIDs; index++)
     {
-      if (ncgrid[index].ncIDs[ncIDType] != CDI_UNDEFID)
+      if (cdfGridVec[index].ncIdVec[ncIDType] != CDI_UNDEFID)
         {
-          int id0 = ncgrid[index].gridID, id0Type = typeInq(id0);
+          int id0 = cdfGridVec[index].gridID, id0Type = typeInq(id0);
           if (id0Type == searchType)
             {
               SizeType size0 = sizeInq(id0);
               if (searchSize == size0)
                 {
-                  foundID = ncgrid[index].ncIDs[ncIDType];
+                  foundID = cdfGridVec[index].ncIdVec[ncIDType];
                   foundIdx = index;
                   break;
                 }
@@ -133,12 +133,12 @@ cdfGridInqHalfSize(int gridID)
 static void
 cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, size_t maxlen, int gridRefType)
 {
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
   SizeType dimlen = gridInqSize(gridID) / 2;
 
   struct idSearch search
-      = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize);
+      = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize);
   int dimID = search.foundID;
   int iz = search.numNonMatching;
 
@@ -164,8 +164,8 @@ cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, siz
         }
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = dimID;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_Y] = dimID;
 }
 
 static void
@@ -256,12 +256,12 @@ static void
 cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cdfDefGridAxisInqs *inqs)
 {
   nc_type xtype = grid_inq_xtype(gridID);
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridVec;
 
   SizeType dimlen = inqs->axisSize(gridID);
   if (dimlen != 1) Error("%c size isn't 1 for %s grid!", inqs->axisSym, gridNamePtr(gridInqType(gridID)));
 
-  int ncvarid = ncgrid[gridIndex].ncIDs[inqs->dimIdx];
+  int ncvarid = ncgrid[gridIndex].ncIdVec[inqs->dimIdx];
   if (ncvarid == CDI_UNDEFID)
     {
       int dimNcID = streamptr->basetime.ncvarid;
@@ -290,7 +290,7 @@ cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cd
 
   ncgrid[gridIndex].gridID = gridID;
   // var ID for trajectory !!!
-  ncgrid[gridIndex].ncIDs[inqs->dimIdx] = ncvarid;
+  ncgrid[gridIndex].ncIdVec[inqs->dimIdx] = ncvarid;
 }
 
 static void
@@ -559,7 +559,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool
   SizeType dimlen = gridAxisInq->axisSize(gridID);
   nc_type xtype = grid_inq_xtype(gridID);
 
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
   bool hasVals = gridInqPropPresence(gridID, gridAxisInq->valsQueryKey);
   char dimname[CDI_MAX_NAME + 3];
@@ -569,7 +569,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool
 
   for (int index = 0; index < gridIndex; ++index)
     {
-      int gridID0 = ncgrid[index].gridID;
+      int gridID0 = cdfGridVec[index].gridID;
       assert(gridID0 != CDI_UNDEFID);
       int gridtype0 = gridInqType(gridID0);
       if (gridtype0 == GRID_GAUSSIAN || gridtype0 == GRID_LONLAT || gridtype0 == GRID_PROJECTION || gridtype0 == GRID_GENERIC)
@@ -586,7 +586,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool
               if (IS_EQUAL(inqVal(gridID0, 0), inqVal(gridID, 0))
                   && IS_EQUAL(inqVal(gridID0, dimlen - 1), inqVal(gridID, dimlen - 1)))
                 {
-                  dimID = ncgrid[index].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y];
+                  dimID = cdfGridVec[index].ncIdVec[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y];
                   break;
                 }
             }
@@ -691,11 +691,11 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool
           streamptr->ncmode = 2;
         }
 
-      if (ndims == 0 || addVarToGrid) ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid;
+      if (ndims == 0 || addVarToGrid) cdfGridVec[gridIndex].ncIdVec[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid;
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
 
   return delayed;
 }
@@ -938,7 +938,7 @@ cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t
 static struct cdfPostDefActionList *
 cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex)
 {
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
   SizeType dimlen = gridInqSize(gridID);
   SizeType xdimlen = gridInqXsize(gridID);
@@ -951,20 +951,20 @@ cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex)
   do
     {
       struct idSearch search
-          = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize);
+          = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize);
       size_t index = search.foundIdx;
       if (index != SIZE_MAX)
         {
-          int gridID0 = ncgrid[index].gridID;
+          int gridID0 = cdfGridVec[index].gridID;
           if (IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0))
               && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1))
               && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0))
               && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1)))
             {
-              xdimID = ncgrid[index].ncIDs[CDF_DIMID_X];
-              ydimID = ncgrid[index].ncIDs[CDF_DIMID_Y];
-              ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X];
-              ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y];
+              xdimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X];
+              ydimID = cdfGridVec[index].ncIdVec[CDF_DIMID_Y];
+              ncxvarid = cdfGridVec[index].ncIdVec[CDF_VARID_X];
+              ncyvarid = cdfGridVec[index].ncIdVec[CDF_VARID_Y];
               break;
             }
           ofs = search.foundIdx;
@@ -987,19 +987,19 @@ cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex)
       delayed = createdIDs.delayed;
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = xdimID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = ydimID;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = xdimID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_Y] = ydimID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_X] = ncxvarid;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_Y] = ncyvarid;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_A] = ncavarid;
   return delayed;
 }
 
 static struct cdfPostDefActionList *
 cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex)
 {
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
   SizeType dimlen = gridInqSize(gridID);
 
@@ -1009,21 +1009,21 @@ cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex)
   size_t ofs = 0;
   do
     {
-      struct idSearch search
-          = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, gridInqType, gridInqSize);
+      struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen,
+                                                 gridInqType, gridInqSize);
       size_t index = search.foundIdx;
       if (index != SIZE_MAX)
         {
-          int gridID0 = ncgrid[index].gridID;
+          int gridID0 = cdfGridVec[index].gridID;
           if (gridInqNvertex(gridID0) == gridInqNvertex(gridID) && IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0))
               && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1))
               && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0))
               && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1)))
             {
-              dimID = ncgrid[index].ncIDs[CDF_DIMID_X];
-              ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X];
-              ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y];
-              ncavarid = ncgrid[index].ncIDs[CDF_VARID_A];
+              dimID = cdfGridVec[index].ncIdVec[CDF_DIMID_X];
+              ncxvarid = cdfGridVec[index].ncIdVec[CDF_VARID_X];
+              ncyvarid = cdfGridVec[index].ncIdVec[CDF_VARID_Y];
+              ncavarid = cdfGridVec[index].ncIdVec[CDF_VARID_A];
               break;
             }
           ofs = search.foundIdx;
@@ -1045,11 +1045,11 @@ cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex)
       delayed = createdIDs.delayed;
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid;
-  ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_X] = ncxvarid;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_Y] = ncyvarid;
+  cdfGridVec[gridIndex].ncIdVec[CDF_VARID_A] = ncavarid;
   return delayed;
 }
 
@@ -1075,10 +1075,10 @@ cdf_def_vct_echam(stream_t *streamptr, int zaxisID)
   if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0)
     {
       int mlev = ilev - 1;
-
-      if (streamptr->vct.ilev > 0)
+      CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+      if (cdfInfo->vct.ilev > 0)
         {
-          if (streamptr->vct.ilev != ilev) Error("More than one VCT for each file unsupported!");
+          if (cdfInfo->vct.ilev != ilev) Error("More than one VCT for each file unsupported!");
           return delayed;
         }
 
@@ -1104,10 +1104,10 @@ cdf_def_vct_echam(stream_t *streamptr, int zaxisID)
           cdf_def_var(fileID, "hybm", NC_DOUBLE, 1, &ncdimid, &hybmid);
         }
 
-      streamptr->vct.ilev = ilev;
-      streamptr->vct.mlev = mlev;
-      streamptr->vct.mlevID = ncdimid;
-      streamptr->vct.ilevID = ncdimid2;
+      cdfInfo->vct.ilev = ilev;
+      cdfInfo->vct.mlev = mlev;
+      cdfInfo->vct.mlevID = ncdimid;
+      cdfInfo->vct.ilevID = ncdimid2;
 
       {
         static const char lname_n[] = "long_name", units_n[] = "units", lname_v_ai[] = "hybrid A coefficient at layer interfaces",
@@ -1177,10 +1177,10 @@ cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int
   if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0)
     {
       int mlev = ilev - 1;
-
-      if (streamptr->vct.ilev > 0)
+      CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+      if (cdfInfo->vct.ilev > 0)
         {
-          if (streamptr->vct.ilev != ilev) Error("more than one VCT for each file unsupported!");
+          if (cdfInfo->vct.ilev != ilev) Error("more than one VCT for each file unsupported!");
           return delayed;
         }
 
@@ -1195,10 +1195,10 @@ cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int
 
       int dimIDs[2] = { nclevID, ncbndsID };
 
-      streamptr->vct.mlev = mlev;
-      streamptr->vct.ilev = ilev;
-      streamptr->vct.mlevID = nclevID;
-      streamptr->vct.ilevID = nclevID;
+      cdfInfo->vct.mlev = mlev;
+      cdfInfo->vct.ilev = ilev;
+      cdfInfo->vct.mlevID = nclevID;
+      cdfInfo->vct.ilevID = nclevID;
 
       int hyamid, hybmid;
       cdf_def_var(fileID, (p0status == 0) ? "a" : "ap", NC_DOUBLE, 1, dimIDs, &hyamid);
@@ -1350,7 +1350,8 @@ cdf_def_zaxis_hybrid_echam(stream_t *streamptr, int type, int *ncvaridp, int zax
     Free(delayedVct);
   }
 
-  if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID;
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdVec[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID;
 
   if (switchNCMode)
     {
@@ -1550,7 +1551,8 @@ cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisI
     Free(delayedVct);
   }
 
-  if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID;
+  CdfInfo *cdfInfo = &(streamptr->cdfInfo);
+  if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdVec[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID;
 
   free(buffer);
   return delayed;
@@ -1646,7 +1648,7 @@ cdfDefZaxisChar(stream_t *streamptr, int zaxisID, char *axisname, int *dimID, si
       cdf_put_att_text(fileID, ncvarID, "axis", 1, "Z");
       cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarID);
 
-      streamptr->nczvarID[zaxisindex] = ncvarID;
+      streamptr->cdfInfo.ncZvarIdVec[zaxisindex] = ncvarID;
       cdf_enddef(fileID, streamptr->self);
 
       // Write Stringvalues
@@ -1827,10 +1829,10 @@ cdfDefZaxis(stream_t *streamptr, int zaxisID)
           streamptr->ncmode = 2;
         }
 
-      if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->nczvarID[zaxisindex] = ncvarid;
+      if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->cdfInfo.ncZvarIdVec[zaxisindex] = ncvarid;
     }
 
-  if (dimID != CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = dimID;
+  if (dimID != CDI_UNDEFID) streamptr->cdfInfo.zaxisIdVec[zaxisindex] = dimID;
   return delayed;
 }
 
@@ -1881,18 +1883,18 @@ cdf_def_mapping(stream_t *streamptr, int gridID)
 static void
 cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, int strlen)
 {
-  if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
+  if (cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] != CDI_UNDEFID) return;
 
   bool isXaxis = (cdiAxisID == CDI_XAXIS);
 
   SizeType dimlen = isXaxis ? gridInqXsize(gridID) : gridInqYsize(gridID);
-  ncgrid_t *ncgrid = streamptr->ncgrid;
 
   // Check for all grids up to gridIndex whether it already is defined
 
   for (int index = 0; index < gridIndex; index++)
     {
-      int gridID0 = ncgrid[index].gridID;
+      int gridID0 = cdfGridVec[index].gridID;
       int gridtype0 = gridInqType(gridID0);
       if (gridtype0 == GRID_CHARXY)
         {
@@ -1957,9 +1959,9 @@ cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, i
       (void) nc_put_vara_text(fileID, ncaxisid, start, count, cvals[i]);
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
-  ncgrid[gridIndex].ncIDs[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
+  cdfGridVec[gridIndex].ncIdVec[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid;
 
   streamptr->ncmode = 2;
 }
@@ -1968,15 +1970,15 @@ cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, i
 static void
 cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex)
 {
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
 
-  ncgrid[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].gridID = gridID;
 
   {
     SizeType dimlen = gridInqSize(gridID);
 
-    struct idSearch search
-        = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize);
+    struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen,
+                                               gridInqType, gridInqSize);
     int iz = search.numNonMatching;
     int dimID = search.foundID;
 
@@ -2004,14 +2006,14 @@ cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex)
           }
       }
 
-    ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+    cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID;
   }
 
   {
     SizeType dimlen = gridInqYsize(gridID);
 
-    struct idSearch search
-        = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize);
+    struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen,
+                                               gridInqType, gridInqSize);
     int iz = search.numNonMatching;
     int dimID = search.foundID;
 
@@ -2038,17 +2040,17 @@ cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex)
         cdf_put_var_int(fileID, ncvarid, reducedPoints);
         Free(reducedPoints);
 
-        ncgrid[gridIndex].ncIDs[CDF_VARID_RP] = ncvarid;
+        cdfGridVec[gridIndex].ncIdVec[CDF_VARID_RP] = ncvarid;
       }
 
-    ncgrid[gridIndex].ncIDs[CDF_DIMID_RP] = dimID;
+    cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_RP] = dimID;
   }
 }
 
 static void
 cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex)
 {
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *cdfGridVec = streamptr->cdfInfo.cdfGridVec;
   int dimID = CDI_UNDEFID;
 
   SizeType dimlen = gridInqSize(gridID);
@@ -2056,14 +2058,14 @@ cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex)
   if (gridInqYsize(gridID) == 0)
     {
       struct idSearch search
-          = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
+          = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
       dimID = search.foundID;
     }
 
   if (gridInqXsize(gridID) == 0)
     {
       struct idSearch search
-          = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
+          = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridVec, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
       dimID = search.foundID;
     }
 
@@ -2096,8 +2098,8 @@ cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex)
         }
     }
 
-  ncgrid[gridIndex].gridID = gridID;
-  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+  cdfGridVec[gridIndex].gridID = gridID;
+  cdfGridVec[gridIndex].ncIdVec[CDF_DIMID_X] = dimID;
 }
 
 static struct cdfPostDefActionList *
@@ -2105,7 +2107,8 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex)
 {
   struct cdfPostDefActionList *delayed = NULL;
 
-  if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return delayed;
+  CdfGrid *ncgrid = &(streamptr->cdfInfo.cdfGridVec[gridIndex]);
+  if (ncgrid->ncIdVec[CDF_DIMID_X] != CDI_UNDEFID) return delayed;
 
   int gridtype = gridInqType(gridID);
   SizeType size = gridInqSize(gridID);
@@ -2114,7 +2117,7 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex)
 
   if (CDI_Reduce_Dim && size == 1)  // no grid information
     {
-      streamptr->ncgrid[gridIndex].gridID = gridID;
+      ncgrid->gridID = gridID;
       return delayed;
     }
 
@@ -2151,7 +2154,7 @@ cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex)
       if (size == 1 && xsize == 0 && ysize == 0)
         {
           // no grid information
-          streamptr->ncgrid[gridIndex].gridID = gridID;
+          ncgrid->gridID = gridID;
         }
       else
         {
@@ -2248,11 +2251,11 @@ cdfDefCoordinateVars(stream_t *streamptr)
 
   struct cdfPostDefActionList *delayed = NULL;
 
-  ncgrid_t *ncgrid = streamptr->ncgrid;
+  CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridVec;
   for (int index = 0; index < 2 * ngrids; ++index)
     {
       ncgrid[index].gridID = CDI_UNDEFID;
-      for (size_t i = 0; i < CDF_SIZE_ncIDs; ++i) ncgrid[index].ncIDs[i] = CDI_UNDEFID;
+      for (size_t i = 0; i < CDF_SIZE_NCID; ++i) ncgrid[index].ncIdVec[i] = CDI_UNDEFID;
     }
 
   for (int index = 0; index < ngrids; ++index)
@@ -2281,7 +2284,7 @@ cdfDefCoordinateVars(stream_t *streamptr)
   for (int index = 0; index < nzaxis; ++index)
     {
       int zaxisID = vlistZaxis(vlistID, index);
-      if (streamptr->zaxisID[index] == CDI_UNDEFID)
+      if (streamptr->cdfInfo.zaxisIdVec[index] == CDI_UNDEFID)
         {
           struct cdfPostDefActionList *zaxisdelayed = cdfDefZaxis(streamptr, zaxisID);
           delayed = cdfPostDefActionConcat(delayed, zaxisdelayed);