diff --git a/src/Showinfo.cc b/src/Showinfo.cc
index 1d866774b635057541be743a383d7bd7f23b7622..cd5f164ed4f967dcb8b88c15bfa981f450adc018 100644
--- a/src/Showinfo.cc
+++ b/src/Showinfo.cc
@@ -38,248 +38,389 @@
 #include "printinfo.h"
 #include "cdo_zaxis.h"
 
-void *
-Showinfo(void *process)
+static void
+show_year(CdoStreamID streamID)
 {
-  int64_t date0 = 0;
-  int year, month, day;
-  int month0 = 0, year0 = 0;
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto taxisID = vlistInqTaxis(vlistID);
+  const auto ntsteps = vlistNtsteps(vlistID);
+  if (ntsteps == 0) return;
 
-  cdo_initialize(process);
+  constexpr int maxOut = 20;
+  int nout = 0;
+  int year0 = 0;
 
-  // clang-format off
-  const auto SHOWYEAR      = cdo_operator_add("showyear",      0, 0, nullptr);
-  const auto SHOWMON       = cdo_operator_add("showmon",       0, 0, nullptr);
-  const auto SHOWDATE      = cdo_operator_add("showdate",      0, 0, nullptr);
-  const auto SHOWTIME      = cdo_operator_add("showtime",      0, 0, nullptr);
-  const auto SHOWTIMESTAMP = cdo_operator_add("showtimestamp", 0, 0, nullptr);
-  const auto SHOWCODE      = cdo_operator_add("showcode",      0, 0, nullptr);
-  const auto SHOWUNIT      = cdo_operator_add("showunit",      0, 0, nullptr);
-  const auto SHOWPARAM     = cdo_operator_add("showparam",     0, 0, nullptr);
-  const auto SHOWNAME      = cdo_operator_add("showname",      0, 0, nullptr);
-  const auto SHOWSTDNAME   = cdo_operator_add("showstdname",   0, 0, nullptr);
-  const auto SHOWLEVEL     = cdo_operator_add("showlevel",     0, 0, nullptr);
-  const auto SHOWLTYPE     = cdo_operator_add("showltype",     0, 0, nullptr);
-  const auto SHOWFORMAT    = cdo_operator_add("showformat",    0, 0, nullptr);
-  const auto SHOWGRID      = cdo_operator_add("showgrid",      0, 0, nullptr); 
-  const auto SHOWATTS      = cdo_operator_add("showatts",      0, 0, nullptr);
-  const auto SHOWATTSGLOB  = cdo_operator_add("showattsglob",  0, 0, nullptr);
-  // clang-format on
+  int tsID = 0;
+  while (true)
+    {
+      const auto nrecs = cdo_stream_inq_timestep(streamID, tsID);
+      if (nrecs == 0) break;
 
-  const auto operatorID = cdo_operator_id();
+      const auto vdate = taxisInqVdate(taxisID);
+      int year, month, day;
+      cdiDecodeDate(vdate, &year, &month, &day);
 
-  operator_check_argc(0);
+      if (tsID == 0 || year0 != year)
+        {
+          nout++;
+          year0 = year;
+          fprintf(stdout, " %4d", year0);
+          if ((nout % maxOut) == 0) fprintf(stdout, "\n");
+        }
 
-  const auto streamID = cdo_open_read(0);
+      tsID++;
+    }
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_mon(CdoStreamID streamID)
+{
   const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto taxisID = vlistInqTaxis(vlistID);
+  const auto ntsteps = vlistNtsteps(vlistID);
+  if (ntsteps == 0) return;
 
-  const auto nvars = vlistNvars(vlistID);
+  constexpr int maxOut = 36;
+  int nout = 0;
+  int month0 = 0;
+
+  int tsID = 0;
+  while (true)
+    {
+      const auto nrecs = cdo_stream_inq_timestep(streamID, tsID);
+      if (nrecs == 0) break;
+
+      const auto vdate = taxisInqVdate(taxisID);
+      int year, month, day;
+      cdiDecodeDate(vdate, &year, &month, &day);
+
+      if (tsID == 0 || month0 != month)
+        {
+          nout++;
+          month0 = month;
+          fprintf(stdout, " %2d", month0);
+          if ((nout % maxOut) == 0) fprintf(stdout, "\n");
+        }
+
+      tsID++;
+    }
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_date(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
   const auto taxisID = vlistInqTaxis(vlistID);
   const auto ntsteps = vlistNtsteps(vlistID);
+  if (ntsteps == 0) return;
+
+  constexpr int maxOut = 12;
+  int nout = 0;
+  int64_t date0 = 0;
 
-  if (operatorID == SHOWYEAR)
+  int tsID = 0;
+  while (true)
     {
-      int tsID = 0;
-      if (ntsteps != 0)
-        while (cdo_stream_inq_timestep(streamID, tsID))
-          {
-            const auto vdate = taxisInqVdate(taxisID);
-            cdiDecodeDate(vdate, &year, &month, &day);
-
-            if (tsID == 0 || year0 != year)
-              {
-                year0 = year;
-                fprintf(stdout, " %4d", year0);
-              }
-
-            tsID++;
-          }
-      fprintf(stdout, "\n");
+      const auto nrecs = cdo_stream_inq_timestep(streamID, tsID);
+      if (nrecs == 0) break;
+
+      const auto vdate = taxisInqVdate(taxisID);
+
+      if (tsID == 0 || date0 != vdate)
+        {
+          nout++;
+          date0 = vdate;
+          fprintf(stdout, " %s", date_to_string(vdate).c_str());
+          if ((nout % maxOut) == 0) fprintf(stdout, "\n");
+        }
+
+      tsID++;
     }
-  else if (operatorID == SHOWMON)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_time(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto taxisID = vlistInqTaxis(vlistID);
+  const auto ntsteps = vlistNtsteps(vlistID);
+  if (ntsteps == 0) return;
+
+  constexpr int maxOut = 12;
+  int nout = 0;
+
+  int tsID = 0;
+  while (true)
     {
-      int tsID = 0;
-      if (ntsteps != 0)
-        while (cdo_stream_inq_timestep(streamID, tsID))
-          {
-            const auto vdate = taxisInqVdate(taxisID);
-            cdiDecodeDate(vdate, &year, &month, &day);
-
-            if (tsID == 0 || month0 != month)
-              {
-                month0 = month;
-                fprintf(stdout, " %2d", month0);
-              }
-
-            tsID++;
-          }
-      fprintf(stdout, "\n");
+      const auto nrecs = cdo_stream_inq_timestep(streamID, tsID);
+      if (nrecs == 0) break;
+
+      const auto vtime = taxisInqVtime(taxisID);
+      nout++;
+      fprintf(stdout, " %s", time_to_string(vtime).c_str());
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
+
+      tsID++;
     }
-  else if (operatorID == SHOWDATE)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_timestamp(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto taxisID = vlistInqTaxis(vlistID);
+  const auto ntsteps = vlistNtsteps(vlistID);
+  if (ntsteps == 0) return;
+
+  constexpr int maxOut = 4;
+  int nout = 0;
+
+  int tsID = 0;
+  while (true)
     {
-      int tsID = 0;
-      if (ntsteps != 0)
-        while (cdo_stream_inq_timestep(streamID, tsID))
-          {
-            const auto vdate = taxisInqVdate(taxisID);
-            if (tsID == 0 || date0 != vdate)
-              {
-                date0 = vdate;
-                fprintf(stdout, " %s", date_to_string(vdate).c_str());
-              }
-
-            tsID++;
-          }
-      fprintf(stdout, "\n");
+      const auto nrecs = cdo_stream_inq_timestep(streamID, tsID);
+      if (nrecs == 0) break;
+
+      const auto vdate = taxisInqVdate(taxisID);
+      const auto vtime = taxisInqVtime(taxisID);
+      nout++;
+      fprintf(stdout, " %s", datetime_to_string(vdate, vtime).c_str());
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
+
+      tsID++;
     }
-  else if (operatorID == SHOWTIME)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_code(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  constexpr int maxOut = 25;
+  int nout = 0;
+
+  for (int varID = 0; varID < nvars; varID++)
     {
-      int tsID = 0;
-      if (ntsteps != 0)
-        while (cdo_stream_inq_timestep(streamID, tsID))
-          {
-            const auto vtime = taxisInqVtime(taxisID);
-            fprintf(stdout, " %s", time_to_string(vtime).c_str());
-
-            tsID++;
-          }
-      fprintf(stdout, "\n");
+      nout++;
+      fprintf(stdout, " %d", vlistInqVarCode(vlistID, varID));
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWTIMESTAMP)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_grid(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  fprintf(stdout, "# param nr | grid nr | z-axis nr:   /* Use in combination with operatores: griddes and zaxisdes */\n");
+  for (int varID = 0; varID < nvars; varID++)
     {
-      int tsID = 0;
-      if (ntsteps != 0)
-        while (cdo_stream_inq_timestep(streamID, tsID))
-          {
-            const auto vdate = taxisInqVdate(taxisID);
-            const auto vtime = taxisInqVtime(taxisID);
-            fprintf(stdout, " %s", datetime_to_string(vdate, vtime).c_str());
-
-            tsID++;
-          }
-      fprintf(stdout, "\n");
+      const auto gridID = vlistInqVarGrid(vlistID, varID);
+      const auto zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+      fprintf(stdout, "      %3d     %3d      %3d\n", vlistInqVarCode(vlistID, varID), vlistGridIndex(vlistID, gridID) + 1,
+              vlistZaxisIndex(vlistID, zaxisID) + 1);
     }
-  else if (operatorID == SHOWCODE)
+}
+
+static void
+show_unit(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  constexpr int maxOut = 10;
+  int nout = 0;
+
+  char varunits[CDI_MAX_NAME];
+  for (int varID = 0; varID < nvars; varID++)
     {
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          fprintf(stdout, " %d", vlistInqVarCode(vlistID, varID));
-        }
-      fprintf(stdout, "\n");
+      nout++;
+      varunits[0] = 0;
+      vlistInqVarUnits(vlistID, varID, varunits);
+      if (strlen(varunits)) fprintf(stdout, " %s", varunits);
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWGRID)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_param(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  constexpr int maxOut = 10;
+  int nout = 0;
+
+  char paramstr[32];
+  for (int varID = 0; varID < nvars; varID++)
     {
-      fprintf(stdout, "# param nr | grid nr | z-axis nr:   /* Use in combination with operatores: griddes and zaxisdes */\n");
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          const auto gridID = vlistInqVarGrid(vlistID, varID);
-          const auto zaxisID = vlistInqVarZaxis(vlistID, varID);
+      nout++;
+      const auto param = vlistInqVarParam(vlistID, varID);
+      cdiParamToString(param, paramstr, sizeof(paramstr));
 
-          fprintf(stdout, "      %3d     %3d      %3d\n", vlistInqVarCode(vlistID, varID), vlistGridIndex(vlistID, gridID) + 1,
-                  vlistZaxisIndex(vlistID, zaxisID) + 1);
-        }
+      fprintf(stdout, " %s", paramstr);
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWUNIT)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_name(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  constexpr int maxOut = 10;
+  int nout = 0;
+
+  char varname[CDI_MAX_NAME];
+  for (int varID = 0; varID < nvars; varID++)
     {
-      char varunits[CDI_MAX_NAME];
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          varunits[0] = 0;
-          vlistInqVarUnits(vlistID, varID, varunits);
-          if (strlen(varunits)) fprintf(stdout, " %s", varunits);
-        }
-      fprintf(stdout, "\n");
+      nout++;
+      vlistInqVarName(vlistID, varID, varname);
+      fprintf(stdout, " %s", varname);
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWPARAM)
-    {
-      char paramstr[32];
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          const auto param = vlistInqVarParam(vlistID, varID);
-          cdiParamToString(param, paramstr, sizeof(paramstr));
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
 
-          fprintf(stdout, " %s", paramstr);
-        }
-      fprintf(stdout, "\n");
-    }
-  else if (operatorID == SHOWNAME)
+static void
+show_stdname(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  constexpr int maxOut = 1;
+  int nout = 0;
+
+  char stdname[CDI_MAX_NAME];
+  for (int varID = 0; varID < nvars; varID++)
     {
-      char varname[CDI_MAX_NAME];
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          vlistInqVarName(vlistID, varID, varname);
-          fprintf(stdout, " %s", varname);
-        }
-      fprintf(stdout, "\n");
+      nout++;
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length);
+      fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown");
+      if ((nout % maxOut) == 0) fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWSTDNAME)
+  if ((nout % maxOut) != 0) fprintf(stdout, "\n");
+}
+
+static void
+show_level(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+  const auto nvars = vlistNvars(vlistID);
+
+  for (int varID = 0; varID < nvars; varID++)
     {
-      char stdname[CDI_MAX_NAME];
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          int length = CDI_MAX_NAME;
-          cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length);
-          fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown");
-        }
+      const auto zaxisID = vlistInqVarZaxis(vlistID, varID);
+      const auto nlevs = zaxisInqSize(zaxisID);
+      for (int levelID = 0; levelID < nlevs; levelID++) fprintf(stdout, " %.9g", cdo_zaxis_inq_level(zaxisID, levelID));
       fprintf(stdout, "\n");
     }
-  else if (operatorID == SHOWLEVEL)
+}
+
+static void
+show_ltype(CdoStreamID streamID)
+{
+  const auto vlistID = cdo_stream_inq_vlist(streamID);
+
+  const auto nzaxis = vlistNzaxis(vlistID);
+  for (int index = 0; index < nzaxis; index++)
     {
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          const auto zaxisID = vlistInqVarZaxis(vlistID, varID);
-          const auto nlevs = zaxisInqSize(zaxisID);
-          for (int levelID = 0; levelID < nlevs; levelID++) fprintf(stdout, " %.9g", cdo_zaxis_inq_level(zaxisID, levelID));
-          fprintf(stdout, "\n");
-        }
+      const auto zaxisID = vlistZaxis(vlistID, index);
+      const auto ltype = zaxis_to_ltype(zaxisID);
+
+      if (ltype != -1) fprintf(stdout, " %d", ltype);
     }
-  else if (operatorID == SHOWLTYPE)
+  fprintf(stdout, "\n");
+}
+
+static void
+show_atts(int vlistID)
+{
+  const auto nvars = vlistNvars(vlistID);
+
+  char varname[CDI_MAX_NAME];
+  for (int varID = 0; varID < nvars; varID++)
     {
-      const auto nzaxis = vlistNzaxis(vlistID);
-      for (int index = 0; index < nzaxis; index++)
-        {
-          const auto zaxisID = vlistZaxis(vlistID, index);
-          const auto ltype = zaxis_to_ltype(zaxisID);
+      vlistInqVarName(vlistID, varID, varname);
+      fprintf(stdout, "%s:\n", varname);
 
-          if (ltype != -1) fprintf(stdout, " %d", ltype);
-        }
-      fprintf(stdout, "\n");
+      int nattsvar;
+      cdiInqNatts(vlistID, varID, &nattsvar);
+      print_atts(vlistID, varID, nattsvar, nullptr);
     }
+}
+
+void *
+Showinfo(void *process)
+{
+  cdo_initialize(process);
+
+  // clang-format off
+  const auto SHOWYEAR      = cdo_operator_add("showyear",      0, 0, nullptr);
+  const auto SHOWMON       = cdo_operator_add("showmon",       0, 0, nullptr);
+  const auto SHOWDATE      = cdo_operator_add("showdate",      0, 0, nullptr);
+  const auto SHOWTIME      = cdo_operator_add("showtime",      0, 0, nullptr);
+  const auto SHOWTIMESTAMP = cdo_operator_add("showtimestamp", 0, 0, nullptr);
+  const auto SHOWCODE      = cdo_operator_add("showcode",      0, 0, nullptr);
+  const auto SHOWUNIT      = cdo_operator_add("showunit",      0, 0, nullptr);
+  const auto SHOWPARAM     = cdo_operator_add("showparam",     0, 0, nullptr);
+  const auto SHOWNAME      = cdo_operator_add("showname",      0, 0, nullptr);
+  const auto SHOWSTDNAME   = cdo_operator_add("showstdname",   0, 0, nullptr);
+  const auto SHOWLEVEL     = cdo_operator_add("showlevel",     0, 0, nullptr);
+  const auto SHOWLTYPE     = cdo_operator_add("showltype",     0, 0, nullptr);
+  const auto SHOWFORMAT    = cdo_operator_add("showformat",    0, 0, nullptr);
+  const auto SHOWGRID      = cdo_operator_add("showgrid",      0, 0, nullptr); 
+  const auto SHOWATTS      = cdo_operator_add("showatts",      0, 0, nullptr);
+  const auto SHOWATTSGLOB  = cdo_operator_add("showattsglob",  0, 0, nullptr);
+
+  const auto operatorID = cdo_operator_id();
+
+  operator_check_argc(0);
+
+  const auto streamID = cdo_open_read(0);
+
+  if      (operatorID == SHOWYEAR)      show_year(streamID);
+  else if (operatorID == SHOWMON)       show_mon(streamID);
+  else if (operatorID == SHOWDATE)      show_date(streamID);
+  else if (operatorID == SHOWTIME)      show_time(streamID);
+  else if (operatorID == SHOWTIMESTAMP) show_timestamp(streamID);
+  else if (operatorID == SHOWCODE)      show_code(streamID);
+  else if (operatorID == SHOWGRID)      show_grid(streamID);
+  else if (operatorID == SHOWUNIT)      show_unit(streamID);
+  else if (operatorID == SHOWPARAM)     show_param(streamID);
+  else if (operatorID == SHOWNAME)      show_name(streamID);
+  else if (operatorID == SHOWSTDNAME)   show_stdname(streamID);
+  else if (operatorID == SHOWLEVEL)     show_level(streamID);
+  else if (operatorID == SHOWLTYPE)     show_ltype(streamID);
   else if (operatorID == SHOWFORMAT)
     {
+      const auto vlistID = cdo_stream_inq_vlist(streamID);
       print_filetype(streamID, vlistID);
     }
-  else if (operatorID == SHOWSTDNAME)
-    {
-      char stdname[CDI_MAX_NAME];
-      for (int varID = 0; varID < nvars; varID++)
-        {
-          int length = CDI_MAX_NAME;
-          cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length);
-          fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown");
-        }
-      fprintf(stdout, "\n");
-    }
   else if (operatorID == SHOWATTS || operatorID == SHOWATTSGLOB)
     {
-      if (operatorID == SHOWATTS)
-        {
-          for (int varID = 0; varID < nvars; varID++)
-            {
-              char varname[CDI_MAX_NAME];
-              vlistInqVarName(vlistID, varID, varname);
-              fprintf(stdout, "%s:\n", varname);
-
-              int nattsvar;
-              cdiInqNatts(vlistID, varID, &nattsvar);
-              print_atts(vlistID, varID, nattsvar, nullptr);
-            }
-        }
+      const auto vlistID = cdo_stream_inq_vlist(streamID);
+      if (operatorID == SHOWATTS) show_atts(vlistID);
+
       fprintf(stdout, "Global:\n");
       int natts;
       cdiInqNatts(vlistID, CDI_GLOBAL, &natts);
       print_atts(vlistID, CDI_GLOBAL, natts, nullptr);
     }
+  // clang-format on
 
   cdo_stream_close(streamID);