diff --git a/examples/cdi_write_hybrid.c b/examples/cdi_write_hybrid.c
index 4488f059543eab16d978acdd15d5bed5e3cc1dc8..0864c3b7877e5cafb136838d75b8c3bced446e69 100644
--- a/examples/cdi_write_hybrid.c
+++ b/examples/cdi_write_hybrid.c
@@ -12,7 +12,7 @@ main(void)
 {
   int gridID, zaxisID1, zaxisID2, zaxisID3, zaxisID4, taxisID;
   int vlistID, varID1, varID2, varID3, varID4, streamID;
-  size_t numMissVals = 0;
+  SizeType numMissVals = 0;
   double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 };
   double lats[nlat] = { -75, -45, -15, 15, 45, 75 };
   double levs[nhlev] = { 1, 2, 3, 4, 5, 6 };
@@ -95,11 +95,11 @@ main(void)
       // Init var1 and var2
       for (size_t i = 0; i < nlon * nlat; ++i) var1[i] = 1.1;
       for (size_t k = 0; k < nflev; ++k)
-        for (size_t i = 0; i < nlon * nlat; ++i) var2[i + k * nlon * nlat] = 2.2 + k;
+        for (size_t i = 0; i < nlon * nlat; ++i) var2[i + k * nlon * nlat] = 2.2 + (double)k;
       for (size_t k = 0; k < nhlev; ++k)
-        for (size_t i = 0; i < nlon * nlat; ++i) var3[i + k * nlon * nlat] = -2.2 - k;
+        for (size_t i = 0; i < nlon * nlat; ++i) var3[i + k * nlon * nlat] = -2.2 - (double)k;
       for (size_t k = 0; k < nflev; ++k)
-        for (size_t i = 0; i < nlon * nlat; ++i) var4[i + k * nlon * nlat] = 100 + k;
+        for (size_t i = 0; i < nlon * nlat; ++i) var4[i + k * nlon * nlat] = 100.0 + (double)k;
 
       // Write var1 and var2
       streamWriteVar(streamID, varID1, var1, numMissVals);
diff --git a/src/async_worker.c b/src/async_worker.c
index a258d967b223e5d6fbe009bebeffc1e65c8675a3..507a747b9aef12142c1751974c8db2c1d0c619eb 100644
--- a/src/async_worker.c
+++ b/src/async_worker.c
@@ -147,7 +147,7 @@ AsyncWorker_init(AsyncManager **jobManager, int threadCount)
   *jobManager = (AsyncManager *) malloc(sizeof(AsyncManager));
   if (!*jobManager) return CDI_ESYSTEM;
   (*jobManager)->workerCount = threadCount;
-  (*jobManager)->communicators = (AsyncJob *) malloc(threadCount * sizeof(AsyncJob));
+  (*jobManager)->communicators = (AsyncJob *) malloc((size_t)threadCount * sizeof(AsyncJob));
   if (!(*jobManager)->communicators) xabort("memory allocation failure");
 
   for (int i = 0; i < threadCount; i++) startWorker(&((*jobManager)->communicators[i]));
diff --git a/src/cdf_lazy_grid.c b/src/cdf_lazy_grid.c
index 625972b971b49c72af166d47a0f7e2c68e7a1ea6..6be31c436d747cf52d8b76c0afeceb79dbe83319 100644
--- a/src/cdf_lazy_grid.c
+++ b/src/cdf_lazy_grid.c
@@ -194,7 +194,7 @@ cdfLazyGridInqXVal(grid_t *grid, SizeType index)
 {
   struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
   lock_lazy_load(lazyGrid);
-  const double rv = cdfLazyGridInqXYVal(grid, index, &lazyGrid->xValsGet, grid->x.vals, grid->vtable->inqXValsPtr);
+  const double rv = cdfLazyGridInqXYVal(grid, (size_t)index, &lazyGrid->xValsGet, grid->x.vals, grid->vtable->inqXValsPtr);
   unlock_lazy_load(lazyGrid);
   return rv;
 }
@@ -204,7 +204,7 @@ cdfLazyGridInqYVal(grid_t *grid, SizeType index)
 {
   struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
   lock_lazy_load(lazyGrid);
-  const double rv = cdfLazyGridInqXYVal(grid, index, &lazyGrid->yValsGet, grid->y.vals, grid->vtable->inqYValsPtr);
+  const double rv = cdfLazyGridInqXYVal(grid, (size_t)index, &lazyGrid->yValsGet, grid->y.vals, grid->vtable->inqYValsPtr);
   unlock_lazy_load(lazyGrid);
   return rv;
 }
diff --git a/src/cdf_read.c b/src/cdf_read.c
index bb58c078a7e2e12174e263893c7aa50b32915172..cfeb0d463b6188cebaab1e8ceb9e981069222ff9 100644
--- a/src/cdf_read.c
+++ b/src/cdf_read.c
@@ -73,8 +73,8 @@ cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENS
   while (0)
   if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1);
   if (zid != CDI_UNDEFID) addDimension(0, (size_t) zaxisInqSize(zaxisID));
-  if (yid != CDI_UNDEFID) addDimension(0, gridInqYsize(gridID));
-  if (xid != CDI_UNDEFID) addDimension(0, gridInqXsize(gridID));
+  if (yid != CDI_UNDEFID) addDimension(0, (size_t) gridInqYsize(gridID));
+  if (xid != CDI_UNDEFID) addDimension(0, (size_t) gridInqXsize(gridID));
 #undef addDimension
 
   assert(ndims <= (int) (sizeof(*start) / sizeof(**start)));
@@ -305,8 +305,8 @@ min_size(size_t a, size_t b)
 static void
 transpose2dArrayDP(int gridId, double *data)
 {
-  size_t inWidth = gridInqYsize(gridId);
-  size_t inHeight = gridInqXsize(gridId);
+  size_t inWidth = (size_t)gridInqYsize(gridId);
+  size_t inHeight = (size_t)gridInqXsize(gridId);
 
   size_t cacheBlockSize = 256;  // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks,
                                 // which should be a decent compromise on many architectures.
@@ -339,8 +339,8 @@ transpose2dArrayDP(int gridId, double *data)
 static void
 transpose2dArraySP(size_t gridId, float *data)
 {
-  size_t inWidth = gridInqYsize(gridId);
-  size_t inHeight = gridInqXsize(gridId);
+  size_t inWidth = (size_t)gridInqYsize(gridId);
+  size_t inHeight = (size_t)gridInqXsize(gridId);
 
   size_t cacheBlockSize = 256;  // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks,
                                 // which should be a decent compromise on many architectures.
@@ -503,7 +503,7 @@ cdfGetSliceSlapDescription(stream_t *streamptr, int tsID, int varID, int levelID
         case 2:
         case 4:
           if (readPart && curDimId == dimIds[0])
-            addDimension(ncGrid->start, ncGrid->count);
+            addDimension((size_t)ncGrid->start, (size_t)ncGrid->count);
           else
             addDimension(0, stream_inq_dimlen(streamptr, curDimId));
           break;
@@ -537,7 +537,7 @@ getSizeVar3D(int vlistID, int varID)
 {
   int gridID = vlistInqVarGrid(vlistID, varID);
   int zaxisID = vlistInqVarZaxis(vlistID, varID);
-  return gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID);
+  return (size_t)gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID);
 }
 
 static void
@@ -720,7 +720,7 @@ cdf_read_var_slice_DP(stream_t *streamptr, int tsID, int varID, int levelID, dou
 
   int vlistID = streamptr->vlistID;
   int gridId = vlistInqVarGrid(vlistID, varID);
-  size_t length = gridInqSize(gridId);
+  size_t length = (size_t)gridInqSize(gridId);
   cdfReadDataFP64(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArrayDP(gridId, data);
@@ -745,7 +745,7 @@ cdf_read_var_slice_SP(stream_t *streamptr, int tsID, int varID, int levelID, flo
 
   int vlistID = streamptr->vlistID;
   int gridId = vlistInqVarGrid(vlistID, varID);
-  size_t length = gridInqSize(gridId);
+  size_t length = (size_t)gridInqSize(gridId);
   cdfReadDataFP32(streamptr, varID, length, start, count, data);
 
   if (swapxy) transpose2dArraySP(gridId, data);
@@ -979,7 +979,7 @@ cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType,
   for (int i = 0; i < MAX_DIMENSIONS; ++i)
     if (count[i] == (size_t)gridsize) position = i;
 
-  start[position] = start[position] + startpoint;
+  start[position] += (size_t)startpoint;
   count[position] = length;
 
   cdfReadDataFP64(streamptr, varID, length, start, count, data);
@@ -1010,7 +1010,7 @@ cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType,
   for (int i = 0; i < MAX_DIMENSIONS; ++i)
     if (count[i] == (size_t)gridsize) position = i;
 
-  start[position] = start[position] + startpoint;
+  start[position] += (size_t)startpoint;
   count[position] = length;
 
   cdfReadDataFP32(streamptr, varID, length, start, count, data);
@@ -1080,7 +1080,7 @@ cdfReadVarDPPart(stream_t *streamptr, int varID, int varType, int startpoint, si
   cdfGetSlapDescription(streamptr, varID, &start, &count);
 
   int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID));
-  start[1 + ltime] = start[1 + ltime] + startpoint;
+  start[1 + ltime] += (size_t)startpoint;
   count[1 + ltime] = length;
 
   cdf_get_vara_double(streamptr->fileID, ncvarid, start, count, data);
@@ -1101,7 +1101,7 @@ cdfReadVarSPPart(stream_t *streamptr, int varID, int varType, int startpoint, si
   cdfGetSlapDescription(streamptr, varID, &start, &count);
 
   int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID));
-  start[1 + ltime] = start[1 + ltime] + startpoint;
+  start[1 + ltime] = (size_t)startpoint;
   count[1 + ltime] = length;
 
   cdf_get_vara_float(streamptr->fileID, ncvarid, start, count, data);
@@ -1157,7 +1157,8 @@ streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int st
                        SizeType *numMissVals, int memtype)
 {
   size_t numMiss = 0;
-  if (cdiStreamReadVarSlicePart(streamID, varID, levelID, varType, start, size, memtype, data, &numMiss))
+  if (cdiStreamReadVarSlicePart(streamID, varID, levelID, varType,
+                                start, (size_t)size, memtype, data, &numMiss))
     {
       Error("Unexpected error returned from cdiStreamReadVarSlicePart()!");
     }
@@ -1168,7 +1169,7 @@ void
 streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memtype)
 {
   size_t numMiss = 0;
-  cdiStreamReadVarPart(streamID, varID, varType, start, size, memtype, data, &numMiss);
+  cdiStreamReadVarPart(streamID, varID, varType, start, (size_t)size, memtype, data, &numMiss);
   *numMissVals = (SizeType) numMiss;
 }
 
diff --git a/src/cdf_write.c b/src/cdf_write.c
index 1c3a3bef184fbb3c7a99de1d1d73abe2759283ab..e0f884bd952da5c270a6bf0b7d591a8c298cc22a 100644
--- a/src/cdf_write.c
+++ b/src/cdf_write.c
@@ -1008,7 +1008,9 @@ cdfDefVar(stream_t *streamptr, int varID)
   char axis[5];
   int dims[4];
   size_t chunks[4];
-  int ndims = cdfDefineDimsAndChunks(streamptr, varID, xid, yid, zid, gridsize, dimorder, dims, useChunks, chunks, axis, &iax);
+  int ndims = cdfDefineDimsAndChunks(streamptr, varID, xid, yid, zid,
+                                     (size_t)gridsize, dimorder, dims,
+                                     useChunks, chunks, axis, &iax);
 
   char name[CDI_MAX_NAME];
   int length = CDI_MAX_NAME;
@@ -1096,7 +1098,8 @@ 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;
 
-  cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, gridsize, axis, iax);
+  cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID,
+                       gridindex, xid, yid, (size_t)gridsize, axis, iax);
 
   cdfDefVarPacking(streamptr, ncvarID, xtype, vlistID, varID);
 
@@ -1503,7 +1506,7 @@ cdf_write_var(stream_t *streamptr, int varID, int memtype, const void *data, siz
 
   if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
 
-  size_t nvals = gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID));
+  size_t nvals = (size_t)gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID));
 
   bool swapxy = false;
   cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
@@ -1600,7 +1603,7 @@ cdf_write_var_chunk(stream_t *streamptr, int varID, int memtype, const int rect[
 
   if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
 
-  size_t nvals = gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID));
+  size_t nvals = (size_t)gridInqSize(gridID) * (size_t)zaxisInqSize(zaxisID);
 
   bool swapxy = false;
   cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
@@ -1687,7 +1690,7 @@ cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, co
 
   if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
 
-  size_t nvals = gridInqSize(gridID);
+  size_t nvals = (size_t)gridInqSize(gridID);
 
   cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
 }
diff --git a/src/cdi_int.h b/src/cdi_int.h
index 00c9bb1ff0f687796a75f46efb0dc6e7fa8a4b65..ecd2be64572cc784beecd44e4cb3ef66c0776c8b 100644
--- a/src/cdi_int.h
+++ b/src/cdi_int.h
@@ -534,8 +534,8 @@ extern "C" {
 
 void cdiDefTableID(int tableID);
 
-void gridGenXvals(int xsize, double xfirst, double xlast, double xinc, double *xvals);
-void gridGenYvals(int gridtype, int ysize, double yfirst, double ylast, double yinc, double *yvals);
+void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *xvals);
+void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *yvals);
 
 static inline
 void cdi_check_gridsize_int_limit(const char *format, SizeType gridsize)
diff --git a/src/grb_read.c b/src/grb_read.c
index 70b793409d8743d3404e1ceb356c17fcadf5cf7e..40e5b7aa7f16d28c5e3644add5760f43e72e4928 100644
--- a/src/grb_read.c
+++ b/src/grb_read.c
@@ -134,7 +134,7 @@ grb_read_raw_data(stream_t *streamptr, int tsID, int recID, int memType, void *g
   size_t recsize = streamptr->tsteps[tsID].records[recID].size;
 
   int gridID = vlistInqVarGrid(vlistID, varID);
-  size_t gridsize = gridInqSize(gridID);
+  size_t gridsize = (size_t)gridInqSize(gridID);
   if (CDI_Debug) Message("gridID = %d gridsize = %zu", gridID, gridsize);
 
   void *cgribexp = (gribbuffer && streamptr->record->objectp) ? streamptr->record->objectp : NULL;
@@ -163,7 +163,7 @@ grb_read_raw_data(stream_t *streamptr, int tsID, int recID, int memType, void *g
       if (fileRead(fileID, gribbuffer, recsize) != recsize) Error("Failed to read GRIB record!");
 
       if (resetFilePos) fileSetPos(fileID, currentfilepos, SEEK_SET);
-      if (!resetFilePos) streamptr->numvals += gridsize;
+      if (!resetFilePos) streamptr->numvals += (SizeType)gridsize;
     }
 
   return (JobArgs){
@@ -335,7 +335,7 @@ grb_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *nu
   int fileID = streamptr->fileID;
 
   int gridID = vlistInqVarGrid(vlistID, varID);
-  size_t gridsize = gridInqSize(gridID);
+  size_t gridsize = (size_t)gridInqSize(gridID);
 
   off_t currentfilepos = fileGetPos(fileID);
 
@@ -348,7 +348,7 @@ grb_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *nu
   for (int levelID = 0; levelID < nlevs; levelID++)
     {
       int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID];
-      size_t offset = levelID * gridsize;
+      size_t offset = (size_t)levelID * gridsize;
       void *datap = (memType == MEMTYPE_FLOAT) ? (void *) ((float *) data + offset) : (void *) ((double *) data + offset);
 
       *numMissVals += grb_read_and_decode_record(streamptr, recID, memType, datap, false);
diff --git a/src/grb_write.c b/src/grb_write.c
index e7cee6d2a0d33f599f557e43f5e60c75442beccb..4f47ac9ccf579dcdc5aed14a7d35423c79f4f9ca 100644
--- a/src/grb_write.c
+++ b/src/grb_write.c
@@ -462,14 +462,14 @@ grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, siz
 {
   int vlistID = streamptr->vlistID, gridID = vlistInqVarGrid(vlistID, varID), zaxisID = vlistInqVarZaxis(vlistID, varID),
       nlevs = zaxisInqSize(zaxisID);
-  size_t gridsize = gridInqSize(gridID);
+  size_t gridsize = (size_t)gridInqSize(gridID);
   double missval = vlistInqVarMissval(vlistID, varID);
 
   size_t chunkLen = gridsize;
   if (memtype == MEMTYPE_FLOAT)
     for (int levelID = 0; levelID < nlevs; levelID++)
       {
-        const float *restrict fdata = ((const float *) data) + levelID * gridsize;
+        const float *restrict fdata = ((const float *) data) + (size_t)levelID * gridsize;
 
         size_t numMissVals_slice = 0;
         if (numMissVals)
@@ -480,7 +480,7 @@ grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, siz
   else
     for (int levelID = 0; levelID < nlevs; levelID++)
       {
-        const double *restrict ddata = ((const double *) data) + levelID * gridsize;
+        const double *restrict ddata = ((const double *) data) + (size_t)levelID * gridsize;
 
         size_t numMissVals_slice = 0;
         if (numMissVals)
diff --git a/src/gribapi_utilities.c b/src/gribapi_utilities.c
index 03734fb55d2f8508da73403b82639360ec181b96..01d00704f0ae941c6c1dd59bfa697ebd2440c323 100644
--- a/src/gribapi_utilities.c
+++ b/src/gribapi_utilities.c
@@ -727,7 +727,7 @@ gribapiGetGridRegular(grib_handle *gh, grid_t *grid, int editionNumber, int grid
           // correct xinc if necessary
           if (IS_EQUAL(grid->x.first, 0) && grid->x.last > 354 && grid->x.last < 360)
             {
-              double xinc = 360. / grid->x.size;
+              double xinc = 360. / (double)grid->x.size;
               if (fabs(grid->x.inc - xinc) > 0.0)
                 {
                   grid->x.inc = xinc;
diff --git a/src/grid.c b/src/grid.c
index 1a9f03eec6cfb5ce6351e0cc6315f0e98aed2a40..ccddea16e8d30a6b44ea38aba2f95e8a535b40be 100644
--- a/src/grid.c
+++ b/src/grid.c
@@ -337,36 +337,36 @@ cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size)
 
 // used also in CDO
 void
-gridGenXvals(int xsize, double xfirst, double xlast, double xinc, double *restrict xvals)
+gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *restrict xvals)
 {
   if (fabs(xinc) <= 0 && xsize > 1)
     {
       if (xfirst >= xlast)
         {
           while (xfirst >= xlast) xlast += 360;
-          xinc = (xlast - xfirst) / (xsize);
+          xinc = (xlast - xfirst) / (double)xsize;
         }
       else
         {
-          xinc = (xlast - xfirst) / (xsize - 1);
+          xinc = (xlast - xfirst) / (double)(xsize - 1);
         }
     }
 
-  for (int i = 0; i < xsize; ++i) xvals[i] = xfirst + i * xinc;
+  for (size_t i = 0; i < xsize; ++i) xvals[i] = xfirst + (double)i * xinc;
 }
 
 static void
-calc_gaussgrid(double *restrict yvals, int ysize, double yfirst, double ylast)
+calc_gaussgrid(double *restrict yvals, size_t ysize, double yfirst, double ylast)
 {
-  double *restrict yw = (double *) malloc((size_t) ysize * sizeof(double));
-  gaussianLatitudes((size_t) ysize, yvals, yw);
+  double *restrict yw = malloc(ysize * sizeof(double));
+  gaussianLatitudes(ysize, yvals, yw);
   free(yw);
-  for (int i = 0; i < ysize; i++) yvals[i] = asin(yvals[i]) / M_PI * 180.0;
+  for (size_t i = 0; i < ysize; i++) yvals[i] = asin(yvals[i]) / M_PI * 180.0;
 
   if (yfirst < ylast && yfirst > -90.0 && ylast < 90.0)
     {
-      int yhsize = ysize / 2;
-      for (int i = 0; i < yhsize; i++)
+      size_t yhsize = ysize / 2;
+      for (size_t i = 0; i < yhsize; i++)
         {
           const double ytmp = yvals[i];
           yvals[i] = yvals[ysize - i - 1];
@@ -376,7 +376,7 @@ calc_gaussgrid(double *restrict yvals, int ysize, double yfirst, double ylast)
 }
 
 static void
-gridGenYvalsGaussian(int ysize, double yfirst, double ylast, double *restrict yvals)
+gridGenYvalsGaussian(size_t ysize, double yfirst, double ylast, double *restrict yvals)
 {
   const double deleps = 0.002;
 
@@ -386,22 +386,26 @@ gridGenYvalsGaussian(int ysize, double yfirst, double ylast, double *restrict yv
     if (fabs(yvals[0] - yfirst) > deleps || fabs(yvals[ysize - 1] - ylast) > deleps)
       {
         bool lfound = false;
-        int ny = (int) (180. / (fabs(ylast - yfirst) / (ysize - 1)) + 0.5);
+        long ny = (long) (180. / (fabs(ylast - yfirst) / (double)(ysize - 1)) + 0.5);
         ny -= ny % 2;
-        if (ny > ysize && ny < 4096)
+        if (ny > 0 && (size_t)ny > ysize && ny < 4096)
           {
             double *ytmp = (double *) Malloc((size_t) ny * sizeof(double));
-            calc_gaussgrid(ytmp, ny, yfirst, ylast);
+            calc_gaussgrid(ytmp, (size_t)ny, yfirst, ylast);
 
-            int i;
-            for (i = 0; i < (ny - ysize); i++)
-              if (fabs(ytmp[i] - yfirst) < deleps) break;
-            int nstart = i;
+            size_t nstart = (size_t)ny-ysize;
+            for (size_t i = 0; i < ((size_t)ny - ysize); i++)
+              if (fabs(ytmp[i] - yfirst) < deleps)
+                {
+                  nstart = i;
+                  break;
+                }
 
-            lfound = (nstart + ysize - 1) < ny && fabs(ytmp[nstart + ysize - 1] - ylast) < deleps;
+            lfound = (nstart + ysize - 1) < (size_t)ny && fabs(ytmp[nstart + ysize - 1] - ylast) < deleps;
             if (lfound)
               {
-                for (i = 0; i < ysize; i++) yvals[i] = ytmp[i + nstart];
+                for (size_t i = 0; i < ysize; i++)
+                  yvals[i] = ytmp[i + nstart];
               }
 
             if (ytmp) Free(ytmp);
@@ -410,7 +414,7 @@ gridGenYvalsGaussian(int ysize, double yfirst, double ylast, double *restrict yv
         if (!lfound)
           {
             Warning("Cannot calculate gaussian latitudes for lat1 = %g latn = %g!", yfirst, ylast);
-            for (int i = 0; i < ysize; i++) yvals[i] = 0;
+            for (size_t i = 0; i < ysize; i++) yvals[i] = 0;
             yvals[0] = yfirst;
             yvals[ysize - 1] = ylast;
           }
@@ -418,26 +422,26 @@ gridGenYvalsGaussian(int ysize, double yfirst, double ylast, double *restrict yv
 }
 
 static void
-gridGenYvalsRegular(int ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
+gridGenYvalsRegular(size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
 {
   if (fabs(yinc) <= 0 && ysize > 1)
     {
       if (IS_EQUAL(yfirst, ylast) && IS_NOT_EQUAL(yfirst, 0)) ylast *= -1;
 
       if (yfirst > ylast)
-        yinc = (yfirst - ylast) / (ysize - 1);
+        yinc = (yfirst - ylast) / (double)(ysize - 1);
       else if (yfirst < ylast)
-        yinc = (ylast - yfirst) / (ysize - 1);
+        yinc = (ylast - yfirst) / (double)(ysize - 1);
       else
         {
           if (ysize % 2 != 0)
             {
-              yinc = 180.0 / (ysize - 1);
+              yinc = 180.0 / (double)(ysize - 1);
               yfirst = -90;
             }
           else
             {
-              yinc = 180.0 / ysize;
+              yinc = 180.0 / (double)ysize;
               yfirst = -90 + yinc / 2;
             }
         }
@@ -445,12 +449,12 @@ gridGenYvalsRegular(int ysize, double yfirst, double ylast, double yinc, double
 
   if (yfirst > ylast && yinc > 0) yinc = -yinc;
 
-  for (int i = 0; i < ysize; i++) yvals[i] = yfirst + i * yinc;
+  for (size_t i = 0; i < ysize; i++) yvals[i] = yfirst + (double)i * yinc;
 }
 
 // used also in CDO
 void
-gridGenYvals(int gridtype, int ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
+gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
 {
   if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
     {
@@ -518,7 +522,8 @@ gridDefYvals(gridID, lats);
 int
 gridCreate(int gridtype, SizeType size)
 {
-  if (CDI_Debug) Message("gridtype=%s  size=%zu", gridNamePtr(gridtype), size);
+  if (CDI_Debug)
+    Message("gridtype=%s  size=%zu", gridNamePtr(gridtype), (size_t)size);
 
   xassert(size);
   gridInit();
@@ -996,7 +1001,7 @@ gridInqSize(int gridID)
 }
 
 static int
-nsp2trunc(int nsp)
+nsp2trunc(size_t nsp)
 {
   /*  nsp = (trunc+1)*(trunc+1)              */
   /*      => trunc^2 + 3*trunc - (x-2) = 0   */
@@ -1004,7 +1009,7 @@ nsp2trunc(int nsp)
   /*  with:  y^2 + p*y + q = 0               */
   /*         y = -p/2 +- sqrt((p/2)^2 - q)   */
   /*         p = 3 and q = - (x-2)           */
-  int trunc = (int) (sqrt(nsp * 4 + 1.) - 3) / 2;
+  int trunc = (int)(sqrt((double)nsp * 4 + 1.) - 3) / 2;
   return trunc;
 }
 
@@ -1278,7 +1283,7 @@ gridInqReducedPoints(int gridID, int *reducedPoints)
   memcpy(reducedPoints, gridptr->reducedPoints, (size_t) gridptr->reducedPointsSize * sizeof(int));
 }
 
-static size_t
+static SizeType
 gridInqMaskSerialGeneric(grid_t *gridptr, mask_t **internalMask, int *restrict mask)
 {
   size_t size = gridptr->size;
@@ -1294,13 +1299,13 @@ gridInqMaskSerialGeneric(grid_t *gridptr, mask_t **internalMask, int *restrict m
   else
     size = 0;
 
-  return size;
+  return (SizeType)size;
 }
 
 static SizeType
 gridInqMaskSerial(grid_t *gridptr, int *mask)
 {
-  return (SizeType) gridInqMaskSerialGeneric(gridptr, &gridptr->mask, mask);
+  return gridInqMaskSerialGeneric(gridptr, &gridptr->mask, mask);
 }
 
 int
@@ -1346,7 +1351,7 @@ gridDefMask(int gridID, const int *mask)
 static int
 gridInqMaskGMESerial(grid_t *gridptr, int *mask_gme)
 {
-  return gridInqMaskSerialGeneric(gridptr, &gridptr->mask_gme, mask_gme);
+  return (int)gridInqMaskSerialGeneric(gridptr, &gridptr->mask_gme, mask_gme);
 }
 
 int
@@ -1758,7 +1763,7 @@ grid_calc_increment(size_t size, const double *vals)
 {
   if (size > 1)
     {
-      double inc = (vals[size - 1] - vals[0]) / (size - 1);
+      double inc = (vals[size - 1] - vals[0]) / (double)(size - 1);
       const double abs_inc = fabs(inc);
       for (size_t i = 1; i < size; ++i)
         if (fabs(fabs(vals[i - 1] - vals[i]) - abs_inc) > 0.01 * abs_inc)
@@ -1778,7 +1783,7 @@ grid_calc_increment_in_meter(SizeType size, const double *vals)
 {
   if (size > 1)
     {
-      const double inc = (vals[size - 1] - vals[0]) / (size - 1);
+      const double inc = (vals[size - 1] - vals[0]) / (double)(size - 1);
       return round(fabs(inc));
     }
 
@@ -2056,7 +2061,7 @@ grid_check_cyclic(grid_t *gridptr)
           if (IS_NOT_EQUAL(xval1, xvaln))
             {
               double xinc = xval2 - xval1;
-              if (IS_EQUAL(xinc, 0)) xinc = (xvaln - xval1) / (xsize - 1);
+              if (IS_EQUAL(xinc, 0)) xinc = (xvaln - xval1) / (double)(xsize - 1);
 
               const double x0 = xvaln + xinc - 360;
 
@@ -2192,11 +2197,12 @@ compareXYvals2(grid_t *gridRef, grid_t *gridTest)
 
   if (!differ && gridTest->x.vals)
     differ = fabs(inqXValTest(gridTest, 0) - inqXValRef(gridRef, 0)) > 1.e-9
-             || fabs(inqXValTest(gridTest, gridsize - 1) - inqXValRef(gridRef, gridsize - 1)) > 1.e-9;
+      || fabs(inqXValTest(gridTest, (SizeType)(gridsize - 1))
+              - inqXValRef(gridRef, (SizeType)(gridsize - 1))) > 1.e-9;
 
   if (!differ && gridTest->y.vals)
     differ = fabs(inqYValTest(gridTest, 0) - inqYValRef(gridRef, 0)) > 1.e-9
-             || fabs(inqYValTest(gridTest, gridsize - 1) - inqYValRef(gridRef, gridsize - 1)) > 1.e-9;
+      || fabs(inqYValTest(gridTest, (SizeType)gridsize - 1) - inqYValRef(gridRef, (SizeType)gridsize - 1)) > 1.e-9;
 
   return differ;
 }
@@ -2546,7 +2552,7 @@ gridCompareP(void *gridptr1, void *gridptr2)
     if (g1_xbounds)
       {
         xassert(g1->nvertex);
-        size_t size = g1->nvertex * (isIrregular ? g1->size : g1->x.size);
+        size_t size = (size_t)g1->nvertex * (isIrregular ? g1->size : g1->x.size);
         xassert(size);
 
         for (size_t i = 0; i < size; i++)
@@ -2560,7 +2566,7 @@ gridCompareP(void *gridptr1, void *gridptr2)
     if (g1_ybounds)
       {
         xassert(g1->nvertex);
-        size_t size = g1->nvertex * (isIrregular ? g1->size : g1->y.size);
+        size_t size = (size_t)g1->nvertex * (isIrregular ? g1->size : g1->y.size);
         xassert(size);
 
         for (size_t i = 0; i < size; i++)
@@ -2631,8 +2637,8 @@ grid_complete(grid_t *grid)
     case GRID_PROJECTION:
     case GRID_CHARXY:
       {
-        if (grid->x.size > 0) gridDefXsize(gridID, grid->x.size);
-        if (grid->y.size > 0) gridDefYsize(gridID, grid->y.size);
+        if (grid->x.size > 0) gridDefXsize(gridID, (SizeType)grid->x.size);
+        if (grid->y.size > 0) gridDefYsize(gridID, (SizeType)grid->y.size);
 
         if (gridtype == GRID_GAUSSIAN) gridDefNP(gridID, grid->np);
 
@@ -2641,7 +2647,7 @@ grid_complete(grid_t *grid)
         if (grid->x.flag == 2)
           {
             assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR);
-            double *xvals = (double *) Malloc(grid->x.size * sizeof(double));
+            double *xvals = Malloc(grid->x.size * sizeof(double));
             gridGenXvals(grid->x.size, grid->x.first, grid->x.last, grid->x.inc, xvals);
             grid->x.vals = xvals;
             // gridDefXinc(gridID, grid->x.inc);
@@ -2794,7 +2800,8 @@ gridGenerate(const grid_t *grid)
   cdiCopyVarKey(&grid->keys, CDI_KEY_SCANNINGMODE, &gridptr->keys);
 
   if (gridtype == GRID_PROJECTION) gridptr->name = strdup(grid->name);
-  if (gridtype == GRID_GAUSSIAN_REDUCED) gridDefReducedPoints(gridID, grid->y.size, grid->reducedPoints);
+  if (gridtype == GRID_GAUSSIAN_REDUCED)
+    gridDefReducedPoints(gridID, (int)grid->y.size, grid->reducedPoints);
   gridptr->trunc = grid->trunc;
   gridptr->lcomplex = grid->lcomplex;
   gridptr->gme.nd = grid->gme.nd;
@@ -2812,7 +2819,8 @@ gridGenerate(const grid_t *grid)
 static void
 grid_copy_base_array_fields(grid_t *gridptrOrig, grid_t *gridptrDup)
 {
-  size_t reducedPointsSize = (SizeType) gridptrOrig->reducedPointsSize;
+  size_t reducedPointsSize = gridptrOrig->reducedPointsSize > 0 ?
+    (size_t)gridptrOrig->reducedPointsSize : (size_t)0;
   size_t gridsize = gridptrOrig->size;
   int gridtype = gridptrOrig->type;
   bool isIrregular = grid_is_irregular(gridtype);
@@ -2838,14 +2846,16 @@ grid_copy_base_array_fields(grid_t *gridptrOrig, grid_t *gridptrDup)
 
   if (gridptrOrig->x.bounds != NULL)
     {
-      size_t size = (isIrregular ? gridsize : gridptrOrig->x.size) * gridptrOrig->nvertex;
+      size_t size = (isIrregular ? gridsize : gridptrOrig->x.size)
+        * (size_t)gridptrOrig->nvertex;
       gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double));
       memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double));
     }
 
   if (gridptrOrig->y.bounds != NULL)
     {
-      size_t size = (isIrregular ? gridsize : gridptrOrig->y.size) * gridptrOrig->nvertex;
+      size_t size = (isIrregular ? gridsize : gridptrOrig->y.size)
+        * (size_t)gridptrOrig->nvertex;
       gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double));
       memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double));
     }
@@ -2911,7 +2921,7 @@ gridCompress(int gridID)
     {
       if (gridptr->mask_gme != NULL)
         {
-          size_t gridsize = gridInqSize(gridID);
+          size_t gridsize = (size_t)gridInqSize(gridID);
           size_t nv = (size_t) gridptr->nvertex;
           double *restrict area = (double *) gridptr->vtable->inqAreaPtr(gridptr),
                            *restrict xvals = (double *) gridptr->vtable->inqXValsPtr(gridptr),
@@ -2943,9 +2953,9 @@ gridCompress(int gridID)
 
           /* fprintf(stderr, "grid compress %d %d %d\n", i, j, gridsize); */
           gridsize = nselect;
-          gridptr->size = (int) gridsize;
-          gridptr->x.size = (int) gridsize;
-          gridptr->y.size = (int) gridsize;
+          gridptr->size = gridsize;
+          gridptr->x.size = gridsize;
+          gridptr->y.size = gridsize;
 
           double **resizeP[] = { &gridptr->x.vals, &gridptr->y.vals, &gridptr->area, &gridptr->x.bounds, &gridptr->y.bounds };
           size_t newSize[] = { gridsize, gridsize, gridsize, nv * gridsize, nv * gridsize };
@@ -3186,7 +3196,8 @@ gridInqXboundsPart(int gridID, int start, SizeType size, double *xbounds)
 {
   grid_t *gridptr = grid_to_pointer(gridID);
   const double *gridptr_xbounds = gridptr->vtable->inqXBoundsPtr(gridptr);
-  if (gridptr_xbounds && size && xbounds) memcpy(xbounds, gridptr_xbounds + start, size * sizeof(double));
+  if (gridptr_xbounds && size && xbounds)
+    memcpy(xbounds, gridptr_xbounds + start, (size_t)size * sizeof(double));
 
   return size;
 }
@@ -3196,7 +3207,8 @@ gridInqYboundsPart(int gridID, int start, SizeType size, double *ybounds)
 {
   grid_t *gridptr = grid_to_pointer(gridID);
   const double *gridptr_ybounds = gridptr->vtable->inqYBoundsPtr(gridptr);
-  if (gridptr_ybounds && size && ybounds) memcpy(ybounds, gridptr_ybounds + start, size * sizeof(double));
+  if (gridptr_ybounds && size && ybounds)
+    memcpy(ybounds, gridptr_ybounds + start, (size_t)size * sizeof(double));
 
   return size;
 }
@@ -3376,13 +3388,13 @@ gridPrintKernel(int gridID, int opt, FILE *fp)
 {
   char attstr[CDI_MAX_NAME];
   char attstr2[CDI_MAX_NAME];
-  size_t nxvals = gridInqXvals(gridID, NULL);
-  size_t nyvals = gridInqYvals(gridID, NULL);
+  size_t nxvals = (size_t)gridInqXvals(gridID, NULL);
+  size_t nyvals = (size_t)gridInqYvals(gridID, NULL);
 
   int type = gridInqType(gridID);
-  size_t gridsize = gridInqSize(gridID);
-  size_t xsize = gridInqXsize(gridID);
-  size_t ysize = gridInqYsize(gridID);
+  size_t gridsize = (size_t)gridInqSize(gridID);
+  size_t xsize = (size_t)gridInqXsize(gridID);
+  size_t ysize = (size_t)gridInqYsize(gridID);
   int nvertex = gridInqNvertex(gridID);
   int datatype;
   cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
@@ -4546,7 +4558,8 @@ gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBu
   if (memberMask & gridHasReducedPointsFlag)
     {
       xassert(gridP->reducedPointsSize);
-      gridP->reducedPoints = (int *) Malloc((size_t) gridP->reducedPointsSize * sizeof(int));
+      gridP->reducedPoints
+        = Malloc((size_t) gridP->reducedPointsSize * sizeof(int));
       serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->reducedPoints, gridP->reducedPointsSize,
                       CDI_DATATYPE_INT, context);
       serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
diff --git a/src/pio_dist_grid.c b/src/pio_dist_grid.c
index 6a5fc4c9fb7d4158a0223bcaefa95c765b7d2de1..d9bbe82414d3f2ff41d4c3fc06a39a8ab0b9c2be 100644
--- a/src/pio_dist_grid.c
+++ b/src/pio_dist_grid.c
@@ -133,8 +133,11 @@ struct cdiPioDistGridExtraData
 #endif
 
 #ifdef HAVE_PPM_DIST_ARRAY_H
-static void cdiPioDistGridInit(grid_t *gridptr, int gridtype, int size, int xsize, int ysize, int nvertex,
-                               const int (*xy_decomposition)[2], Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY);
+static void
+cdiPioDistGridInit(grid_t *gridptr, int gridtype,
+                   size_t size, size_t xsize, size_t ysize, int nvertex,
+                   const int (*xy_decomposition)[2], Xt_idxlist partDesc2D,
+                   Xt_idxlist partDescX, Xt_idxlist partDescY);
 #endif
 
 cdiResH
@@ -150,7 +153,8 @@ cdiPioDistGridCreate(int gridtype, int size, int xsize, int ysize, int nvertex,
     }
   gridDefNvertex(gridID, nvertex);
   grid_t *gridptr = grid_to_pointer(gridID);
-  cdiPioDistGridInit(gridptr, gridtype, size, xsize, ysize, nvertex, xy_decomposition, partDesc2D, partDescX, partDescY);
+  cdiPioDistGridInit(gridptr, gridtype, (size_t)size, (size_t)xsize, (size_t)ysize,
+                     nvertex, xy_decomposition, partDesc2D, partDescX, partDescY);
   return gridID;
 #else
   (void) gridtype;
@@ -421,11 +425,14 @@ static bool cdiPioDistGridInitOnceState = false;
 #endif
 
 static void
-cdiPioDistGridInit(grid_t *gridptr, int gridtype, int size, int xsize, int ysize, int nvertex, const int (*xy_decomposition)[2],
+cdiPioDistGridInit(grid_t *gridptr, int gridtype,
+                   size_t size, size_t xsize, size_t ysize, int nvertex,
+                   const int (*xy_decomposition)[2],
                    Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY)
 {
   CDI_PIO_DIST_GRID_INIT_ONCE();
-  struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) (gridptr->extraData = Malloc(sizeof(*extraData)));
+  struct cdiPioDistGridExtraData *extraData
+    = gridptr->extraData = Malloc(sizeof(*extraData));
   extraData->rmaEnabled = false;
   struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays;
   sub_arrays[cdiPioGDsaXVals].element_dt = MPI_DOUBLE;
@@ -447,15 +454,16 @@ cdiPioDistGridInit(grid_t *gridptr, int gridtype, int size, int xsize, int ysize
         {
           sub_arrays[saIdx].a_rank = 2;
           sub_arrays[saIdx].rect[0].first = 0;
-          sub_arrays[saIdx].rect[0].size = ysize;
+          sub_arrays[saIdx].rect[0].size = (int32_t)ysize;
           sub_arrays[saIdx].rect[1].first = 0;
-          sub_arrays[saIdx].rect[1].size = xsize;
+          sub_arrays[saIdx].rect[1].size = (int32_t)xsize;
           extraData->defRedists[saIdx] = NULL;
         }
       irregular = true;
       break;
     case GRID_UNSTRUCTURED:
-      for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) sub_arrays[saIdx].rect[0].size = size;
+      for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx)
+        sub_arrays[saIdx].rect[0].size = (int32_t)size;
       irregular = true;
       /*-fallthrough*/
     case GRID_GENERIC:
@@ -476,13 +484,13 @@ cdiPioDistGridInit(grid_t *gridptr, int gridtype, int size, int xsize, int ysize
         }
       if (irregular) break;
       /* FIXME: make the following three 2D */
-      sub_arrays[cdiPioGDsaArea].rect[0].size = size;
-      sub_arrays[cdiPioGDsaMask].rect[0].size = size;
-      sub_arrays[cdiPioGDsaMaskGME].rect[0].size = size;
-      sub_arrays[cdiPioGDsaXVals].rect[0].size = xsize;
-      sub_arrays[cdiPioGDsaYVals].rect[0].size = ysize;
-      sub_arrays[cdiPioGDsaXBounds].rect[0].size = xsize;
-      sub_arrays[cdiPioGDsaYBounds].rect[0].size = ysize;
+      sub_arrays[cdiPioGDsaArea].rect[0].size = (int32_t)size;
+      sub_arrays[cdiPioGDsaMask].rect[0].size = (int32_t)size;
+      sub_arrays[cdiPioGDsaMaskGME].rect[0].size = (int32_t)size;
+      sub_arrays[cdiPioGDsaXVals].rect[0].size = (int32_t)xsize;
+      sub_arrays[cdiPioGDsaYVals].rect[0].size = (int32_t)ysize;
+      sub_arrays[cdiPioGDsaXBounds].rect[0].size = (int32_t)xsize;
+      sub_arrays[cdiPioGDsaYBounds].rect[0].size = (int32_t)ysize;
       break;
     case GRID_GAUSSIAN_REDUCED:
     default: Error("Unexpected or unsupported grid type %d", gridtype);
@@ -1079,23 +1087,26 @@ cdiPioDistGridDefYVals(grid_t *gridptr, const double *yvals)
 }
 
 static double
-cdiPioDistGridInqXorYVal(grid_t *gridptr, enum cdiPioGDsa saIdx, const double *vals, int index)
+cdiPioDistGridInqXorYVal(grid_t *gridptr, enum cdiPioGDsa saIdx,
+                         const double *vals, SizeType index)
 {
   double val = 0;
   if (vals)
     {
-      struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData;
+      struct cdiPioDistGridExtraData *extraData
+        = (struct cdiPioDistGridExtraData *) gridptr->extraData;
       if (index == 0)
         {
           struct axisReduction *aReduce = extraData->aReduce + saIdx;
           return aReduce->first;
         }
-      else if (index == gridptr->size - 1)
+      else if ((size_t)index == gridptr->size - 1)
         {
           struct axisReduction *aReduce = extraData->aReduce + saIdx;
           return aReduce->last;
         }
-      const struct PPM_global_array_desc *sub_array_desc = extraData->sub_arrays + saIdx;
+      const struct PPM_global_array_desc *sub_array_desc
+        = extraData->sub_arrays + saIdx;
       int32_t coord[cdiPioGDsaMaxRank];
       if (sub_array_desc->a_rank == 1)
         coord[0] = index;
@@ -1480,9 +1491,12 @@ cdiPioDistGridUnpackArrays(grid_t *gridptr, int memberMask, char *unpackBuffer,
       }
     else if (type == GRID_CURVILINEAR)
       {
-        Xt_int global_size[cdiPioGDsaMaxRank] = { gridptr->y.size, gridptr->x.size }, local_start[cdiPioGDsaMaxRank];
+        Xt_int global_size[cdiPioGDsaMaxRank]
+          = { (Xt_int)gridptr->y.size, (Xt_int)gridptr->x.size },
+          local_start[cdiPioGDsaMaxRank];
         int local_size[cdiPioGDsaMaxRank];
-        Xt_idxlist *partDescClient2D = (Xt_idxlist *) (Malloc((size_t) numClientsInGroup * sizeof(*partDescClient2D)));
+        Xt_idxlist *partDescClient2D
+          = Malloc((size_t) numClientsInGroup * sizeof(*partDescClient2D));
         for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs)
           {
             for (size_t dim = 0; dim < cdiPioGDsaMaxRank; ++dim)
@@ -1499,7 +1513,9 @@ cdiPioDistGridUnpackArrays(grid_t *gridptr, int memberMask, char *unpackBuffer,
       }
     else
       {
-        Xt_int global_size[cdiPioGDsaMaxRank] = { gridptr->y.size, gridptr->x.size }, local_start[cdiPioGDsaMaxRank];
+        Xt_int global_size[cdiPioGDsaMaxRank]
+          = { (Xt_int)gridptr->y.size, (Xt_int)gridptr->x.size },
+          local_start[cdiPioGDsaMaxRank];
         int local_size[cdiPioGDsaMaxRank];
         /* describe 2D decomposition via section for later collection
          * construction */
@@ -1593,19 +1609,24 @@ static bool
 cdiPioDistGridCompareXYvals(grid_t *gridRef, grid_t *gridTest)
 {
   bool differ = false;
-  int xsizeTest = gridTest->x.size, ysizeTest = gridTest->y.size;
-  if (gridRef->vtable == &cdiPioDistGridVtable && gridTest->vtable == &cdiPioDistGridVtable)
+  size_t xsizeTest = gridTest->x.size, ysizeTest = gridTest->y.size;
+  if (gridRef->vtable == &cdiPioDistGridVtable
+      && gridTest->vtable == &cdiPioDistGridVtable)
     {
-      if (!differ && xsizeTest > 0 && xsizeTest == gridRef->vtable->inqXVals(gridRef, NULL))
+      if (!differ && xsizeTest > 0
+          && xsizeTest == (size_t)gridRef->vtable->inqXVals(gridRef, NULL))
         {
-          const double *restrict xvalsRef = gridRef->x.vals, *restrict xvalsTest = gridTest->x.vals;
-          differ = compareGridVals((size_t) xsizeTest, xvalsRef, xvalsTest);
+          const double *restrict xvalsRef = gridRef->x.vals,
+            *restrict xvalsTest = gridTest->x.vals;
+          differ = compareGridVals(xsizeTest, xvalsRef, xvalsTest);
         }
 
-      if (!differ && ysizeTest > 0 && ysizeTest == gridRef->vtable->inqYVals(gridRef, NULL))
+      if (!differ && ysizeTest > 0
+          && ysizeTest == (size_t)gridRef->vtable->inqYVals(gridRef, NULL))
         {
-          const double *restrict yvalsRef = gridRef->y.vals, *restrict yvalsTest = gridTest->y.vals;
-          differ = compareGridVals((size_t) ysizeTest, yvalsRef, yvalsTest);
+          const double *restrict yvalsRef = gridRef->y.vals,
+            *restrict yvalsTest = gridTest->y.vals;
+          differ = compareGridVals(ysizeTest, yvalsRef, yvalsTest);
         }
       int differReduce = differ;
       xmpi(MPI_Allreduce(MPI_IN_PLACE, &differReduce, 1, MPI_INT, MPI_LOR, commInqCommCalc()));
@@ -1613,7 +1634,8 @@ cdiPioDistGridCompareXYvals(grid_t *gridRef, grid_t *gridTest)
     }
   else
     {
-      if (xsizeTest != gridRef->vtable->inqXVals(gridRef, NULL) || ysizeTest != gridRef->vtable->inqYVals(gridRef, NULL))
+      if (xsizeTest != (size_t)gridRef->vtable->inqXVals(gridRef, NULL)
+          || ysizeTest != (size_t)gridRef->vtable->inqYVals(gridRef, NULL))
         {
           differ = true;
         }
@@ -1622,14 +1644,14 @@ cdiPioDistGridCompareXYvals(grid_t *gridRef, grid_t *gridTest)
           /* warn about grid compare of distributed vs. undistributed grid */
           Warning("efficiency: comparing data of distributed "
                   "vs. non-distributed grid!");
-          double *valsRefCopy = Malloc((size_t) MAX(xsizeTest, ysizeTest) * sizeof(double));
+          double *valsRefCopy = Malloc(MAX(xsizeTest, ysizeTest) * sizeof(double));
           /* fetch X data */
           gridRef->vtable->inqXVals(gridRef, valsRefCopy);
-          differ = compareGridVals((size_t) xsizeTest, valsRefCopy, gridTest->vtable->inqXValsPtr(gridTest));
+          differ = compareGridVals(xsizeTest, valsRefCopy, gridTest->vtable->inqXValsPtr(gridTest));
           if (!differ)
             {
               gridRef->vtable->inqYVals(gridRef, valsRefCopy);
-              differ = compareGridVals((size_t) ysizeTest, valsRefCopy, gridTest->vtable->inqYValsPtr(gridTest));
+              differ = compareGridVals(ysizeTest, valsRefCopy, gridTest->vtable->inqYValsPtr(gridTest));
             }
           /* todo: handle this collectively, i.e. only compare
            * indices from chunk and allreduce result */
diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c
index ea30c581f7a5b32f3b8f7c39990f783a110ab365..2efcb9449cf97800b3d3a4dd2646bb681c0ae611 100644
--- a/src/stream_cdf_i.c
+++ b/src/stream_cdf_i.c
@@ -2517,8 +2517,8 @@ cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t
             }
           else if (gridPart && gridPart->readPart)
             {
-              start[0] = gridPart->start;
-              count[0] = gridPart->count;
+              start[0] = (size_t)gridPart->start;
+              count[0] = (size_t)gridPart->count;
               readPart = true;
             }
         }
@@ -2626,7 +2626,7 @@ cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t
                         if (readPart)
                           {
                             start[1] = 0;
-                            count[1] = grid->nvertex;
+                            count[1] = (size_t)grid->nvertex;
                           }
                         cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet,
                                         readPart, start, count);
@@ -2674,7 +2674,7 @@ cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t
                         if (readPart)
                           {
                             start[1] = 0;
-                            count[1] = grid->nvertex;
+                            count[1] = (size_t)grid->nvertex;
                           }
                         cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet,
                                         readPart, start, count);
@@ -2708,7 +2708,8 @@ cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t
                 int dimid = ncvars[ncvar->rpvarid].dimids[0];
                 size_t len = ncdims[dimid].len;
                 grid->y.size = len;
-                grid->reducedPointsSize = len;
+                assert(len <= INT_MAX);
+                grid->reducedPointsSize = (int)len;
                 grid->reducedPoints = (int *) Malloc(len * sizeof(int));
                 cdf_get_var_int(ncvar->ncid, ncvar->rpvarid, grid->reducedPoints);
                 grid->np = ncvar->numLPE;
@@ -3049,8 +3050,8 @@ cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t
                       if (numCellidx == 2) cdiQueryCellidx(query, count);
                       xsize = count;
                       ysize = count;
-                      gridPart.start = start - 1;
-                      gridPart.count = count;
+                      gridPart.start = (long)start - 1;
+                      gridPart.count = (long)count;
                       gridPart.readPart = true;
                     }
                 }
diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c
index 5b23b356ea5533481f35f92ab547795a50234732..a174955db39c017168c19acc92846af6907822fa 100644
--- a/src/stream_cdf_o.c
+++ b/src/stream_cdf_o.c
@@ -26,7 +26,7 @@ cdfCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
   int recID = streamptr1->tsteps[tsID].recIDs[vrecID];
   int ivarID = streamptr1->tsteps[tsID].records[recID].varID;
   int gridID = vlistInqVarGrid(vlistID1, ivarID);
-  size_t datasize = gridInqSize(gridID);
+  size_t datasize = (size_t)gridInqSize(gridID);
   int datatype = vlistInqVarDatatype(vlistID1, ivarID);
   int memtype = (datatype != CDI_DATATYPE_FLT32) ? MEMTYPE_DOUBLE : MEMTYPE_FLOAT;
 
@@ -649,7 +649,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool
           bool genBounds = false, hasBounds = gridInqPropPresence(gridID, gridAxisInq->bndsQueryKey);
           bool grid_is_cyclic = (gridIsCircular(gridID) > 0);
           double *restrict pbounds;
-          size_t nvertex = gridInqNvertex(gridID);
+          size_t nvertex = (size_t)gridInqNvertex(gridID);
           if (CDI_CMOR_Mode && grid_is_cyclic && !hasBounds)
             {
               const double *pvals = gridAxisInq->axisValsPtr(gridID);
@@ -1458,7 +1458,7 @@ cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisI
   int ncbvarid = CDI_UNDEFID;
   int nvdimID = CDI_UNDEFID;
 
-  double *buffer = (double *) malloc(2 * dimlen * sizeof(double));
+  double *buffer = Malloc(2 * dimlen * sizeof(double));
   double *lbounds = buffer;
   double *ubounds = buffer + dimlen;
   double *restrict levels;
@@ -1468,7 +1468,7 @@ cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisI
     levels = (double *) zaxisInqLevelsPtr(zaxisID);
   else
     {
-      levels = (double *) Malloc(sizeof(*levels) * dimlen);
+      levels = Malloc(sizeof(*levels) * dimlen);
       for (size_t i = 0; i < dimlen; ++i) levels[i] = (double) (i + 1);
     }
 
@@ -1535,7 +1535,7 @@ cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisI
 
   if (ncbvarid != CDI_UNDEFID)
     {
-      double *restrict zbounds = (double *) Malloc(2 * dimlen * sizeof(*zbounds));
+      double *restrict zbounds = Malloc(2 * dimlen * sizeof(*zbounds));
       for (size_t i = 0; i < dimlen; ++i)
         {
           zbounds[2 * i] = lbounds[i];
diff --git a/src/stream_cgribex.c b/src/stream_cgribex.c
index b937d27152c47bd6bf765db5fde6ac450a8d047e..83255d43f9764b0e8c563d765919e8e4363f7825 100644
--- a/src/stream_cgribex.c
+++ b/src/stream_cgribex.c
@@ -291,12 +291,12 @@ cgribexGetGridRegular(int *isec2, int *isec4, grid_t *grid, int gridtype, bool c
           }
 
         // recompute xinc if necessary
-        if (recompinc) grid->x.inc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / (grid->x.size - 1);
+        if (recompinc) grid->x.inc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / ((double)grid->x.size - 1);
 
         // correct xinc if necessary
         if (ISEC2_FirstLon == 0 && ISEC2_LastLon > 354000 && ISEC2_LastLon < 360000)
           {
-            double xinc = 360. / grid->x.size;
+            double xinc = 360. / (double)grid->x.size;
             if (fabs(grid->x.inc - xinc) > 0.0)
               {
                 grid->x.inc = xinc;
@@ -324,7 +324,7 @@ cgribexGetGridRegular(int *isec2, int *isec4, grid_t *grid, int gridtype, bool c
           }
 
         // recompute yinc if necessary
-        if (recompinc) grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / (grid->y.size - 1);
+        if (recompinc) grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double)grid->y.size - 1);
       }
     grid->y.first = ISEC2_FirstLat * 0.001;
     grid->y.last = ISEC2_LastLat * 0.001;
@@ -373,7 +373,7 @@ cgribexGetGridReduced(int *isec2, int *isec4, grid_t *grid)
         if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0)
           grid->y.inc = ISEC2_LatIncr * 0.001;
         else
-          grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / (grid->y.size - 1);
+          grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double)grid->y.size - 1);
       }
     grid->y.first = ISEC2_FirstLat * 0.001;
     grid->y.last = ISEC2_LastLat * 0.001;
diff --git a/src/stream_ext.c b/src/stream_ext.c
index 7fbcd25ce7dffffb863bfb7db957695939c5a90c..794acf0c2d3824969f466ef7999899443aa826b3 100644
--- a/src/stream_ext.c
+++ b/src/stream_ext.c
@@ -97,14 +97,14 @@ ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
   extInqDataFP32(extp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t size = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
 
   if (vlistInqVarNumber(vlistID, varID) == CDI_REAL)
-    *numMissVals = get_num_missvalsSP(size, data, missval);
+    *numMissVals = get_num_missvalsSP(size, data, (float)missval);
   else
-    *numMissVals = get_cplx_num_missvalsSP(size, data, missval);
+    *numMissVals = get_cplx_num_missvalsSP(size, data, (float)missval);
 
-  streamptr->numvals += size;
+  streamptr->numvals += (SizeType)size;
 }
 
 static void
@@ -129,14 +129,14 @@ ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
   extInqDataFP64(extp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t size = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
 
   if (vlistInqVarNumber(vlistID, varID) == CDI_REAL)
     *numMissVals = get_num_missvalsDP(size, data, missval);
   else
     *numMissVals = get_cplx_num_missvalsDP(size, data, missval);
 
-  streamptr->numvals += size;
+  streamptr->numvals += (SizeType)size;
 }
 
 void
@@ -299,7 +299,7 @@ extScanTimestep1(stream_t *streamptr)
 
       if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime);
 
-      extAddRecord(streamptr, param, rlevel, rxysize, recsize, recpos, extp->prec, extp->number);
+      extAddRecord(streamptr, param, rlevel, (size_t)rxysize, recsize, recpos, extp->prec, extp->number);
     }
 
 tstepScanLoopFinished:
@@ -560,7 +560,7 @@ extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_
   int fileID = streamptr->fileID;
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   int tsid = streamptr->curTsID;
 
   off_t currentfilepos = fileGetPos(fileID);
@@ -587,7 +587,7 @@ extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
   if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
 
   int vlistID = streamptr->vlistID;
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
 
   for (size_t levID = 0; levID < nlevs; levID++)
@@ -629,7 +629,7 @@ extWriteVarDP(stream_t *streamptr, int varID, const double *data)
   if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
 
   int vlistID = streamptr->vlistID;
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   size_t nlevs = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
 
   for (size_t levID = 0; levID < nlevs; levID++) extWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]);
diff --git a/src/stream_ieg.c b/src/stream_ieg.c
index 306b88cde5a6fb959aebf2dc671e8033e413f40c..72451628b21c9b12c3014bb335f4e1d0fb172dd4 100644
--- a/src/stream_ieg.c
+++ b/src/stream_ieg.c
@@ -55,11 +55,11 @@ ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
   iegInqDataFP32(iegp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t size = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
 
   *numMissVals = get_num_missvalsSP(size, data, missval);
 
-  streamptr->numvals += size;
+  streamptr->numvals += (SizeType)size;
 }
 
 static void
@@ -82,11 +82,11 @@ ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
   iegInqDataFP64(iegp, data);
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t size = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
 
   *numMissVals = get_num_missvalsDP(size, data, missval);
 
-  streamptr->numvals += size;
+  streamptr->numvals += (SizeType)size;
 }
 
 void
@@ -483,7 +483,7 @@ ieg_write_recordSP(stream_t *streamptr, const float *data)
   iegrec_t *iegp = (iegrec_t *) record->objectp;
 
   int fileID = streamptr->fileID;
-  size_t gridsize = gridInqSize(record->gridID);
+  size_t gridsize = (size_t)gridInqSize(record->gridID);
 
   iegp->refval = calc_refvalSP(gridsize, data);
 
@@ -498,7 +498,7 @@ ieg_write_recordDP(stream_t *streamptr, const double *data)
   iegrec_t *iegp = (iegrec_t *) record->objectp;
 
   int fileID = streamptr->fileID;
-  size_t gridsize = gridInqSize(record->gridID);
+  size_t gridsize = (size_t)gridInqSize(record->gridID);
 
   iegp->refval = calc_refvalDP(gridsize, data);
 
@@ -570,12 +570,12 @@ iegAddRecord(stream_t *streamptr, int param, int *pdb, int *gdb, double *vct, si
         if (IEG_G_ResFlag(gdb) && IEG_G_LonIncr(gdb) > 0)
           grid->x.inc = IEG_G_LonIncr(gdb) * resfac;
         else
-          grid->x.inc = (IEG_G_LastLon(gdb) - IEG_G_FirstLon(gdb)) * resfac / (xsize - 1);
+          grid->x.inc = (IEG_G_LastLon(gdb) - IEG_G_FirstLon(gdb)) * resfac / ((double)xsize - 1);
 
         // correct xinc if necessary
         if (IEG_G_FirstLon(gdb) == 0 && IEG_G_LastLon(gdb) > 354000)
           {
-            double xinc = 360. / xsize;
+            double xinc = 360. / (double)xsize;
             // FIXME: why not use grid->x.inc != xinc as condition?
             if (fabs(grid->x.inc - xinc) > 0.0)
               {
@@ -596,7 +596,7 @@ iegAddRecord(stream_t *streamptr, int param, int *pdb, int *gdb, double *vct, si
         if (IEG_G_ResFlag(gdb) && IEG_G_LatIncr(gdb) > 0)
           grid->y.inc = IEG_G_LatIncr(gdb) * resfac;
         else
-          grid->y.inc = (IEG_G_LastLat(gdb) - IEG_G_FirstLat(gdb)) * resfac / (ysize - 1);
+          grid->y.inc = (IEG_G_LastLat(gdb) - IEG_G_FirstLat(gdb)) * resfac / (double)(ysize - 1);
       }
     grid->y.first = IEG_G_FirstLat(gdb) * resfac;
     grid->y.last = IEG_G_LastLat(gdb) * resfac;
@@ -1016,7 +1016,7 @@ iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_
   int fileID = streamptr->fileID;
 
   double missval = vlistInqVarMissval(vlistID, varID);
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   int tsid = streamptr->curTsID;
 
   off_t currentfilepos = fileGetPos(fileID);
@@ -1038,7 +1038,7 @@ iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
   if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
 
   int vlistID = streamptr->vlistID;
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
 
   for (size_t levID = 0; levID < nlevs; levID++)
@@ -1073,7 +1073,7 @@ iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data
 
   iegp->dprec = iegDefDatatype(vlistInqVarDatatype(vlistID, varID));
 
-  size_t gridsize = gridInqSize(gridID);
+  size_t gridsize = (size_t)gridInqSize(gridID);
   iegp->refval = calc_refvalDP(gridsize, data);
 
   iegDefDataFP64(iegp, data);
@@ -1086,7 +1086,7 @@ iegWriteVarDP(stream_t *streamptr, int varID, const double *data)
   if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
 
   int vlistID = streamptr->vlistID;
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   size_t nlevels = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
 
   for (size_t levID = 0; levID < nlevels; levID++) iegWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]);
diff --git a/src/stream_read.c b/src/stream_read.c
index fedafb2ac7b488453fbfbf9319a5069acb4b346c..a7c5066559d802fa2201ed9bda7aa5c98cccbfef 100644
--- a/src/stream_read.c
+++ b/src/stream_read.c
@@ -104,7 +104,7 @@ streamReadVarF(int streamID, int varID, float *data, SizeType *numMissVals)
     {
       // In case the file format does not support single precision reading,
       // we fall back to double precision reading, converting the data on the fly.
-      size_t elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      size_t elementCount = (size_t)gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
       elementCount *= (size_t) zaxisInqSize(vlistInqVarZaxis(streamInqVlist(streamID), varID));
       double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
       streamReadVar(streamID, varID, conversionBuffer, numMissVals);
@@ -181,7 +181,7 @@ streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType
   if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, data, &numMiss))
     {
       Warning("Unexpected error returned from cdiStreamReadVarSlice()!");
-      size_t elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      size_t elementCount = (size_t)gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
       memset(data, 0, elementCount * sizeof(*data));
     }
   *numMissVals = (SizeType) numMiss;
@@ -213,7 +213,7 @@ streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType
     {
       // In case the file format does not support single precision reading,
       // we fall back to double precision reading, converting the data on the fly.
-      size_t elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      size_t elementCount = (size_t)gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
       double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
       streamReadVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals);
       for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i];
diff --git a/src/stream_srv.c b/src/stream_srv.c
index 5e7363c14bca627cc0e69abb81c1aaaaeae43935..b07185b75e01f309483a5bca84b680627ccbbb0c 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -308,7 +308,7 @@ srvScanTimestep1(stream_t *streamptr)
 
       if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime);
 
-      srv_add_record(streamptr, param, rlevel, rxsize, rysize, recsize, recpos, prec);
+      srv_add_record(streamptr, param, rlevel, (size_t)rxsize, (size_t)rysize, recsize, recpos, prec);
     }
 
 tstepScanLoopFinished:
@@ -595,7 +595,7 @@ srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
   if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
 
   int vlistID = streamptr->vlistID;
-  size_t gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t gridsize = (size_t)gridInqSize(vlistInqVarGrid(vlistID, varID));
   size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
 
   for (size_t levID = 0; levID < nlevs; levID++)
diff --git a/src/stream_write.c b/src/stream_write.c
index a2b34e90fe6f8cd9693ab3a2d49e84a00295ce49..23f622d41a7ba6f3ea4729d01e8c02c449f86e8c 100644
--- a/src/stream_write.c
+++ b/src/stream_write.c
@@ -37,7 +37,7 @@ cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeT
   switch (cdiBaseFiletype(filetype))
     {
 #ifdef HAVE_LIBGRIB
-    case CDI_FILETYPE_GRIB: grb_write_var(streamptr, varID, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_GRIB: grb_write_var(streamptr, varID, memtype, data, (size_t)numMissVals); break;
 #endif
 #ifdef HAVE_LIBSERVICE
     case CDI_FILETYPE_SRV: srvWriteVarDP(streamptr, varID, (double *) data); break;
@@ -49,7 +49,7 @@ cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeT
     case CDI_FILETYPE_IEG: iegWriteVarDP(streamptr, varID, (double *) data); break;
 #endif
 #ifdef HAVE_LIBNETCDF
-    case CDI_FILETYPE_NETCDF: cdf_write_var(streamptr, varID, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_NETCDF: cdf_write_var(streamptr, varID, memtype, data, (size_t)numMissVals); break;
 #endif
     default: Error("%s support not compiled in!", strfiletype(filetype));
     }
@@ -111,9 +111,9 @@ streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals
       const int vlistID = streamInqVlist(streamID);
       SizeType elementCount = gridInqSize(vlistInqVarGrid(vlistID, varID));
       elementCount *= (SizeType) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
-      double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
-      for (SizeType i = elementCount; i--;) conversionBuffer[i] = (double) data[i];
-      myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) conversionBuffer, numMissVals);
+      double *conversionBuffer = Malloc((size_t)elementCount * sizeof(*conversionBuffer));
+      for (SizeType i = elementCount; i--;) conversionBuffer[i] = data[i];
+      myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) conversionBuffer,  numMissVals);
       Free(conversionBuffer);
     }
 }
@@ -142,7 +142,7 @@ cdiStreamWriteVarSlice(int streamID, int varID, int levelID, int memtype, const
   switch (cdiBaseFiletype(filetype))
     {
 #ifdef HAVE_LIBGRIB
-    case CDI_FILETYPE_GRIB: grb_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_GRIB: grb_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t)numMissVals); break;
 #endif
 #ifdef HAVE_LIBSERVICE
     case CDI_FILETYPE_SRV: srvWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break;
@@ -154,7 +154,7 @@ cdiStreamWriteVarSlice(int streamID, int varID, int levelID, int memtype, const
     case CDI_FILETYPE_IEG: iegWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break;
 #endif
 #ifdef HAVE_LIBNETCDF
-    case CDI_FILETYPE_NETCDF: cdf_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_NETCDF: cdf_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t)numMissVals); break;
 #endif
     default: Error("%s support not compiled in!", strfiletype(filetype));
     }
@@ -210,7 +210,7 @@ streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, Si
       // In case the file format does not support single precision writing,
       // we fall back to double precision writing, converting the data on the fly.
       const SizeType elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
-      double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
+      double *conversionBuffer = Malloc((size_t)elementCount * sizeof(*conversionBuffer));
       for (SizeType i = elementCount; i--;) conversionBuffer[i] = (double) data[i];
       streamWriteVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals);
       Free(conversionBuffer);
@@ -268,7 +268,7 @@ cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2
       break;
 #endif
 #ifdef HAVE_LIBNETCDF
-    case CDI_FILETYPE_NETCDF: cdf_write_var_chunk(streamptr, varID, memtype, rect, data, numMissVals); break;
+    case CDI_FILETYPE_NETCDF: cdf_write_var_chunk(streamptr, varID, memtype, rect, data, (size_t)numMissVals); break;
 #endif
     default: Error("%s support not compiled in!", strfiletype(filetype)); break;
     }
@@ -286,7 +286,7 @@ stream_write_record(int streamID, int memtype, const void *data, SizeType numMis
   switch (cdiBaseFiletype(streamptr->filetype))
     {
 #ifdef HAVE_LIBGRIB
-    case CDI_FILETYPE_GRIB: grb_write_record(streamptr, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_GRIB: grb_write_record(streamptr, memtype, data, (size_t)numMissVals); break;
 #endif
 #ifdef HAVE_LIBSERVICE
     case CDI_FILETYPE_SRV: srv_write_record(streamptr, memtype, data); break;
@@ -298,7 +298,7 @@ stream_write_record(int streamID, int memtype, const void *data, SizeType numMis
     case CDI_FILETYPE_IEG: ieg_write_record(streamptr, memtype, data); break;
 #endif
 #ifdef HAVE_LIBNETCDF
-    case CDI_FILETYPE_NETCDF: cdf_write_record(streamptr, memtype, data, numMissVals); break;
+    case CDI_FILETYPE_NETCDF: cdf_write_record(streamptr, memtype, data, (size_t)numMissVals); break;
 #endif
     default: Error("%s support not compiled in!", strfiletype(streamptr->filetype));
     }
diff --git a/src/vlist.c b/src/vlist.c
index b0820c01141c7c23ef72aad23b838906a4a0d2b2..5e3a1315afd388c035308576c3679710c1d31a8a 100644
--- a/src/vlist.c
+++ b/src/vlist.c
@@ -1140,7 +1140,8 @@ vlistPrintKernel(vlist_t *vlistptr, FILE *fp)
             fp);
       for (int varID = 0; varID < nvars; varID++)
         fprintf(fp, "%3d %8zu\n", varID,
-                (size_t) zaxisInqSize(vlistptr->vars[varID].zaxisID) * gridInqSize(vlistptr->vars[varID].gridID));
+                (size_t)zaxisInqSize(vlistptr->vars[varID].zaxisID)
+                * (size_t)gridInqSize(vlistptr->vars[varID].gridID));
     }
 }
 
diff --git a/tests/test_cdf_read.c b/tests/test_cdf_read.c
index 35390ec56ee674e181929c3e0435e77d418cb25a..790f3162d3200b0e021d00ddf3a81fbe241829c4 100644
--- a/tests/test_cdf_read.c
+++ b/tests/test_cdf_read.c
@@ -51,7 +51,7 @@ main(int argc, const char **argv)
               buf = temp;
             }
           streamReadVar(streamID, (int) varID, buf, &nmiss);
-          allNmissSum += nmiss;
+          allNmissSum += (size_t)nmiss;
         }
     }
   if (countMissingValues) printf("missing values count = %zu\n", allNmissSum);