diff --git a/src/grid.c b/src/grid.c
index a30557c27accf4cbcef4d00352b188396c939d23..1172f230e13335c9980a869abe20715f6cd86221 100644
--- a/src/grid.c
+++ b/src/grid.c
@@ -56,7 +56,7 @@ static void   gridPack        ( void * gridptr, void * buff, int size,
 				int *position, void *context);
 static int    gridTxCode      ( void );
 
-static const resOps gridOps = {
+const resOps gridOps = {
   gridCompareP,
   gridDestroyP,
   gridPrintP,
diff --git a/src/grid.h b/src/grid.h
index 4e447211de17b43ec5cc329c4cc46b7b87c6123e..bde677d2256ffdf1a3f710102bafc8e6fa5f62b8 100644
--- a/src/grid.h
+++ b/src/grid.h
@@ -2,6 +2,7 @@
 #define _GRID_H
 
 #include "cdi.h"
+#include "resource_handle.h"
 
 typedef unsigned char mask_t;
 
@@ -95,6 +96,8 @@ gridUnpack(char * unpackBuffer, int unpackBufferSize,
            int * unpackBufferPos, int originNamespace, void *context,
            int force_id);
 
+extern const resOps gridOps;
+
 #endif
 /*
  * Local Variables:
diff --git a/src/varscan.c b/src/varscan.c
index 131261ab28eb50300838d7dd7e57411cc6480ce2..0ff41fd4771a2973e02fbac772633f9155824ce7 100644
--- a/src/varscan.c
+++ b/src/varscan.c
@@ -2,12 +2,14 @@
 #  include "config.h"
 #endif
 
+#include <stdbool.h>
 #include <string.h>
 #include <math.h>
 
 #include "cdi.h"
 #include "cdi_int.h"
 #include "dmemory.h"
+#include "resource_handle.h"
 #include "varscan.h"
 #include "vlist.h"
 #include "grid.h"
@@ -741,6 +743,25 @@ void varDefZAxisReference(int nhlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZ
   memcpy(uuidVGrid, uuid, CDI_UUID_SIZE);
 }
 
+struct varDefGridSearchState
+{
+  int resIDValue;
+  const grid_t *queryKey;
+};
+
+static enum cdiApplyRet
+varDefGridSearch(int id, void *res, void *data)
+{
+  struct varDefGridSearchState *state = data;
+  (void)res;
+  if (gridCompare(id, state->queryKey) == 0)
+    {
+      state->resIDValue = id;
+      return CDI_APPLY_STOP;
+    }
+  else
+    return CDI_APPLY_GO_ON;
+}
 
 int varDefGrid(int vlistID, const grid_t *grid, int mode)
 {
@@ -751,10 +772,7 @@ int varDefGrid(int vlistID, const grid_t *grid, int mode)
   int gridglobdefined = FALSE;
   int griddefined;
   int gridID = CDI_UNDEFID;
-  vlist_t *vlistptr;
-  int * gridIndexList;
-
-  vlistptr = vlist_to_pointer(vlistID);
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
 
   griddefined = FALSE;
   unsigned ngrids = (unsigned)vlistptr->ngrids;
@@ -775,25 +793,13 @@ int varDefGrid(int vlistID, const grid_t *grid, int mode)
 
   if ( ! griddefined )
     {
-      ngrids = cdiGridCount();
-      if ( ngrids > 0 )
-        {
-          gridIndexList = (int*)xmalloc((size_t)ngrids * sizeof(int));
-          cdiGridGetIndexList ( ngrids, gridIndexList );
-          for (unsigned i = 0; i < ngrids; i++ )
-            {
-              gridID = gridIndexList[i];
-              if ( gridCompare(gridID, grid) == 0 )
-                {
-                  gridglobdefined = TRUE;
-                  break;
-                }
-            }
-          free(gridIndexList);
-        }
+      struct varDefGridSearchState query = { .queryKey = grid };
+      if ((gridglobdefined
+           = (cdiResHFilterApply(&gridOps, varDefGridSearch, &query)
+              == CDI_APPLY_STOP)))
+        gridID = query.resIDValue;
 
-      ngrids = (unsigned)vlistptr->ngrids;
-      if ( mode == 1 )
+      if ( mode == 1 && gridglobdefined)
 	for (unsigned index = 0; index < ngrids; index++ )
 	  if ( vlistptr->gridIDs[index] == gridID )
 	    {
@@ -953,7 +959,6 @@ int varDefZaxis(int vlistID, int zaxistype, int nlevels, double *levels, int lbo
 	  zaxisDefLtype(zaxisID, ltype1);
 	}
 
-      nzaxis = vlistptr->nzaxis;
       vlistptr->zaxisIDs[nzaxis] = zaxisID;
       vlistptr->nzaxis++;
     }