diff --git a/ChangeLog b/ChangeLog
index 4d67335fe18ef71716ef1a66e84c5ca4805b31e6..839e9e81880c6b3ed5fe3ae5a581079fa359565b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,10 @@
 
 	* Version 2.0.0 released
 
+2021-04-16  Uwe Schulzweida
+
+	* Replaced gridDefDatatype()/gridInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE
+
 2021-04-15  Uwe Schulzweida
 
 	* gribapiDefLevel: added support for GRIB1_LTYPE_LANDDEPTH_LAYER
diff --git a/Obsolete_functions b/Obsolete_functions
index 4754ddf4a8aa04fa5342b127f4fae793eedaf692..b3ef7e237728b5b98ba55a478ae4c2e4a6886c29 100644
--- a/Obsolete_functions
+++ b/Obsolete_functions
@@ -22,14 +22,16 @@ gridInqYlongname(gridID, ylongname)   -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_
 gridInqYunits(gridID, yunits)         -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, yunits, &length)
 gridInqYstdname(gridID, ylongname)    -> cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, ystdname, &length)
 
-gridDefNumber(zaxisID, number)        -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number)
-gridInqNumber(zaxisID)                -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number)
-gridDefPosition(zaxisID, position)     > cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position)
-gridInqPosition(zaxisID)              -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position)
-gridDefUUID(zaxisID, uuidOfHGrid)     -> cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, length)
-gridInqUUID(zaxisID)                  -> cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, &length)
-gridDefReference(zaxisID, reference)  -> cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference)
-gridInqReference(zaxisID)             -> cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length)
+gridDefDatatype(gridID, datatype)     -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype)
+gridInqDatatype(gridID)               -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype)
+gridDefNumber(gridID, number)         -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number)
+gridInqNumber(gridID)                 -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number)
+gridDefPosition(gridID, position)     -> cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position)
+gridInqPosition(gridID)               -> cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position)
+gridDefUUID(gridID, uuidOfHGrid)      -> cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, length)
+gridInqUUID(gridID)                   -> cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid, &length)
+gridDefReference(gridID, reference)   -> cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference)
+gridInqReference(gridID)              -> cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length)
 
 zaxisDefName(zaxisID, name)           -> cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name)
 zaxisDefLongname(zaxisID, longname)   -> cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname)
diff --git a/doc/tex/c_quick_ref.tex b/doc/tex/c_quick_ref.tex
index 38de0eb26e95dbe73893df7d0f25f3737e40a908..87eac29911ffb25accab3c4fab827523408cd6c4 100644
--- a/doc/tex/c_quick_ref.tex
+++ b/doc/tex/c_quick_ref.tex
@@ -161,15 +161,6 @@ Get number of attributes assigned to this variable.
 Create a horizontal Grid.
 
 
-\section*{\tt \htmlref{gridDefDatatype}{gridDefDatatype}}
-
-\begin{verbatim}
-    void gridDefDatatype (int gridID, int prec);
-\end{verbatim}
-
-Define the data type of a Grid.
-
-
 \section*{\tt \htmlref{gridDefNP}{gridDefNP}}
 
 \begin{verbatim}
@@ -359,15 +350,6 @@ Destroy a horizontal Grid.
 Duplicate a Grid.
 
 
-\section*{\tt \htmlref{gridInqDatatype}{gridInqDatatype}}
-
-\begin{verbatim}
-    int gridInqDatatype (int gridID);
-\end{verbatim}
-
-Get the data type of a Grid.
-
-
 \section*{\tt \htmlref{gridInqNP}{gridInqNP}}
 
 \begin{verbatim}
diff --git a/doc/tex/f_quick_ref.tex b/doc/tex/f_quick_ref.tex
index f6995f6c5ae0666337496fd0f33acb532619ac26..b44741069d603cdec19e356a0db7954428afa7be 100644
--- a/doc/tex/f_quick_ref.tex
+++ b/doc/tex/f_quick_ref.tex
@@ -169,15 +169,6 @@ Get number of attributes assigned to this variable.
 Create a horizontal Grid.
 
 
-\section*{\tt \htmlref{gridDefDatatype}{gridDefDatatype}}
-
-\begin{verbatim}
-    SUBROUTINE gridDefDatatype (INTEGER gridID, INTEGER prec)
-\end{verbatim}
-
-Define the data type of a Grid.
-
-
 \section*{\tt \htmlref{gridDefNP}{gridDefNP}}
 
 \begin{verbatim}
@@ -367,15 +358,6 @@ Destroy a horizontal Grid.
 Duplicate a Grid.
 
 
-\section*{\tt \htmlref{gridInqDatatype}{gridInqDatatype}}
-
-\begin{verbatim}
-    INTEGER FUNCTION gridInqDatatype (INTEGER gridID)
-\end{verbatim}
-
-Get the data type of a Grid.
-
-
 \section*{\tt \htmlref{gridInqNP}{gridInqNP}}
 
 \begin{verbatim}
diff --git a/src/cdi.h b/src/cdi.h
index b96069f96a47aaa6449ddead784c8a57ef97a405..c1a7ef1fce1392bde00855278fce18aca014216a 100644
--- a/src/cdi.h
+++ b/src/cdi.h
@@ -914,10 +914,7 @@ void    gridDefYunits(int gridID, const char *yunits);
 //      gridInqYunits: Get the units of a Y-axis
 void    gridInqYunits(int gridID, char *yunits);
 
-//      gridDefDatatype: Define the data type of a Grid
 void    gridDefDatatype(int gridID, int prec);
-
-//      gridInqDatatype: Get the data type of a Grid
 int     gridInqDatatype(int gridID);
 
 //      gridInqXval: Get one value of a X-axis
diff --git a/src/cdi.inc b/src/cdi.inc
index 6fafd09de9769920568634b90912638ea367c6f7..9558cfe5339fbbc83171273bcfee5b868b42e715 100644
--- a/src/cdi.inc
+++ b/src/cdi.inc
@@ -4,7 +4,7 @@
 !
 ! Author:
 ! -------
-! Uwe Schulzweida, MPI-MET, Hamburg,   March 2021
+! Uwe Schulzweida, MPI-MET, Hamburg,   April 2021
 !
 
       INTEGER    CDI_MAX_NAME
diff --git a/src/gribapi_utilities.c b/src/gribapi_utilities.c
index f58a2f020854187e7e730bd12bf60ae937ee44c4..7c94f737eb8bbe671e071b03408d9af9ed8cc970 100644
--- a/src/gribapi_utilities.c
+++ b/src/gribapi_utilities.c
@@ -445,7 +445,7 @@ int gribapiGetTsteptype(grib_handle *gh)
 int gribGetDatatype(grib_handle* gribHandle)
 {
   int datatype;
-  if(gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee"))
+  if (gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee"))
     {
       datatype = gribCheckLong(gribHandle, "precision", 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
     }
@@ -470,8 +470,8 @@ int gribapiGetParam(grib_handle *gh)
   else
     {
       FAIL_ON_GRIB_ERROR(grib_get_long, gh, "discipline", &pdis);
-      if(grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0;
-      if(grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0;
+      if (grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0;
+      if (grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0;
     }
   return cdiEncodeParam((int)pnum, (int)pcat, (int)pdis);
 }
diff --git a/src/grid.c b/src/grid.c
index 7f03d2c93b8283c29a080e5eef1c1169a6574f7a..aed192f4a48f8a015685d8361e13353f4377ca10 100644
--- a/src/grid.c
+++ b/src/grid.c
@@ -92,7 +92,7 @@ bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int
 {
   bool status = true;
 
-  if ( atttype == CDI_DATATYPE_INT32 )
+  if (atttype == CDI_DATATYPE_INT32)
     {
       int attint;
       int *pattint = attlen > 1 ? (int*) malloc(attlen*sizeof(int)) : &attint;
@@ -100,7 +100,7 @@ bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int
       for ( int i = 0; i < attlen; ++i ) attflt[i] = (double)pattint[i];
       if (attlen > 1) free(pattint);
     }
-  else if ( atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64 )
+  else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64)
     {
       cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt);
     }
@@ -153,7 +153,6 @@ void grid_init(grid_t *gridptr)
 
   gridptr->trunc          = 0;
   gridptr->nvertex        = 0;
-  gridptr->datatype       = CDI_DATATYPE_FLT64;
   gridptr->np             = 0;
   gridptr->isCyclic       = CDI_UNDEFID;
 
@@ -161,10 +160,12 @@ void grid_init(grid_t *gridptr)
   gridptr->hasdims        = true;
   gridptr->name           = NULL;
   gridptr->vtable         = &cdiGridVtable;
+
   cdiInitKeys(&gridptr->keys);
   gridptr->atts.nalloc    = MAX_ATTRIBUTES;
   gridptr->atts.nelems    = 0;
 
+  cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64);
   cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_SCANNINGMODE, 64);
 }
 
@@ -860,7 +861,7 @@ void gridDefProj(int gridID, int projID)
   grid_t *gridptr = grid_to_pointer(gridID);
   gridptr->proj = projID;
 
-  if ( gridptr->type == GRID_CURVILINEAR )
+  if (gridptr->type == GRID_CURVILINEAR)
     {
       grid_t *projptr = grid_to_pointer(projID);
       const char *xdimname = cdiInqVarKeyStringPtr(&gridptr->x.keys, CDI_KEY_DIMNAME);
@@ -883,19 +884,19 @@ int gridInqProjType(int gridID)
   grid_t *gridptr = grid_to_pointer(gridID);
 
   int projtype = gridptr->projtype;
-  if ( projtype == -1 )
+  if (projtype == -1)
     {
       char gmapname[CDI_MAX_NAME];
       int length = CDI_MAX_NAME;
       cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length);
-      if ( gmapname[0] )
+      if (gmapname[0])
         {
           // clang-format off
-          if      ( strIsEqual(gmapname, "rotated_latitude_longitude") )   projtype = CDI_PROJ_RLL;
-          else if ( strIsEqual(gmapname, "lambert_azimuthal_equal_area") ) projtype = CDI_PROJ_LAEA;
-          else if ( strIsEqual(gmapname, "lambert_conformal_conic") )      projtype = CDI_PROJ_LCC;
-          else if ( strIsEqual(gmapname, "sinusoidal") )                   projtype = CDI_PROJ_SINU;
-          else if ( strIsEqual(gmapname, "polar_stereographic") )          projtype = CDI_PROJ_STERE;
+          if      (strIsEqual(gmapname, "rotated_latitude_longitude"))   projtype = CDI_PROJ_RLL;
+          else if (strIsEqual(gmapname, "lambert_azimuthal_equal_area")) projtype = CDI_PROJ_LAEA;
+          else if (strIsEqual(gmapname, "lambert_conformal_conic"))      projtype = CDI_PROJ_LCC;
+          else if (strIsEqual(gmapname, "sinusoidal"))                   projtype = CDI_PROJ_SINU;
+          else if (strIsEqual(gmapname, "polar_stereographic"))          projtype = CDI_PROJ_STERE;
           // clang-format on
           gridptr->projtype = projtype;
         }
@@ -910,14 +911,14 @@ void gridVerifyProj(int gridID)
   grid_t *gridptr = grid_to_pointer(gridID);
 
   const int projtype = gridInqProjType(gridID);
-  if ( projtype == CDI_PROJ_RLL )
+  if (projtype == CDI_PROJ_RLL)
     {
       gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]);
       gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]);
       gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees");
       gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees");
     }
-  else if ( projtype == CDI_PROJ_LCC )
+  else if (projtype == CDI_PROJ_LCC)
     {
       gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]);
       gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]);
@@ -1073,40 +1074,16 @@ void gridDefXsize(int gridID, size_t xsize)
     }
 }
 
-/*
-@Function
-@Title
-
-@Prototype
-@Parameter
-    @Item  Grid identifier
-
-@EndFunction
-*/
 void gridDefDatatype(int gridID, int datatype)
 {
-  grid_t *gridptr = grid_to_pointer(gridID);
-  if (gridptr->datatype != datatype)
-    {
-      gridMark4Update(gridID);
-      gridptr->datatype = datatype;
-    }
+  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype);
 }
 
-/*
-@Function
-@Title
-
-@Prototype
-@Parameter
-    @Item  Grid identifier
-
-@EndFunction
-*/
 int gridInqDatatype(int gridID)
 {
-  grid_t *gridptr = grid_to_pointer(gridID);
-  return gridptr->datatype;
+  int datatype = 0;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  return datatype;
 }
 
 /*
@@ -2582,7 +2559,8 @@ static
 void gridComplete(grid_t *grid)
 {
   const int gridID = grid->self;
-  gridDefDatatype(gridID, grid->datatype);
+
+  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid->datatype);
 
   const int gridtype = grid->type;
   switch (gridtype)
@@ -2639,14 +2617,14 @@ void gridComplete(grid_t *grid)
             cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]);
 	  }
 
-        if ( gridtype == GRID_UNSTRUCTURED )
+        if (gridtype == GRID_UNSTRUCTURED)
           {
             int number = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED);
-            if ( number > 0 )
+            if (number > 0)
               {
                 cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number);
                 int position = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE);
-                if ( position > 0 ) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position);
+                if (position > 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position);
               }
           }
 
@@ -3349,12 +3327,13 @@ void gridPrintKernel(int gridID, int opt, FILE *fp)
   size_t nxvals = gridInqXvals(gridID, NULL);
   size_t nyvals = gridInqYvals(gridID, NULL);
 
-  int type     = gridInqType(gridID);
+  int type = gridInqType(gridID);
   size_t gridsize = gridInqSize(gridID);
-  size_t xsize    = gridInqXsize(gridID);
-  size_t ysize    = gridInqYsize(gridID);
+  size_t xsize = gridInqXsize(gridID);
+  size_t ysize = gridInqYsize(gridID);
   int nvertex  = gridInqNvertex(gridID);
-  int datatype = gridInqDatatype(gridID);
+  int datatype;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
 
   int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7;
 
diff --git a/src/stream_cdf_o.c b/src/stream_cdf_o.c
index 24ee141afd2a777d6dd8d8dafd929ad836463938..e88ccd7f447b7e4ccff755bae2fab94bb822ff83 100644
--- a/src/stream_cdf_o.c
+++ b/src/stream_cdf_o.c
@@ -266,10 +266,18 @@ void cdfPutGridStdAtts(int fileID, int ncvarid, int gridID, int dimtype)
     cdf_put_att_text(fileID, ncvarid, "units", len, units);
 }
 
+static int
+grid_inq_xtype(int gridID)
+{
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  return (datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE;
+}
+
 static void
 cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridindex, const struct cdfDefGridAxisInqs *inqs, int dimtype)
 {
-  const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE;
+  const nc_type xtype = grid_inq_xtype(gridID);
   ncgrid_t *ncgrid = streamptr->ncgrid;
 
   const size_t dimlen = inqs->axisSize(gridID);
@@ -423,7 +431,7 @@ cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridindex, int ndims, bool
   int dimID = CDI_UNDEFID;
   const int fileID  = streamptr->fileID;
   const size_t dimlen = gridAxisInq->axisSize(gridID);
-  const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE;
+  const nc_type xtype = grid_inq_xtype(gridID);
 
   ncgrid_t *ncgrid = streamptr->ncgrid;
 
@@ -630,7 +638,7 @@ cdfDefIrregularGridCommon(stream_t *streamptr, int gridID,
                           size_t nvertex, const char *vdimname_default,
                           bool setVdimname)
 {
-  const nc_type xtype = (gridInqDatatype(gridID) == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE;
+  const nc_type xtype = grid_inq_xtype(gridID);
   int xdimID = CDI_UNDEFID;
   int ydimID = CDI_UNDEFID;
   int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID;