diff --git a/ChangeLog b/ChangeLog
index 5595a022a8799ac48d9991311cff8a9b2083d067..e36044247c168cbb82b4e30f16d127d6dc07c625 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2024-04-15 Uwe Schulzweida
+
+	* gribapi: added support for sortname option
+
 2024-03-22 Uwe Schulzweida
 
 	* gribapi_get_timeunits: check unitsOfTime (bug fix) [report: Chris Barnard]
diff --git a/src/stream_gribapi.c b/src/stream_gribapi.c
index e13553a322ebf3ccc43595686cb71f62827c295b..d7b18f3fe9db1b6138570421dc6b85d0de421ba8 100644
--- a/src/stream_gribapi.c
+++ b/src/stream_gribapi.c
@@ -1212,6 +1212,21 @@ fdbScanTimesteps(stream_t *streamptr)
   return 0;
 }
 
+static int
+records_cmp_varname(const void *s1, const void *s2)
+{
+  const record_t *x = (const record_t *) s1, *y = (const record_t *) s2;
+  return strcmp(x->varname, y->varname);
+}
+
+void
+sort_records(stream_t *streamptr)
+{
+  record_t *records = streamptr->tsteps[0].records;
+  int numRecords = streamptr->tsteps[0].recordSize;
+  qsort(records, numRecords, sizeof(records[0]), records_cmp_varname);
+}
+
 int
 gribapiScanTimestep1(stream_t *streamptr)
 {
@@ -1360,6 +1375,8 @@ gribapiScanTimestep1(stream_t *streamptr)
   streamScanTsFixNtsteps(streamptr, recpos);
   streamScanTimeConstAdjust(streamptr, taxis);
 
+  if (streamptr->sortname) sort_records(streamptr);
+
   return 0;
 }
 
diff --git a/src/varscan.c b/src/varscan.c
index 1facb46d32e545b644d10a44778784fb58fcdad5..04c9320f7ab7128389a2b5ec9b4fabef86ef80af 100644
--- a/src/varscan.c
+++ b/src/varscan.c
@@ -481,13 +481,13 @@ varCopyKeys(int vlistID, int varID)
   cdiInitKeys(&vlistptr->vars[varID].keys);
   cdiCopyVarKeys(&vartable[varID].keys, &vlistptr->vars[varID].keys);
 }
-
+/*
 struct cdi_generate_varinfo
 {
   int varid;
   const char *name;
 };
-/*
+
 static int
 cdi_generate_cmp_varname(const void *s1, const void *s2)
 {
@@ -505,11 +505,11 @@ cdi_generate_vars(stream_t *streamptr)
   /*
     if (streamptr->sortname)
       {
-        int varID;
-        for (varID = 0; varID < varTableUsed; varID++)
-          if (!vartable[varID].name) break;
+        bool hasName = true;
+        for (int varID = 0; varID < varTableUsed; varID++)
+          if (!vartable[varID].name) hasName = false;
 
-        if (varID == varTableUsed)
+        if (hasName)
           {
             struct cdi_generate_varinfo *varInfo
                 = (struct cdi_generate_varinfo *) Malloc((size_t) varTableUsed * sizeof(struct cdi_generate_varinfo));