diff --git a/app/cdi.c b/app/cdi.c
index cb1a95417c8a273fb8a9c2b72466ada455739fe9..e79a88937222ba6e1e70b3fe2505cf1521fdbf88 100644
--- a/app/cdi.c
+++ b/app/cdi.c
@@ -729,72 +729,6 @@ defineCompress(const char *arg)
     fprintf(stderr, "%s compression unsupported!\n", arg);
 }
 
-typedef struct CdiQuery
-{
-  int numNames;
-  char **names;
-} CdiQuery;
-
-void
-cdiQueryInit(CdiQuery *query)
-{
-  query->numNames = 0;
-  query->names = NULL;
-}
-
-CdiQuery *
-cdiQueryCreate()
-{
-  CdiQuery *query = (CdiQuery*) malloc(sizeof(CdiQuery));
-  cdiQueryInit(query);
-  return query;
-}
-
-void
-cdiQueryDelete(CdiQuery *query)
-{
-  if (query->numNames && query)
-    {
-      for (int i = 0; i < query->numNames; ++i) free(query->names[i]);
-      free(query);
-    }
-}
-
-void
-cdiQuerySetNames(CdiQuery *query, int numNames, char **names)
-{
-  if (numNames)
-    {
-      query->numNames = numNames;
-      query->names = (char**)malloc(numNames * sizeof(char*));
-      for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]);
-    }
-}
-
-CdiQuery *
-cdiQueryClone(CdiQuery *query)
-{
-  CdiQuery *queryOut = cdiQueryCreate();
-
-  if (query)
-    {
-      cdiQuerySetNames(queryOut, query->numNames, query->names);
-    }
-
-  return queryOut;
-}
-
-void
-cdiQueryPrint(CdiQuery *query)
-{
-  if (query->numNames)
-    {
-      printf("Names:");
-      for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]);
-      printf("\n");
-    }
-}
-
 int
 main(int argc, char *argv[])
 {
diff --git a/src/Makefile.am b/src/Makefile.am
index 77e1c06cbbe4c46157ffebb9d482887d8b935d1a..eca0bb02a34ef28ecfd1d1f84d9b50688fc2d67e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -47,6 +47,7 @@ libcdi_la_SOURCES = 	 \
 	cdi_datetime.h   \
 	cdi_error.c      \
 	cdi_limits.h	 \
+	cdi_query.c	 \
 	cdi_util.c       \
 	cgribex.h	 \
 	cgribexlib.c  	 \
diff --git a/src/cdi.h b/src/cdi.h
index 7fffa8c241d6d6c48dd2ae31a617a04cc972e6a4..44f1b97ae8d6e0e867390aeac1824afd957a6429 100644
--- a/src/cdi.h
+++ b/src/cdi.h
@@ -1315,6 +1315,21 @@ void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDef
 extern "C" {
 #endif
 
+// CDI query interface
+
+typedef struct CdiQuery
+{
+  int numNames;
+  char **names;
+} CdiQuery;
+
+CdiQuery *cdiQueryCreate();
+void cdiQueryDelete(CdiQuery *query);
+void cdiQuerySetNames(CdiQuery *query, int numNames, char **names);
+void cdiQueryPrint(CdiQuery *query);
+
+// CDI interface for  paraview vtkCDIReader.cxx
+
 #include "cdi_datetime.h"
 
 void taxisDefRdatetime(int taxisID, CdiDateTime rdatetime);
@@ -1333,6 +1348,7 @@ int64_t julday_to_date(int calendar, int64_t julday);
 int time_to_sec(int time);                           // Used in paraview vtkCDIReader.cxx
 int sec_to_time(int secofday);
 
+// CDI projection parameter interface
 
 struct CDI_GridProjParams
 {
diff --git a/src/cdi_query.c b/src/cdi_query.c
new file mode 100644
index 0000000000000000000000000000000000000000..b97724e4971f977bda5b56aea94ee471b08786bd
--- /dev/null
+++ b/src/cdi_query.c
@@ -0,0 +1,63 @@
+#include <string.h>
+#include <stdlib.h>
+#include "cdi.h"
+
+void
+cdiQueryInit(CdiQuery *query)
+{
+  query->numNames = 0;
+  query->names = NULL;
+}
+
+CdiQuery *
+cdiQueryCreate()
+{
+  CdiQuery *query = (CdiQuery*) malloc(sizeof(CdiQuery));
+  cdiQueryInit(query);
+  return query;
+}
+
+void
+cdiQueryDelete(CdiQuery *query)
+{
+  if (query->numNames && query)
+    {
+      for (int i = 0; i < query->numNames; ++i) free(query->names[i]);
+      free(query);
+    }
+}
+
+void
+cdiQuerySetNames(CdiQuery *query, int numNames, char **names)
+{
+  if (numNames)
+    {
+      query->numNames = numNames;
+      query->names = (char**)malloc(numNames * sizeof(char*));
+      for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]);
+    }
+}
+
+CdiQuery *
+cdiQueryClone(CdiQuery *query)
+{
+  CdiQuery *queryOut = cdiQueryCreate();
+
+  if (query)
+    {
+      cdiQuerySetNames(queryOut, query->numNames, query->names);
+    }
+
+  return queryOut;
+}
+
+void
+cdiQueryPrint(CdiQuery *query)
+{
+  if (query->numNames)
+    {
+      printf("Names:");
+      for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]);
+      printf("\n");
+    }
+}
diff --git a/src/make_cdilib b/src/make_cdilib
index d39c11ebf11bff03ef4492739edeb4fa18792000..6e2920177d44056863301d3edb026f6ccb04dfee 100755
--- a/src/make_cdilib
+++ b/src/make_cdilib
@@ -109,6 +109,7 @@ files="async_worker.c \
    cdi_error.c \
    cdi_datetime.c \
    cdi_int.c \
+   cdi_query.c \
    cdi_util.c \
    cgribexlib.c \
    cksum.c \