[nco] 01/04: Imported Upstream version 4.6.5

Bas Couwenberg sebastic at debian.org
Thu Mar 16 06:53:59 UTC 2017


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository nco.

commit 6e08b94eda0f0b7cd7ec775446c64f636f1695b8
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Thu Mar 16 07:29:20 2017 +0100

    Imported Upstream version 4.6.5
---
 CMakeLists.txt           |  31 ++-
 bld/nco.spec             |  11 +-
 bld/nco_dst.pl           |  30 +--
 bm/NCO_rgr.pm            |   5 +-
 configure                |  20 +-
 configure.ac             |   2 +-
 configure.eg             |   6 +-
 data/bsc_tst.nco         |   9 +
 data/in.cdl              |  15 +-
 data/ncclimo             |  45 +++-
 data/ncremap             | 198 ++++++++++-----
 data/stdin.sh            |  45 ++++
 data/stdin_tst.sh        |  15 ++
 data/tst-udunits.nco     |  26 +-
 data/vpointer-ex3.nco    |  16 ++
 debian/changelog         |   6 +
 doc/ANNOUNCE             | 154 +++++++-----
 doc/ChangeLog            | 125 ++++++++++
 doc/TODO                 |   2 +-
 doc/VERSION              |   2 +-
 doc/debian.txt           | 162 ++++++-------
 doc/index.shtml          |  91 +++----
 doc/nco.texi             | 243 +++++++++++++++----
 man/ncbo.1               |   1 +
 man/ncclimo.1            |   8 +-
 man/ncecat.1             |   1 +
 man/nces.1               |   1 +
 man/ncflint.1            |   1 +
 man/ncks.1               |   2 +-
 man/ncpdq.1              |   1 +
 man/ncra.1               |   1 +
 man/ncrcat.1             |   1 +
 man/ncremap.1            |   3 +-
 man/ncwa.1               |   1 +
 src/nco++/fmc_all_cls.cc | 372 ++++++++++++++++++++++++-----
 src/nco++/fmc_all_cls.hh |   7 +-
 src/nco++/ncap2.cc       |  37 ++-
 src/nco++/ncap2_att.cc   |  76 +++++-
 src/nco++/ncap2_att.hh   |  12 +
 src/nco++/ncap2_utl.cc   |  63 ++---
 src/nco++/ncoGrammer.g   | 153 ++++++++----
 src/nco++/ncoTree.cpp    | 450 +++++++++++++++++++---------------
 src/nco/mpncbo.c         |  13 +-
 src/nco/mpncecat.c       |  13 +-
 src/nco/mpncflint.c      |  13 +-
 src/nco/mpncpdq.c        |  10 +-
 src/nco/mpncra.c         |  13 +-
 src/nco/mpncwa.c         |  13 +-
 src/nco/ncap.c           |  11 +-
 src/nco/ncatted.c        |  13 +-
 src/nco/ncbo.c           |  33 ++-
 src/nco/ncecat.c         |  33 ++-
 src/nco/ncflint.c        |  33 ++-
 src/nco/ncks.c           |  60 +++--
 src/nco/nco.h            |   5 +-
 src/nco/nco_att_utl.c    |   6 +-
 src/nco/nco_cln_utl.c    | 367 +++++++++++++++++++++++++---
 src/nco/nco_cln_utl.h    |  80 +++++--
 src/nco/nco_cnk.c        |  30 +++
 src/nco/nco_cnk.h        |   4 +
 src/nco/nco_ctl.c        |  26 +-
 src/nco/nco_fl_utl.c     |  15 +-
 src/nco/nco_lst_utl.c    |   2 +-
 src/nco/nco_msa.c        |  18 +-
 src/nco/nco_mss_val.c    |  16 +-
 src/nco/nco_mss_val.h    |   4 +-
 src/nco/nco_netcdf.c     |   2 +-
 src/nco/nco_ppc.c        |   5 +-
 src/nco/nco_prn.c        | 610 +++++++++++++++++++++++++++++------------------
 src/nco/nco_prn.h        |   5 +
 src/nco/nco_rgr.c        | 224 ++++++++---------
 src/nco/nco_sld.c        |   6 +-
 src/nco/nco_sng_utl.c    |   5 +-
 src/nco/nco_sng_utl.h    |   1 +
 src/nco/ncpdq.c          |  37 ++-
 src/nco/ncra.c           |  33 ++-
 src/nco/ncrename.c       |  13 +-
 src/nco/ncwa.c           |  33 ++-
 78 files changed, 2932 insertions(+), 1323 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c2abe08..e48c446 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,7 @@
 #CMake build, Pedro Vicente 
 #options
+#FIND_SZIP try to locate SZIP library (default ON)
+#library dependencies
 #NETCDF_INCLUDE
 #NETCDF_LIBRARY
 #HDF5_LIBRARY
@@ -57,12 +59,17 @@ else()
   message("-- Found zlib library at: " ${ZLIB_LIBRARY})
 endif()
 
+option(FIND_SZIP "Try to link with SZIP libarry" ON)
+
+if (FIND_SZIP)
+message("-- Trying to find SZIP library...")
 find_library(SZIP_LIBRARY NAMES sz)
 if(NOT SZIP_LIBRARY)
   message(FATAL_ERROR "szip library not found")
 else()
   message("-- Found szip library at: " ${SZIP_LIBRARY})
 endif()
+endif(FIND_SZIP)
 
 find_library(CURL_LIBRARY NAMES curl)
 if(NOT CURL_LIBRARY)
@@ -72,16 +79,20 @@ else()
 endif()
 
 if (MSVC)
-  add_definitions( "/D_CRT_SECURE_NO_WARNINGS" )
-  if (STATIC_CRT)
-    message("-- Building with static runtime library")
-	  set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
-    set(CMAKE_CXX_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG")
-    set(CMAKE_CXX_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG")
-    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")
-  endif()  
+  add_definitions( "/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE" )
+  message("-- Building with static runtime library")
+  set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_CXX_FLAGS_MINSIZEREL     "/MT /O1 /Ob1 /D NDEBUG")
+  set(CMAKE_CXX_FLAGS_RELEASE        "/MT /O2 /Ob2 /D NDEBUG")
+  set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MT /Zi /O2 /Ob1 /D NDEBUG")
+  #Compile as C++ Code (/TP)
+  set(CMAKE_C_FLAGS_DEBUG "/TP /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_C_FLAGS_MINSIZEREL     "/TP /MT /O1 /Ob1 /D NDEBUG")
+  set(CMAKE_C_FLAGS_RELEASE        "/TP /MT /O2 /Ob2 /D NDEBUG")
+  set(CMAKE_C_FLAGS_RELWITHDEBINFO "/TP /MT /Zi /O2 /Ob1 /D NDEBUG")
   set(WINSOCK_LIBRARY ws2_32.lib winmm.lib wldap32.lib)
-endif(MSVC)
+
+else (MSVC)  
 
 if (CMAKE_VERSION VERSION_LESS "3.1")
   if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
@@ -91,6 +102,8 @@ else ()
   set (CMAKE_C_STANDARD 99)
 endif ()
 
+endif(MSVC)
+
 include_directories(${NETCDF_INCLUDE_FOUND})
 
 set(LIB_DEP ${LIB_DEP} ${NETCDF_LIBRARY} ${HDF5_HL_LIBRARY} ${HDF5_LIBRARY})
diff --git a/bld/nco.spec b/bld/nco.spec
index 68e5b23..3b816c2 100644
--- a/bld/nco.spec
+++ b/bld/nco.spec
@@ -2,17 +2,17 @@
 # http://cvs.fedoraproject.org/viewvc/devel/nco/nco.spec?view=co
 
 Name:           nco
-Version:        4.6.4
+Version:        4.6.5
 Release:        1%{?dist}
 Summary:        Programs that manipulate netCDF files
 Group:          Applications/Engineering
 License:        GPL3
 URL:            http://nco.sf.net/
 
-# Obtain NCO version 4.6.4-1 tar.gz from Sourceforge using CVS:
+# Obtain NCO version 4.6.5-1 tar.gz from Sourceforge using CVS:
 # cvs -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco login
-# cvs -z3 -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco co -r nco-4.6.4-1 -d nco-%{version} nco
-# tar czf nco-%{version}.tar.gz --exclude='nco-4.6.4/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude='ncap_yacc.[ch]' ./nco-%{version}
+# cvs -z3 -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco co -r nco-4.6.5-1 -d nco-%{version} nco
+# tar czf nco-%{version}.tar.gz --exclude='nco-4.6.5/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude='ncap_yacc.[ch]' ./nco-%{version}
 Source0:        nco-%{version}.tar.gz
 #Patch0:		nco_install_C_headers.patch
 #Patch1:         nco_find_udunits-dat.patch
@@ -108,6 +108,9 @@ fi
 # %{_libdir}/libnco++.so
 
 %changelog
+* Wed Mar 15 2017 Charlie Zender <zender at uci.edu> - 4.6.5-1
+- new upstream 4.6.5
+
 * Tue Feb 07 2017 Charlie Zender <zender at uci.edu> - 4.6.4-1
 - new upstream 4.6.4
 
diff --git a/bld/nco_dst.pl b/bld/nco_dst.pl
index 8aa6549..c7b4943 100755
--- a/bld/nco_dst.pl
+++ b/bld/nco_dst.pl
@@ -5,20 +5,20 @@
 
 # Usage:
 # Export tagged, public versions
-# /usr/bin/scp ${DATA}/nco-4.6.4.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
-
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.6.4 # Build, do not release on SF
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --sf nco-4.6.4 # Build, release on SF
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --nst_all nco-4.6.4 # Install, do not build
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --nst_all nco-4.6.4 # Build and install
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_cnt nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_prs nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cgd_cnt nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cray_prs nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --bbl_cnt nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --blk_cnt nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --dat_cnt nco-4.6.4
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --ute_prs nco-4.6.4
+# /usr/bin/scp ${DATA}/nco-4.6.5.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.6.5 # Build, do not release on SF
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --sf nco-4.6.5 # Build, release on SF
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --nst_all nco-4.6.5 # Install, do not build
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --nst_all nco-4.6.5 # Build and install
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_cnt nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_prs nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cgd_cnt nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cray_prs nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --bbl_cnt nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --blk_cnt nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --dat_cnt nco-4.6.5
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --ute_prs nco-4.6.5
 
 # Export daily snapshot
 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 
@@ -256,7 +256,7 @@ if($bld){
 # Set up FTP server
     chdir $dst_pth_pfx or die "$prg_nm: ERROR unable to chdir to $dst_pth_pfx: $!\n"; # $! is system error string
     cmd_prc("$cp_cmd $doc_fl ./$dst_vrs/doc"); # Copy derived documentation to source directory
-    cmd_prc("$tar_cmd cvzf $dst_fl --exclude='nco-4.6.4/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude=ncap_yacc.[ch] ./$dst_vrs"); # Create gzipped tarfile
+    cmd_prc("$tar_cmd cvzf $dst_fl --exclude='nco-4.6.5/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude=ncap_yacc.[ch] ./$dst_vrs"); # Create gzipped tarfile
     cmd_prc("$rsh_cmd $www_mch $rm_cmd $www_drc/src/$dst_fl"); # Remove any distribution with same name
     if($dly_snp){cmd_prc("$rsh_cmd $www_mch $rm_cmd -r $www_drc/src/nco-????????.tar.gz");} # Remove previous daily snapshots from WWW server
     cmd_prc("$rcp_cmd $dst_fl $www_mch:$www_drc/src"); # Copy local tarfile to WWW server
diff --git a/bm/NCO_rgr.pm b/bm/NCO_rgr.pm
index e33cffd..affcfbf 100644
--- a/bm/NCO_rgr.pm
+++ b/bm/NCO_rgr.pm
@@ -758,8 +758,10 @@ if($USER eq 'zender'){
     NCO_bm::tst_run(\@tst_cmd);
     $#tst_cmd=0; # Reset array
 	
-
 # ncbo #14
+# ncks -O -v three_dmn_rec_var ~/nco/data/in.nc ~/foo.nc
+# ncbo -O -v three_dmn_rec_var ~/foo.nc ~/foo.nc ~/foo2.nc
+# ncks -C -H -v three_dmn_rec_var -d time,9,9,1 -d lat,1,1,1 -d lon,3,3,1 ~/foo2.nc
     $dsc_sng="Copy associated coordinates -v three_dmn_rec_var";
     $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg -v three_dmn_rec_var $in_pth_arg in.nc %tmp_fl_00%";
     $tst_cmd[1]="ncbo $omp_flg -O $fl_fmt $nco_D_flg -v three_dmn_rec_var %tmp_fl_00% %tmp_fl_00% %tmp_fl_01%";
@@ -768,7 +770,6 @@ if($USER eq 'zender'){
     $tst_cmd[4]="SS_OK";
     NCO_bm::tst_run(\@tst_cmd);
     $#tst_cmd=0; # Reset array     
-    
 
 #ncbo #15
 #Operate on files containing same variable in different orders
diff --git a/configure b/configure
index 0ba5802..60f9604 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for NCO netCDF Operators 4.6.4.
+# Generated by GNU Autoconf 2.69 for NCO netCDF Operators 4.6.5.
 #
 # Report bugs to <nco-bugs at lists.sourceforge.net>.
 #
@@ -592,8 +592,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='NCO netCDF Operators'
 PACKAGE_TARNAME='nco'
-PACKAGE_VERSION='4.6.4'
-PACKAGE_STRING='NCO netCDF Operators 4.6.4'
+PACKAGE_VERSION='4.6.5'
+PACKAGE_STRING='NCO netCDF Operators 4.6.5'
 PACKAGE_BUGREPORT='nco-bugs at lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1394,7 +1394,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures NCO netCDF Operators 4.6.4 to adapt to many kinds of systems.
+\`configure' configures NCO netCDF Operators 4.6.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1465,7 +1465,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of NCO netCDF Operators 4.6.4:";;
+     short | recursive ) echo "Configuration of NCO netCDF Operators 4.6.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1633,7 +1633,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-NCO netCDF Operators configure 4.6.4
+NCO netCDF Operators configure 4.6.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2499,7 +2499,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by NCO netCDF Operators $as_me 4.6.4, which was
+It was created by NCO netCDF Operators $as_me 4.6.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3750,7 +3750,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='nco'
- VERSION='4.6.4'
+ VERSION='4.6.5'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -21495,7 +21495,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by NCO netCDF Operators $as_me 4.6.4, which was
+This file was extended by NCO netCDF Operators $as_me 4.6.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -21561,7 +21561,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-NCO netCDF Operators config.status 4.6.4
+NCO netCDF Operators config.status 4.6.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 47a747d..e932d60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,7 +51,7 @@
 
 # Process configure input with autoconf to produce configure script
 # (package name,version,bug-report-address,tarball name)
-AC_INIT([NCO netCDF Operators],[4.6.4],[nco-bugs at lists.sourceforge.net],[nco])
+AC_INIT([NCO netCDF Operators],[4.6.5],[nco-bugs at lists.sourceforge.net],[nco])
 
 # Print GNU copyright in configure script
 AC_COPYRIGHT
diff --git a/configure.eg b/configure.eg
index 42e1007..dda6642 100644
--- a/configure.eg
+++ b/configure.eg
@@ -293,6 +293,7 @@ make install >> nco.make.${GNU_TRP}.foo 2>&1
 scp nco.configure.${GNU_TRP}.foo nco.config.log.${GNU_TRP}.foo nco.libtool.${GNU_TRP}.foo nco.make.${GNU_TRP}.foo dust.ess.uci.edu:/var/www/html/nco/rgr
 
 # gcc/g++ Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on cori:
+# Latest sysadmin-compiled module usage: module load nco/4.6.4 # 20170210 (without ncap2)
 # Used 20151204-
 module load szip
 module load gsl
@@ -310,6 +311,7 @@ scp nco.configure.${GNU_TRP}.foo nco.config.log.${GNU_TRP}.foo nco.libtool.${GNU
 
 # acme: http://www.gnu.org/software/automake/manual/automake.html search for "shared by two hosts" use 
 # gcc/g++ Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on edison:
+# Latest sysadmin-compiled module usage: module load nco/4.6.4 # 20170210 (with ncap2)
 # Used 20150825-
 module load szip
 module load gsl
@@ -405,7 +407,8 @@ git reset --hard origin/master
 cd ~/nco/bld;make NETCDF_ROOT='/glade/apps/opt/netcdf/4.3.0/intel/default' UDUNITS_INC='/glade/apps/opt/udunits/2.1.24/intel/12.1.4/include' UDUNITS_LIB='/glade/apps/opt/udunits/2.1.24/intel/12.1.4/lib' OPTS=D allinone;cd -
 
 # gcc/g++ 20160107 Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on rhea:
-# val anantharaj packages these and makes them available with "module load nco/4.6.1"
+# Latest sysadmin-compiled module usage: module load nco/4.6.4 # 20170215
+# Recipe last used successfully: 20170308
 export LINUX_CC='gcc -std=c99 -pedantic -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_SOURCE'
 export LINUX_CXX='g++ -std=c++11'
 export LINUX_FC='gfortran'
@@ -417,7 +420,6 @@ export NETCDF_ROOT='/sw/redhat6/netcdf/4.3.3.1/rhel6.6_gcc4.8.2--with-dap+hdf4'
 export PATH='/sw/redhat6/netcdf/4.3.3.1/rhel6.6_gcc4.8.2--with-dap+hdf4/bin':${PATH}
 cd ~/nco;git reset --hard origin/master
 cd ~/nco/bld;make ANTLR_ROOT=${HOME} NETCDF_ROOT='/sw/redhat6/netcdf/4.3.3.1/rhel6.6_gcc4.8.2--with-dap+hdf4' SZ=Y SZ_LIB='/sw/redhat6/szip/2.1/rhel6.6_gnu4.8.2/lib' UDUNITS_INC='/sw/redhat6/udunits/2.1.24/rhel6.4_intel13.1.3/include' UDUNITS_LIB='/sw/redhat6/udunits/2.1.24/rhel6.4_intel13.1.3/lib' OPTS=D OMP=Y allinone;cd -
-/bin/cp ~/ncclimo.4.6.2 ~/bin_rhea
 
 # gcc/g++ 20160420 Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on titan:
 export LINUX_CC='gcc -std=c99 -pedantic -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_SOURCE'
diff --git a/data/bsc_tst.nco b/data/bsc_tst.nco
index 2c47adc..35843a3 100644
--- a/data/bsc_tst.nco
+++ b/data/bsc_tst.nco
@@ -545,6 +545,15 @@ nbr_err_ttl=0;
      nbr_err++;	
   }
 
+  //check attribute inheritance using an incremental operand
+  // attribute propgation
+  three_dmn_var_crd+=10.0;
+  if(!exists(three_dmn_var_crd at units) || !exists(three_dmn_var_crd at long_name))
+  {  
+     print("ERROR: d8: error att inheritance with '+=' op\n");
+     nbr_err++;	
+  }
+
 
   print("RESULTS block d: Num errors="); print(nbr_err,"%d");
   nbr_err_ttl+=nbr_err;
diff --git a/data/in.cdl b/data/in.cdl
index 28f73d9..8de9268 100644
--- a/data/in.cdl
+++ b/data/in.cdl
@@ -635,6 +635,10 @@ variables:
 	fl_nm_rec:long_name = "A record variable of file names";
 	fl_nm_rec:units = "[sng]";
 
+	char date_sng(char_dmn_lng26);
+	date_sng:long_name = "A single date string";
+	date_sng:units = "[sng]";
+
 	char date_rec(time,char_dmn_lng26);
 	date_rec:long_name = "A record variable of date strings";
 	date_rec:units = "[sng]";
@@ -1653,6 +1657,7 @@ data:
 	  "/data/zender/dstccm04/dstccm04_8589_08.nc",
 	  "/data/zender/dstccm04/dstccm04_8589_09.nc",
 	  "/data/zender/dstccm04/dstccm04_8589_10.nc";
+	date_sng="2010-11-01T00:00:00.000000";
 	date_rec="2010-11-01T00:00:00.000000",
 	  "2010-11-01T01:00:00.000000",
 	  "2010-11-01T02:00:00.000000",
@@ -1733,16 +1738,6 @@ data:
 				-99,58,59,60,61,62,63,64,
 				65,66,67,68,69,70,71,72,
 				-99,74,75,76,77,78,79,-99;
-	three_dmn_rec_var=    	 1, 2, 3, 4, 5, 6, 7, 8,
-				 9,10,11,12,13,14,15,16,
-				17,18,19,20,21,22,23,24,
-				-99,-99,-99,-99,-99,-99,-99,-99,
-				33,34,35,36,37,38,39,40,
-				41,42,43,44,45,46,47,48,
-				49,50,51,52,53,54,55,56,
-				-99,58,59,60,61,62,63,64,
-				65,66,67,68,69,70,71,72,
-				-99,74,75,76,77,78,79,-99;
 	zg=              	 1, 2, 3, 4, 5, 6, 7, 8,9,10,11,12,
 				13,14,15,16,17,18,19,20,21,22,23,24,
 	                        25,26,27,28,29,30,31,32,33,34,35,36,
diff --git a/data/ncclimo b/data/ncclimo
index eed91dd..e8b40fd 100755
--- a/data/ncclimo
+++ b/data/ncclimo
@@ -211,7 +211,7 @@ esac # !HOSTNAME
 # cd /scratch2/scratchdirs/golaz/ACME_simulations/20161117.beta0.A_WCYCL1850S.ne30_oEC_ICG.edison/run;ls *cam.h0.000[1-9]* | ncclimo --dbg=1 --yr_srt=1 --yr_end=9 --var=FSNT,AODVIS,T --map=${DATA}/maps/map_ne30np4_to_fv129x256_aave.20150901.nc --drc_out=${DATA}/ne30/clm > ~/ncclimo.out 2>&1 &
 # cd /scratch2/scratchdirs/golaz/ACME_simulations/20161117.beta0.A_WCYCL1850S.ne30_oEC_ICG.edison/run;ls *cam.h0.0[012]??* | ncclimo --dbg=1 --yr_srt=1 --yr_end=250 --var=FSNT,AODVIS,T --map=${DATA}/maps/map_ne30np4_to_fv129x256_aave.20150901.nc --drc_out=${DATA}/ne30/clm > ~/ncclimo.out 2>&1 &
 # Daily pipe:
-# cd ${DATA}/ne30/raw;ls *h1*.nc | ncclimo --dbg=1 --job_nbr=8 --caseid='famipc5_ne30_v0.3_00007' --clm_md='dly' -s 2001 -e 2002 --var=PRECT,TREFHT --drc_out=${DATA}/ne30/clm > ~/ncclimo.out 2>&1 &
+# cd ${DATA}/ne30/raw;ls *h1*.nc | ncclimo --dbg=1 --job_nbr=8 --caseid=famipc5_ne30_v0.3_00007 --clm_md=dly -s 2001 -e 2002 --var=PRECT,TREFHT --drc_out=${DATA}/ne30/clm > ~/ncclimo.out 2>&1 &
 
 # Best performance on resolutions finer than ne30 (~1x1 degree) requires a job scheduler/batch processor
 # Cobalt (cooley), SLURM (cori,edison), Maui (a PBS-variant) (blues), Torque (a PBS-variant) (hopper), and PBS (rhea) schedulers allow both interactive and non-interactive (i.e., script) batch jobs
@@ -337,7 +337,8 @@ while [ -h "${nco_exe}" ]; do
   [[ ${nco_exe} != /* ]] && nco_exe="${drc_nco}/${nco_exe}"
 done
 drc_nco="$( cd -P "$( dirname "${nco_exe}" )" && pwd )"
-nco_vrs=$(ncks --version 2>&1 >/dev/null | grep NCO | awk '{print $5}')
+nco_vrs=$(ncks --version 2>&1 > /dev/null | grep NCO | awk '{print $5}')
+lbr_vrs=$(ncks --library 2>&1 > /dev/null | awk '{print $6}')
 
 # When running in a terminal window (not in an non-interactive batch queue)...
 if [ -n "${TERM}" ]; then
@@ -408,6 +409,7 @@ thr_nbr=2 # [nbr] Thread number for regridder
 tpd_out=1 # [nbr] Timesteps-per-day in ouput
 #var_lst='FSNT,AODVIS' # [sng] Variables to process (empty means all)
 var_lst='' # [sng] Variables to process (empty means all)
+vrs_prn='No' # [sng] Print version information
 xtn_flg='No' # [sng] Produce extended climatology
 ypf_max=50 # [yr] Years-per-output-file
 yr_end='1983' # [yr] End year
@@ -435,25 +437,27 @@ function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_
     echo "${fnt_rvr}-O${fnt_nrm} ${fnt_bld}drc_rgr${fnt_nrm}  Regridded directory (default ${fnt_bld}${drc_rgr}${fnt_nrm}) [${fnt_tlc}drc_rgr, rgr_drc, dir_regrid, regrid${fnt_nrm}]"
     echo "${fnt_rvr}-o${fnt_nrm} ${fnt_bld}drc_out${fnt_nrm}  Output directory (default ${fnt_bld}${drc_out}${fnt_nrm}) [${fnt_tlc}drc_out, out_drc, dir_out, out_dir, output${fnt_nrm}]"
     echo "${fnt_rvr}-p${fnt_nrm} ${fnt_bld}par_typ${fnt_nrm}  Parallelism type (default ${fnt_bld}${par_typ}${fnt_nrm}) [${fnt_tlc}par_typ, par_md, parallel_type, parallel_mode, parallel${fnt_nrm}]"
-    echo "${fnt_rvr}-r${fnt_nrm} ${fnt_bld}rgr_map${fnt_nrm}  Regrid map (empty means none) (default ${fnt_bld}${rgr_map}${fnt_nrm}) [${fnt_tlc}rgr_map, regrid_map$, map, map_file, map_fl{fnt_nrm}]"
+    echo "${fnt_rvr}-r${fnt_nrm} ${fnt_bld}rgr_map${fnt_nrm}  Regrid map (empty means none) (default ${fnt_bld}${rgr_map}${fnt_nrm}) [${fnt_tlc}rgr_map, regrid_map$, map, map_file, map_fl]"
     echo "${fnt_rvr}-R${fnt_nrm} ${fnt_bld}rgr_opt${fnt_nrm}  Regrid options (empty means none) (default ${fnt_bld}${rgr_opt}${fnt_nrm}) [${fnt_tlc}rgr_opt, regrid_options${fnt_nrm}]"
     echo "${fnt_rvr}-S${fnt_nrm} ${fnt_bld}yr_srt${fnt_nrm}   Start year previous climo (empty means none) (default ${fnt_bld}${yr_srt_prv}${fnt_nrm}) [${fnt_tlc}yr_srt_prv, prv_yr_srt, previous_start${fnt_nrm}]"
     echo "${fnt_rvr}-s${fnt_nrm} ${fnt_bld}yr_srt${fnt_nrm}   Start year (default ${fnt_bld}${yr_srt}${fnt_nrm}) [${fnt_tlc}yr_srt, start_yr, year_start, start_year, start${fnt_nrm}]"
-    echo "${fnt_rvr}  ${fnt_nrm} ${fnt_bld}stdin${fnt_nrm}    Stdin used for input (default ${fnt_bld}${inp_std}${fnt_nrm}) [${fnt_tlc}stdin, std_flg, inp_std, redirect, standard_input${fnt_nrm}]"
+    echo " ${fnt_bld}--std_flg${fnt_nrm}  Stdin used for input (default ${fnt_bld}${inp_std}${fnt_nrm}) [${fnt_tlc}stdin, std_flg, inp_std, redirect, standard_input${fnt_nrm}]"
     echo "${fnt_rvr}-t${fnt_nrm} ${fnt_bld}thr_nbr${fnt_nrm}  Thread number for regridder (default ${fnt_bld}${thr_nbr}${fnt_nrm}) [${fnt_tlc}thr_nbr, thread_number, thread, threads${fnt_nrm}]"
-    echo "${fnt_rvr}  ${fnt_nrm} ${fnt_bld}tpd_out${fnt_nrm}  Timesteps-per-day in output (default ${fnt_bld}${tpd_out}${fnt_nrm}) [${fnt_tlc}tpd_out, tpd, timesteps_per_day${fnt_nrm}]"
+    echo " ${fnt_bld}--tpd_out${fnt_nrm}  Timesteps-per-day in output (default ${fnt_bld}${tpd_out}${fnt_nrm}) [${fnt_tlc}tpd_out, tpd, timesteps_per_day${fnt_nrm}]"
     echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}var_lst${fnt_nrm}  Variable list (empty means all) (default ${fnt_bld}${var_lst}${fnt_nrm}) [${fnt_tlc}var_lst, variable_list, var, vars, variable, variables${fnt_nrm}]"
+    echo " ${fnt_bld}--version${fnt_nrm}  Version and configuration information [${fnt_tlc}version, vrs, config, configuration, cnf${fnt_nrm}]"
     echo "${fnt_rvr}-X${fnt_nrm} ${fnt_bld}drc_xtn${fnt_nrm}  Extended climo directory (default ${fnt_bld}${drc_xtn}${fnt_nrm}) [${fnt_tlc}drc_xtn, xtn_drc, extended_dir, extended_climo, extended${fnt_nrm}]"
     echo "${fnt_rvr}-x${fnt_nrm} ${fnt_bld}drc_prv${fnt_nrm}  Previous climo directory (default ${fnt_bld}${drc_prv}${fnt_nrm}) [${fnt_tlc}drc_prv, prv_drc, previous_dir, previous_climo, previous${fnt_nrm}]"
     echo "${fnt_rvr}-Y${fnt_nrm} ${fnt_bld}rgr_xtn${fnt_nrm}  Regridded extended climo directory (default ${fnt_bld}${drc_rgr_xtn}${fnt_nrm}) [${fnt_tlc}drc_rgr_xtn, drc_xtn_rgr, regridded_extended, extended_regridded${fnt_nrm}]"
-    echo "${fnt_rvr}-y${fnt_nrm} ${fnt_bld}rgr_prv${fnt_nrm}  Regridded previous climo directory (default ${fnt_bld}${drc_rgr_prv}${fnt_nrm}) [${fnt_tlc}drc_rgr_prv, drc_prv_rgr, regridded_previous, prefvious_regridded${fnt_nrm}]"
-    echo "${fnt_rvr}  ${fnt_nrm} ${fnt_bld}ypf_max${fnt_nrm}  Years-per-output-file maximum (empty means none) (default ${fnt_bld}${ypf_max}${fnt_nrm}) [${fnt_tlc}ypf_max, ypf, years, years_per_file${fnt_nrm}]"
+    echo "${fnt_rvr}-y${fnt_nrm} ${fnt_bld}rgr_prv${fnt_nrm}  Regridded previous climo directory (default ${fnt_bld}${drc_rgr_prv}${fnt_nrm}) [${fnt_tlc}drc_rgr_prv, drc_prv_rgr, regridded_previous, previous_regridded${fnt_nrm}]"
+    echo " ${fnt_bld}--ypf_max${fnt_nrm}  Years-per-output-file maximum (default ${fnt_bld}${ypf_max}${fnt_nrm}) [${fnt_tlc}ypf_max, ypf, years, years_per_file${fnt_nrm}]"
     printf "\n"
-    printf "${fnt_rvr}Examples:${fnt_nrm}\n${fnt_bld}${spt_nm} -c ${caseid_xmp} -s ${yr_srt} -e ${yr_end} -i ${drc_in_xmp} -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}\n"
-    printf "${fnt_bld}${spt_nm} -c control -m clm2 -s ${yr_srt} -e ${yr_end} -i ${drc_in_xmp} -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}\n"
-    printf "${fnt_bld}${spt_nm} -m mpascice  -s ${yr_srt} -e ${yr_end} -i ${drc_in_mps} -o ${drc_out_mps} -r ~zender/data/maps/map_oEC60to30_to_t62_bilin.20160301.nc ${fnt_nrm}\n"
-    printf "${fnt_bld}${spt_nm} -m mpaso -p mpi -s 1 -e 5 -i ${drc_in_mps} -o ${drc_out_mps} -r ~zender/data/maps/map_oEC60to30_to_t62_bilin.20160301.nc ${fnt_nrm}\n"
-    printf "${fnt_bld}cd output;ls *cam*19??-??*.nc | ${spt_nm} -v FSNT,TREFHT -s 1900 -e 1999 -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}\n\n"
+    printf "${fnt_rvr}Examples:${fnt_nrm}\n${fnt_bld}${spt_nm} -c ${caseid_xmp} -s ${yr_srt} -e ${yr_end} -i ${drc_in_xmp} -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}# Generate CAM climo\n"
+    printf "${fnt_bld}${spt_nm} -c control -m clm2 -s ${yr_srt} -e ${yr_end} -i ${drc_in_xmp} -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}# Generate CLM climo\n"
+    printf "${fnt_bld}${spt_nm} -m mpascice  -s ${yr_srt} -e ${yr_end} -i ${drc_in_mps} -o ${drc_out_mps} -r ~zender/data/maps/map_oEC60to30_to_t62_bilin.20160301.nc ${fnt_nrm}# Generate MPAS-CICE climo\n"
+    printf "${fnt_bld}${spt_nm} -m mpaso -p mpi -s 1 -e 5 -i ${drc_in_mps} -o ${drc_out_mps} -r ~zender/data/maps/map_oEC60to30_to_t62_bilin.20160301.nc ${fnt_nrm}# Generate MPAS-Ocean climo\n"
+    printf "${fnt_bld}cd output;ls *cam*19??-??*.nc | ${spt_nm} -v FSNT,TREFHT -s 1900 -e 1999 -o ${drc_out_xmp} -r ~zender/data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ${fnt_nrm}# Split climo\n"
+    printf "${fnt_bld}ncclimo -a sdd -c ${caseid_xmp} -m cam -S 41 -E 50 -x ${drc_rgr_xmp}/0041-0050 -s 51 -e 60 -i ${drc_rgr_xmp}/0051-0060 -X ${drc_rgr_xmp}/0041-0060 ${fnt_nrm}# Combine two climos\n\n"
     printf "${fnt_rvr}Interactive batch queues:${fnt_nrm}\n"
     printf "blues : qsub -I -A ACME -q acme -l nodes=1 -l walltime=00:30:00 -N ncclimo\n"
     printf "cooley: qsub -I -A HiRes_EarthSys --nodecount=1 --time=00:30:00 --jobname=ncclimo\n"
@@ -572,6 +576,7 @@ while getopts :a:C:c:d:E:e:f:h:i:j:l:m:n:O:o:p:R:r:S:s:t:v:X:x:Y:y:-: OPT; do
 	       stdin=?* | inp_std=?* | std_flg=?* | redirect=?* | standard_input=?* ) echo "No argument allowed for --${OPTARG switch}" >&2; exit 1 ;; # # Input file list from stdin
 	       tpd_out=?* | tpd=?* | timesteps_per_day=?* ) tpd_out="${LONG_OPTARG}" ;; # # Timesteps-per-day in output
 	       var_lst=?* | variable_list=?* | var=?* | vars=?* | variable=?* | variables=?* ) var_lst="${LONG_OPTARG}" ;; # -v # Variables
+	       version | vrs | config | configuration | cnf ) vrs_prn='Yes' ;; # # Print version information
 	       drc_xtn=?* | xtn_drc=?* | extended_dir=?* | extended_climo=?* | extended=?* ) drc_xtn="${LONG_OPTARG}" ;; # -X # Extended climo directory
 	       drc_prv=?* | prv_drc=?* | previous_dir=?* | previous_climo=?* | previous=?* ) drc_prv="${LONG_OPTARG}" ;; # -x # Previous climo directory
 	       drc_rgr_xtn=?* | drc_xtn_rgr=?* | regridded_extended=?* | extended_regridded=?* ) drc_rgr_xtn="${LONG_OPTARG}" ;; # -Y # Regridded extended climo directory
@@ -590,7 +595,21 @@ psn_nbr=$#
 if [ ${psn_nbr} -ge 1 ]; then
     inp_psn='Yes'
 fi # !psn_nbr
-    
+if [ ${vrs_prn} = 'Yes' ]; then
+    printf "${spt_nm}, the NCO climatology operator, version ${nco_vrs}\n"
+    printf "Copyright (C) 2016--2017 Charlie Zender\n"
+    printf "This program is part of NCO, the netCDF Operators\n"
+    printf "NCO is free software and comes with a BIG FAT KISS and ABOLUTELY NO WARRANTY\n"
+    printf "You may redistribute and/or modify NCO under the terms of the\n"
+    printf "GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file\n"
+    printf "GPL: http://www.gnu.org/copyleft/gpl.html\n"
+    printf "LICENSE: https://github.com/nco/nco/tree/master/LICENSE\n"
+    printf "Config: ${spt_nm} running from directory ${drc_spt}\n"
+    printf "Config: calling NCO binaries in directory ${drc_nco}\n"
+    printf "Config: binaries linked to netCDF library version ${lbr_vrs}\n"
+    exit 0
+fi # !vrs_prn
+
 # Detect input on pipe to stdin:
 # http://stackoverflow.com/questions/2456750/detect-presence-of-stdin-contents-in-shell-script
 # http://unix.stackexchange.com/questions/33049/check-if-pipe-is-empty-and-run-a-command-on-the-data-if-it-isnt
diff --git a/data/ncremap b/data/ncremap
index fa11136..a874289 100755
--- a/data/ncremap
+++ b/data/ncremap
@@ -224,7 +224,8 @@ while [ -h "${nco_exe}" ]; do
   [[ ${nco_exe} != /* ]] && nco_exe="${drc_nco}/${nco_exe}"
 done
 drc_nco="$( cd -P "$( dirname "${nco_exe}" )" && pwd )"
-nco_vrs=$(ncks --version 2>&1 >/dev/null | grep NCO | awk '{print $5}')
+nco_vrs=$(ncks --version 2>&1 > /dev/null | grep NCO | awk '{print $5}')
+lbr_vrs=$(ncks --library 2>&1 > /dev/null | awk '{print $6}')
 
 # When running in a terminal window (not in an non-interactive batch queue)...
 if [ -n "${TERM}" ]; then
@@ -294,6 +295,13 @@ unq_sfx=".pid${spt_pid}" # [sng] Unique suffix
 var_lst='' # [sng] Variables to process (empty means all)
 var_rgr='' # [sng] CF template variable
 var_xmp='FSNT' # [sng] Variable list for examples
+vrb_lvl=2 # [sng] Verbosity level
+vrb_0=0 # [sng] Verbosity level: Quiet
+vrb_1=1 # [sng] Verbosity level: Standard, minimal file I/O
+vrb_2=2 # [sng] Verbosity level: All file I/O
+vrb_3=3 # [sng] Verbosity level: English
+vrb_4=4 # [sng] Verbosity level: Pedantic
+vrs_prn='No' # [sng] Print version information
 wgt_gnr='esmf' # [sng] Weight-generator program
 xtn_var='' # [sng] Extensive variables (e.g., 'TSurfStd_ct')
 
@@ -336,6 +344,8 @@ function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_
     echo "${fnt_rvr}-u${fnt_nrm} ${fnt_bld}unq_sfx${fnt_nrm}  Unique suffix (prevents intermediate files from sharing names) (default ${fnt_bld}${unq_sfx}${fnt_nrm}) [${fnt_tlc}unq_sfx, unique_suffix, suffix${fnt_nrm}]"
     echo "${fnt_rvr}-V${fnt_nrm} ${fnt_bld}var_rgr${fnt_nrm}  CF template variable (empty means none) (default ${fnt_bld}${var_rgr}${fnt_nrm}) [${fnt_tlc}var_rgr, rgr_var, var_cf, cf_var, cf_variable${fnt_nrm}]"
     echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}var_lst${fnt_nrm}  Variable list (empty means all) (default ${fnt_bld}${var_lst}${fnt_nrm}) [${fnt_tlc}var_lst, variable_list, var, vars, variable, variables${fnt_nrm}]"
+    echo " ${fnt_bld}--version${fnt_nrm}  Version and configuration information [${fnt_tlc}version, vrs, config, configuration, cnf${fnt_nrm}]"
+    echo " ${fnt_bld}--vrb_lvl${fnt_nrm}  Verbosity level (default ${fnt_bld}${vrb_lvl}${fnt_nrm}) [${fnt_tlc}vrb_lvl, vrb, verbosity, print_verbosity${fnt_nrm}]"
     echo "${fnt_rvr}-w${fnt_nrm} ${fnt_bld}wgt_gnr${fnt_nrm}  Weight-generator (default ${fnt_bld}${wgt_gnr}${fnt_nrm}) [${fnt_tlc}wgt_gnr, weight_generator, generator${fnt_nrm}]"
     echo "${fnt_rvr}-x${fnt_nrm} ${fnt_bld}xtn_var${fnt_nrm}  Extensive variables (empty means none) (default ${fnt_bld}${xtn_var}${fnt_nrm}) [${fnt_tlc}xtn_var, xtn_lst, extensive, var_xtn, extensive_variables${fnt_nrm}]"
     printf "\n"
@@ -441,6 +451,8 @@ while getopts :a:CD:d:E:f:g:G:h:I:i:j:Mm:n:O:o:P:p:R:s:T:t:U:u:V:v:w:x:-: OPT; d
 	       unq_sfx=?* | unique_suffix=?* | suffix=?* ) unq_usr="${LONG_OPTARG}" ;; # -u # Unique suffix
 	       var_rgr=?* | rgr_var=?* | var_cf=?* | cf_var=?* | cf_variable=?* ) var_rgr="${LONG_OPTARG}" ;; # -V # CF template variable 
 	       var_lst=?* | variable_list=?* | var=?* | vars=?* | variable=?* | variables=?* ) var_lst="${LONG_OPTARG}" ;; # -v # Variables
+	       vrb_lvl=?* | vrb=?* | verbosity=?* | print_verbosity=?* ) vrb_lvl="${LONG_OPTARG}" ;; # # Print verbosity
+	       version | vrs | config | configuration | cnf ) vrs_prn='Yes' ;; # # Print version information
 	       wgt_gnr=?* | weight_generator=?* | generator=?* ) wgt_usr="${LONG_OPTARG}" ;; # -w # Weight-generator
 	       xtn_var=?* | extensive=?* | var_xtn=?* | extensive_variables=?* ) xtn_var="${LONG_OPTARG}" ;; # -x # Extensive variables
                '' ) break ;; # "--" terminates argument processing
@@ -452,6 +464,34 @@ while getopts :a:CD:d:E:f:g:G:h:I:i:j:Mm:n:O:o:P:p:R:s:T:t:U:u:V:v:w:x:-: OPT; d
     esac # !OPT
 done # !getopts
 shift $((OPTIND-1)) # Advance one argument
+if [ ${vrs_prn} = 'Yes' ]; then
+    printf "${spt_nm}, the NCO regridder and map- and grid-generator, version ${nco_vrs}\n"
+    printf "Copyright (C) 2016--2017 Charlie Zender\n"
+    printf "This program is part of NCO, the netCDF Operators\n"
+    printf "NCO is free software and comes with a BIG FAT KISS and ABOLUTELY NO WARRANTY\n"
+    printf "You may redistribute and/or modify NCO under the terms of the\n"
+    printf "GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file\n"
+    printf "GPL: http://www.gnu.org/copyleft/gpl.html\n"
+    printf "LICENSE: https://github.com/nco/nco/tree/master/LICENSE\n"
+    printf "Config: ${spt_nm} running from directory ${drc_spt}\n"
+    printf "Config: calling NCO binaries in directory ${drc_nco}\n"
+    printf "Config: binaries linked to netCDF library version ${lbr_vrs}\n"
+    wgt_cmd='ESMF_RegridWeightGen'
+    cmd_wgt=`command -v ${wgt_cmd} 2>&1 > /dev/null`
+    if [ $? -eq 0 ]; then
+	printf "Config: ESMF weight-generation command ${wgt_cmd} found as ${cmd_wgt}\n"
+    else
+	printf "Config: ESMF weight-generation command ${wgt_cmd} not found\n"
+    fi # !err
+    wgt_cmd='GenerateOverlapMesh'
+    cmd_wgt=`command -v ${wgt_cmd} 2>&1 > /dev/null`
+    if [ $? -eq 0 ]; then
+	printf "Config: Tempest weight-generation command ${wgt_cmd} found as ${cmd_wgt}\n"
+    else
+	printf "Config: Tempest weight-generation command ${wgt_cmd} not found\n"
+    fi # !err
+    exit 0
+fi # !vrs_prn
 
 # Detect input on pipe to stdin:
 # http://stackoverflow.com/questions/2456750/detect-presence-of-stdin-contents-in-shell-script
@@ -853,20 +893,24 @@ fi # !drc_tmp
 
 # Human-readable summary
 date_srt=$(date +"%s")
-if [ ${dbg_lvl} -ge 1 ]; then
+if [ ${vrb_lvl} -ge ${vrb_4} ]; then
     printf "NCO regridder invoked with command:\n"
     echo "${cmd_ln}"
-fi # !dbg
+fi # !vrb_lvl
 if [ -f 'PET0.RegridWeightGen.Log' ]; then
-    printf "${spt_nm}: Removing PET0.RegridWeightGen.Log file from current directory before running\n"
+    if [ ${vrb_lvl} -ge ${vrb_4} ]; then
+	printf "${spt_nm}: Removing PET0.RegridWeightGen.Log file from current directory before running\n"
+    fi # !vrb_lvl
     /bin/rm -f PET0.RegridWeightGen.Log
 fi # !PETO
-printf "Started processing at `date`.\n"
-printf "Running remap script ${spt_nm} from directory ${drc_spt}\n"
-printf "NCO binaries version ${nco_vrs} from directory ${drc_nco}\n"
-printf "Input files in or relative to directory ${drc_in}\n"
-printf "Intermediate/temporary files written to directory ${drc_tmp}\n"
-printf "Output files to directory ${drc_out}\n"
+if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+    printf "Started processing at `date`.\n"
+    printf "Running remap script ${spt_nm} from directory ${drc_spt}\n"
+    printf "NCO binaries version ${nco_vrs} from directory ${drc_nco}\n"
+    printf "Input files in or relative to directory ${drc_in}\n"
+    printf "Intermediate/temporary files written to directory ${drc_tmp}\n"
+    printf "Output files to directory ${drc_out}\n"
+fi # !vrb_lvl
 if [ "${map_mk}" != 'Yes' ] && [ "${map_usr_flg}" = 'Yes' ] && [ -n "${wgt_usr}" ]; then
     printf "${spt_nm}: ERROR Specifying both '-m map_fl' and '-w wgt_gnr' is only allowed when creating a map (weight generator is superfluous when map is supplied)\n"
     exit 1
@@ -888,33 +932,43 @@ fi # !dst_usr_flg
 # Generate destination grid at most one-time (unlike source grid)
 # Eventually we will allow destination grid to be provided as grid-file, map-file, or data-file
 # Currently we require user to know (and specify) means by which destination grid is provided
-if [ ${fl_nbr} -eq 0 ]; then
-    printf "Map-only run: no input data detected therefore will exit after generating map\n"
-fi # !fl_nbr
-if [ -n "${pdq_opt}" ]; then 
-    printf "Input data shaped in \"${pdq_typ}\"-order, will permute with \"ncpdq ${pdq_opt}\"\n"
-fi # !pdq_opt
-if [ "${pdq_typ}" = 'mpas' ]; then
-    printf "Input assumed to be MPAS-O/I data: will apply renormalized regridding (--rnr=0.0)\n"
-    if [ "${clm_flg}" = 'No' ]; then
- 	printf "Input assumed to be barenaked of attributes: will annotate NC_DOUBLE variables with _FillValue prior to regridding\n"
-    fi # !clm_flg
-fi # !mpas
+if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+    if [ ${fl_nbr} -eq 0 ]; then
+	printf "Map-only run: no input data detected therefore will exit after generating map\n"
+    fi # !fl_nbr
+    if [ -n "${pdq_opt}" ]; then 
+	printf "Input data shaped in \"${pdq_typ}\"-order, will permute with \"ncpdq ${pdq_opt}\"\n"
+    fi # !pdq_opt
+    if [ "${pdq_typ}" = 'mpas' ]; then
+	printf "Input assumed to be MPAS-O/I data: will apply renormalized regridding (--rnr=0.0)\n"
+	if [ "${clm_flg}" = 'No' ]; then
+ 	    printf "Input assumed to be barenaked of attributes: will annotate NC_DOUBLE variables with _FillValue prior to regridding\n"
+	fi # !clm_flg
+    fi # !mpas
+fi # !vrb_lvl
 if [ "${map_mk}" != 'Yes' ] && [ "${map_usr_flg}" = 'Yes' ]; then 
-    printf "Source and destination grids will both be read from supplied map-file\n"
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	printf "Source and destination grids will both be read from supplied map-file\n"
+    fi # !vrb_lvl
 else # !map_usr_flg
     fl_idx=0 # [idx] Current file index
     if [ "${dst_usr_flg}" = 'Yes' ]; then 
 	# Block 1 Loop 1: Generate, check, and store (but do not yet execute) commands
 	# Infer destination grid-file from data file
-	printf "Destination grid will be inferred from data-file\n"
+	if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	    printf "Destination grid will be inferred from data-file\n"
+	fi # !vrb_lvl
 	cmd_dst[${fl_idx}]="ncks ${nco_opt} --rgr nfr=y ${nco_var_rgr} --rgr grid=${grd_dst} ${dst_fl} ${tmp_out_fl}"
     else # !dst_usr_flg
 	if [ "${grd_dst_usr_flg}" = 'Yes' ]; then 
-	    printf "Destination grid supplied by user\n"
+	    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+		printf "Destination grid supplied by user\n"
+	    fi # !vrb_lvl
 	else
 	    if [ "${grd_sng_usr_flg}" = 'Yes' ]; then 
-		printf "Destination grid will be generated from NCO grid string ${grd_sng}\n"
+		if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+		    printf "Destination grid will be generated from NCO grid string ${grd_sng}\n"
+		fi # !vrb_lvl
 		cmd_dst[${fl_idx}]="ncks ${nco_opt} ${grd_sng} ${fl_in[0]} ${tmp_out_fl}"
 	    else
 		printf "${spt_nm}: ERROR Grid string grd_sng not provided\n"
@@ -938,31 +992,41 @@ else # !map_usr_flg
 	    fi # !grd_sng_usr_flg
 	fi # !dbg
     fi # !dst_usr_flg || grd_dst_usr_flg
-    printf "Weight-generation type: ${wgt_gnr}\n"
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	printf "Weight-generation type: ${wgt_gnr}\n"
+    fi # !vrb_lvl
     if [ "${wgt_gnr}" = 'esmf' ]; then 
-	printf "ESMF's ESMF_RegridWeightGen will generate mapping weights and map-file\n"
-	printf "Algorithm used to generate weights in map-file is: ${alg_opt}\n"
+	if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	    printf "ESMF's ESMF_RegridWeightGen will generate mapping weights and map-file\n"
+	    printf "Algorithm used to generate weights in map-file is: ${alg_opt}\n"
+	fi # !vrb_lvl
 	wgt_cmd='ESMF_RegridWeightGen'
     fi # !esmf
     if [ "${wgt_gnr}" = 'tempest' ]; then 
-	printf "TempestRemap's GenerateOverlapMesh and GenerateOfflineMap will generate mapping weights and map-file\n"
-	wgt_cmd='GenerateOverlapMesh'
+	if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	    printf "TempestRemap's GenerateOverlapMesh and GenerateOfflineMap will generate mapping weights and map-file\n"
+	fi # !vrb_lvl
+	wgt_cmd='GenerateOfflineMap'
     fi # !tempest
-    command -v ${wgt_cmd} 2>&1 /dev/null || { printf "${spt_nm}: ERROR cannot find weight-generation command ${wgt_cmd}. Please install the executable, or change your PATH to find it.\n${spt_nm}: HINT ESMF_RegridWeightGen is often provided in NCL packages. Tempest executables must be installed from source (https://github.com/ClimateGlobalChange/tempestremap)."; exit 1; }
-    if [ ${fl_nbr} -ge 2 ]; then 
-	if [ "${mlt_map_flg}" = 'Yes' ]; then 
-	    printf "Input files assumed to use unique input grids\nOne source grid-file will be inferred and one map-file generated per input file\n"
-	else # !mlt_map_flg
-	    printf "Input files assumed to use same input grid\nOnly one source grid-file and one map-file will be generated\n"
-	fi # !mlt_map_flg
-    fi # !fl_nbr
+    command -v ${wgt_cmd} 2>&1 > /dev/null || { printf "${spt_nm}: ERROR cannot find weight-generation command ${wgt_cmd}. Please install the executable, or change your PATH to find it.\n${spt_nm}: HINT ESMF_RegridWeightGen is often provided in NCL packages. Tempest executables must be installed from source (https://github.com/ClimateGlobalChange/tempestremap)."; exit 1; }
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	if [ ${fl_nbr} -ge 2 ]; then 
+	    if [ "${mlt_map_flg}" = 'Yes' ]; then 
+		printf "Input files assumed to use unique input grids\nOne source grid-file will be inferred and one map-file generated per input file\n"
+	    else # !mlt_map_flg
+		printf "Input files assumed to use same input grid\nOnly one source grid-file and one map-file will be generated\n"
+	    fi # !mlt_map_flg
+	fi # !fl_nbr
+    fi # !vrb_lvl
 fi # !map_usr
 
 # If user provides source gridfile, assume it applies to every input file
 # Do not infer source gridfiles from input files within file loop
 # Generate map-file once outside of file loop, and re-use it for every input file
 if [ "${grd_src_usr_flg}" = 'Yes' ]; then
-    printf "Source grid supplied by user as ${grd_src}\n"
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	printf "Source grid supplied by user as ${grd_src}\n"
+    fi # !vrb_lvl
     fl_idx=0
     if [ "${wgt_gnr}" = 'esmf' ]; then 
 	cmd_map[${fl_idx}]="ESMF_RegridWeightGen -s ${grd_src} -d ${grd_dst} -w ${map_fl} --method ${alg_opt} ${esmf_opt} > /dev/null"
@@ -1019,7 +1083,9 @@ for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do
 	in_fl="${drc_pwd}/${in_fl}"
     fi # !basename
     idx_prn=`printf "%02d" ${fl_idx}`
-    printf "Input #${idx_prn}: ${in_fl}\n"
+    if [ ${vrb_lvl} -ge ${vrb_1} ]; then
+	printf "Input #${idx_prn}: ${in_fl}\n"
+    fi # !vrb_lvl
     if [ "${out_usr_flg}" = 'Yes' ]; then 
 	if [ ${fl_nbr} -ge 2 ]; then 
 	    echo "ERROR: Single output filename specified with -o for multiple input files"
@@ -1083,8 +1149,10 @@ for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do
 	
 	# Block 3: Source->destination maps
 	# Block 3 Loop 1: Map-file commands
-	printf "Grid(src): ${grd_src}\n"
-	printf "Grid(dst): ${grd_dst}\n"
+	if [ ${vrb_lvl} -ge ${vrb_1} ]; then
+	    printf "Grid(src): ${grd_src}\n"
+	    printf "Grid(dst): ${grd_dst}\n"
+	fi # !vrb_lvl
 	if [ "${wgt_gnr}" = 'esmf' ]; then 
 	    cmd_map[${fl_idx}]="ESMF_RegridWeightGen -s ${grd_src} -d ${grd_dst} -w ${map_fl} --method ${alg_opt} ${esmf_opt} > /dev/null"
 	fi # !esmf
@@ -1139,6 +1207,10 @@ for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do
     # Block 4a: Add missing metadata to MPAS files unless script was invoked by ncclimo (it makes no sense to give naked files to ncclimo and then annotate here, so assume ncclimo is working with annotated files)
     if [ "${pdq_typ}" = 'mpas' ] && [ "${clm_flg}" = 'No' ]; then
 	cmd_att[${fl_idx}]="ncatted -O -t -a _FillValue,,o,d,-9.99999979021476795361e+33 ${in_fl} ${att_fl};"
+	if [ ${vrb_lvl} -ge ${vrb_2} ]; then
+	    printf "att(in)  : ${in_fl}\n"
+	    printf "att(out) : ${att_fl}\n"
+	fi # !vrb_lvl
 	in_fl="${att_fl}"
 	if [ ${dbg_lvl} -ge 1 ]; then
 	    echo ${cmd_att[${fl_idx}]}
@@ -1154,8 +1226,10 @@ for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do
 	
     # Block 4b: Generic Permutation (AIRS, HIRDLS, MLS, MPAS)
     if [ -n "${pdq_opt}" ]; then
-	printf "PDQ(in)  : ${in_fl}\n"
-	printf "PDQ(out) : ${pdq_fl}\n"
+	if [ ${vrb_lvl} -ge ${vrb_2} ]; then
+	    printf "PDQ(in)  : ${in_fl}\n"
+	    printf "PDQ(out) : ${pdq_fl}\n"
+	fi # !vrb_lvl
 	cmd_pdq[${fl_idx}]="ncpdq ${nco_opt} ${nco_var_lst} ${pdq_opt} ${in_fl} ${pdq_fl}"
 	in_fl=${pdq_fl}
 	if [ ${dbg_lvl} -ge 1 ]; then
@@ -1171,8 +1245,10 @@ for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do
     fi # !pdq_opt
 
     # Block 5: Regrid
-    printf "Map/Wgt  : ${map_fl}\n"
-    printf "Regridded: ${out_fl}\n"
+    if [ ${vrb_lvl} -ge ${vrb_1} ]; then
+	printf "Map/Wgt  : ${map_fl}\n"
+	printf "Regridded: ${out_fl}\n"
+    fi # !vrb_lvl
     cmd_rgr[${fl_idx}]="${cmd_mpi[${fl_idx}]} ncks -t ${thr_nbr} ${nco_opt} ${nco_var_rgr} ${nco_var_lst} ${rgr_opt} --map=${map_fl} ${in_fl} ${out_fl}"
     
     # Block 5 Loop 2: Execute and/or echo commands
@@ -1251,21 +1327,27 @@ if [ -n "${par_opt}" ]; then
 fi # !par_typ
 
 if [ "${cln_flg}" = 'Yes' ]; then
-    printf "Cleaning-up intermediate files...\n"
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	printf "Cleaning-up intermediate files...\n"
+    fi # !vrb_lvl
     /bin/rm -f ${att_fl} ${grd_dst_dfl} ${grd_src_dfl} ${map_fl_dfl} ${msh_fl_dfl} ${ncwa_fl} ${pdq_fl} ${tmp_out_fl} ${znl_fl/znl/znl1} ${znl_fl/znl/znl2}
 else # !cln_flg
-    printf "Explicitly instructed not to clean-up intermediate files.\n"
+    if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+	printf "Explicitly instructed not to clean-up intermediate files.\n"
+    fi # !vrb_lvl
 fi # !cln_flg
 
 date_end=$(date +"%s")
-if [ ${fl_nbr} -eq 0 ]; then
-    printf "Completed generating map-file(s) at `date`.\n"
-else # !fl_nbr
-    echo "Quick plots of results from last regridded file:"
-    echo "ncview  ${out_fl} &"
-    echo "panoply ${out_fl} &"
-fi # !fl_nbr
-date_dff=$((date_end-date_srt))
-echo "Elapsed time $((date_dff/60))m$((date_dff % 60))s"
+if [ ${vrb_lvl} -ge ${vrb_3} ]; then
+    if [ ${fl_nbr} -eq 0 ]; then
+	printf "Completed generating map-file(s) at `date`.\n"
+    else # !fl_nbr
+	echo "Quick plots of results from last regridded file:"
+	echo "ncview  ${out_fl} &"
+	echo "panoply ${out_fl} &"
+    fi # !fl_nbr
+    date_dff=$((date_end-date_srt))
+    echo "Elapsed time $((date_dff/60))m$((date_dff % 60))s"
+fi # !vrb_lvl
 
 exit 0
diff --git a/data/stdin.sh b/data/stdin.sh
new file mode 100644
index 0000000..abf3d8d
--- /dev/null
+++ b/data/stdin.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Usage:
+# chmod 755 ~/stdin.sh
+# Invoke stdin.sh with stdin_tst.sh as described in that file
+if [ -p /dev/stdin ]; then
+    printf "[ -p /dev/stdin ] is true\n"
+else
+    printf "[ -p /dev/stdin ] is false \n"
+fi
+if [ ! -t 0 ]; then
+    printf "[ ! -t 0 ] is true\n"
+else
+    printf "[ ! -t 0 ] is false\n"
+fi
+if [ -z "${TERM}" ]; then
+    printf "[ -z \"\${TERM}\" ] is true\n"
+else
+    printf "[ -z \"\${TERM}\" ] is false\n"
+fi
+if [ -z "${PS1}" ]; then
+    printf "[ -z \"\${PS1}\" ] is true\n"
+else
+    printf "[ -z \"\${PS1}\" ] is false\n"
+fi
+if [ -n "${PBS_ENVIRONMENT}" ]; then
+    printf "[ -n \"\${PBS_ENVIRONMENT}\" ] is true and value is \"${PBS_ENVIRONMENT}\"\n"
+else
+    printf "[ -n \"\${PBS_ENVIRONMENT}\" ] is false\n"
+fi
+if [ -n "${SLURM_PTY_PORT}" ]; then
+    printf "[ -n \"\${SLURM_PTY_PORT}\" ] is true and value is \"${SLURM_PTY_PORT}\"\n"
+else
+    printf "[ -n \"\${SLURM_PTY_PORT}\" ] is false\n"
+fi
+if [ -n "${SLURM_JOBID}" ]; then
+    printf "[ -n \"\${SLURM_JOBID}\" ] is true and value is \"${SLURM_JOBID}\"\n"
+else
+    printf "[ -n \"\${SLURM_JOBID}\" ] is false\n"
+fi
+read -t 0 line
+if [ -n ${line} ] ; then
+    printf "\"read -t 0 line\" is true and contains \"${line}\"\n"
+else
+    printf "\"read line\" is false\n"
+fi
diff --git a/data/stdin_tst.sh b/data/stdin_tst.sh
new file mode 100644
index 0000000..c7f5ed4
--- /dev/null
+++ b/data/stdin_tst.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# Usage:
+# chmod 755 ~/stdin_tst.sh
+# qsub -A CLI115 -V -l nodes=1 -l walltime=00:30:00 -N stdin -j oe -m e -o ~/stdin.out ~/stdin_tst.sh
+# qsub -A arpae -l walltime=00:30:00 -l nodes=1 -N stdin -q batch -j oe -m e -o ~/stdin.out ~/stdin_tst.sh
+# qsub -A ACME -q acme -l nodes=1 -l walltime=00:30:00 -N stdin -j oe -m e -o ~/stdin.out ~/stdin_tst.sh
+# sbatch -A acme --nodes=1 --time=00:30:00 --partition=debug --job-name=stdin --mail-type=END --output=${HOME}/stdin.out ~/stdin_tst.sh
+# salloc -A acme --nodes=1 --time=00:30:00 --partition=debug --job-name=stdin
+echo foo > ~/foo
+printf "No pipe, no re-direction: ~/stdin.sh\n"
+~/stdin.sh
+printf "Pipe to stdin:            echo hello | ~/stdin.sh\n"
+echo hello | ~/stdin.sh
+printf "Redirection to stdin:     ~/stdin.sh < foo\n"
+~/stdin.sh < ~/foo
diff --git a/data/tst-udunits.nco b/data/tst-udunits.nco
index 0e0c0f3..845e195 100644
--- a/data/tst-udunits.nco
+++ b/data/tst-udunits.nco
@@ -109,6 +109,29 @@ nbr_err_ttl=0;
    nbr_err++;
   }
 
+}
+
+// check strftime
+{
+  
+  // rebase coordinate both with "days" - 30 days a month calendar
+  b1=time;
+  b1 at units="days since 1990-01-01";
+  b1 at calendar="gregorian";
+ 
+  // use default strftime output this is "%Y-%m-%d %H:%M:%S"
+  b1 at str=strftime(b1);
+  // use y/m/d
+  b1 at str2=strftime(b1,"%Y/%m/%d");
+
+  b2=time;
+  b2 at units="hours since 1970-01-01";
+  b2 at calendar="gregorian";
+  b2 at str=strftime(b2,"%Y/%m/%d %H:%M");
+
+
+}
+
 // other units
 {
 
@@ -129,8 +152,7 @@ nbr_err_ttl=0;
 
 
 
-}
+ }
 
 
 
-}
\ No newline at end of file
diff --git a/data/vpointer-ex3.nco b/data/vpointer-ex3.nco
index 90c933f..639fb55 100644
--- a/data/vpointer-ex3.nco
+++ b/data/vpointer-ex3.nco
@@ -52,10 +52,26 @@ for(*idx=0;idx<sz;idx++)
  
   *@att_total= *@var_nm.total();
   *@att_range={ min(*@var_nm), max(*@var_nm)}; 
+  
 
 
 } 
 
 
+// check that where body works with a vpointer
+ at tst={"time"s,"one_dmn_rec_var"s, "one_dmn_rec_var_flt"s, "one_dmn_rec_var_mdn"s};
+sz=@tst.size();
+
+for(*idx=0;idx<sz;idx++)
+{
+  @var_nm=@tst(idx);
+
+  if( exists(*@var_nm))
+    where ( *@var_nm <2 || *@var_nm >= 9)
+      *@var_nm=-999; 
+
+
+} 
+
 
 
diff --git a/debian/changelog b/debian/changelog
index 2efa2d2..097b937 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+nco (4.6.5-1) unstable; urgency=low
+
+  * new upstream version cnk csh, EXIT_FAILURE, ncclimo/ncremap version/vrb_lvl, ncks --cal, nfr() refactor, POP fix
+
+ -- Charlie Zender <zender at uci.edu>  Wed, 15 Mar 2017 12:25:20 -0700
+
 nco (4.6.4-1) unstable; urgency=low
 
   * new upstream version splitter, stdin, clm_md=dly, cll_msr, frm_trm, cln=365 and srd fixes
diff --git a/doc/ANNOUNCE b/doc/ANNOUNCE
index d1a0bca..cfc4577 100644
--- a/doc/ANNOUNCE
+++ b/doc/ANNOUNCE
@@ -1,94 +1,122 @@
 $Header$ -*-text-*-
 
-The netCDF Operators NCO version 4.6.4 are ready. 
+The netCDF Operators NCO version 4.6.5 are ready. 
 
 http://nco.sf.net (Homepage, Mailing lists)
 http://github.com/nco (Source Code, Releases, Developers)
 
 What's new?
 
-The main new features in 4.6.4 are the "splitter" and daily
-climatology capabilities for ncclimo. ncclimo now generates,
-combines existing, and splits climatologies. Thus it is a
-fairly general purpose climatology operator. NCO now supports
-two more CF conventions (formula_terms and cell_measures),
-and has a few bugfixes.
+4.6.5 contains a potpurri of new features. Setting chunk cache size
+with --cnk_csh can accelerate aggregation of netCDF4 files.
+Climatology and regridder users may appreciate the cleaned-up
+ouput offered by the ncremap --vrb_lvl switch and more intelligent
+grid inferral. Everyone who has tried to convert "time since..." 
+values to calendar dates will like the new ncks --cal switch that does
+the UDUnits conversion for you. There are also helpful bugfixes for
+ncap2 attribute propagation in corner cases, and corrected error codes
+for bad command line arguments. 
 
-Work on NCO 4.6.5 has commenced. Planned improvements include 
-support for conda installs on MS Windows, and more ncclimo
-and ncremap features.
+Work on NCO 4.6.6 has commenced. Planned improvements include 
+support for conda installs on MS Windows, and human-legible calendar
+date printing, more ncclimo and ncremap features.
 
 Enjoy,
 Charlie
 
 NEW FEATURES (full details always in ChangeLog):
 
-A. ncclimo will reshape timeseries, i.e., split input datasets into
-   per-variable files that span the entire timeseries.
-   Input files are specified via stdin, via positional arguments
-   (after all options) on the command-line, or as the set of .nc files
-   in drc_in 
-   ls $drc_in/*.nc | ncclimo -v T,Q --output=drc_out --map=rgr_map
-   ncclimo -v T,Q --output=drc_out --map=rgr_map < list
-   ncclimo -v T,Q --output=drc_out --map=rgr_map $drc_in/*.nc
-   ncclimo -v T,Q --input=$drc_in --output=drc_out --map=rgr_map
-   http://nco.sf.net/nco.html#ncclimo
-
-A. ncks allows setting per-variable chunk cache-size with --cnk_csh. 
-   The effects of varying chunk cache-size are not well understood,
-   at least by we who work on NCO. Users asked for a knob to tune
-   it, and now that exists. Experiment with this and if you find
-   reasons for NCO to set this to non-default values, let us know.
-   If you want more knobs, let us know.
+A. ncks allows setting chunk cache-size with --cnk_csh with all
+   applicable operators. This sets the cache size for all variables. 
+   Users have demonstrated that increasing cache size can dramatically
+   speed-up chunking operations on large datasets.
    This setting only works on netCDF4 files.
-   ncks -D 3 --cnk_csh 1000000 in.nc4 out.nc
+   ncrcat --cnk_csh=1000000000 --cnk_plc=g3d --cnk_dmn=time,365 \
+          --cnk_dmn=lat,1800 --cnk_dmn=lon,3600 in*.nc4 out.nc4
    http://nco.sf.net/nco.html#cnk_csh
-
-A. ncremap now includes staggered grid weights with FV grid output. 
-   The weights are named w_stag, following the CESM CAM convention. 
+   Thanks to Hugo Oliveira for encouraging this feature
+
+B. ncks now prints the human-legible calendar string corresponding to
+   values with UDUnits date units (time since basetime, e.g., "days
+   since 2000-01-01") and CF calendar attribute, if any. Enact this
+   with the --calendar option when printing. Using dbg_lvl >= 1 in CDL 
+   mode prints both the value and calendar string (one in comments):
+
+   zender at aerosol:~$ ncks -D 1 --cdl --cal -v tm_365 ~/nco/data/in.nc
+   tm_365 = "2013-03-01"; // double value: 59
+   zender at aerosol:~$ ncks -D 1 --cdl -v tm_365 ~/nco/data/in.nc
+   tm_365 = 59; // calendar format: "2013-03-01"
+
+   This option is similar to the ncdump -t option.
+   Does this work how you'd like? Let us know.
+   http://nco.sf.net/nco.html#cal
+
+C. ncap2 now seamlessly edits character arrays.
+   Suppose you have a string stored as an old school character array
+   (not a netCDF4 string) with a fixed dimension size. ncap2 now
+   supports altering the string value without having to manually pad
+   the RHS to the exact dimension size of the LHS:
+
+   ncap2 -s 'date_sng="2016-05-11_06:00:00"' in.nc out.nc
+   ncap2 -s 'date_sng="automatic padding"' in.nc out.nc
+
+   The exact same syntax has always worked on netCDF4 strings.
+   This new feature frees users from needing to know the ugly details
+   of netCDF3 string storage.
+   http://nco.sf.net/nco.html#ncap2
+
+D. ncremap support a verbosity level option, --vrb_lvl.
+   Verbosity level is now independent of debug level, dbg_lvl, so
+   users can customize how much ncremap information to print.
+   Default vrb_lvl=2 and supported levels range from 0 (no output) to
+   4 (most verbose). The verbosity of the underlying remapping,
+   which invokes ncks, is still controlled by dbg_lvl not vrb_lvl.
+   ncremap --vrb_lvl=1 -i in.nc -m map.nc -o out.nc
+   http://nco.sf.net/nco.html#ncremap
+   Thanks to Milena Veneziani for requesting.
+
+E. ncremap and ncclimo now support a version option, --version.
+   This option prints the operator version and configuration.
+   It's a painless way to tell, e.g., if ncremap knows where your 
+   ESMF_RegridWeightGen executable is, and where these scripts
+   look for NCO and what version of netCDF is linked to:
+   ncremap --version
+   ncclimo --version
    http://nco.sf.net/nco.html#ncremap
+   http://nco.sf.net/nco.html#ncclimo
 
-A. Variables listed in a formula_terms attribute are now extracted
-   by default. Turn-off this behavior with --no_frm_trm.
-   The CF formula_terms convention is used to associate variables
-   with terms in defined formulas, such as vertical coordinates:
-   lev:standard_name = "atmosphere_hybrid_sigma_pressure_coordinate"
-   lev:formula_terms = "a: hyam b: hybm p0: P0 ps: PS"
-   Unless the default behavior is overridden, NCO attaches any 
-   formula variables to the extraction list along with the primary
-   variable and other associated variables. By definition, formula
-   variables are a subset of the rank of the variable they define.
-   http://nco.sf.net/nco.html#frm_trm
-
-A. Variables listed in a cell_measures attribute are now extracted
-   by default. Turn-off this behavior with --no_cll_msr.
-   This convention allows variables to indicate which other variables 
-   contains area or volume information about a gridcell.
-   These measures variables are pointed to by the cell_measures
-   attribute. Unless the default behavior is overridden, NCO attaches
-   all measures variables to the extraction list along with the
-   primary variable.
-   http://nco.sf.net/nco.html#cll_msr
+F. ncremap and ncks now parse more unknown grids than before.
+   The front-end of ncremap's grid-inferenence routine has been
+   refactored to rely on less user-provided information about
+   dimension names. Now it obtains more information than before
+   by examining the grid coordinates. As a result, grids from
+   data files with strange dimension names are likelier to be parsed. 
 
 BUG FIXES:
 
-A. Fix bug introduced in 4.6.3 where hyperslabs involving UDUnits
-   dates could fail, depending on exactly how NCO was compiled.
-   Failures most likely on MacOS because clang, unlike gcc, does not
-   initialize pointers to NULL by default. Solution is to upgrade.
+A. ncap2 attribute propagation for some unary operators is fixed.
+   It had been broken since ~4.6.3 for unary operations like 'time+=10'
+   whereas it was working fine for binary operations, e.g., 'T=T+10'.
+   Thanks to Qi Tang for sounding the alert. Solution is to upgrade.
+
+B. The chunk cache option (--cnk_csh) implemented in ncks in 4.6.4 was  
+   inadvertently doing a no-op. Now it works as advertised.
+   No workaround, solution is to upgrade.
+
+C. A broken diagnostic introduced in 4.6.3 or 4.6.4 could cause the
+   regridder to fail. This occurred with some POP files. Diagnostic
+   now turned-off. Solution is to upgrade, workaround is use NCO <=
+   4.6.2. Thanks to Sungduk Yu for reporting.
 
-A. Fix bug introduced in ~4.4.6 where some hyperslabs of non-unity 
-   stride in netCDF4 files could return incorrect values.
-   If you use the hyperslab stride argument on netCDF4 files, we
-   suggest you upgrade immediately. The workaround is to convert
-   to netCDF3 before using a strided hyperslab. 
-   Thanks to Martin Dix for reporting this bug.
+D. Bad command-line options now always return with EXIT_FAILURE (1).
+   Previously they could return with EXIT_SUCCESS (0).
+   Thanks to Jerome Mao for reporting.
 
 KNOWN PROBLEMS DUE TO NCO:
 
    This section of ANNOUNCE reports and reminds users of the
    existence and severity of known, not yet fixed, problems. 
-   These problems occur with NCO 4.6.4 built/tested under
+   These problems occur with NCO 4.6.5 built/tested under
    MacOS 10.12.1 with netCDF 4.4.1 on HDF5 1.8.16 and with
    Linux with netCDF 4.4.2-development (20161116) on HDF5 1.8.16.
 
diff --git a/doc/ChangeLog b/doc/ChangeLog
index ae55be4..98bdc42 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,128 @@
+2017-03-15  Charlie Zender  <zender at uci.edu>
+
+	* NCO 4.6.5 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5 final changes';git push
+	git tag -a 4.6.5 -m 'Version 4.6.5 new features: --cnk_csh, EXIT_FAILURE, ncclimo/ncremap version/vrb_lvl, ncks --cal, nfr() refactor, POP fix';git push --tags
+
+2017-03-14  Charlie Zender  <zender at uci.edu>
+
+	* NCO 4.6.5-beta01 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5-beta01 final changes';git push
+	git tag -a 4.6.5-beta01 -m 'Version 4.6.5-beta01 new features: unary operation attribute propagation, MSVC fixes, EXIT_FAILURE';git push --tags
+
+	* Tidy nco_prn() and nco_cln_utl() warnings
+
+	* Return with EXIT_FAILURE not EXIT_SUCCESS for bad commandline options
+
+2017-03-13  Charlie Zender  <zender at uci.edu>
+
+	* Henry fixed attribute propagation on ncap2 unary operators
+
+2017-03-11  Charlie Zender  <zender at uci.edu>
+
+	* Print nco_fl_open() INFO messages only once to avoid redundant messages
+
+2017-03-09  Charlie Zender  <zender at uci.edu>
+
+	* Add MSVC workaround to gmtime_r() in fmc_all_cls.cc
+
+	* Add missing stub prototypes to nco_cln_utl.h and fix MSVC compilation
+
+2017-03-09 Henry Butowsky  <henryb at hush.com>
+
+	* Fix plain var NC_CHAR assign statment so if var exists in Input then shape is obtained from Input
+
+2017-03-08  Charlie Zender  <zender at uci.edu>
+
+	* Document --calendar option
+
+	* NCO 4.6.5-alpha04 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5-alpha04 final changes';git push
+	git tag -a 4.6.5-alpha04 -m 'Version 4.6.5-alpha04 new features: ncclimo/ncremap copyright, quieter, nco_grd_nfr() refactor, ncap2 calendar format';git push --tags
+
+	* Add ECMWF IFS data wrangling example to ncclimo docs for Jerry Potter
+
+2017-03-07  Charlie Zender  <zender at uci.edu>
+
+	* Improve nco_grd_nfr() to recognize all CF-approved forms of degrees_north and degrees_east
+
+	* Re-factor nco_grd_nfr() algorithm to find coordinates first,
+	then use coordinates to unambiguously deduce dimension names
+
+2017-03-05  Charlie Zender  <zender at uci.edu>
+
+	* Suppress multiple NaN warnings from nco_mss_val_get_dbl()
+
+	* Functionalize chunk cache size set into nco_cnk_csh_ini()
+
+2017-03-04  Charlie Zender  <zender at uci.edu>
+
+	* Output NCO-standardish copyright/config notice from ncremap/ncclimo --version
+
+2017-03-03  Charlie Zender  <zender at uci.edu>
+
+	* NCO 4.6.5-alpha03 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5-alpha03 final changes';git push
+	git tag -a 4.6.5-alpha03 -m 'Version 4.6.5-alpha03 new features: rgr pop sungduk, timestamps, --version, --cnk_csh, --vrb_lvl ';git push --tags
+
+	* Add --prn_vrb option to ncremap
+
+2017-03-02  Charlie Zender  <zender at uci.edu>
+
+	* Add chunk cache set to all other applicable operators
+
+2017-03-01  Charlie Zender  <zender at uci.edu>
+
+	* Clean-up warnings/redundancies in nco_rgr.c, nco_cln_utl.c
+
+	* Add chunk cache set to ncra.c, fix it in ncks.c
+
+2017-02-28  Charlie Zender  <zender at uci.edu>
+
+	* Define vrs_prn before referencing in ncclimo, ncremap
+
+	* Change timestamp printing switch from --prn_timestamp to --cal and synonyms
+
+2017-02-28 Henry Butowsky  <henryb at hush.com>
+
+	* Added timestamp printing capability to ncks
+
+2017-02-24  Charlie Zender  <zender at uci.edu>
+
+	* Add --version option to ncclimo, ncremap
+
+2017-02-23  Charlie Zender  <zender at uci.edu>
+
+	* Prettify ncclimo self-documentation
+
+2017-02-17  Charlie Zender  <zender at uci.edu>
+
+	* Turn-off whiteboard latitude circle routine until devise fix for Sungduk's POP case
+
+2017-02-15  Charlie Zender  <zender at uci.edu>
+
+	* NCO 4.6.5-alpha02 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5-alpha02 final changes';git push
+	git tag -a 4.6.5-alpha02 -m 'Version 4.6.5-alpha02 new features: where() fix for vpointers';git push --tags
+
+2017-02-13 Henry Butowsky  <henryb at hush.com>
+
+	* Modify where_assign() method in grammar so that it can handle vpointers in where() body
+
+2017-02-10  Charlie Zender  <zender at uci.edu>
+
+	* Restore correct values for three_dmn_rec_var in in.cdl that were inadvertently changed in 4.6.4
+
+2017-02-09  Charlie Zender  <zender at uci.edu>
+
+	* NCO 4.6.5-alpha01 release procedure:
+	cd ~/nco;git commit -a -m 'Version 4.6.5-alpha01 final changes';git push
+	git tag -a 4.6.5-alpha01 -m 'Version 4.6.5-alpha01 new features: re-introduce fixed USE_NC4_SRD_WORKAROUND';git push --tags
+
+2017-02-08  Charlie Zender  <zender at uci.edu>
+
+	* Re-instate USE_NC4_SRD_WORKAROUND only when strided dimension is first dimension
+
 2017-02-07  Charlie Zender  <zender at uci.edu>
 
 	* NCO 4.6.4 release procedure:
diff --git a/doc/TODO b/doc/TODO
index 5d71675..b4403f8 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -694,7 +694,7 @@ nco1133. ncks CDL-mode do UDUnits time conversions to ISO (added 20161116)
 	 ncdump -t ~/nco/data/in.nc | grep tm_
 nco1134. MSA: wrapped limit with an additional limit pvn20160211 -- bug found that happens in nco 4.2.0 also
 	 ncks -O -C --msa -g g19 -v time -d time,9,0 -d time,1,2 ~/nco/data/in_grp_3.nc ~/foo.nc
-nco1135. USE_NC4_SRD_WORKAROUND is broken:
+nco1135. USE_NC4_SRD_WORKAROUND is broken: (added 20170201 fixed 20170207)
 	 ncks -v zg -H -C -d time,0,1 -d lev,0,2,2 ~/nco/data/in.nc # works
       	 ncks -v zg -H -C -d time,0,1 -d lev,0,2,2 ~/nco/data/in_4c.nc # borken
 nco1136. 
diff --git a/doc/VERSION b/doc/VERSION
index ef36c9a..f18045d 100644
--- a/doc/VERSION
+++ b/doc/VERSION
@@ -1 +1 @@
-4.6.4
+4.6.5
diff --git a/doc/debian.txt b/doc/debian.txt
index e4c7bd2..19c831b 100644
--- a/doc/debian.txt
+++ b/doc/debian.txt
@@ -29,18 +29,18 @@ apt-get install dh-make debhelper devscripts fakeroot gnupg debian-policy develo
 
 2. Debian build procedure recommends placing entire package source in
    subdirectory of main package. 
-   For starters, we wish to create .debs of tagged releases, e.g., nco-4.6.4
-   First we create a clean source distribution of nco and place it in nco-4.6.4
+   For starters, we wish to create .debs of tagged releases, e.g., nco-4.6.5
+   First we create a clean source distribution of nco and place it in nco-4.6.5
    Until we know what is necessary, however, we just copy a snapshot
    
    2.1 Clean all build files from development directory
 
 cd ~/nco;make distclean;cd bld;make clean;cd ~
 tar cvzf ./nco/nco.tar.gz ./nco/*
-cd ~/nco;tar xvzf nco.tar.gz;mv nco nco-4.6.4
-/bin/rm nco.tar.gz;tar cvzf nco-4.6.4.tar.gz ./nco-4.6.4/*
-cd ~/nco/nco-4.6.4
-dh_make -e zender at uci.edu -f ../nco-4.6.4.tar.gz
+cd ~/nco;tar xvzf nco.tar.gz;mv nco nco-4.6.5
+/bin/rm nco.tar.gz;tar cvzf nco-4.6.5.tar.gz ./nco-4.6.5/*
+cd ~/nco/nco-4.6.5
+dh_make -e zender at uci.edu -f ../nco-4.6.5.tar.gz
 
     2.2 The preceding steps created template debian files for a .deb,
     Those files now reside in ~/nco/debian.
@@ -55,7 +55,7 @@ dh_make -e zender at uci.edu -f ../nco-4.6.4.tar.gz
    from previous build
 
    cd ~/nco;/bin/rm *.gz
-   cd ~/nco/nco-4.6.4
+   cd ~/nco/nco-4.6.5
    dpkg-buildpackage -rfakeroot > foo 2>&1
    dpkg-buildpackage -rsudo > foo 2>&1
 
@@ -84,33 +84,33 @@ patch -p0 < nco_X.Y.Z-3.diff   # Patch destination with Debian diff
    make tags
 # Put cute version-specific string in nco_ctl.c:nco_nmn_get()
 # Install correct version numbers before updating Debian
-# tags-query replace 4.6.4 with X.Y.Z+1
+# tags-query replace 4.6.5 with X.Y.Z+1
 # If tags-query replace does not work, be sure to manually change
 # versions in configure.ac, debian/files, doc/ANNOUNCE, doc/debian.txt,
 # doc/index.shtml, doc/nco.texi, bld/nco_dst.pl, doc/VERSION
 # 20141201: Change NCO_VERSION_PATCH in src/nco.h!!!!!!!!!!!!!!!!!!!!!!
-   cd ~/nco/debian;dch -b --force-distribution --distribution=unstable -v 4.6.4-1 # Update changelog (-b forces this version number)
+   cd ~/nco/debian;dch -b --force-distribution --distribution=unstable -v 4.6.5-1 # Update changelog (-b forces this version number)
    emacs ~/nco/bld/nco.spec # Update changelog
 # For unknown reason rules file may lose its executable bit
    chmod a+x ~/nco/debian/rules
 # Rebuild autotools so new version # propagates
    cd ~/nco;aclocal;autoheader;automake --foreign;autoconf
 # Save all files in emacs before tagging
-   ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.6.4
+   ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.6.5
 # Upload tarball to SF https://sourceforge.net/projects/nco/files 
-   cd;scp dust.ess.uci.edu:/var/www/html/nco/src/nco-4.6.4.tar.gz .
+   cd;scp dust.ess.uci.edu:/var/www/html/nco/src/nco-4.6.5.tar.gz .
 
 7. Ubuntu PPA
 https://help.launchpad.net/Packaging/PPA
-dput NCO nco_4.6.4-2~ppa1_source.changes
+dput NCO nco_4.6.5-2~ppa1_source.changes
 sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com
 
 # Location of build diagnostics for mentors to help 
-http://dust.ess.uci.edu/nco/src/nco_4.6.4-1.dpkg-buildpackage.txt
-http://dust.ess.uci.edu/nco/src/nco_4.6.4-1.dsc
-http://dust.ess.uci.edu/nco/src/nco_4.6.4-1_i386.changes
-http://dust.ess.uci.edu/nco/src/nco_4.6.4-1_i386.deb
-http://dust.ess.uci.edu/nco/src/nco_4.6.4.orig.tar.gz
+http://dust.ess.uci.edu/nco/src/nco_4.6.5-1.dpkg-buildpackage.txt
+http://dust.ess.uci.edu/nco/src/nco_4.6.5-1.dsc
+http://dust.ess.uci.edu/nco/src/nco_4.6.5-1_i386.changes
+http://dust.ess.uci.edu/nco/src/nco_4.6.5-1_i386.deb
+http://dust.ess.uci.edu/nco/src/nco_4.6.5.orig.tar.gz
 
 # Becoming a Debian developer
 http://www.debian.org/devel/join/newmaint
@@ -164,31 +164,31 @@ Matej Vela <vela at debian.org>, Daniel Baumann <daniel at debian.org>, Warren Turkal
 # export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/X11R6/lib
 # sudo aptitude install antlr bison flex gsl-bin libgsl0-dev libantlr-dev netcdf-bin libnetcdfc7 libnetcdf-dev texinfo libcurl4-gnutls-dev libexpat1-dev libxml2-dev udunits-bin libudunits2-0 libudunits2-dev
 cd ~/nco;cvc
-sudo /bin/rm -rf ${DATA}/nco-4.6.4 ${DATA}/nco_4.6.4* ${DATA}/debian # Cleanup last build. sudo necessary for removal because dpkg-buildpackage uses sudo?
-# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.4-1 -d nco-4.6.4 nco # Export based on tag
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -d nco-4.6.4 nco # Export most recent
-tar cvzf ./nco_4.6.4.orig.tar.gz --exclude='nco-4.6.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.4 
-/bin/rm -rf ${DATA}/nco-4.6.4 # Remove cvs-exported directory
-tar xvzf ./nco_4.6.4.orig.tar.gz # Untar to get directory without excluded files
-mkdir -p ${DATA}/nco-4.6.4/debian/source;cd ~/nco/debian;/bin/cp changelog compat control convert copyright doc-base files info rules ${DATA}/nco-4.6.4/debian;cd ~/nco/debian/source;/bin/cp format ${DATA}/nco-4.6.4/debian/source # Replace debian directory with _CURRENT_ (main trunk) settings
+sudo /bin/rm -rf ${DATA}/nco-4.6.5 ${DATA}/nco_4.6.5* ${DATA}/debian # Cleanup last build. sudo necessary for removal because dpkg-buildpackage uses sudo?
+# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.5-1 -d nco-4.6.5 nco # Export based on tag
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -d nco-4.6.5 nco # Export most recent
+tar cvzf ./nco_4.6.5.orig.tar.gz --exclude='nco-4.6.5/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.5 
+/bin/rm -rf ${DATA}/nco-4.6.5 # Remove cvs-exported directory
+tar xvzf ./nco_4.6.5.orig.tar.gz # Untar to get directory without excluded files
+mkdir -p ${DATA}/nco-4.6.5/debian/source;cd ~/nco/debian;/bin/cp changelog compat control convert copyright doc-base files info rules ${DATA}/nco-4.6.5/debian;cd ~/nco/debian/source;/bin/cp format ${DATA}/nco-4.6.5/debian/source # Replace debian directory with _CURRENT_ (main trunk) settings
 #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support
-#cd ${DATA}/nco-4.6.4;dpkg-buildpackage -rsudo -uc -us > ~/foo.nco 2>&1 # -uc -us: Do not sign changes or source files
-#cd ${DATA}/nco-4.6.4;dpkg-buildpackage -rsudo -sa > ~/foo.nco 2>&1 # -sa: Include _orig.tar.gz in .changes 
-cd ${DATA}/nco-4.6.4;dpkg-buildpackage -rsudo > ~/foo.nco 2>&1
+#cd ${DATA}/nco-4.6.5;dpkg-buildpackage -rsudo -uc -us > ~/foo.nco 2>&1 # -uc -us: Do not sign changes or source files
+#cd ${DATA}/nco-4.6.5;dpkg-buildpackage -rsudo -sa > ~/foo.nco 2>&1 # -sa: Include _orig.tar.gz in .changes 
+cd ${DATA}/nco-4.6.5;dpkg-buildpackage -rsudo > ~/foo.nco 2>&1
 sudo dpkg --remove nco
-sudo dpkg --install ${DATA}/nco_4.6.4-1_*.deb
+sudo dpkg --install ${DATA}/nco_4.6.5-1_*.deb
 cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress
 # http://lintian.debian.org/full/zender@uci.edu.html
-lintian ${DATA}/nco_4.6.4-1_*.deb
-ls -l ${DATA}/nco_4.6.4*
+lintian ${DATA}/nco_4.6.5-1_*.deb
+ls -l ${DATA}/nco_4.6.5*
 m ~/foo.nco
 # Upload Ubuntu (rather than Debian) packages to websites
-scp ${DATA}/nco_4.6.4* dust.ess.uci.edu:/var/www/html/nco/src
-scp ${DATA}/nco_4.6.4* zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+scp ${DATA}/nco_4.6.5* dust.ess.uci.edu:/var/www/html/nco/src
+scp ${DATA}/nco_4.6.5* zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 # NB: Make sure RPMs build before uploading to debian, since changing
 # Debian versions is a PITA
 # NB: Only upload pbuilder Debian Sid (not personal Ubuntu) .deb builds to Debian mentors
-# cd ${DATA};dupload -t mentors nco_4.6.4-1_*.changes
+# cd ${DATA};dupload -t mentors nco_4.6.5-1_*.changes
 bsrc # Reset shell environment for regular development
 
 # New build system #2
@@ -202,52 +202,52 @@ DIST=sid sudo pbuilder update # Update chroot before building package in it
 # dget http://ftp.debian.org/debian/pool/main/n/nco/nco_3.9.0-1.dsc
 # dget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1-1.dsc
 # apt-get source nco # Get package source
-sudo /bin/rm /var/cache/pbuilder/result/nco_4.6.4* # Cleanup prior build
+sudo /bin/rm /var/cache/pbuilder/result/nco_4.6.5* # Cleanup prior build
 # To pass DEB_BUILD_OPTIONS to pbuilder while using sudo, one must first
 # modify sudoers with visudo to prevent sudo from resetting environment
 #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support
-cd ${DATA};DIST=sid sudo pbuilder build nco_4.6.4-1.dsc > ~/foo.nco.pbuilder 2>&1
-cd /var/cache/pbuilder/result;debsign -k6F635D10 nco_4.6.4-1_*.changes
-lintian /var/cache/pbuilder/result/nco_4.6.4-1_*.deb
+cd ${DATA};DIST=sid sudo pbuilder build nco_4.6.5-1.dsc > ~/foo.nco.pbuilder 2>&1
+cd /var/cache/pbuilder/result;debsign -k6F635D10 nco_4.6.5-1_*.changes
+lintian /var/cache/pbuilder/result/nco_4.6.5-1_*.deb
 sudo dpkg --remove nco
-sudo dpkg --install /var/cache/pbuilder/result/nco_4.6.4-1_*.deb
+sudo dpkg --install /var/cache/pbuilder/result/nco_4.6.5-1_*.deb
 cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress
 # NB: Upload pbuilder Debian Sid packages to Debian mentors, but not
 # to personal or NCO websites since most people use Ubuntu not Debian
 # NB: Debian versions are a PITA, ensure RPMs build before uploading to Debian
-cd /var/cache/pbuilder/result;dupload -t mentors nco_4.6.4-1_*.changes
+cd /var/cache/pbuilder/result;dupload -t mentors nco_4.6.5-1_*.changes
 
 # RPM builds as root
 export rpm_root='/usr/src/redhat'
 # export sudo_sng='' # sudo not-necessary when builing in user directories
 export sudo_sng='sudo' # sudo necessary when building in system directories
 cd ~/nco;cvc;cvu
-/bin/rm -rf ${DATA}/nco-4.6.4 ${DATA}/nco-4.6.4* # Cleanup last build
+/bin/rm -rf ${DATA}/nco-4.6.5 ${DATA}/nco-4.6.5* # Cleanup last build
 ${sudo_sng} /bin/rm -r -f \
-${rpm_root}/BUILD/nco-4.6.4 \
-${rpm_root}/RPMS/i386/nco-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-4.6.4-?.i386.rpm \
-${rpm_root}/SOURCES/nco-4.6.4.tar.gz \
-${rpm_root}/SPECS/nco-4.6.4.spec \
-${rpm_root}/SRPMS/nco-4.6.4-?.src.rpm
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.4-1 -d nco-4.6.4 nco # Export based on tag
-${sudo_sng} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/SPECS/nco-4.6.4.spec
-tar cvzf ./nco-4.6.4.tar.gz --exclude='nco-4.6.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.4 
-${sudo_sng} /bin/cp ${DATA}/nco-4.6.4.tar.gz ${rpm_root}/SOURCES
+${rpm_root}/BUILD/nco-4.6.5 \
+${rpm_root}/RPMS/i386/nco-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-4.6.5-?.i386.rpm \
+${rpm_root}/SOURCES/nco-4.6.5.tar.gz \
+${rpm_root}/SPECS/nco-4.6.5.spec \
+${rpm_root}/SRPMS/nco-4.6.5-?.src.rpm
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.5-1 -d nco-4.6.5 nco # Export based on tag
+${sudo_sng} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/SPECS/nco-4.6.5.spec
+tar cvzf ./nco-4.6.5.tar.gz --exclude='nco-4.6.5/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.5 
+${sudo_sng} /bin/cp ${DATA}/nco-4.6.5.tar.gz ${rpm_root}/SOURCES
 cd ${rpm_root}/SPECS
-${sudo_sng} rpmbuild -ba --sign nco-4.6.4.spec > ~/foo.nco 2>&1
+${sudo_sng} rpmbuild -ba --sign nco-4.6.5.spec > ~/foo.nco 2>&1
 scp \
-${rpm_root}/RPMS/i386/nco-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-4.6.4-?.i386.rpm \
-${rpm_root}/SRPMS/nco-4.6.4-?.src.rpm \
+${rpm_root}/RPMS/i386/nco-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-4.6.5-?.i386.rpm \
+${rpm_root}/SRPMS/nco-4.6.5-?.src.rpm \
 dust.ess.uci.edu:/var/www/html/nco/src
 scp \
-${rpm_root}/RPMS/i386/nco-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-4.6.4-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-4.6.4-?.i386.rpm \
-${rpm_root}/SRPMS/nco-4.6.4-?.src.rpm \
+${rpm_root}/RPMS/i386/nco-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-4.6.5-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-4.6.5-?.i386.rpm \
+${rpm_root}/SRPMS/nco-4.6.5-?.src.rpm \
 zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 
 # RPM builds as user
@@ -256,33 +256,33 @@ zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 export rpm_root="${DATA}/rpm/nco"
 #cd ~/nco;cvc;cvu # This risks committing unwanted *.[ch]pp files
 mkdir -p ${DATA}/rpm/nco/TMP ${DATA}/rpm/nco/BUILD
-/bin/rm -rf ${DATA}/nco-4.6.4 ${DATA}/nco-4.6.4* # Cleanup last build
+/bin/rm -rf ${DATA}/nco-4.6.5 ${DATA}/nco-4.6.5* # Cleanup last build
 /bin/rm -r -f \
-${rpm_root}/nco-4.6.4-?.src.rpm \
-${rpm_root}/nco-4.6.4.spec \
-${rpm_root}/nco-4.6.4.tar.gz \
-${rpm_root}/*/nco-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-devel-4.6.4-?.*.rpm
-# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.4-1 -d nco-4.6.4 nco # Export based on tag
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -dnco-4.6.4 nco # Export most recent and build as 4.6.4-1
-tar cvzf ./nco-4.6.4.tar.gz --exclude='nco-4.6.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.4 
-/bin/cp ${DATA}/nco-4.6.4.tar.gz ${rpm_root}
+${rpm_root}/nco-4.6.5-?.src.rpm \
+${rpm_root}/nco-4.6.5.spec \
+${rpm_root}/nco-4.6.5.tar.gz \
+${rpm_root}/*/nco-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-devel-4.6.5-?.*.rpm
+# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.6.5-1 -d nco-4.6.5 nco # Export based on tag
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -dnco-4.6.5 nco # Export most recent and build as 4.6.5-1
+tar cvzf ./nco-4.6.5.tar.gz --exclude='nco-4.6.5/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.6.5 
+/bin/cp ${DATA}/nco-4.6.5.tar.gz ${rpm_root}
 ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/nco.spec
 cd ${rpm_root}
 rpmbuild -ba --sign nco.spec > ~/foo.nco 2>&1
-rpmlint ${rpm_root}/*/nco-4.6.4-?.*.rpm
+rpmlint ${rpm_root}/*/nco-4.6.5-?.*.rpm
 sudo yum remove nco
-sudo yum install ${rpm_root}/*/nco-4.6.4-?.*.rpm
+sudo yum install ${rpm_root}/*/nco-4.6.5-?.*.rpm
 scp \
-${rpm_root}/*/nco-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-devel-4.6.4-?.*.rpm \
-${rpm_root}/nco-4.6.4-?.*.src.rpm \
+${rpm_root}/*/nco-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-devel-4.6.5-?.*.rpm \
+${rpm_root}/nco-4.6.5-?.*.src.rpm \
 dust.ess.uci.edu:/var/www/html/nco/src
 scp \
-${rpm_root}/*/nco-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-4.6.4-?.*.rpm \
-${rpm_root}/*/nco-devel-4.6.4-?.*.rpm \
-${rpm_root}/nco-4.6.4-?.*.src.rpm \
+${rpm_root}/*/nco-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-4.6.5-?.*.rpm \
+${rpm_root}/*/nco-devel-4.6.5-?.*.rpm \
+${rpm_root}/nco-4.6.5-?.*.src.rpm \
 zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
diff --git a/doc/index.shtml b/doc/index.shtml
index 32cfcb0..7adccc0 100644
--- a/doc/index.shtml
+++ b/doc/index.shtml
@@ -70,7 +70,7 @@ Try to disable Spammers' machines:
 <p><h1 align="center">Bienvenue sur le netCDF Operator (NCO) site</h1>
 
 <p><h2>
-Current stable NCO version is 4.6.4 released <!--#flastmod file="src/nco-4.6.4.tar.gz"-->
+Current stable NCO version is 4.6.5 released <!--#flastmod file="src/nco-4.6.5.tar.gz"-->
 </h2>
 
 <table border=0 width=100%>
@@ -149,33 +149,34 @@ and
 <h2>Recent Releases & Milestones</h2>
 
 <ul>
-<li>2017 Mar ??: 4.6.5 (<i>In progress</i>)
-<li>2017 Feb 07: 4.6.4
+<li>2017 Apr ??: 4.6.6 (<i>In progress</i>)
+<li>2017 Mar 15: 4.6.5 (Sundry features/fixes)
+<li>2017 Feb 07: 4.6.4 (<tt>ncclimo</tt> splitter)
 <li>2017 Jan 27: <i>Geosci. Model Dev.</i> publishes compression-error trade-off <a href="http://www.geosci-model-dev.net/10/413/2017">paper</a></li>
-<li>2016 Dec 23: 4.6.3 (Minor features)
+<li>2016 Dec 23: 4.6.3 (Sundry features/fixes)
 <li>2016 Nov 16: 4.6.2 (JSON)
 <li>2016 Sep 19: <i>Geosci. Model Dev.</i> publishes PPC <a href="http://www.geosci-model-dev.net/9/3199/2016">paper</a></li>
-<li>2016 Aug 06: 4.6.1 (Stability)
+<li>2016 Aug 06: 4.6.1 (Sundry features/fixes)
 <li>2016 Jul 06: Submitted Layer-packing <a href="http://www.geosci-model-dev-discuss.net/gmd-2016-177">manuscript</a> to <i>Geosci. Model Dev.</i></li>
 <li>2016 May 12: 4.6.0 (<tt>ncclimo</tt>)
 <li>2016 Apr 06: <a href="http://dust.ess.uci.edu/smn/pst_nco_esds_201604.pdf">Poster</a> at NASA ESDSWG, Greenbelt</li>
 <li>2016 Apr 05: <a href="http://dust.ess.uci.edu/smn/smn_nco_gsfc_201604.pdf">Talk</a> at NASA GES DISC, Greenbelt</li>
 <li>2016 Mar 22: Submitted PPC manuscript to <i>Geosci. Model Dev.</i></li>
-<li>2016 Feb 17: 4.5.5 (Stability)
+<li>2016 Feb 17: 4.5.5 (Sundry features/fixes)
 <li>2016 Jan 07: 4.5.4 (<tt>ncremap</tt>)
 <li>2015 Dec 16: <a href="http://dust.ess.uci.edu/smn/pst_nco_agu_201512.pdf">Poster</a> at Fall AGU, San Francisco</li>
 <li>2015 Nov 04: <a href="http://dust.ess.uci.edu/smn/smn_nco_acme_201511.pdf">Talk</a> at DOE ACME, Albuquerque</li>
 <li>2015 Oct 20: 4.5.3 (Curvilinear)
 <li>2015 Sep 06: 4.5.2 (Generate SCRIP)
 <li>2015 Sep 01: NSF EarthCube <a href="#prp_e3">project</a> commences</li>
-<li>2015 Jul 10: 4.5.1 (Stability)
+<li>2015 Jul 10: 4.5.1 (Sundry features/fixes)
 <li>2015 Jun 11: 4.5.0 (Regridding)
 <li>2015 May 21: 4.4.9 (<tt>ncra</tt> weights)
 <li>2015 Feb 16: 4.4.8 (Precision-Preserving Compression)
 <li>2014 Dec 15: DOE ACME <a href="#prp_acme">project</a> commences</li>
 <li>2014 Nov 26: 4.4.7 (Chunking features)
 <li>2014 Oct 01: 4.4.6 (<tt>ncra, ncwa</tt> packing bugfixes, stride optimization)
-<li>2014 Aug 26: 4.4.5 (Stability)
+<li>2014 Aug 26: 4.4.5 (Sundry features/fixes)
 <li>2014 Jul 01: NASA ACCESS 2013 <a href="#prp_axs">project</a> commences</li>
 <li><a href="./milestones_old.shtml">Milestones from 200301–201406 (versions 2.8.4–4.4.4)</a></li>
 <li><a href="./nco_news.shtml">News and Announcements from 199801–200212 (version 1.1.0–2.8.3) and earlier</a></li>
@@ -325,7 +326,7 @@ This may incentivize us to tackle your favorite <a href="./TODO"><tt>TODO</tt></
 Inspired by President Obama's plan to bring more transparency to
 government investment, these homepage donation counters track the
 influence of your monetary donations on NCO development: 
-<dt>Donations received between 20030624 and 20141126: US$144.55. Thank you, donors!</dt>
+<dt>Donations received between 20030624 and 20170217: US$149.55. Thank you, donors!</dt>
 <dt>NCO features “incentivized” by these donations: More emoticons in the documentation :)</dt>
 <hr></p>
 
@@ -624,22 +625,28 @@ Identical copies of those tarballs are also stored
 <a href="http://nco.sf.net/src">here</a> on SourceForge for historical
 continuity.
 You may retrieve the source of tagged versions directly with, e.g.,
-<tt>git clone -b 4.6.4 http://github.com/nco/nco.git nco-4.6.4</tt></a>.
+<tt>git clone -b 4.6.5 http://github.com/nco/nco.git nco-4.6.5</tt></a>.
 <ul>
-<li><b>NCO 4.6.5</b>: (<i>Future</i>) 
-<tt>ncks</tt> prints human-legible ISO8601 dates;
-<a href="http://nco.sf.net/nco.html#cnk">Chunking</a> bytes not elements, caching;
+<li><b>NCO 4.6.7</b>: (<i>Future</i>)
+<a href="http://nco.sf.net/nco.html#cnk">Chunking</a> bytes not elements;
 extensive hashing?;
 netCDF4 compound types?;
-Optimize diskless files?;</li>
 <tt>ncks --xtn</tt> better extensive variable treatment;</li>
-<li><b>NCO 4.6.4</b>: (<i>In Progress, features in-progress or completed include</i>)
-<tt>ncks</tt> set chunk cache-size with <tt>--cnk_csh</tt>;
+<li><b>NCO 4.6.6</b>: (<i>In Progress, features in-progress or completed include</i>) 
+<tt>ncks --xtn</tt> better extensive variable treatment;</li>
+<li><b>NCO 4.6.5</b>: (<i>Current Stable Release</i>)
+<tt>ncks --cal</tt> prints human-legible ISO8601 dates;
+<tt>ncclimo/ncremap --version</tt> switch;
+<tt>ncremap --vrb_lvl</tt> verbosity level;
+<tt>ncremap</tt> refactor dimension inferral, fix POP re-grids;
+Set chunk cache-size with <tt>--cnk_csh</tt>;</li>
+<li><b>NCO 4.6.4</b>: 
 <tt>ncremap</tt> add <tt>w_stag</tt> weights to FV output;
 <tt>ncclimo</tt> timeseries reshaping ("splitting") mode;
-Extract variables in CF <tt>formula_terms</tt> attribute;
+<tt>ncclimo</tt> daily climo mode;
+Extract variables in CF <tt>cell_measures</tt>, <tt>formula_terms</tt> attributes;
 Fix UDUnits calendar bug introduced in 4.6.3;</li>
-<li><b>NCO 4.6.3</b>: (<i>Current Stable Release</i>)
+<li><b>NCO 4.6.3</b>: 
 CMake build option;
 <tt>ncap2</tt> udunits() function;
 <tt>ncclimo</tt> supports binary climos, annual mode;
@@ -788,7 +795,7 @@ goodies besides NCO) to your automatically-searched channels with
 ‘<tt>conda config --add channels --conda-forge</tt>’, then
 install NCO with ‘<tt>conda install nco</tt>’.
 The default NCO installed by <tt>conda</tt> is generally within a month of the latest release. 
-<li><a href="https://github.com/conda-forge/nco-feedstock">nco-4.6.4</a> Executables Anaconda-compatible. Maintained by Filipe Fernandes.</li>
+<li><a href="https://github.com/conda-forge/nco-feedstock">nco-4.6.5</a> Executables Anaconda-compatible. Maintained by Filipe Fernandes.</li>
 Thanks to Rich Signell, Filipe Fernandes (and others?) for developing and maintaining the NCO package for conda.
 </ul>
 
@@ -797,7 +804,7 @@ Thanks to Rich Signell, Filipe Fernandes (and others?) for developing and mainta
 <h3><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux</a></h3>
 <ul>
 <!--
-<li><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux-compatible Intel systems, prebuilt binary executable <a href="http://www.debian.org">deb</a>: <a href="http://packages.debian.org/testing/math/nco.html">nco-4.6.4</a></li>
+<li><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux-compatible Intel systems, prebuilt binary executable <a href="http://www.debian.org">deb</a>: <a href="http://packages.debian.org/testing/math/nco.html">nco-4.6.5</a></li>
 -->
 <a href="http://packages.debian.org/unstable/science/nco">Debian NCO</a> and 
 <a href="https://launchpad.net/ubuntu/+source/nco">Ubuntu NCO</a> homepages.
@@ -805,8 +812,8 @@ Thanks to Rich Signell, Filipe Fernandes (and others?) for developing and mainta
 NCO packages in the Debian/Ubuntu repositories (e.g., Sid and Raring) generally lag the packages distributed here by 6–12 months.
 <a name="beta"></a><a name="prerelease"> <!-- http://nco.sf.net#beta -->
 Newer (beta- or pre-release) packages are often available for intrepid Debian/Ubuntu users as described <a href="https://github.com/nco/nco/tree/master/doc/beta.txt">here</a>.
-<dt>Debian package for most recent NCO release (install with, e.g., ‘<tt>dpkg --install nco_4.6.4-1_i386.deb</tt>’):</dt>
-<li><a href="https://launchpad.net/ubuntu/+source/nco/4.6.4-1">nco_4.6.4-1_amd64.deb</a> : Executables AMD64-compatible</li>
+<dt>Debian package for most recent NCO release (install with, e.g., ‘<tt>dpkg --install nco_4.6.5-1_i386.deb</tt>’):</dt>
+<li><a href="https://launchpad.net/ubuntu/+source/nco/4.6.5-1">nco_4.6.5-1_amd64.deb</a> : Executables AMD64-compatible</li>
 Thanks to Daniel Baumann, Sebastian Couwenberg, Barry deFreese, Francesco Lovergine, 
 Brian Mays, Rorik Peterson, and Matej Vela for their help packaging
 NCO for Debian over the years. 
@@ -850,10 +857,10 @@ Thanks to Gavin Burris and Kyle Wilcox for documenting build procedures for RHEL
 <!-- 
 # Mac OS X 10.12 (Sierra) systems (aerosol):
 /usr/bin/scp ~/nco/doc/index.shtml zender,nco at web.sf.net:/home/project-web/nco/htdocs
-cd ~/bin;tar cvzf ${DATA}/nco-4.6.4.macosx.10.12.tar.gz nc*;scp ${DATA}/nco-4.6.4.macosx.10.12.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+cd ~/bin;tar cvzf ${DATA}/nco-4.6.5.macosx.10.12.tar.gz nc*;scp ${DATA}/nco-4.6.5.macosx.10.12.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 -->
 The most up-to-date executables are probably those in the tarball below. Those unfamiliar with installing executables from tarballs may try the (older) <a href="http://en.wikipedia.org/wiki/Apple_Disk_Image">DMG</a> files (you may need to add <tt>/opt/local/bin</tt> to your executable path to access those operators).
-<li><a href="src/nco-4.6.4.macosx.10.12.tar.gz">nco-4.6.4.macosx.10.12.tar.gz</a> (<!--#fsize file="src/nco-4.6.4.macosx.10.12.tar.gz"-->): Executables MacOSX 10.12-compatible (last updated <!--#flastmod file="src/nco-4.6.4.macosx.10.12.tar.gz"-->). 
+<li><a href="src/nco-4.6.5.macosx.10.12.tar.gz">nco-4.6.5.macosx.10.12.tar.gz</a> (<!--#fsize file="src/nco-4.6.5.macosx.10.12.tar.gz"-->): Executables MacOSX 10.12-compatible (last updated <!--#flastmod file="src/nco-4.6.5.macosx.10.12.tar.gz"-->). 
 (NB: These executables require
   the <a href="http://trac.macosforge.org/projects/macports/wiki">MacPorts</a>
   <a href="#bld_macports">dependencies</a> for <a href="http://svn.macports.org/repository/macports/trunk/dports/science/nco">NCO</a>). Maintained by NCO Project.</li>
@@ -1048,11 +1055,11 @@ site.</li>
 The simplest way to acquire the source is to download the compressed tarball:
 <ul>
 <li>
-<!-- scp ${DATA}/nco-4.6.4.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src -->
-<a href="https://github.com/nco/nco/archive/4.6.4.tar.gz">nco-4.6.4.tar.gz</a> 
-(<!--#fsize file="src/nco-4.6.4.tar.gz"--> compressed tar-file)<br>
-<!--#exec cmd="openssl dgst -md5 src/nco-4.6.4.tar.gz"--><br>
-<!--#exec cmd="openssl dgst -sha1 src/nco-4.6.4.tar.gz"--> 
+<!-- scp ${DATA}/nco-4.6.5.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src -->
+<a href="https://github.com/nco/nco/archive/4.6.5.tar.gz">nco-4.6.5.tar.gz</a> 
+(<!--#fsize file="src/nco-4.6.5.tar.gz"--> compressed tar-file)<br>
+<!--#exec cmd="openssl dgst -md5 src/nco-4.6.5.tar.gz"--><br>
+<!--#exec cmd="openssl dgst -sha1 src/nco-4.6.5.tar.gz"--> 
 </li>
 </ul>
 
@@ -1071,8 +1078,8 @@ You may retrieve any NCO distribution you wish from
 <a href="https://help.github.com">GitHub</a>. 
 Usually you wish to retrieve a recent tagged (i.e., released) version.
 This command retrieves the entire NCO repository (< 20 MB) and
-then checks out NCO version <tt>4.6.4</tt>:
-<p><tt>git clone https://github.com/nco/nco.git;cd nco;git checkout 4.6.4</tt></p>
+then checks out NCO version <tt>4.6.5</tt>:
+<p><tt>git clone https://github.com/nco/nco.git;cd nco;git checkout 4.6.5</tt></p>
 These commands retrieve the current (“bleeding edge”)
 development version of NCO into a local directory named <tt>nco</tt>:
 <p><tt>git clone https://github.com/nco/nco.git ~/nco</tt></p> or
@@ -1080,9 +1087,9 @@ development version of NCO into a local directory named <tt>nco</tt>:
 Track changes to the development version using
 <p><tt>cd nco;git pull</tt></p>
 One difference between running a "tagged" release 
-(e.g., <tt>4.6.4</tt>) and the development version is that the
+(e.g., <tt>4.6.5</tt>) and the development version is that the
 tagged release operators will print a valid version number (e.g.,
-<tt>4.6.4</tt>) when asked to do so with the <tt>-r</tt> flag
+<tt>4.6.5</tt>) when asked to do so with the <tt>-r</tt> flag
 (e.g., <tt>ncks -r</tt>).
 The development version simply places today's date in place of the
 version.
@@ -1140,10 +1147,10 @@ patch necessary to allow NCO to link to ANTLR.
 If you must build the source stack yourself (e.g., due to lack of root
 access, or systems without packages such as AIX), build all libraries
 with the same compiler and switches.
-The ANTLR source file <tt>CharScanner.hpp</tt> must include this line:
+The ANTLR 2.x source file <tt>CharScanner.hpp</tt> must include this line:
 <tt>#include <cstring></tt> or else <tt>ncap2</tt> will not
 compile (<a href="http://dust.ess.uci.edu/tmp/antlr-2.7.7.tar.gz">this</a>
-tarball is already patched).
+ANTLR tarball is already patched).
 Recent versions of netCDF automatically build OPeNDAP and UDUnits.
 NCO is mostly written in C99, and although you <i>may</i> mix and
 match compilers, this is often difficult in practice and is not recommended.
@@ -1221,17 +1228,15 @@ For Windows with Cygwin, select and install the following packages with Cygwin S
 <dt>netcdf # netCDF</dt>
 <dt>udunits2 # UDUnits</dt>
 </tt>
-As of 20131101 there is no Cygwin package for Antlr, and the netcdf package does not yet support DAP. 
-Users should instead first download and install the Antlr found <a href="http://nco.sourceforge.net/nco_qt_msvc.shtml">here</a>.
+As of 20131101 there is no Cygwin package for ANTLR, and the netCDF package does not yet support DAP. 
+Users should instead first download and install the ANTLR found <a href="http://nco.sourceforge.net/nco_qt_msvc.shtml">here</a>.
 </li>
 
-<li>Once you have installed the pre-requisites as shown above, you may
-  then build the latest stable NCO and install it in,
-  e.g., <tt>/usr/local</tt> with: 
+<li>Once you have installed the pre-requisites as shown above, you may then build the latest stable NCO and install it in, e.g., <tt>/usr/local</tt> with: 
 <tt>
-<dt>wget https://github.com/nco/nco/archive/4.6.4.tar.gz</dt>
-<dt>tar xvzf 4.6.4.tar.gz</dt>
-<dt>cd nco-4.6.4</dt>
+<dt>wget https://github.com/nco/nco/archive/4.6.5.tar.gz</dt>
+<dt>tar xvzf 4.6.5.tar.gz</dt>
+<dt>cd nco-4.6.5</dt>
 <dt>./configure --prefix=/usr/local</dt>
 <dt>make</dt>
 <dt>sudo make install</dt>
diff --git a/doc/nco.texi b/doc/nco.texi
index d751667..94d2a42 100644
--- a/doc/nco.texi
+++ b/doc/nco.texi
@@ -118,12 +118,12 @@ Octave TeXInfo manual shows clean TeXInfo structure
 @setfilename nco.info
 
 @c Define edition, date, ...
- at set nco-edition 4.6.4
- at set doc-edition 4.6.4
+ at set nco-edition 4.6.5
+ at set doc-edition 4.6.5
 @set copyright-years 1995--2017
 @set update-year 2017
- at set update-date 7 February 2017
- at set update-month February 2017
+ at set update-date 15 March 2017
+ at set update-month March 2017
 
 @settitle @acronym{NCO} @value{nco-edition} User Guide
 
@@ -7570,12 +7570,14 @@ important information from being lost.
 @node Chunking, Compression, Missing Values, Shared features
 @section Chunking
 @cindex @code{--cnk_byt}
+ at cindex @code{--cnk_csh}
 @cindex @code{--cnk_dmn}
 @cindex @code{--cnk_map}
 @cindex @code{--cnk_min}
 @cindex @code{--cnk_plc}
 @cindex @code{--cnk_scl}
 @cindex @code{--chunk_byte}
+ at cindex @code{--chunk_cache}
 @cindex @code{--chunk_dimension}
 @cindex @code{--chunk_map}
 @cindex @code{--chunk_min}
@@ -7589,6 +7591,7 @@ Availability: @command{ncap2}, @command{ncbo}, @command{nces},
 Short options: none@*
 Long options: 
 @samp{--cnk_byt @var{sz_byt}}, @samp{--chunk_byte @var{sz_byt}}@*
+ at samp{--cnk_csh @var{sz_byt}}, @samp{--chunk_cache @var{sz_byt}}@*
 @samp{--cnk_dmn @var{dmn_nm}, at var{sz_lmn}},
 @samp{--chunk_dimension @var{dmn_nm}, at var{sz_lmn}}@*,
 @samp{--cnk_map @var{cnk_map}}, @samp{--chunk_map @var{cnk_map}},@*
@@ -7610,6 +7613,41 @@ and
 applications of chunking strategies (stay tuned for more in 2017).
 
 @html
+<a name="chunk_cache"></a> <!-- http://nco.sf.net/nco.html#chunk_cache -->
+<a name="cnk_csh"></a> <!-- http://nco.sf.net/nco.html#cnk_csh -->
+<a name="cache"></a> <!-- http://nco.sf.net/nco.html#cache -->
+<a name="csh"></a> <!-- http://nco.sf.net/nco.html#csh -->
+ at end html
+ at cindex chunk cache size
+ at cindex cache size
+ at cindex @code{--cnk_csh @var{sz}}
+ at cindex @code{--chunk_cache @var{sz}}
+As of @acronym{NCO} version 4.6.5 (March, 2017), @acronym{NCO} supports
+run-time alteration of the chunk cache size.
+By default, the cache size is set (by the @code{--with-chunk-cache-size}
+option to @command{configure}) at netCDF compile time. 
+The @code{--cnk_csh @var{sz}} option sets the cache size to @var{sz}
+bytes for all variables.
+When the debugging level is set (with @code{-D @var{dbg_lvl}}) to three
+or higher, @acronym{NCO} prints the current value of the cache settings
+for informational purposes. 
+Also @samp{--chunk_cache}.
+
+Increasing cache size from the default can dramatically accelerate time
+to aggregate and rechunk multiple large input datasets, e.g.,
+ at example
+ncrcat -4 -L 1 --cnk_csh=1000000000 --cnk_plc=g3d --cnk_dmn=time,365 \
+       --cnk_dmn=lat,1800 --cnk_dmn=lon,3600 in*.nc4 out.nc
+ at end example
+In this example all 3D variables the input datasets (which may or may
+not be chunked already) are re-chunked to a size of 365 along the time
+dimension. 
+Because the default chunk cache size of about @w{4 MB} is too small to
+manipulate the large chunks, we reset the cache to @w{1 GB}.
+The operation completes much faster, and subsequent reads along the
+time dimension will be much more rapid.
+
+ at html
 <a name="blocksize"></a> <!-- http://nco.sf.net/nco.html#blocksize -->
 <a name="blk"></a> <!-- http://nco.sf.net/nco.html#blk -->
 @end html
@@ -7637,8 +7675,8 @@ These measures differ by a factor of four or eight for @code{NC_FLOAT}
 or @code{NC_DOUBLE}, respectively. 
 The option @samp{--cnk_scl} takes an argument @var{sz_lmn} measured in
 elements.
-The options @samp{--cnk_byt} and @samp{--cnk_min} take arguments
- at var{sz_byt} measured in bytes.
+The options @samp{--cnk_byt}, @samp{--cnk_csh}, and @samp{--cnk_min}
+take arguments @var{sz_byt} measured in bytes.
 
 Use the @samp{--cnk_min=@var{sz_byt}} option to set the minimum size in
 bytes (not elements) of variables to chunk.  
@@ -11862,7 +11900,7 @@ three_mw=three_dmn_var_dbl.permute($0,$2,$1);
 @end example
 
 @noindent @strong{ID Quoting @*}
-If the dimension name contains non-regular characters use ID quoting. 
+If the dimension name contains non-regular characters use ID quoting:
 See @pxref{ID Quoting}
 @example
 defdim("a--list.A",10);
@@ -12331,7 +12369,7 @@ push(&@h," again"s); // BAD PUSH
 @end verbatim
 @end example
 
-If the attribute name contains non-regular characters use ID quoting.
+If the attribute name contains non-regular characters use ID quoting:
 @example
 @verbatim
 'b..m1 at c--lost'=23;
@@ -16333,7 +16371,7 @@ omitted in batch scripts.
 SYNTAX
 @example 
 ncbo [-3] [-4] [-6] [-7] [-A] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] 
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}]
@@ -16764,9 +16802,9 @@ ncclimo [-a @var{dec_md}] [-C @var{clm_md}] [-c @var{caseid}] [-d @var{dbg_lvl}]
 [-E @var{yr_prv}] [-e @var{yr_end}] [-f @var{fml_nm}] [-h @var{hst_nm}] [-i @var{drc_in}]
 [-j @var{job_nbr}] [-l @var{lnk_flg}] [-m @var{mdl_nm}] [-n @var{nco_opt}] 
 [-O @var{drc_rgr}] [-o @var{drc_out}] [-p @var{par_typ}] [-R @var{rgr_opt}] [-r @var{rgr_map}] 
-[-S @var{yr_prv}] [-s @var{yr_srt}] [--stdin] [--tpd=@var{tpd_dly}] [-t @var{thr_nbr}] [--tpd=@var{tpd_dly}] 
-[-v @var{var_lst}] [-x @var{cf_flg}] [-X @var{drc_xtn}] [-x @var{drc_prv}] [-Y @var{rgr_xtn}] [-y @var{rgr_prv}]
-[--ypf=@var{ypf_max}]
+[-S @var{yr_prv}] [-s @var{yr_srt}] [--stdin] [-t @var{thr_nbr}] [--tpd=@var{tpd_dly}]
+[-v @var{var_lst}] [--version] [-x @var{cf_flg}] [-X @var{drc_xtn}] [-x @var{drc_prv}] 
+[-Y @var{rgr_xtn}] [-y @var{rgr_prv}] [--ypf=@var{ypf_max}]
 @end example
 
 @noindent
@@ -16828,6 +16866,7 @@ The last month is November of the end year specified with @samp{-e}.
 @acronym{SDD}-mode stands for ``Seasonally Discontinuous December''. 
 The first month used is January of the specified start year. 
 The last month is December of the end year specified with @samp{-e}.
+
 @cindex @code{-C @var{clm_md}}
 @cindex @var{clm_md}
 @cindex @code{--clm_md}
@@ -16840,6 +16879,7 @@ Valid values are @samp{ann} and @samp{mth}.
 The value indicates the timespan of the averages in each input file.  
 The default mode is @samp{mth}, which means input files are monthly averages. 
 Use @samp{ann} if the input files are a series of annual means.
+
 @cindex @code{-c @var{caseid}}
 @cindex @var{caseid}
 @cindex @code{--caseid}
@@ -16863,6 +16903,7 @@ as an additional string in the output filename.
 For example, specifying @samp{-c control} would cause
 @file{T_000101_000912.nc} to be instead named 
 @file{T_control_000101_000912.nc}.
+
 @cindex @code{-D @var{dbg_lvl}}
 @cindex @var{dbg_lvl}
 @cindex @code{--dbg_lvl}
@@ -16877,6 +16918,7 @@ not execute these commands.
 If @math{@var{dbg_lvl} > 2}, @command{ncclimo} prints the diagnostic
 information, executes all commands, and passes-through the debugging
 level to the regridder (@command{ncks}) for additional diagnostics.
+
 @cindex @code{-e @var{end_yr}}
 @cindex @var{end_yr}
 @cindex @code{--end_yr}
@@ -16889,6 +16931,7 @@ Unless the option @samp{-a sdd} is specified, the last month used
 is November of the specified end year. 
 If @samp{-a sdd} is specified, the last month is December of the
 specified end year.  
+
 @cindex @code{-f @var{fml_nm}}
 @cindex @var{fml_nm}
 @cindex @code{--fml_nm}
@@ -16910,6 +16953,7 @@ as an additional string in the output filename.
 For example, specifying @samp{-f control} would cause
 @file{T_000101_000912.nc} to be instead named 
 @file{T_control_000101_000912.nc}.
+
 @cindex @code{-h @var{hst_nm}}
 @cindex @var{hst_nm}
 @cindex @code{--history_name}
@@ -16925,6 +16969,7 @@ with @samp{-m}) and the date range.
 Use @samp{-h @var{hst_nm}} to specify alternative history volumes.
 Examples include @samp{h0} (default, works for @acronym{CAM},
 @acronym{ALM/CLM}), @samp{h1}, and @samp{h} (for @acronym{CISM}).
+
 @cindex @code{-i @var{drc_in}}
 @cindex @var{drc_in}
 @cindex @code{--drc_in}
@@ -16941,6 +16986,7 @@ In timeseries reshaping mode, @command{ncclimo} uses all netCDF files
 @code{.cdf}, @code{.hdf}, @code{.he5}, or @code{.h5}) in @var{drc_in} to 
 create the list of input files when no list is provided through
 @code{stdin} or as positional arguments to the command-line. 
+
 @cindex @code{-j @var{job_nbr}}
 @cindex @var{job_nbr}
 @cindex @code{--job_nbr}
@@ -16997,6 +17043,7 @@ By default @command{ncclimo} symbolically links the full
 these linked filenames. 
 Use this switch to turn-off that linking and reduce filename
 proliferation if you do not need @acronym{AMWG} filenames.
+
 @cindex @code{-m @var{mdl_nm}}
 @cindex @var{mdl_nm}
 @cindex @code{--model_name}
@@ -17006,6 +17053,7 @@ proliferation if you do not need @acronym{AMWG} filenames.
 Model name (as embedded in monthly input filenames). 
 Default is @samp{cam}. Other options are @samp{clm2}, @samp{ocn},
 @samp{ice}, @samp{cism}, @samp{cice}, @samp{pop}. 
+
 @cindex @code{-n @var{nco_opt}}
 @cindex @var{nco_opt}
 @cindex @code{--nco_opt}
@@ -17015,6 +17063,7 @@ Default is @samp{cam}. Other options are @samp{clm2}, @samp{ocn},
 Specifies a string of options to pass-through unaltered to
 @command{ncks}. 
 @var{nco_opt} defaults to @samp{-O --no_tmp_fl}.
+
 @cindex @code{-O @var{drc_rgr}}
 @cindex @var{drc_rgr}
 @cindex @code{--drc_rgr}
@@ -17025,6 +17074,7 @@ Specifies a string of options to pass-through unaltered to
 Directory to hold regridded climo files.
 Regridded climos are placed in @var{drc_out} unless a separate
 directory for them is specified with @samp{-O} (NB: capital ``O''). 
+
 @cindex @code{-o @var{drc_out}}
 @cindex @var{drc_out}
 @cindex @code{--drc_out}
@@ -17035,6 +17085,7 @@ directory for them is specified with @samp{-O} (NB: capital ``O'').
 Directory to hold computed (output) native grid climo files.
 Regridded climos are also placed here unless a separate directory
 for them is specified with @samp{-O} (NB: capital ``O''). 
+
 @cindex @code{-p @var{par_typ}}
 @cindex @var{par_typ}
 @cindex @code{--par_typ}
@@ -17051,6 +17102,7 @@ The default is background-mode parallelism.
 The default @var{par_typ} is @samp{bck}, which means @command{ncclimo} 
 runs spawns up to twelve (one for each month) parallel processes at a time.
 See discussion below under Memory Considerations.
+
 @cindex @code{-R @var{rgr_opt}}
 @cindex @var{rgr_opt}
 @cindex @code{--rgr_opt}
@@ -17059,6 +17111,7 @@ See discussion below under Memory Considerations.
 Specifies a string of options to pass-through unaltered to
 @command{ncks}. 
 @var{rgr_opt} defaults to @samp{-O --no_tmp_fl}.
+
 @cindex @code{-r @var{rgr_map}}
 @cindex @var{rgr_map}
 @cindex @code{--rgr_map}
@@ -17076,6 +17129,7 @@ analysis grid.
 Options intended exclusively for the regridder may be passed as
 arguments to the @samp{-R} switch.
 See below the discussion on regridding.
+
 @cindex @code{-s @var{srt_yr}}
 @cindex @var{srt_yr}
 @cindex @code{--srt_yr}
@@ -17089,6 +17143,7 @@ be December of the year before the start year (to allow for contiguous
 @acronym{DJF} climos).   
 If @samp{-a sdd} is specified, the first month used is January of
 the specified start year. 
+
 @cindex @code{--stdin}
 @cindex @code{--inp_std}
 @cindex @code{--std_flg}
@@ -17111,6 +17166,7 @@ are piped to @code{stdin}, and on @acronym{SLURM} when the input files
 are redirected from a file to @code{stdin}.
 Using this switch in any other context (e.g., interactive shells) is
 optional. 
+
 @cindex @code{-t @var{thr_nbr}}
 @cindex @var{thr_nbr}
 @cindex @code{--thr_nbr}
@@ -17124,6 +17180,7 @@ However, regridding with the maximum number of threads can interfere
 with climatology generation in parallel climatology mode (i.e., when
 @math{@var{par_typ}} = @code{mpi} or @code{bck}). 
 Hence @command{ncclimo} defaults to @var{thr_nbr}=2.
+
 @cindex @code{--tpd_out @var{tpd_out}}
 @cindex @var{tpd_out}
 @cindex @code{--tpd_out}
@@ -17141,6 +17198,7 @@ resolution), can be used to produce climatological output at 3, 6,
 or 12-hourly resolution by setting @var{tpd_out} to 8, 4, or 2,
 respectively. 
 This option only takes effect in daily-average climatology mode.
+
 @cindex @code{-v @var{var_lst}}
 @cindex @var{var_lst}
 @cindex @code{--var_lst}
@@ -17158,6 +17216,20 @@ Regular expressions are allowed so, e.g., @samp{PREC.?} extracts
 the variables @samp{PRECC,PRECL,PRECSC,PRECSL} if present.
 Note that in reshaping mode all matches to a regular expression are
 placed in the same output file.
+
+ at cindex @code{--version}
+ at cindex @code{--vrs}
+ at cindex @code{--config}
+ at cindex @code{--configuration}
+ at cindex @code{--cnf}
+ at item --version (@code{--version}, @code{--vrs}, @code{--config}, @code{--configuration}, @code{--cnf})
+This switch (which takes no argument) causes the operator to print
+its version and configuration.
+This includes the copyright notice, @acronym{URL}s to the @acronym{GPL}
+and @acronym{NCO} license, directories from which the @acronym{NCO}
+scripts and binaries are running, and the locations of any separate 
+executables that may be used by the script.
+
 @cindex @code{--ypf_max @var{ypf_max}}
 @cindex @var{ypf_max}
 @cindex @code{--ypf_max}
@@ -17413,6 +17485,7 @@ Options:
 The ending year of the previous climo. 
 This argument is required to trigger binary climatologies,
 and should not be used for incremental climatologies.
+
 @cindex @code{-S @var{yr_srt_prv}}
 @cindex @var{yr_srt_prv}
 @cindex @code{--yr_srt_prv}
@@ -17422,6 +17495,7 @@ and should not be used for incremental climatologies.
 The starting year of the previous climo. 
 This argument is required to trigger incremental climatologies,
 and is also mandatory for binary climatologies.
+
 @cindex @code{-X @var{drc_xtn}}
 @cindex @var{drc_xtn}
 @cindex @code{--drc_xtn}
@@ -17434,6 +17508,7 @@ Default value is @var{drc_prv}.
 Unless a separate directory is specified (with @samp{-Y}) for the
 extended climo on the analysis grid, it will be stored in @var{drc_xtn},
 too.  
+
 @cindex @code{-x @var{drc_prv}}
 @cindex @var{drc_prv}
 @cindex @code{--drc_prv}
@@ -17446,6 +17521,7 @@ Default value is @var{drc_out}.
 Unless a separate directory is specified (with @samp{-y}) for the
 previous climo on the analysis grid, it is assumed to reside in
 @var{drc_prv}, too. 
+
 @cindex @code{-Y @var{drc_rgr_xtn}}
 @cindex @var{drc_rgr_xtn}
 @cindex @code{--drc_rgr_xtn}
@@ -17456,6 +17532,7 @@ previous climo on the analysis grid, it is assumed to reside in
 Directory in which the extended analysis grid climo files will be
 stored in an incremental climatology. 
 Default value is @var{drc_xtn}.
+
 @cindex @code{-y @var{drc_rgr_prv}}
 @cindex @var{drc_rgr_prv}
 @cindex @code{--drc_rgr_prv}
@@ -17966,6 +18043,37 @@ Then call @command{ncclimo} with @file{merra2_200903.nc4} as
 ncclimo -c merra2_200903.nc4 -s 1980 -e 2016 -i $drc_in -o $drc_out
 @end example
 
+In the default monthly climo generation mode, @command{ncclimo} expects 
+each input file to contain one single record that is the monthly average 
+of all fields.
+Another example of of wrangling observed datasets into a
+ at acronym{CESM}ish format is @acronym{ECMWF} Integrated Forecasting
+System (@acronym{IFS}) data that contains twelve months per file,
+rather than the one month per file that @command{ncclimo} expects.
+ at example
+ at verbatim
+for yr in {1979..2016}; do
+# Convert ifs_YYYY01-YYYY12.nc to ifs_YYYYMM.nc
+    yyyy=`printf "%04d" $yr`
+    for mth in {1..12}; do
+        mm=`printf "%02d" $mth`
+        ncks -O -F -d time,${mth} ifs_${yyyy}01-${yyyy}12.nc ifs_${yyyy}${mm}.nc
+    done
+done
+ at end verbatim
+ at end example
+Then call @command{ncclimo} with @file{ifs_197901.nc} as @var{caseid}:  
+ at example
+ncclimo -c ifs_197901.nc -s 1979 -e 2016 -i $drc_in -o $drc_out
+ at end example
+ at acronym{ncclimo} does not recognize all combinations imaginable of
+records per file and files per year. 
+However, support can be added for the most prevalent combinations 
+so that @acronym{ncclimo}, rather than the user, does any necessary data
+wrangling.
+Contact us if there is a common input data format you would like
+supported as a custom option.
+
 Often one wishes to create a climatology of a single variable.
 The @samp{-f @var{fml_nm}} option to @command{ncclimo} makes this easy.
 Consider a series of single-variable climos for the fields @code{FSNT}, 
@@ -17994,7 +18102,7 @@ Moreover, the climatologies can be generated in parallel.
 SYNTAX
 @example
 ncecat [-3] [-4] [-6] [-7] [-A] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F]
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--gag] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}]
@@ -18262,7 +18370,7 @@ of changing variable dimensionality, including the record dimension.
 SYNTAX
 @example
 nces [-3] [-4] [-6] [-7] [-A] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F]
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] 
@@ -18491,7 +18599,7 @@ member in the first file.
 SYNTAX
 @example
 ncflint [-3] [-4] [-6] [-7] [-A] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]
 [-F] [--fix_rec_crd] [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}]
@@ -18786,7 +18894,7 @@ ncatted -a units,prs_sfc,o,c,millibar out.nc
 SYNTAX
 @example
 ncks [-3] [-4] [-5] [-6] [-7] [-A] [-a] [-b @var{fl_bnr}] [-C] [-c] [--cdl]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [--fix_rec_dmn @var{dim}] 
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [--grp_xtr_var_xcl]
@@ -18975,26 +19083,44 @@ coordinates to the binary file:
 40
 @end example
 
-
 @html
-<a name="chunk_cache"></a> <!-- http://nco.sf.net/nco.html#chunk_cache -->
-<a name="cnk_csh"></a> <!-- http://nco.sf.net/nco.html#cnk_csh -->
-<a name="cache"></a> <!-- http://nco.sf.net/nco.html#cache -->
-<a name="csh"></a> <!-- http://nco.sf.net/nco.html#csh -->
+<a name="cal"></a> <!-- http://nco.sf.net/nco.html#cal -->
+<a name="cln"></a> <!-- http://nco.sf.net/nco.html#cln -->
+<a name="calendar"></a> <!-- http://nco.sf.net/nco.html#calendar -->
 @end html
- at cindex chunk cache size
- at cindex cache size
- at cindex @code{--cnk_csh @var{sz}}
- at cindex @code{--chunk_cache @var{sz}}
-Set the per-variable chunk cache size to @var{sz} bytes.
-By default, the per-variable cache size is set (by the 
- at code{--with-chunk-cache-size} option to @command{configure}) at netCDF
-compile time. 
-This option changes the per-variable cache size.
-When the debugging level is set (with @code{-D @var{dbg_lvl}}) to three
-or higher, @acronym{NCO} prints the current value of the cache settings
-for informational purposes. 
-Also @samp{--chunk_cache}.
+ at cindex @code{--calendar}
+ at cindex @code{--cln_lgb}
+ at cindex @code{--prn_lgb}
+ at cindex @code{--datestamp}
+ at item --cal 
+As of @acronym{NCO} version 4.6.5 (March, 2017), @command{ncks} can
+print human-legible calendar strings corresponding to time values with 
+UDUnits-compatible date units of the form time-since-basetime, e.g.,
+ at samp{days since 2000-01-01} and a @acronym{CF} calendar attribute, if
+any. 
+Enact this with the @samp{--calendar} (also @samp{--cln},
+ at samp{prn_lgb}, and @samp{datestamp}) option when printing in any mode.
+Invoking this option when @math{@var{dbg_lvl} >= 1} in @acronym{CDL}
+mode prints both the value and the calendar string (one in comments):
+ at example
+ at verbatim
+zender at aerosol:~$ ncks -D 1 --cdl --cal -v tm_365 ~/nco/data/in.nc
+...
+  variables:
+    double tm_365 ;
+      tm_365:units = "days since 2013-01-01" ; // char
+      tm_365:calendar = "365_day" ; // char
+
+  data:
+    tm_365 = "2013-03-01"; // double value: 59
+...
+zender at aerosol:~$ ncks -D 1 --cdl -v tm_365 ~/nco/data/in.nc
+...
+    tm_365 = 59; // calendar format: "2013-03-01"
+...
+ at end verbatim
+ at end example
+This option is similar to the @command{ncdump} @samp{-t} option.
 
 @html
 <a name="dmn_fix_mk"></a> <!-- http://nco.sf.net/nco.html#dmn_fix_mk -->
@@ -20239,7 +20365,7 @@ For more details @xref{Wrapped Coordinates}.
 SYNTAX
 @example
 ncpdq [-3] [-4] [-6] [-7] [-A] [-a [-]@var{dim}[, at dots{}]] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]
 [-F] [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}]
@@ -20838,7 +20964,7 @@ changing variable dimensionality, including the record dimension.
 SYNTAX
 @example
 ncra [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cb]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]] [-F]
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] 
@@ -21087,7 +21213,7 @@ The last example
 SYNTAX
 @example
 ncrcat [-3] [-4] [-6] [-7] [-A] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]] [-F]
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}]
@@ -21227,7 +21353,8 @@ ncremap [-a @var{alg_typ}] [-D @var{dbg_lvl}] [-d @var{dst_fl}] [-E @var{esmf_op
 [-M] [-m @var{map_fl}] [-n @var{nco_opt}] [-O @var{drc_out}] [-o @var{output-file}]
 [-P @var{pdq_typ}] [-p @var{par_typ}] [-R @var{rgr_opt}] [-s @var{grd_src}] 
 [-T @var{tempest_opt}] [-t @var{thr_nbr}] [-U @var{drc_tmp}] [-u @var{unq_sfx}] 
-[-V @var{rgr_var}] [-v @var{var_lst}[, at dots{}]] [-w @var{wgt_gnr}] [-x @var{xtn_lst}[, at dots{}]] 
+[-V @var{rgr_var}] [-v @var{var_lst}[, at dots{}]] [--version] [--vrb=@var{vrb_lvl}] 
+[-w @var{wgt_gnr}] [-x @var{xtn_lst}[, at dots{}]] 
 @end example
 
 @noindent
@@ -21916,6 +22043,41 @@ ncremap -R "--rgr lat_nm=xq --rgr lon_nm=zj" -i in.nc -d dst.nc -O ~/rgr # Manua
 @end example
 @noindent
 
+ at cindex @code{--version}
+ at cindex @code{--vrs}
+ at cindex @code{--config}
+ at cindex @code{--configuration}
+ at cindex @code{--cnf}
+ at item --version (@code{--version}, @code{--vrs}, @code{--config}, @code{--configuration}, @code{--cnf})
+This switch (which takes no argument) causes the operator to print
+its version and configuration.
+This includes the copyright notice, @acronym{URL}s to the @acronym{GPL}
+and @acronym{NCO} license, directories from which the @acronym{NCO}
+scripts and binaries are running, and the locations of any separate 
+executables that may be used by the script.
+
+ at html
+<a name="vrb_lvl"></a> <!-- http://nco.sf.net/nco.html#vrb_lvl -->
+ at end html
+ at cindex @code{--vrb @var{vrb_lvl}}
+ at cindex @var{vrb_lvl}
+ at cindex @code{--vrb_lvl}
+ at cindex @code{--vrb}
+ at cindex @code{--verbosity}
+ at cindex @code{--verbosity_level}
+ at item --vrb @var{vrb_lvl} (@code{--vrb_lvl}, @code{--vrb}, @code{--verbosity}, @code{--verbosity_level})
+Specifies a verbosity level similar to the rest of @acronym{NCO}.
+If @math{@var{vrb_lvl} = 0}, @command{ncremap} prints nothing except
+potentially serious warnings.
+If @math{@var{vrb_lvl} = 1}, @command{ncremap} prints the basic
+filenames involved in the remapping.
+If @math{@var{vrb_lvl} = 2}, @command{ncremap} prints helpful comments
+about the code path taken.
+If @math{@var{vrb_lvl} > 2}, @command{ncremap} prints even more detailed
+information.
+Note that @var{vrb_lvl} is distinct from @var{dbg_lvl} which is
+passed to the regridder (@command{ncks}) for additional diagnostics.
+
 @html
 <a name="wgt_gnr"></a> <!-- http://nco.sf.net/nco.html#wgt_gnr -->
 @end html
@@ -22570,7 +22732,7 @@ Variables not prefixed with a period (@code{global}) must be present.
 SYNTAX
 @example
 ncwa [-3] [-4] [-6] [-7] [-A] [-a @var{dim}[, at dots{}]] [-B @var{mask_cond}] [-b] [-C] [-c]
-[--cnk_byt @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
+[--cnk_byt @var{sz_byt}] [--cnk_csh @var{sz_byt}] [--cnk_dmn @var{nm}, at var{sz_lmn}] [--cnk_map @var{map}]
 [--cnk_min @var{sz_byt}] [--cnk_plc @var{plc}] [--cnk_scl @var{sz_lmn}]
 [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F]
 [-G @var{gpe_dsc}] [-g @var{grp}[, at dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}] [-I]
@@ -23234,9 +23396,10 @@ Large work-load testing
 @item Peter Campbell, Martin Dix, Mark Flanner, Markus Liebig, Keith Lindsay, Mike Page, Martin Schmidt, Michael Schulz, Lori Sentman, Rich Signell, Gary Strand, George White Andrew Wittenberg, Remik Ziemlinski
 Excellent bug reports and feature requests.
 @cindex Filipe Fernandes
+ at cindex Hugo Oliveira
 @cindex Rich Signell
 @cindex Kyle Wilcox
- at item Filipe Fernandes, Rich Signell, Kyle Wilcox
+ at item Filipe Fernandes, Hugo Oliveira, Rich Signell, Kyle Wilcox
 Anaconda packaging
 @cindex Daniel Baumann
 @cindex Nick Bower
diff --git a/man/ncbo.1 b/man/ncbo.1
index 98de5cb..485e3da 100644
--- a/man/ncbo.1
+++ b/man/ncbo.1
@@ -9,6 +9,7 @@ ncbo \- netCDF Binary Operator
 ncbo [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] 
 [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncclimo.1 b/man/ncclimo.1
index 64220b5..74af989 100644
--- a/man/ncclimo.1
+++ b/man/ncclimo.1
@@ -47,11 +47,11 @@ ncclimo
 .IR yr_prv ] 
 [\-s
 .IR yr_srt ] 
-[\-t
-.IR thr_nbr ] 
-[\-v
+[\--std_flg ] [\-t
+.IR thr_nbr ] [\--tpd_out
+.IR tpd_out ] [\-v
 .IR var_lst ] 
-[\-X
+[\--version ] [\-X
 .IR drc_xtn ] 
 [\-x
 .IR drc_prv ] 
diff --git a/man/ncecat.1 b/man/ncecat.1
index 4b13bf8..d1f116a 100644
--- a/man/ncecat.1
+++ b/man/ncecat.1
@@ -8,6 +8,7 @@ ncecat \- netCDF Ensemble Concatenator
 .SH SYNTAX
 ncecat [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/nces.1 b/man/nces.1
index 0f7e11f..ad41413 100644
--- a/man/nces.1
+++ b/man/nces.1
@@ -8,6 +8,7 @@ nces \- netCDF Ensemble Statistics
 .SH SYNTAX
 nces [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncflint.1 b/man/ncflint.1
index b678281..97cb32b 100644
--- a/man/ncflint.1
+++ b/man/ncflint.1
@@ -8,6 +8,7 @@ ncflint \- netCDF File Interpolator
 .SH SYNTAX
 ncflint [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncks.1 b/man/ncks.1
index c5e73d2..57c1309 100644
--- a/man/ncks.1
+++ b/man/ncks.1
@@ -10,7 +10,7 @@ ncks [\-3] [\-4] [\-5] [\-6] [\-7] [\-A] [\-a] [\-b
 .IR bnr_fl] 
 [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] 
-[\-\-cdl] [\-\-cnk_byt
+[\-\-cal] [\-\-cdl] [\-\-cnk_byt
 .IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
diff --git a/man/ncpdq.1 b/man/ncpdq.1
index 5040e01..62643af 100644
--- a/man/ncpdq.1
+++ b/man/ncpdq.1
@@ -10,6 +10,7 @@ ncpdq [\-3] [\-4] [\-6] [\-7] [\-A] [\-a
 .IR dim [,...]]
 [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncra.1 b/man/ncra.1
index efbad39..d3531d1 100644
--- a/man/ncra.1
+++ b/man/ncra.1
@@ -8,6 +8,7 @@ ncra \- netCDF Record Averager
 .SH SYNTAX
 ncra [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncrcat.1 b/man/ncrcat.1
index 389e2bf..71f0966 100644
--- a/man/ncrcat.1
+++ b/man/ncrcat.1
@@ -8,6 +8,7 @@ ncrcat \- netCDF Record Concatenator
 .SH SYNTAX
 ncrcat [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/man/ncremap.1 b/man/ncremap.1
index 3ceaa97..3b03c05 100644
--- a/man/ncremap.1
+++ b/man/ncremap.1
@@ -53,7 +53,8 @@ ncremap
 .IR rgr_var ] 
 [\-v
 .IR var_lst ] 
-[\-w
+[\--verbose ] 
+.IR prn_vrb ] [\--version ] [\-w
 .IR wgt_gnr ] 
 [\-x
 .IR xtn_lst ] 
diff --git a/man/ncwa.1 b/man/ncwa.1
index 685d9ed..abf443f 100644
--- a/man/ncwa.1
+++ b/man/ncwa.1
@@ -12,6 +12,7 @@ ncwa [\-3] [\-4] [\-6] [\-7] [\-A] [\-a
 .IR mask_cond] 
 [\-b] [\-\-bfr
 .IR sz_byt ] [\-C] [\-c] [\-\-cnk_byt
+.IR sz_byt ] [\-\-cnk_csh
 .IR sz_byt ] [\-\-cnk_dmn 
 .IR nm,sz_lmn ]
 [\-\-cnk_map 
diff --git a/src/nco++/fmc_all_cls.cc b/src/nco++/fmc_all_cls.cc
index 62c9ce5..90494f9 100644
--- a/src/nco++/fmc_all_cls.cc
+++ b/src/nco++/fmc_all_cls.cc
@@ -4690,6 +4690,8 @@ var_sct *vlist_cls::push_fnd(bool &is_mtd, std::vector<RefAST> &vtr_args, fmc_cl
     //Populate only on  constructor call
     if(fmc_vtr.empty()){
           fmc_vtr.push_back( fmc_cls("udunits",this,PUNITS1)); 
+          fmc_vtr.push_back( fmc_cls("strftime",this,PSTRFTIME));
+          fmc_vtr.push_back( fmc_cls("regular",this,PREGULAR));
 
     }		      
   } 
@@ -4700,16 +4702,24 @@ var_sct *vlist_cls::push_fnd(bool &is_mtd, std::vector<RefAST> &vtr_args, fmc_cl
   int nbr_args;
   int nbr_dim;
   int rcd;
+  bool is_mtd;
   long lret;
+
+
   dmn_sct **dim;
   var_sct *var=NULL_CEWI;
-  var_sct *var_ud_in=NULL_CEWI;
   var_sct *var_ud_out=NULL_CEWI;
-  var_sct *var_cln=NULL_CEWI;
-  var_sct *var_ret;
-           
+
+
   std::string susg;
   std::string sfnm=fmc_obj.fnm();
+
+  std::string att_sng;
+  std::string units_in_sng;
+  std::string calendar_in_sng;
+  //std::string udunits_out_sng
+
+
   RefAST tr;
   std::vector<RefAST> args_vtr; 
   std::vector<std::string> cst_vtr;              
@@ -4734,6 +4744,13 @@ var_sct *vlist_cls::push_fnd(bool &is_mtd, std::vector<RefAST> &vtr_args, fmc_cl
     } 
       
   nbr_args=args_vtr.size();  
+  is_mtd=(expr ? true: false);
+
+  /* deal with printing a time stamp here */
+  if(fdx==PSTRFTIME)
+    return strftime_fnd( is_mtd,args_vtr, fmc_obj, walker); 
+  else if(fdx==PREGULAR)
+    return regular_fnd( is_mtd,args_vtr, fmc_obj, walker);
 
   susg="usage: var_out="+sfnm+"(var_in ,unitsOutString)"; 
 
@@ -4764,76 +4781,54 @@ var_sct *vlist_cls::push_fnd(bool &is_mtd, std::vector<RefAST> &vtr_args, fmc_cl
   }
 
   if(var_ud_out->type !=NC_CHAR && var_ud_out->type !=NC_STRING)
-     err_prn(sfnm,"The second argument must be a netCDF text type\n"+susg); 
+     err_prn(sfnm,"The second argument must be a netCDF text type\n"+susg);
 
 
+  // grab units attribute of var
+  units_in_sng=ncap_att2var(prs_arg, std::string(var->nm)+"@units");
 
-  { 
 
-    /* hack RefAST to something so that we dont  have to call astFactory that is protected */
-    RefAST atr=walker.nco_dupList(args_vtr[0]);  
-    std::string units_att_nm;
 
-    units_att_nm=std::string(var->nm)+"@units";          
-   
-    atr->setText(units_att_nm);
-    atr->setType(ATT_ID);
+  // grab calendar attribute of var
+  att_sng=std::string(var->nm)+"@calendar";
+
+  if( ncap_att2var_chk(prs_arg, att_sng) )
+  {
+     calendar_in_sng=ncap_att2var(prs_arg, att_sng);
+
+  }
 
-    var_ud_in=walker.out(atr);
 
-    if(var_ud_in->type !=NC_CHAR && var_ud_in->type !=NC_STRING)
-       err_prn(sfnm,"The attribute \""+units_att_nm+"\" argument must be a netCDF text type\n"+susg); 
-  
-    
-    /* look for calendar att - may not be present */  
-    units_att_nm=std::string(var->nm)+"@calendar";          
-    
-    Nvar=prs_arg->var_vtr.find(units_att_nm);
 
-    if(Nvar !=NULL)
-      var_cln=nco_var_dpl(Nvar->var);
-    else    
-      var_cln=ncap_att_init(units_att_nm,prs_arg);
 
-    if(var_cln && var_cln->type !=NC_CHAR && var_cln->type !=NC_STRING)
-       err_prn(sfnm,"The attribute \""+units_att_nm+"\" argument must be a netCDF text type\n"+susg); 
- 
-  
-  }
 
   // do heavy lifting 
   {
    
-   char *units_in_sng;
-   char *units_out_sng;    
-   char *cln_sng=NULL_CEWI;   
+
+   char *units_out_sng;
 
    nco_cln_typ cln_typ=cln_nil;
 
-   units_in_sng=ncap_att_char(var_ud_in);         
    units_out_sng=ncap_att_char(var_ud_out);   
 
-   if(var_cln)
-   {
-     cln_sng=ncap_att_char(var_cln); 
-     cln_typ=nco_cln_get_cln_typ(cln_sng);
-   }
+   if( calendar_in_sng.size())
+     cln_typ=nco_cln_get_cln_typ(calendar_in_sng.c_str());
+
    
 
 
-    #ifdef ENABLE_UDUNITS
-    # ifdef HAVE_UDUNITS2_H
-       rcd=nco_cln_clc_dbl_var_dff(units_in_sng,units_out_sng,cln_typ,(double*)NULL, var);
-    #endif
-    #endif
+   #ifdef ENABLE_UDUNITS
+   # ifdef HAVE_UDUNITS2_H
+       rcd=nco_cln_clc_dbl_var_dff(units_in_sng.c_str(),units_out_sng,cln_typ,(double*)NULL, var);
+   #endif
+   #endif
    
-    if(rcd!=NCO_NOERR)   
+   if(rcd!=NCO_NOERR)
       err_prn(sfnm, "Udunits was unable to convert data in the var '"+std::string(var->nm)+"' from '" +std::string(units_in_sng) +"' to '"+std::string(units_out_sng)+"'\n");
 
-    nco_free(units_in_sng);
+    // nco_free(units_in_sng);
     nco_free(units_out_sng);
-    if(cln_sng)
-      nco_free(cln_sng);
 
   }
   
@@ -4841,20 +4836,287 @@ var_sct *vlist_cls::push_fnd(bool &is_mtd, std::vector<RefAST> &vtr_args, fmc_cl
   /* revert var back to original type */
   if( var->type != lcl_typ)
     nco_var_cnf_typ(lcl_typ,var);
- 
 
-  if(var_cln)
-    var_cln=nco_var_free(var_cln);
 
-  if(var_ud_in)
-    var_ud_in=nco_var_free(var_ud_in); 
-  
 
   return var;
 
 }
 
 
+var_sct *udunits_cls::strftime_fnd(bool &is_mtd, std::vector<RefAST> &args_vtr, fmc_cls &fmc_obj, ncoTree &walker)
+ {
+    int nbr_args;
+    int fdx=fmc_obj.fdx();
+    int rcd;
+    char *cformat=(char*)NULL;
+
+    var_sct *var=NULL_CEWI;
+    var_sct *var_cformat=NULL_CEWI;
+    var_sct *var_ret=NULL_CEWI;
+
+    std::string sfnm =fmc_obj.fnm(); //method name
+    std::string susg;
+    std::string att_sng;
+    std::string units_in_sng;
+    std::string units_out_sng;
+    std::string calendar_in_sng;
+
+
+    prs_cls *prs_arg=walker.prs_arg;            
+    nc_type lcl_typ;
+    nco_cln_typ cln_typ;
+
+    nbr_args=args_vtr.size();
+
+    // convert time to UTC for now -hwta about other calendars ?
+    units_out_sng="seconds since 1970-01-01";
+
+    susg="usage: var_out="+sfnm+"(var_in ,\"format-timestring ? \")";
+
+  
+    if(nbr_args<1)
+       err_prn(sfnm,"Function has been called with less than two arguments\n"+susg); 
+    
+    /* data to convert */ 
+    var=walker.out(args_vtr[0]);  
+
+
+    lcl_typ=var->type;
+    if( !var->undefined && var->type !=NC_FLOAT && var->type !=NC_DOUBLE )
+      nco_var_cnf_typ(NC_DOUBLE,var); 
+
+     
+    var_ret=nco_var_dpl(var);
+    if(var_ret->val.vp)
+      var_ret->val.vp=nco_free(var_ret->val.vp);
+    
+    var_ret=nco_var_cnf_typ(NC_STRING, var_ret);
+
+    /* text string output units */
+    if(nbr_args >=2)
+       var_cformat=walker.out(args_vtr[1]);
+
+
+    if(prs_arg->ntl_scn  )
+    {
+      if(var_cformat)  
+         nco_var_free(var_cformat);
+      
+      if(var)        
+	     nco_var_free(var);
+
+      return var_ret;
+    }
+
+
+    if(var_cformat)
+    {
+       if (var_cformat->type != NC_CHAR && var_cformat->type != NC_STRING)
+          err_prn(sfnm, "The second argument must be a netCDF text type\n" + susg);
+
+       cformat = ncap_att_char(var_cformat);
+       var_cformat=(var_sct*)nco_var_free(var_cformat);
+
+    }
+    // use default strtime string - this is like the ncdump -t output string
+    else
+    {
+      cformat=strdup("%Y-%m-%d %H:%M:%S");
+    }
+
+
+     // grab units attribute of var
+     units_in_sng=ncap_att2var(prs_arg, std::string(var->nm)+"@units");
+
+    // grab calendar attribute of var
+    att_sng=std::string(var->nm)+"@calendar";
+
+    if( ncap_att2var_chk(prs_arg, att_sng) )
+    {
+      calendar_in_sng = ncap_att2var(prs_arg, att_sng);
+      cln_typ=nco_cln_get_cln_typ(calendar_in_sng.c_str());
+    }
+    else
+      cln_typ=cln_nil;
+
+
+    #ifdef ENABLE_UDUNITS
+    # ifdef HAVE_UDUNITS2_H
+       rcd=nco_cln_clc_dbl_var_dff(units_in_sng.c_str(),units_out_sng.c_str(),cln_typ,(double*)NULL, var);
+     #endif
+    #endif
+
+    if(rcd!=NCO_NOERR)
+         err_prn(sfnm, "Udunits was unable to convert data in the var '"+std::string(var->nm)+"' from '" +units_in_sng +"' to '"+units_out_sng+"'\n");
+
+
+     //start heavy lifting
+    {
+      long idx;
+      long sz;
+      char schar[200];
+      time_t sgmt;
+      struct tm tp;  
+      double *dp;
+
+
+      // make some space for strings
+      var_ret->val.vp=(void *)nco_malloc(var_ret->sz*nco_typ_lng(var_ret->type));
+       
+       
+      (void)cast_void_nctype(var->type,&var->val);     
+      (void)cast_void_nctype(var_ret->type,&var->val);
+
+         
+     
+      dp=var->val.dp; 
+       
+      sz=var->sz;
+
+      for(idx=0;idx<sz;idx++)
+      {
+          
+        sgmt=(time_t)dp[idx];  
+#ifdef _MSC_VER
+    (void)gmtime_s(&tp, &sgmt);
+#else
+    (void)gmtime_r(&sgmt,&tp);
+#endif /* !_MSC_VER */
+        strftime(schar,sizeof(schar),cformat,&tp);
+        var_ret->val.sngp[idx]=strdup(schar);           
+      }
+
+
+      (void)cast_nctype_void(var->type,&var->val);
+      (void)cast_nctype_void(var_ret->type,&var_ret->val);     
+
+    }
+
+
+    var=(var_sct*)nco_var_free(var);
+
+    return var_ret;
+
+ }
+
+
+var_sct *udunits_cls::regular_fnd(bool &is_mtd, std::vector<RefAST> &args_vtr, fmc_cls &fmc_obj, ncoTree &walker)
+ {
+    int nbr_args;
+    int fdx=fmc_obj.fdx();
+    int rcd;
+    int iformat=0;
+
+    var_sct *var=NULL_CEWI;
+    var_sct *var_iformat=NULL_CEWI;
+    var_sct *var_ret=NULL_CEWI;
+
+    std::string sfnm =fmc_obj.fnm(); //method name
+    std::string susg;
+    std::string att_sng;
+    std::string units_in_sng;
+    std::string units_out_sng;
+    std::string calendar_in_sng;
+
+
+    prs_cls *prs_arg=walker.prs_arg;            
+    nc_type lcl_typ;
+    nco_cln_typ cln_typ;
+
+    nbr_args=args_vtr.size();
+
+    // convert time to UTC for now -hwta about other calendars ?
+    units_out_sng="seconds since 1970-01-01";
+
+    susg="usage: var_out="+sfnm+"(var_in ,\"format-timestring ? \")";
+
+  
+    if(nbr_args<1)
+       err_prn(sfnm,"Function has been called with less than two arguments\n"+susg); 
+    
+    /* data to convert */ 
+    var=walker.out(args_vtr[0]);  
+
+
+    lcl_typ=var->type;
+    if( !var->undefined && var->type !=NC_FLOAT && var->type !=NC_DOUBLE )
+      nco_var_cnf_typ(NC_DOUBLE,var); 
+
+     
+    var_ret=nco_var_dpl(var);
+    if(var_ret->val.vp)
+      var_ret->val.vp=nco_free(var_ret->val.vp);
+    
+    var_ret=nco_var_cnf_typ(NC_STRING, var_ret);
+
+    /* text string output units */
+    if(nbr_args >=2)
+       var_iformat=walker.out(args_vtr[1]);
+
+
+
+
+    if(prs_arg->ntl_scn  )
+    {
+      if(var_iformat)  
+         nco_var_free(var_iformat);
+      
+      if(var)        
+	     nco_var_free(var);
+
+      return var_ret;
+    }
+
+
+    if(var_iformat)
+    {
+       nco_var_cnf_typ(NC_INT,var_iformat);
+       cast_void_nctype(NC_INT,&var_iformat->val);
+       iformat=var_iformat->val.ip[0];
+
+       var_iformat=(var_sct*)nco_var_free(var_iformat);
+
+    }
+    // use default format
+    else
+      iformat=1;
+
+
+
+     // grab units attribute of var
+     units_in_sng=ncap_att2var(prs_arg, std::string(var->nm)+"@units");
+
+    // grab calendar attribute of var
+    att_sng=std::string(var->nm)+"@calendar";
+
+    if( ncap_att2var_chk(prs_arg, att_sng) )
+    {
+      calendar_in_sng = ncap_att2var(prs_arg, att_sng);
+      cln_typ=nco_cln_get_cln_typ(calendar_in_sng.c_str());
+    }
+    else
+      cln_typ=cln_nil;
+
+
+
+    rcd=nco_cln_var_prs(units_in_sng.c_str(), cln_typ,iformat, var,var_ret);
+    if(rcd==NCO_ERR)
+        err_prn(sfnm,"Error formatting time string");
+
+
+
+    var=(var_sct*)nco_var_free(var);
+
+    return var_ret;
+
+ }
+
+
+
+
+
+
 
 
 /* ncap2 functions and methods */
diff --git a/src/nco++/fmc_all_cls.hh b/src/nco++/fmc_all_cls.hh
index 2b73b1a..c7434b8 100644
--- a/src/nco++/fmc_all_cls.hh
+++ b/src/nco++/fmc_all_cls.hh
@@ -8,7 +8,7 @@
 // Standard C++ headers
 #ifndef FMC_ALL_CLS_HH
 #define FMC_ALL_CLS_HH
-
+#include <time.h>
 #include <math.h>
 
 #include <string>
@@ -25,6 +25,7 @@
 #include "map_srt_tmp.hh" // template -used in srt_cls
 #include <assert.h>
 
+
   /* Math float prototypes required by AIX, Solaris, but not by Linux, IRIX */
   /* Basic math: acos, asin, atan, cos, exp, fabs, log, log10, sin, sqrt, tan */
   
@@ -295,11 +296,13 @@ public:
 // udunits  Functions       /***************************************/
 class udunits_cls: public vtl_cls {
 private:
-  enum{ PUNITS1};
+  enum{ PUNITS1,PSTRFTIME,PREGULAR};
   bool _flg_dbg;
 public:
   udunits_cls(bool flg_dbg);
   var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker);
+  var_sct *strftime_fnd(bool &is_mtd, std::vector<RefAST> &args_vtr, fmc_cls &fmc_obj, ncoTree &walker);
+  var_sct *regular_fnd(bool &is_mtd, std::vector<RefAST> &args_vtr, fmc_cls &fmc_obj, ncoTree &walker);
 };
 
 
diff --git a/src/nco++/ncap2.cc b/src/nco++/ncap2.cc
index 4332e6f..c2a1eef 100644
--- a/src/nco++/ncap2.cc
+++ b/src/nco++/ncap2.cc
@@ -95,8 +95,8 @@ void ram_vars_add(prs_cls *prs_arg);
 int 
 main(int argc,char **argv)
 {
-  const char fnc_nm[]="main"; 
   FILE *yyin; /* File handle used to check file existence */
+
   int parse_antlr(std::vector<prs_cls> &prs_vtr ,char*,char*);
   
   /* fxm TODO nco652 */
@@ -130,6 +130,8 @@ main(int argc,char **argv)
   const char * const att_nm_tmp="eulaVlliF_"; /* For netCDF4 name hack */
   const char * const opt_sht_lst="3467ACcD:FfhL:l:n:Oo:p:Rrs:S:t:vx-:"; /* [sng] Single letter command line options */
   
+  const char fnc_nm[]="main()";
+
   cnk_sct cnk; /* [sct] Chunking structure */
 
   dmn_sct **dmn_in=NULL_CEWI;  /* [lst] Dimensions in input file */
@@ -205,7 +207,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   
   nm_id_sct *dmn_lst=NULL_CEWI;
   nm_id_sct *xtr_lst=NULL_CEWI; /* Non-processed variables to copy to OUTPUT */
@@ -229,7 +231,6 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -238,6 +239,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"lbr",no_argument,0,0},
     {"library",no_argument,0,0},
     {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */
@@ -254,6 +257,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -314,8 +319,6 @@ main(int argc,char **argv)
     {"variable",no_argument,0,'v'},
     {"exclude",no_argument,0,'x'},
     {"xcl",no_argument,0,'x'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -344,6 +347,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -367,8 +374,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -380,6 +387,10 @@ main(int argc,char **argv)
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
       if(!strcmp(opt_crr,"hdf_upk") || !strcmp(opt_crr,"hdf_unpack")) nco_upk_cnv=nco_upk_HDF_MOD10; /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"lbr") || !strcmp(opt_crr,"library")){
         (void)nco_lbr_vrs_prn();
         nco_exit(EXIT_SUCCESS);
@@ -480,9 +491,10 @@ main(int argc,char **argv)
       PROCESS_ALL_VARS=False;
       xtr_nbr=0;
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       err_prn(fnc_nm,"Long options are not available in this build. Use single letter options instead.\n");
@@ -496,6 +508,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
   
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   /* Append ";\n" to command-script arguments, then concatenate them */
   for(idx=0;idx<nbr_spt;idx++){
     sng_lng=strlen(spt_arg[idx]);
@@ -1041,7 +1056,7 @@ main(int argc,char **argv)
   if(FL_OUT_NEW) (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id); else nco_close(out_id);
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncap-specific memory */
     if(fl_spt_usr) fl_spt_usr=(char *)nco_free(fl_spt_usr);
     
@@ -1104,7 +1119,7 @@ main(int argc,char **argv)
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     var_fix=(var_sct **)nco_free(var_fix);
     var_fix_out=(var_sct **)nco_free(var_fix_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
   // nco_exit_gracefully();
   (void)fclose(stderr);
diff --git a/src/nco++/ncap2_att.cc b/src/nco++/ncap2_att.cc
index 395bc6b..87fd208 100644
--- a/src/nco++/ncap2_att.cc
+++ b/src/nco++/ncap2_att.cc
@@ -72,6 +72,42 @@ ncap_att2var          //   [fnc] return text content of var
 
 
 
+int                    // O [flg] 0 - att doesnt exist 1 - att exists
+ncap_att2var_chk       //   [fnc] returns nco_bool
+( prs_cls *prs_arg,    // I [cls] var/att symbol tables
+  std::string att_nm)  // I [sn]  contains var name to read
+{
+
+  std::string fnc_nm("ncap_att2var");
+  std::string sn;
+  var_sct *var_att = NULL_CEWI;
+  NcapVar *Nvar = NULL;
+
+  if (prs_arg->ntl_scn)
+    Nvar = prs_arg->int_vtr.find(att_nm);
+
+  if (Nvar == NULL)
+    Nvar = prs_arg->var_vtr.find(att_nm);
+
+  if (Nvar)
+    return 1;
+
+  var_att = ncap_att_init(att_nm, prs_arg);
+
+  if (var_att) {
+    var_att = (var_sct *) nco_free(var_att);
+    return 1;
+  }
+  else
+  {
+    return 0;
+  }
+
+}
+
+
+
+
 
 var_sct *                    // O [sct] variable containing attribute 
 ncap_att_init                //   [fnc] Grab an attribute from input file or symbol table
@@ -295,6 +331,40 @@ ncap_att_stretch /* stretch a single valued attribute from 1 to sz */
   return true;
 } /* end ncap_att_stretch */
 
+nco_bool                 /* O [flg] true if var has been stretched */
+ncap_att_char_stretch    /* pad out or truncate a NC_CHAR attribute */
+(var_sct* var,           /* I/O [sct] var/att */
+ long nw_sz)             /* I [nbr] new var size */
+{
+  long  var_typ_sz;
+  char *cp;
+  void* vp;
+
+  if(var->type != NC_CHAR)
+    return False;
+
+  var_typ_sz=nco_typ_lng(NC_CHAR);
+
+
+  vp=(void*)nco_calloc(var_typ_sz,nw_sz);
+  cp=(char*)vp;
+  cast_void_nctype(NC_CHAR,&var->val);
+
+  if( nw_sz > var->sz )
+    strncpy(cp, var->val.cp, var->sz);
+  else
+    strncpy(cp, var->val.cp,nw_sz);
+
+
+  cast_nctype_void(NC_CHAR,&var->val);
+
+  var->val.vp=(void*)nco_free(var->val.vp);
+  var->sz=nw_sz;
+  var->val.vp=vp;
+
+  return true;
+
+} /* end ncap_att_char_stretch */
 
 int 
 ncap_att_cpy_sct
@@ -430,8 +500,7 @@ ncap_att_sprn     /* [fnc] Print a single attribute*/
   char *cp_max;  
 
   long att_lmn;
-  long att_sz; 
-  long max_sz;
+  long att_sz;
   
   /* Copy value to avoid indirection in loop over att_sz */
   att_sz=var->sz;
@@ -574,8 +643,7 @@ char *          /* new malloc'ed string */
 ncap_att_char  /* extract string from a NC_CHAR or first NC_STRING */
 (var_sct *var_att)
 {
-  int idx;
-  char *cstr;
+  char *cstr=NULL;
   
   (void)cast_void_nctype((nc_type)var_att->type,&var_att->val);
 
diff --git a/src/nco++/ncap2_att.hh b/src/nco++/ncap2_att.hh
index 52f7324..643eded 100644
--- a/src/nco++/ncap2_att.hh
+++ b/src/nco++/ncap2_att.hh
@@ -52,6 +52,12 @@ std::string ncap_att2var
 ( prs_cls *prs_arg,   
   std::string att_nm);
 
+int                    // O [flg] 0 - att doesnt exist 1 - att exists
+ncap_att2var_chk       //   [fnc] returns nco_bool
+( prs_cls *prs_arg,    // I [cls] var/att symbol tables
+std::string att_nm);   // I [sn]  contains var name to read
+
+
 
 var_sct * /* O [sct] variable containing attribute */
 ncap_att_init /* [fnc] Grab an attribute from input file */
@@ -90,6 +96,12 @@ ncap_att_stretch    /* stretch a single valued attribute from 1 to sz */
  long nw_sz);       /* I [nbr] new var size */
 
 
+nco_bool                 /* O [flg] true if var has been stretched */
+ncap_att_char_stretch    /* pad out or truncate a NC_CHAR attribute */
+(var_sct* var,           /* I/O [sct] var/att */
+long nw_sz);             /* I [nbr] new var size */
+
+
 int 
 ncap_att_cpy_sct
 (var_sct *var1,
diff --git a/src/nco++/ncap2_utl.cc b/src/nco++/ncap2_utl.cc
index de5a814..0fcb827 100644
--- a/src/nco++/ncap2_utl.cc
+++ b/src/nco++/ncap2_utl.cc
@@ -564,8 +564,8 @@ nco_att_lst_mk
       /* fxm mmr TODO 491: memory leak xtr_lst */
       xtr_lst=(nm_id_sct *)nco_realloc(xtr_lst,(size+1)*sizeof(nm_id_sct));
       xtr_lst[size].id=var_id;
-      xtr_lst[size].nm=(char *)strdup(var_nm); 
-      
+      xtr_lst[size].nm=(char *)strdup(var_nm); 
+      
       /* Increment */
       size++;
       
@@ -1052,7 +1052,7 @@ var_sct* var2)
    a function template overload in VarOPNew.hh */
 var_sct* tmp_var_op_nco_string(var_sct* var1, int op) 
 {
-    long idx;
+
     long sz;
     nco_string *tp1;
 
@@ -1475,9 +1475,7 @@ ncap_var_var_op   /* [fnc] Add two variables */
   // att & var
   else if( vb1 && !vb2)
   {
-    var_sct *var_swp;
-    ptr_unn val_swp;  // Used to swap values around
-    
+
     var1=nco_var_cnf_typ(var2->type,var1);
     //if(var2->sz > 1 && var1->sz==1) (void)ncap_var_cnf_dmn(&var1,&var2);
     
@@ -1648,38 +1646,45 @@ ncap_var_var_inc   /* [fnc] Add two variables */
  int op,            /* Deal with incremental operators i.e +=,-=,*=,/= */
  bool bram,         /* I [bool] If true make a RAM variable */ 
  bool bret, 
- prs_cls *prs_arg)
-{
-  const char fnc_nm[]="ncap_var_var_inc"; 
+ prs_cls *prs_arg) {
+  const char fnc_nm[] = "ncap_var_var_inc";
   const char *cvar1;
   const char *cvar2;
   nco_bool vb1;
   nco_bool vb2;
-  
-  var_sct *var_ret=NULL_CEWI;
-  
+
+  var_sct *var_ret = NULL_CEWI;
+  NcapVar *Nvar;
+
   vb1 = ncap_var_is_att(var1);
-  
+
   // If initial Scan
-  if(prs_arg->ntl_scn)
-  {
-    
+  if (prs_arg->ntl_scn) {
+
     // deal with variable
-    if(!vb1)
-    {
-      var_ret=nco_var_dpl(var1); 
-      (void)prs_arg->ncap_var_write(var1,bram);  
+    if (!vb1) {
+      var_ret = nco_var_dpl(var1);
+      (void) prs_arg->ncap_var_write(var1, bram);
     }
-    // deal with attribute 
+      // deal with attribute
     else
-      var_ret=var1;
+      var_ret = var1;
+
+    if (var2)
+      var2 = (var_sct *) nco_var_free(var2);
 
-    if(var2) 
-      var2=(var_sct*)nco_var_free(var2);
-    
     return var_ret;
-  }   
-  
+  }
+
+
+  // do attribute inheritance
+  if (!vb1) {
+    Nvar = prs_arg->var_vtr.find(var1->nm);
+    if (!Nvar || (Nvar && Nvar->flg_stt == 1))
+      (void)ncap_att_cpy(SCS(var1->nm), SCS(var1->nm), prs_arg);
+
+  }
+
   //Deal with unary functions first
   if(var2==NULL_CEWI)
   {
@@ -1700,7 +1705,7 @@ ncap_var_var_inc   /* [fnc] Add two variables */
     else
     {
       std::string sa(var1->nm);
-      NcapVar *Nvar=new NcapVar(var1,sa);
+      Nvar=new NcapVar(var1,sa);
       prs_arg->var_vtr.push_ow(Nvar);       
     }
     return var_ret;    
@@ -1759,7 +1764,7 @@ ncap_var_var_inc   /* [fnc] Add two variables */
   {
     // deal with attribute
     std::string sa(var1->nm);
-    NcapVar *Nvar=new NcapVar(var1,sa);
+    Nvar=new NcapVar(var1,sa);
     prs_arg->var_vtr.push_ow(Nvar);       
     
   }
diff --git a/src/nco++/ncoGrammer.g b/src/nco++/ncoGrammer.g
index e64e7f5..53274fd 100644
--- a/src/nco++/ncoGrammer.g
+++ b/src/nco++/ncoGrammer.g
@@ -1553,33 +1553,61 @@ var=NULL_CEWI;
             }
 
           | vid2:VAR_ID {   
-              
-              var_sct *var_rhs;
+
+              var_sct *var_rhs=NULL_CEWI;
+              var_sct *var_lhs=NULL_CEWI;
+              var_sct *var_ret=NULL_CEWI;
               std::string var_nm;
-              
+              NcapVar *Nvar;
+
+              // Set class wide variables
+              bcst=false;
+              var_cst=NULL_CEWI;
+
               var_nm=vid2->getText();
 
               if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm);
-               
-               // Set class wide variables           
-               bcst=false;
-               var_cst=NULL_CEWI; 
-             
-               // get shape from RHS
-               var_rhs=out(vid2->getNextSibling());
-               (void)nco_free(var_rhs->nm);                
-               var_rhs->nm =strdup(var_nm.c_str());
 
-               //Copy return variable
-               if(bret)
-                  var=nco_var_dpl(var_rhs);
-               else
-                  var=(var_sct*)NULL;  
-                
-               // Write var to int_vtr
-               // if var already in int_vtr or var_vtr then write call does nothing
-               (void)prs_arg->ncap_var_write(var_rhs,bram);
-               //(void)ncap_var_write_omp(var_rhs,bram,prs_arg);
+              // get shape from RHS
+              var_rhs=out(vid2->getNextSibling());
+
+              // deal with special case where RHS is a NC_CHAR
+              if(var_rhs->type==NC_CHAR)
+              {
+
+                Nvar=prs_arg->int_vtr.find(var_nm);
+                if(!Nvar)
+                   Nvar=prs_arg->var_vtr.find(var_nm);
+
+                // var is unread, is it in Input ?
+                if(!Nvar && prs_arg->ncap_var_init_chk(var_nm)){
+                    var_lhs=prs_arg->ncap_var_init(var_nm,false);
+                    if(var_lhs->type !=NC_CHAR)
+                        var_lhs=nco_var_free(var_lhs);
+                }
+               }
+
+               if(var_lhs)
+               {
+                 var_rhs=(var_sct*)nco_var_free(var_rhs);
+                 var_ret=var_lhs;
+
+               }
+               else if(var_rhs)
+               {
+                  (void)nco_free(var_rhs->nm);
+                  var_rhs->nm =strdup(var_nm.c_str());
+                  var_ret=var_rhs;
+                }
+
+                //Copy return variable
+                if(bret)
+                  var=nco_var_dpl(var_ret);
+                else
+                   var=(var_sct*)NULL;
+
+                (void)prs_arg->ncap_var_write(var_ret,bram);
+
 
 
         } // end action
@@ -1686,11 +1714,11 @@ var=NULL_CEWI;
                   
                  if(Nvar && Nvar->flg_stt==1){
                     var_sct *var_ini;
-                    var_ini=prs_arg->ncap_var_init(var_nm,true);       
+                    var_ini=prs_arg->ncap_var_init(var_nm,true);
                     Nvar->var->val.vp=var_ini->val.vp;
                     var_ini->val.vp=(void*)NULL;
                     var_ini=nco_var_free(var_ini);
-                    Nvar->flg_stt=2; 
+                    Nvar->flg_stt=2;
                  }
 
                  if(Nvar && Nvar->flg_stt==2)
@@ -1937,6 +1965,7 @@ end0:         if(bret)
 
                // Set class wide variables
                var_sct *var_rhs;
+               var_sct *var_shp;
                NcapVar *Nvar;
                std::string var_nm;
  
@@ -1963,30 +1992,66 @@ end0:         if(bret)
                  (void)ncap_att_cpy(var_nm,s_var_rhs,prs_arg);
                
                 // var is defined and populated &  RHS is scalar -then stretch var to match
-               if(Nvar && Nvar->flg_stt==2)
-               {  
-                  long n_sz=Nvar->var->sz;
+               // if(Nvar && Nvar->flg_stt==2)
+               if(Nvar )
+               {
+                  var_shp=Nvar->cpyVarNoData();
+                  nco_var_cnf_typ(var_shp->type,var_rhs);
 
-                  if(var_rhs->sz ==1 && Nvar->var->sz >1)
+                  long n_sz=var_shp->sz;
+
+                  if(var_rhs->sz ==1 && n_sz >1)
                   {
-                    var_rhs=nco_var_cnf_typ(Nvar->var->type,var_rhs);  
                     (void)ncap_att_stretch(var_rhs,n_sz);
                     
                     // this is a special case -- if the RHS scalar has
                     // no missing value then retain LHS missing value
                     // else LHS missing value gets over written by RHS
-                    if(!var_rhs->has_mss_val)
-                      (void)nco_mss_val_cp(Nvar->var,var_rhs);   
+                    //if(!var_rhs->has_mss_val)
+                    // (void)nco_mss_val_cp(Nvar->var,var_rhs);
                   }
-                  
-                  else if( var_rhs->sz >1 && n_sz >1 && var_rhs->sz != n_sz && n_sz % var_rhs->sz ==0)  
+
+                  // deal with NC_CHAR on RHS as special case - if too short then pad out with nulls else trucate
+                  else if(var_rhs->sz>1 &&  n_sz != var_rhs->sz &&  var_shp->type==NC_CHAR  )
+                      ncap_att_char_stretch(var_rhs, n_sz);
+
+                  else if( var_rhs->sz >1 && n_sz >1 && var_rhs->sz != n_sz && n_sz % var_rhs->sz ==0)
                       ncap_var_cnf_dmn(&Nvar->var,&var_rhs); 
-                   
-                
-                  if(var_rhs->sz != Nvar->var->sz)
+
+                  if(var_rhs->sz != n_sz)
                    err_prn(fnc_nm, "size miss-match in simple assign between \""+ var_nm +"\""+ " size="+nbr2sng(Nvar->var->sz) + "var_rhs expr size="+nbr2sng(var_rhs->sz) );
 
-               } 
+                   var_shp->val.vp=var_rhs->val.vp;
+                   var_rhs->val.vp=(void*)NULL;
+
+                   if(var_rhs->has_mss_val)
+                        (void)nco_mss_val_cp(var_rhs,var_shp);
+
+                   var_rhs=nco_var_free(var_rhs);
+                   var_rhs=var_shp;
+
+               }
+               // var is undefined in Output and special treatment of NC_CHAR on RHS
+               else if(!Nvar && var_rhs->type ==NC_CHAR)
+               {
+                 if( prs_arg->ncap_var_init_chk(var_nm))
+                    var_shp=prs_arg->ncap_var_init(var_nm,false);
+
+                 if(var_shp->type==NC_CHAR && var_shp->sz != var_rhs->sz)
+                 {
+                     ncap_att_char_stretch(var_rhs, var_shp->sz);
+                     var_shp->val.vp=var_rhs->val.vp;
+                     var_rhs->val.vp=(void*)NULL;
+                     if(var_rhs->has_mss_val)
+                        (void)nco_mss_val_cp(var_rhs,var_shp);
+
+                     var_rhs=nco_var_free(var_rhs);
+                     var_rhs=var_shp;
+
+                 }
+
+                }
+
 
                // finally add new name before write  
                (void)nco_free(var_rhs->nm);                
@@ -1994,7 +2059,7 @@ end0:         if(bret)
 
                // Write var to disk
                (void)prs_arg->ncap_var_write(var_rhs,bram);
-               //(void)ncap_var_write_omp(var_rhs,bram,prs_arg);
+
 
                 // See If we have to return something
                if(bret)
@@ -3306,23 +3371,27 @@ var=NULL_CEWI;
 where_assign [var_sct *var_msk] returns [bool bret=false]
 {
 const std::string fnc_nm("where_assign");
+var_sct *var_lhs;
 var_sct *var_rhs;
 
 }
-  :#(EXPR #(ASSIGN vid:VAR_ID var_rhs=out)) {
+  //:#(EXPR #(ASSIGN vid:VAR_ID var_rhs=out)) {
+:#(EXPR #(ASSIGN var_lhs=out var_rhs=out)) {
     
    bool bfr=false;
    nco_bool DO_CONFORM;
-   std::string var_nm=vid->getText();
-   var_sct *var_lhs;
+   //std::string var_nm=vid->getText();
+   std::string var_nm;
    NcapVar *Nvar;
 
    bret=false;
 
-   var_lhs=prs_arg->ncap_var_init(var_nm,true);
+   //var_lhs=prs_arg->ncap_var_init(var_nm,true);
    if(var_lhs==NULL_CEWI) 
      nco_exit(EXIT_FAILURE);
             
+   var_nm=std::string(var_lhs->nm); 
+
    var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs);         
    if(var_rhs->sz >1L && var_rhs->sz != var_lhs->sz) {
      var_sct *var_tmp=NULL_CEWI;
diff --git a/src/nco++/ncoTree.cpp b/src/nco++/ncoTree.cpp
index ef9937b..ae7d76c 100644
--- a/src/nco++/ncoTree.cpp
+++ b/src/nco++/ncoTree.cpp
@@ -619,7 +619,7 @@ int  ncoTree::statements(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
 var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 2207 "ncoGrammer.g"
+#line 2272 "ncoGrammer.g"
 	var_sct *var;
 #line 625 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST out_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
@@ -663,7 +663,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 	ANTLR_USE_NAMESPACE(antlr)RefAST val_uint = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST val_int64 = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST val_uint64 = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 2207 "ncoGrammer.g"
+#line 2272 "ncoGrammer.g"
 	
 	bool bret=true;   
 	const std::string fnc_nm("out"); 
@@ -700,7 +700,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t309;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2248 "ncoGrammer.g"
+#line 2313 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, TIMES );
 #line 706 "ncoTree.cpp"
 			}
@@ -719,7 +719,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t310;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2251 "ncoGrammer.g"
+#line 2316 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, DIVIDE );
 #line 725 "ncoTree.cpp"
 			}
@@ -738,7 +738,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t311;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2253 "ncoGrammer.g"
+#line 2318 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, MOD);
 #line 744 "ncoTree.cpp"
 			}
@@ -757,7 +757,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t312;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2255 "ncoGrammer.g"
+#line 2320 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, CARET);
 #line 763 "ncoTree.cpp"
 			}
@@ -774,7 +774,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t313;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2258 "ncoGrammer.g"
+#line 2323 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,NULL_CEWI, LNOT );
 #line 780 "ncoTree.cpp"
 			}
@@ -793,7 +793,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t320;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2277 "ncoGrammer.g"
+#line 2342 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, LAND );
 #line 799 "ncoTree.cpp"
 			}
@@ -812,7 +812,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t321;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2279 "ncoGrammer.g"
+#line 2344 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, LOR );
 #line 818 "ncoTree.cpp"
 			}
@@ -831,7 +831,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t322;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2282 "ncoGrammer.g"
+#line 2347 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, LTHAN );
 #line 837 "ncoTree.cpp"
 			}
@@ -850,7 +850,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t323;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2284 "ncoGrammer.g"
+#line 2349 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, GTHAN );
 #line 856 "ncoTree.cpp"
 			}
@@ -869,7 +869,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t324;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2286 "ncoGrammer.g"
+#line 2351 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, GEQ );
 #line 875 "ncoTree.cpp"
 			}
@@ -888,7 +888,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t325;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2288 "ncoGrammer.g"
+#line 2353 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, LEQ );
 #line 894 "ncoTree.cpp"
 			}
@@ -907,7 +907,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t326;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2290 "ncoGrammer.g"
+#line 2355 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, EQ );
 #line 913 "ncoTree.cpp"
 			}
@@ -926,7 +926,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t327;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2292 "ncoGrammer.g"
+#line 2357 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, NEQ );
 #line 932 "ncoTree.cpp"
 			}
@@ -945,7 +945,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t328;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2295 "ncoGrammer.g"
+#line 2360 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, FLTHAN );
 #line 951 "ncoTree.cpp"
 			}
@@ -964,7 +964,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t329;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2297 "ncoGrammer.g"
+#line 2362 "ncoGrammer.g"
 				var=ncap_var_var_op(var1,var2, FGTHAN );
 #line 970 "ncoTree.cpp"
 			}
@@ -982,7 +982,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t413;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2430 "ncoGrammer.g"
+#line 2495 "ncoGrammer.g"
 				
 				var=out(att2var(attz));    
 				
@@ -1002,7 +1002,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t414;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2436 "ncoGrammer.g"
+#line 2501 "ncoGrammer.g"
 				
 				
 				
@@ -1024,7 +1024,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t415;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2441 "ncoGrammer.g"
+#line 2506 "ncoGrammer.g"
 				
 				bool br;
 				
@@ -1057,7 +1057,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t416;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2459 "ncoGrammer.g"
+#line 2524 "ncoGrammer.g"
 				
 				// The lexer has appended the index of the function to the function name m - (name#index)
 				//  the index is into fmc_vtr  
@@ -1089,7 +1089,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t417;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2470 "ncoGrammer.g"
+#line 2535 "ncoGrammer.g"
 				
 				// The lexer has appended the index of the function to the function name m - (name#index)
 				//  the index is into fmc_vtr  
@@ -1108,7 +1108,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,DIM_ID_SIZE);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2480 "ncoGrammer.g"
+#line 2545 "ncoGrammer.g"
 				
 				string sDim=dval->getText();
 				dmn_sct *dmn_fd;
@@ -1158,7 +1158,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,VALUE_LIST);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2721 "ncoGrammer.g"
+#line 2786 "ncoGrammer.g"
 				
 				var=value_list(vlst);
 				
@@ -1172,7 +1172,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NSTRING);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2726 "ncoGrammer.g"
+#line 2791 "ncoGrammer.g"
 				
 				/* use malloc here rather than strdup(str->getText().c_str()) as this causes 
 				an invalid-read when using GCC compiler */ 
@@ -1206,7 +1206,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,N4STRING);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2754 "ncoGrammer.g"
+#line 2819 "ncoGrammer.g"
 				
 				char *tsng;
 				tsng=(char*)nco_malloc(str1->getText().size()+1);    
@@ -1244,7 +1244,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_FLOAT);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2784 "ncoGrammer.g"
+#line 2849 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~float"),(nc_type)NC_FLOAT,false); else var=ncap_sclr_var_mk(SCS("~float"),static_cast<float>(std::strtod(val_float->getText().c_str(),(char **)NULL)));
 #line 1250 "ncoTree.cpp"
 			}
@@ -1256,7 +1256,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_DOUBLE);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2786 "ncoGrammer.g"
+#line 2851 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~double"),(nc_type)NC_DOUBLE,false); else var=ncap_sclr_var_mk(SCS("~double"),strtod(val_double->getText().c_str(),(char **)NULL));
 #line 1262 "ncoTree.cpp"
 			}
@@ -1268,7 +1268,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_INT);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2788 "ncoGrammer.g"
+#line 2853 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int"),(nc_type)NC_INT,false); else var=ncap_sclr_var_mk(SCS("~int"),static_cast<nco_int>(std::strtol(val_int->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1274 "ncoTree.cpp"
 			}
@@ -1280,7 +1280,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_SHORT);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2790 "ncoGrammer.g"
+#line 2855 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~short"),(nc_type)NC_SHORT,false); else var=ncap_sclr_var_mk(SCS("~short"),static_cast<nco_short>(std::strtol(val_short->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1286 "ncoTree.cpp"
 			}
@@ -1292,7 +1292,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_BYTE);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2792 "ncoGrammer.g"
+#line 2857 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~byte"),(nc_type)NC_BYTE,false); else var=ncap_sclr_var_mk(SCS("~byte"),static_cast<nco_byte>(std::strtol(val_byte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1298 "ncoTree.cpp"
 			}
@@ -1304,7 +1304,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_UBYTE);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2797 "ncoGrammer.g"
+#line 2862 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ubyte"),(nc_type)NC_UBYTE,false); else var=ncap_sclr_var_mk(SCS("~ubyte"),static_cast<nco_ubyte>(std::strtoul(val_ubyte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1310 "ncoTree.cpp"
 			}
@@ -1316,7 +1316,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_USHORT);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2801 "ncoGrammer.g"
+#line 2866 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ushort"),(nc_type)NC_USHORT,false); else var=ncap_sclr_var_mk(SCS("~ushort"),static_cast<nco_ushort>(std::strtoul(val_ushort->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1322 "ncoTree.cpp"
 			}
@@ -1328,7 +1328,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_UINT);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2803 "ncoGrammer.g"
+#line 2868 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint"),(nc_type)NC_UINT,false); else var=ncap_sclr_var_mk(SCS("~uint"),static_cast<nco_uint>(std::strtoul(val_uint->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));
 #line 1334 "ncoTree.cpp"
 			}
@@ -1340,7 +1340,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_INT64);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2805 "ncoGrammer.g"
+#line 2870 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int64"),(nc_type)NC_INT64,false); else var=ncap_sclr_var_mk(SCS("~int64"),sng2nbr(val_int64->getText(),nco_int64_CEWI));
 #line 1346 "ncoTree.cpp"
 			}
@@ -1352,7 +1352,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,NCAP_UINT64);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2809 "ncoGrammer.g"
+#line 2874 "ncoGrammer.g"
 				if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint64"),(nc_type)NC_UINT64,false); else var=ncap_sclr_var_mk(SCS("~uint64"),sng2nbr(val_uint64->getText(),nco_uint64_CEWI));
 #line 1358 "ncoTree.cpp"
 			}
@@ -1398,7 +1398,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 				_t = __t280;
 				_t = _t->getNextSibling();
 				if ( inputState->guessing==0 ) {
-#line 2228 "ncoGrammer.g"
+#line 2293 "ncoGrammer.g"
 					var=ncap_var_var_op(var1,var2, PLUS );
 #line 1404 "ncoTree.cpp"
 				}
@@ -1443,7 +1443,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 					_t = __t284;
 					_t = _t->getNextSibling();
 					if ( inputState->guessing==0 ) {
-#line 2230 "ncoGrammer.g"
+#line 2295 "ncoGrammer.g"
 						var=ncap_var_var_op(var1,var2, MINUS );
 #line 1449 "ncoTree.cpp"
 					}
@@ -1498,7 +1498,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 						_t = __t289;
 						_t = _t->getNextSibling();
 						if ( inputState->guessing==0 ) {
-#line 2231 "ncoGrammer.g"
+#line 2296 "ncoGrammer.g"
 							
 							var1=out(att2var(aposti));     
 							var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,false,bret,prs_arg);      
@@ -1556,7 +1556,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 							_t = __t295;
 							_t = _t->getNextSibling();
 							if ( inputState->guessing==0 ) {
-#line 2235 "ncoGrammer.g"
+#line 2300 "ncoGrammer.g"
 								
 								var1=out(att2var(apostd));     
 								var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,false,bret,prs_arg);      
@@ -1614,7 +1614,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 								_t = __t301;
 								_t = _t->getNextSibling();
 								if ( inputState->guessing==0 ) {
-#line 2239 "ncoGrammer.g"
+#line 2304 "ncoGrammer.g"
 									
 									var1=out(att2var(aprei));     
 									var=ncap_var_var_inc(var1,NULL_CEWI,INC,false,bret,prs_arg);      
@@ -1672,7 +1672,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t307;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2243 "ncoGrammer.g"
+#line 2308 "ncoGrammer.g"
 										
 										var1=out(att2var(apred));     
 										var=ncap_var_var_inc(var1,NULL_CEWI,DEC,false,bret,prs_arg);      
@@ -1690,7 +1690,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t314;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2260 "ncoGrammer.g"
+#line 2325 "ncoGrammer.g"
 										var=ncap_var_var_op(var1,NULL_CEWI, MINUS );
 #line 1696 "ncoTree.cpp"
 									}
@@ -1715,7 +1715,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t316;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2264 "ncoGrammer.g"
+#line 2329 "ncoGrammer.g"
 										var=ncap_var_var_inc(var1,NULL_CEWI,INC,false,bret,prs_arg);
 #line 1721 "ncoTree.cpp"
 									}
@@ -1730,7 +1730,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t317;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2267 "ncoGrammer.g"
+#line 2332 "ncoGrammer.g"
 										var=ncap_var_var_inc(var1,NULL_CEWI, DEC,false,bret,prs_arg );
 #line 1736 "ncoTree.cpp"
 									}
@@ -1745,7 +1745,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t318;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2269 "ncoGrammer.g"
+#line 2334 "ncoGrammer.g"
 										
 										var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,false,bret,prs_arg);
 										
@@ -1762,7 +1762,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 									_t = __t319;
 									_t = _t->getNextSibling();
 									if ( inputState->guessing==0 ) {
-#line 2272 "ncoGrammer.g"
+#line 2337 "ncoGrammer.g"
 										
 										var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,false,bret,prs_arg);
 										
@@ -1831,7 +1831,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 										_t = __t334;
 										_t = _t->getNextSibling();
 										if ( inputState->guessing==0 ) {
-#line 2305 "ncoGrammer.g"
+#line 2370 "ncoGrammer.g"
 											
 											var=ncap_var_var_inc(var1,var2,PLUS_ASSIGN ,false, bret,prs_arg);
 											
@@ -1891,7 +1891,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 											_t = __t339;
 											_t = _t->getNextSibling();
 											if ( inputState->guessing==0 ) {
-#line 2309 "ncoGrammer.g"
+#line 2374 "ncoGrammer.g"
 												
 												var=ncap_var_var_inc(var1,var2, PLUS_ASSIGN ,true, bret,prs_arg);
 												
@@ -1952,7 +1952,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 												_t = __t345;
 												_t = _t->getNextSibling();
 												if ( inputState->guessing==0 ) {
-#line 2313 "ncoGrammer.g"
+#line 2378 "ncoGrammer.g"
 													
 													
 													var1=out(att2var(atp));     
@@ -2023,7 +2023,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 													_t = __t351;
 													_t = _t->getNextSibling();
 													if ( inputState->guessing==0 ) {
-#line 2320 "ncoGrammer.g"
+#line 2385 "ncoGrammer.g"
 														
 														var=ncap_var_var_inc(var1,var2, MINUS_ASSIGN ,false, bret,prs_arg);
 														
@@ -2083,7 +2083,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 														_t = __t356;
 														_t = _t->getNextSibling();
 														if ( inputState->guessing==0 ) {
-#line 2324 "ncoGrammer.g"
+#line 2389 "ncoGrammer.g"
 															
 															var=ncap_var_var_inc(var1,var2, MINUS_ASSIGN ,true, bret,prs_arg);
 															
@@ -2144,7 +2144,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 															_t = __t362;
 															_t = _t->getNextSibling();
 															if ( inputState->guessing==0 ) {
-#line 2328 "ncoGrammer.g"
+#line 2393 "ncoGrammer.g"
 																
 																var1=out(att2var(atm));     
 																var=ncap_var_var_inc(var1,var2, MINUS_ASSIGN ,false, bret,prs_arg);
@@ -2214,7 +2214,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																_t = __t368;
 																_t = _t->getNextSibling();
 																if ( inputState->guessing==0 ) {
-#line 2333 "ncoGrammer.g"
+#line 2398 "ncoGrammer.g"
 																	
 																	var=ncap_var_var_inc(var1,var2, TIMES_ASSIGN ,false, bret,prs_arg);
 																	
@@ -2274,7 +2274,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																	_t = __t373;
 																	_t = _t->getNextSibling();
 																	if ( inputState->guessing==0 ) {
-#line 2337 "ncoGrammer.g"
+#line 2402 "ncoGrammer.g"
 																		
 																		var=ncap_var_var_inc(var1,var2, TIMES_ASSIGN ,true, bret,prs_arg);
 																		
@@ -2335,7 +2335,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																		_t = __t379;
 																		_t = _t->getNextSibling();
 																		if ( inputState->guessing==0 ) {
-#line 2341 "ncoGrammer.g"
+#line 2406 "ncoGrammer.g"
 																			
 																			var1=out(att2var(attm));     
 																			var=ncap_var_var_inc(var1,var2, TIMES_ASSIGN ,false, bret,prs_arg);
@@ -2405,7 +2405,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																			_t = __t385;
 																			_t = _t->getNextSibling();
 																			if ( inputState->guessing==0 ) {
-#line 2346 "ncoGrammer.g"
+#line 2411 "ncoGrammer.g"
 																				
 																				var=ncap_var_var_inc(var1,var2, DIVIDE_ASSIGN ,false, bret,prs_arg);
 																				
@@ -2465,7 +2465,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																				_t = __t390;
 																				_t = _t->getNextSibling();
 																				if ( inputState->guessing==0 ) {
-#line 2350 "ncoGrammer.g"
+#line 2415 "ncoGrammer.g"
 																					
 																					var=ncap_var_var_inc(var1,var2, DIVIDE_ASSIGN ,true, bret,prs_arg);
 																					
@@ -2526,7 +2526,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																					_t = __t396;
 																					_t = _t->getNextSibling();
 																					if ( inputState->guessing==0 ) {
-#line 2354 "ncoGrammer.g"
+#line 2419 "ncoGrammer.g"
 																						
 																						var1=out(att2var(atd));        
 																						var=ncap_var_var_inc(var1,var2, DIVIDE_ASSIGN ,false, bret,prs_arg);
@@ -2593,7 +2593,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																						_t = __t402;
 																						_t = _t->getNextSibling();
 																						if ( inputState->guessing==0 ) {
-#line 2360 "ncoGrammer.g"
+#line 2425 "ncoGrammer.g"
 																							
 																							if(prs_arg->ntl_scn)
 																							var=assign_ntl(asn,false,bret); 
@@ -2653,7 +2653,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																							_t = __t407;
 																							_t = _t->getNextSibling();
 																							if ( inputState->guessing==0 ) {
-#line 2368 "ncoGrammer.g"
+#line 2433 "ncoGrammer.g"
 																								
 																								
 																								RefAST tr;
@@ -2715,7 +2715,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																							_t = __t409;
 																							_t = _t->getNextSibling();
 																							if ( inputState->guessing==0 ) {
-#line 2384 "ncoGrammer.g"
+#line 2449 "ncoGrammer.g"
 																								
 																								// Check for RAM variable - if present 
 																								// change tree - for example from:
@@ -2800,7 +2800,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																								_t = __t421;
 																								_t = _t->getNextSibling();
 																								if ( inputState->guessing==0 ) {
-#line 2521 "ncoGrammer.g"
+#line 2586 "ncoGrammer.g"
 																									
 																											
 																											    // fxm: 4 Oct 2015
@@ -2868,7 +2868,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																									_t = __t425;
 																									_t = _t->getNextSibling();
 																									if ( inputState->guessing==0 ) {
-#line 2549 "ncoGrammer.g"
+#line 2614 "ncoGrammer.g"
 																										
 																										
 																										std::string att_nm=attl->getText();
@@ -2978,7 +2978,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																									match(_t,VAR_ID);
 																									_t = _t->getNextSibling();
 																									if ( inputState->guessing==0 ) {
-#line 2655 "ncoGrammer.g"
+#line 2720 "ncoGrammer.g"
 																										
 																										//dbg_prn(fnc_nm,"getting regular var in out "+v->getText());
 																										
@@ -3017,7 +3017,7 @@ var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 																									match(_t,ATT_ID);
 																									_t = _t->getNextSibling();
 																									if ( inputState->guessing==0 ) {
-#line 2687 "ncoGrammer.g"
+#line 2752 "ncoGrammer.g"
 																										
 																										
 																										var=att_plain(att);  
@@ -3312,36 +3312,64 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 #line 1555 "ncoGrammer.g"
 					
 					
-					var_sct *var_rhs;
+					var_sct *var_rhs=NULL_CEWI;
+					var_sct *var_lhs=NULL_CEWI;
+					var_sct *var_ret=NULL_CEWI;
 					std::string var_nm;
+					NcapVar *Nvar;
+					
+					// Set class wide variables
+					bcst=false;
+					var_cst=NULL_CEWI;
 					
 					var_nm=vid2->getText();
 					
 					if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm);
 					
-					// Set class wide variables           
-					bcst=false;
-					var_cst=NULL_CEWI; 
-					
 					// get shape from RHS
 					var_rhs=out(vid2->getNextSibling());
-					(void)nco_free(var_rhs->nm);                
+					
+					// deal with special case where RHS is a NC_CHAR
+					if(var_rhs->type==NC_CHAR)
+					{
+					
+					Nvar=prs_arg->int_vtr.find(var_nm);
+					if(!Nvar)
+					Nvar=prs_arg->var_vtr.find(var_nm);
+					
+					// var is unread, is it in Input ?
+					if(!Nvar && prs_arg->ncap_var_init_chk(var_nm)){
+					var_lhs=prs_arg->ncap_var_init(var_nm,false);
+					if(var_lhs->type !=NC_CHAR)
+					var_lhs=nco_var_free(var_lhs);
+					}
+					}
+					
+					if(var_lhs)
+					{
+					var_rhs=(var_sct*)nco_var_free(var_rhs);
+					var_ret=var_lhs;
+					
+					}
+					else if(var_rhs)
+					{
+					(void)nco_free(var_rhs->nm);
 					var_rhs->nm =strdup(var_nm.c_str());
+					var_ret=var_rhs;
+					}
 					
 					//Copy return variable
 					if(bret)
-					var=nco_var_dpl(var_rhs);
+					var=nco_var_dpl(var_ret);
 					else
-					var=(var_sct*)NULL;  
+					var=(var_sct*)NULL;
+					
+					(void)prs_arg->ncap_var_write(var_ret,bram);
 					
-					// Write var to int_vtr
-					// if var already in int_vtr or var_vtr then write call does nothing
-					(void)prs_arg->ncap_var_write(var_rhs,bram);
-					//(void)ncap_var_write_omp(var_rhs,bram,prs_arg);
 					
 					
 					
-#line 3345 "ncoTree.cpp"
+#line 3373 "ncoTree.cpp"
 				}
 			}
 			else {
@@ -3382,7 +3410,7 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					_t = __t253;
 					_t = _t->getNextSibling();
 					if ( inputState->guessing==0 ) {
-#line 1587 "ncoGrammer.g"
+#line 1615 "ncoGrammer.g"
 						
 						
 						//In Initial scan all newly defined atts are flagged as Undefined
@@ -3403,7 +3431,7 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						var=(var_sct*)NULL; 
 						
 						
-#line 3407 "ncoTree.cpp"
+#line 3435 "ncoTree.cpp"
 					}
 				}
 				else {
@@ -3444,11 +3472,11 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						_t = __t257;
 						_t = _t->getNextSibling();
 						if ( inputState->guessing==0 ) {
-#line 1608 "ncoGrammer.g"
+#line 1636 "ncoGrammer.g"
 							
 							;
 							
-#line 3452 "ncoTree.cpp"
+#line 3480 "ncoTree.cpp"
 						}
 					}
 					else if ((_t->getType() == ATT_ID)) {
@@ -3456,7 +3484,7 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						match(_t,ATT_ID);
 						_t = _t->getNextSibling();
 						if ( inputState->guessing==0 ) {
-#line 1611 "ncoGrammer.g"
+#line 1639 "ncoGrammer.g"
 							
 							
 							//In Initial scan all newly defined atts are flagged as Undefined
@@ -3477,7 +3505,7 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 							var=(var_sct*)NULL;    
 							
 							
-#line 3481 "ncoTree.cpp"
+#line 3509 "ncoTree.cpp"
 						}
 					}
 		else {
@@ -3501,9 +3529,9 @@ var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 	bool bram,bool bret
 ) {
-#line 1634 "ncoGrammer.g"
+#line 1662 "ncoGrammer.g"
 	var_sct *var;
-#line 3507 "ncoTree.cpp"
+#line 3535 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST assign_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST;
@@ -3514,12 +3542,12 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 	ANTLR_USE_NAMESPACE(antlr)RefAST lmta = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST att1 = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST att2 = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 1634 "ncoGrammer.g"
+#line 1662 "ncoGrammer.g"
 	
 	const std::string fnc_nm("assign"); 
 	var=NULL_CEWI;
 	
-#line 3523 "ncoTree.cpp"
+#line 3551 "ncoTree.cpp"
 	
 	try {      // for error handling
 		bool synPredMatched261 = false;
@@ -3559,7 +3587,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 			_t = __t262;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 1640 "ncoGrammer.g"
+#line 1668 "ncoGrammer.g"
 				
 				
 				int idx;
@@ -3609,11 +3637,11 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 				
 				if(Nvar && Nvar->flg_stt==1){
 				var_sct *var_ini;
-				var_ini=prs_arg->ncap_var_init(var_nm,true);       
+				var_ini=prs_arg->ncap_var_init(var_nm,true);
 				Nvar->var->val.vp=var_ini->val.vp;
 				var_ini->val.vp=(void*)NULL;
 				var_ini=nco_var_free(var_ini);
-				Nvar->flg_stt=2; 
+				Nvar->flg_stt=2;
 				}
 				
 				if(Nvar && Nvar->flg_stt==2)
@@ -3756,7 +3784,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 				
 				
 				
-#line 3760 "ncoTree.cpp"
+#line 3788 "ncoTree.cpp"
 			}
 		}
 		else {
@@ -3818,7 +3846,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 				_t = __t267;
 				_t = _t->getNextSibling();
 				if ( inputState->guessing==0 ) {
-#line 1838 "ncoGrammer.g"
+#line 1866 "ncoGrammer.g"
 					
 					
 					var_sct *var1;
@@ -3916,7 +3944,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					var_cst=nco_var_free(var_cst); 
 					
 					
-#line 3920 "ncoTree.cpp"
+#line 3948 "ncoTree.cpp"
 				}
 			}
 			else if ((_t->getType() == VAR_ID)) {
@@ -3924,11 +3952,12 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 				match(_t,VAR_ID);
 				_t = _t->getNextSibling();
 				if ( inputState->guessing==0 ) {
-#line 1936 "ncoGrammer.g"
+#line 1964 "ncoGrammer.g"
 					
 					
 					// Set class wide variables
 					var_sct *var_rhs;
+					var_sct *var_shp;
 					NcapVar *Nvar;
 					std::string var_nm;
 					
@@ -3955,30 +3984,66 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					(void)ncap_att_cpy(var_nm,s_var_rhs,prs_arg);
 					
 					// var is defined and populated &  RHS is scalar -then stretch var to match
-					if(Nvar && Nvar->flg_stt==2)
-					{  
-					long n_sz=Nvar->var->sz;
+					// if(Nvar && Nvar->flg_stt==2)
+					if(Nvar )
+					{
+					var_shp=Nvar->cpyVarNoData();
+					nco_var_cnf_typ(var_shp->type,var_rhs);
 					
-					if(var_rhs->sz ==1 && Nvar->var->sz >1)
+					long n_sz=var_shp->sz;
+					
+					if(var_rhs->sz ==1 && n_sz >1)
 					{
-					var_rhs=nco_var_cnf_typ(Nvar->var->type,var_rhs);  
 					(void)ncap_att_stretch(var_rhs,n_sz);
 					
 					// this is a special case -- if the RHS scalar has
 					// no missing value then retain LHS missing value
 					// else LHS missing value gets over written by RHS
-					if(!var_rhs->has_mss_val)
-					(void)nco_mss_val_cp(Nvar->var,var_rhs);   
+					//if(!var_rhs->has_mss_val)
+					// (void)nco_mss_val_cp(Nvar->var,var_rhs);
 					}
 					
-					else if( var_rhs->sz >1 && n_sz >1 && var_rhs->sz != n_sz && n_sz % var_rhs->sz ==0)  
-					ncap_var_cnf_dmn(&Nvar->var,&var_rhs); 
+					// deal with NC_CHAR on RHS as special case - if too short then pad out with nulls else trucate
+					else if(var_rhs->sz>1 &&  n_sz != var_rhs->sz &&  var_shp->type==NC_CHAR  )
+					ncap_att_char_stretch(var_rhs, n_sz);
 					
+					else if( var_rhs->sz >1 && n_sz >1 && var_rhs->sz != n_sz && n_sz % var_rhs->sz ==0)
+					ncap_var_cnf_dmn(&Nvar->var,&var_rhs); 
 					
-					if(var_rhs->sz != Nvar->var->sz)
+					if(var_rhs->sz != n_sz)
 					err_prn(fnc_nm, "size miss-match in simple assign between \""+ var_nm +"\""+ " size="+nbr2sng(Nvar->var->sz) + "var_rhs expr size="+nbr2sng(var_rhs->sz) );
 					
-					} 
+					var_shp->val.vp=var_rhs->val.vp;
+					var_rhs->val.vp=(void*)NULL;
+					
+					if(var_rhs->has_mss_val)
+					(void)nco_mss_val_cp(var_rhs,var_shp);
+					
+					var_rhs=nco_var_free(var_rhs);
+					var_rhs=var_shp;
+					
+					}
+					// var is undefined in Output and special treatment of NC_CHAR on RHS
+					else if(!Nvar && var_rhs->type ==NC_CHAR)
+					{
+					if( prs_arg->ncap_var_init_chk(var_nm))
+					var_shp=prs_arg->ncap_var_init(var_nm,false);
+					
+					if(var_shp->type==NC_CHAR && var_shp->sz != var_rhs->sz)
+					{
+					ncap_att_char_stretch(var_rhs, var_shp->sz);
+					var_shp->val.vp=var_rhs->val.vp;
+					var_rhs->val.vp=(void*)NULL;
+					if(var_rhs->has_mss_val)
+					(void)nco_mss_val_cp(var_rhs,var_shp);
+					
+					var_rhs=nco_var_free(var_rhs);
+					var_rhs=var_shp;
+					
+					}
+					
+					}
+					
 					
 					// finally add new name before write  
 					(void)nco_free(var_rhs->nm);                
@@ -3986,7 +4051,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					
 					// Write var to disk
 					(void)prs_arg->ncap_var_write(var_rhs,bram);
-					//(void)ncap_var_write_omp(var_rhs,bram,prs_arg);
+					
 					
 					// See If we have to return something
 					if(bret)
@@ -3996,7 +4061,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					
 					
 					
-#line 4000 "ncoTree.cpp"
+#line 4065 "ncoTree.cpp"
 				}
 			}
 			else {
@@ -4037,7 +4102,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 					_t = __t271;
 					_t = _t->getNextSibling();
 					if ( inputState->guessing==0 ) {
-#line 2008 "ncoGrammer.g"
+#line 2073 "ncoGrammer.g"
 						
 						
 						long srt,end,cnt,srd;  
@@ -4192,7 +4257,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						
 						
 						
-#line 4196 "ncoTree.cpp"
+#line 4261 "ncoTree.cpp"
 					}
 				}
 				else {
@@ -4233,11 +4298,11 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						_t = __t275;
 						_t = _t->getNextSibling();
 						if ( inputState->guessing==0 ) {
-#line 2163 "ncoGrammer.g"
+#line 2228 "ncoGrammer.g"
 							
 							;
 							
-#line 4241 "ncoTree.cpp"
+#line 4306 "ncoTree.cpp"
 						}
 					}
 					else if ((_t->getType() == ATT_ID)) {
@@ -4245,7 +4310,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 						match(_t,ATT_ID);
 						_t = _t->getNextSibling();
 						if ( inputState->guessing==0 ) {
-#line 2166 "ncoGrammer.g"
+#line 2231 "ncoGrammer.g"
 							
 							
 							var_sct *var1;
@@ -4285,7 +4350,7 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 							
 							
 							
-#line 4289 "ncoTree.cpp"
+#line 4354 "ncoTree.cpp"
 						}
 					}
 		else {
@@ -4307,14 +4372,14 @@ var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 }
 
 var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 2820 "ncoGrammer.g"
+#line 2885 "ncoGrammer.g"
 	var_sct *var;
-#line 4313 "ncoTree.cpp"
+#line 4378 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST out_asn_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid1 = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 2820 "ncoGrammer.g"
+#line 2885 "ncoGrammer.g"
 	
 	const std::string fnc_nm("assign_asn");
 	var=NULL_CEWI; 
@@ -4322,7 +4387,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 	NcapVar *Nvar;
 	
 	
-#line 4326 "ncoTree.cpp"
+#line 4391 "ncoTree.cpp"
 	
 	try {      // for error handling
 		if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST )
@@ -4340,7 +4405,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			_t = __t427;
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2830 "ncoGrammer.g"
+#line 2895 "ncoGrammer.g"
 				
 				if(vid1->getFirstChild())
 				err_prn(fnc_nm,"Invalid Lvalue " +vid1->getText() );
@@ -4358,7 +4423,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 				}
 				
 				
-#line 4362 "ncoTree.cpp"
+#line 4427 "ncoTree.cpp"
 			}
 			break;
 		}
@@ -4368,7 +4433,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,VAR_ID);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2848 "ncoGrammer.g"
+#line 2913 "ncoGrammer.g"
 				
 				var_nm_s=vid->getText();  
 				if(vid->getFirstChild())
@@ -4389,7 +4454,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 				}
 				
 				
-#line 4393 "ncoTree.cpp"
+#line 4458 "ncoTree.cpp"
 			}
 			break;
 		}
@@ -4399,7 +4464,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			match(_t,ATT_ID);
 			_t = _t->getNextSibling();
 			if ( inputState->guessing==0 ) {
-#line 2869 "ncoGrammer.g"
+#line 2934 "ncoGrammer.g"
 				
 				// check "output"
 				NcapVar *Nvar=NULL;
@@ -4436,7 +4501,7 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 				
 				
 				
-#line 4440 "ncoTree.cpp"
+#line 4505 "ncoTree.cpp"
 			}
 			break;
 		}
@@ -4460,12 +4525,12 @@ var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
 var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 2909 "ncoGrammer.g"
+#line 2974 "ncoGrammer.g"
 	var_sct *var;
-#line 4466 "ncoTree.cpp"
+#line 4531 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST att_plain_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 2909 "ncoGrammer.g"
+#line 2974 "ncoGrammer.g"
 	
 	const std::string fnc_nm("att_plain");
 	var=NULL_CEWI; 
@@ -4473,14 +4538,14 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 	NcapVar *Nvar;
 	
 	
-#line 4477 "ncoTree.cpp"
+#line 4542 "ncoTree.cpp"
 	
 	try {      // for error handling
 		att = _t;
 		match(_t,ATT_ID);
 		_t = _t->getNextSibling();
 		if ( inputState->guessing==0 ) {
-#line 2919 "ncoGrammer.g"
+#line 2984 "ncoGrammer.g"
 			
 			// check "output"
 			NcapVar *Nvar=NULL;
@@ -4511,7 +4576,7 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			var->val.vp=(void*)nco_free(var->val.vp);
 			
 			
-#line 4515 "ncoTree.cpp"
+#line 4580 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -4528,12 +4593,12 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
  RefAST  ncoTree::att2var(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 2956 "ncoGrammer.g"
+#line 3021 "ncoGrammer.g"
 	 RefAST tr ;
-#line 4534 "ncoTree.cpp"
+#line 4599 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST att2var_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 2956 "ncoGrammer.g"
+#line 3021 "ncoGrammer.g"
 	
 	var_sct *var=NULL_CEWI; 
 	NcapVar *Nvar;
@@ -4542,7 +4607,7 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 	std::string fnc_nm("att2var");
 	
 	
-#line 4546 "ncoTree.cpp"
+#line 4611 "ncoTree.cpp"
 	
 	try {      // for error handling
 		{
@@ -4551,7 +4616,7 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = _t->getNextSibling();
 		}
 		if ( inputState->guessing==0 ) {
-#line 2967 "ncoGrammer.g"
+#line 3032 "ncoGrammer.g"
 			
 			/* sn can be empty on 1st Parse but not 2nd */
 			att_nm=att->getText();
@@ -4580,7 +4645,7 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			tr->setText(sn);
 			
 			
-#line 4584 "ncoTree.cpp"
+#line 4649 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -4597,17 +4662,17 @@ var_sct * ncoTree::att_plain(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
 var_sct * ncoTree::value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 3000 "ncoGrammer.g"
+#line 3065 "ncoGrammer.g"
 	var_sct *var;
-#line 4603 "ncoTree.cpp"
+#line 4668 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST value_list_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vlst = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3000 "ncoGrammer.g"
+#line 3065 "ncoGrammer.g"
 	
 	const std::string fnc_nm("value_list");
 	var=NULL_CEWI; 
 	
-#line 4611 "ncoTree.cpp"
+#line 4676 "ncoTree.cpp"
 	
 	try {      // for error handling
 		{
@@ -4616,7 +4681,7 @@ var_sct * ncoTree::value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = _t->getNextSibling();
 		}
 		if ( inputState->guessing==0 ) {
-#line 3005 "ncoGrammer.g"
+#line 3070 "ncoGrammer.g"
 			
 			char *cp;  
 			int nbr_lst;
@@ -4691,7 +4756,7 @@ var_sct * ncoTree::value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			var=var_ret;
 			
 			
-#line 4695 "ncoTree.cpp"
+#line 4760 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -4708,17 +4773,17 @@ var_sct * ncoTree::value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
 var_sct * ncoTree::value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 3082 "ncoGrammer.g"
+#line 3147 "ncoGrammer.g"
 	var_sct *var;
-#line 4714 "ncoTree.cpp"
+#line 4779 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST value_list_string_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vlst = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3082 "ncoGrammer.g"
+#line 3147 "ncoGrammer.g"
 	
 	const std::string fnc_nm("value_list");
 	var=NULL_CEWI; 
 	
-#line 4722 "ncoTree.cpp"
+#line 4787 "ncoTree.cpp"
 	
 	try {      // for error handling
 		{
@@ -4727,7 +4792,7 @@ var_sct * ncoTree::value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = _t->getNextSibling();
 		}
 		if ( inputState->guessing==0 ) {
-#line 3087 "ncoGrammer.g"
+#line 3152 "ncoGrammer.g"
 			
 			
 			char *cp;
@@ -4785,7 +4850,7 @@ var_sct * ncoTree::value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			
 			
 			
-#line 4789 "ncoTree.cpp"
+#line 4854 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -4802,17 +4867,17 @@ var_sct * ncoTree::value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 }
 
 var_sct * ncoTree::value_list_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 3148 "ncoGrammer.g"
+#line 3213 "ncoGrammer.g"
 	var_sct *var;
-#line 4808 "ncoTree.cpp"
+#line 4873 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST value_list_old_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vlst = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3148 "ncoGrammer.g"
+#line 3213 "ncoGrammer.g"
 	
 	const std::string fnc_nm("value_list");
 	var=NULL_CEWI; 
 	
-#line 4816 "ncoTree.cpp"
+#line 4881 "ncoTree.cpp"
 	
 	try {      // for error handling
 		{
@@ -4821,7 +4886,7 @@ var_sct * ncoTree::value_list_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = _t->getNextSibling();
 		}
 		if ( inputState->guessing==0 ) {
-#line 3153 "ncoGrammer.g"
+#line 3218 "ncoGrammer.g"
 			
 			
 			char *cp;
@@ -4910,7 +4975,7 @@ var_sct * ncoTree::value_list_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			var=var_ret;
 			
 			
-#line 4914 "ncoTree.cpp"
+#line 4979 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -4929,20 +4994,20 @@ var_sct * ncoTree::value_list_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 var_sct * ncoTree::value_list_string_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 	 std::vector<var_sct*> &exp_vtr
 ) {
-#line 3249 "ncoGrammer.g"
+#line 3314 "ncoGrammer.g"
 	var_sct *var;
-#line 4935 "ncoTree.cpp"
+#line 5000 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST value_list_string_old_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
-#line 3249 "ncoGrammer.g"
+#line 3314 "ncoGrammer.g"
 	
 	const std::string fnc_nm("value_list_string");
 	var=NULL_CEWI; 
 	
-#line 4942 "ncoTree.cpp"
+#line 5007 "ncoTree.cpp"
 	
 	try {      // for error handling
 		if ( inputState->guessing==0 ) {
-#line 3255 "ncoGrammer.g"
+#line 3320 "ncoGrammer.g"
 			
 			int idx;
 			int nbr_lst;
@@ -4991,7 +5056,7 @@ var_sct * ncoTree::value_list_string_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 			end_val: var=var_ret;
 			
 			
-#line 4995 "ncoTree.cpp"
+#line 5060 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -5010,18 +5075,18 @@ var_sct * ncoTree::value_list_string_old(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 bool  ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 	var_sct *var_msk
 ) {
-#line 3306 "ncoGrammer.g"
+#line 3371 "ncoGrammer.g"
 	bool bret=false;
-#line 5016 "ncoTree.cpp"
+#line 5081 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST where_assign_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
-	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3306 "ncoGrammer.g"
+#line 3371 "ncoGrammer.g"
 	
 	const std::string fnc_nm("where_assign");
+	var_sct *var_lhs;
 	var_sct *var_rhs;
 	
 	
-#line 5025 "ncoTree.cpp"
+#line 5090 "ncoTree.cpp"
 	
 	try {      // for error handling
 		ANTLR_USE_NAMESPACE(antlr)RefAST __t439 = _t;
@@ -5032,9 +5097,8 @@ bool  ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 		ANTLR_USE_NAMESPACE(antlr)RefAST tmp272_AST_in = _t;
 		match(_t,ASSIGN);
 		_t = _t->getFirstChild();
-		vid = _t;
-		match(_t,VAR_ID);
-		_t = _t->getNextSibling();
+		var_lhs=out(_t);
+		_t = _retTree;
 		var_rhs=out(_t);
 		_t = _retTree;
 		_t = __t440;
@@ -5042,21 +5106,23 @@ bool  ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 		_t = __t439;
 		_t = _t->getNextSibling();
 		if ( inputState->guessing==0 ) {
-#line 3312 "ncoGrammer.g"
+#line 3379 "ncoGrammer.g"
 			
 			
 			bool bfr=false;
 			nco_bool DO_CONFORM;
-			std::string var_nm=vid->getText();
-			var_sct *var_lhs;
+			//std::string var_nm=vid->getText();
+			std::string var_nm;
 			NcapVar *Nvar;
 			
 			bret=false;
 			
-			var_lhs=prs_arg->ncap_var_init(var_nm,true);
+			//var_lhs=prs_arg->ncap_var_init(var_nm,true);
 			if(var_lhs==NULL_CEWI) 
 			nco_exit(EXIT_FAILURE);
 			
+			var_nm=std::string(var_lhs->nm); 
+			
 			var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs);         
 			if(var_rhs->sz >1L && var_rhs->sz != var_lhs->sz) {
 			var_sct *var_tmp=NULL_CEWI;
@@ -5144,7 +5210,7 @@ bool  ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 			prs_arg->ncap_var_write(var_lhs,false);
 			bret=true;
 			
-#line 5148 "ncoTree.cpp"
+#line 5214 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -5161,18 +5227,18 @@ bool  ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 }
 
 var_sct * ncoTree::var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 3417 "ncoGrammer.g"
+#line 3486 "ncoGrammer.g"
 	var_sct *var;
-#line 5167 "ncoTree.cpp"
+#line 5233 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_one_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3417 "ncoGrammer.g"
+#line 3486 "ncoGrammer.g"
 	
 	const std::string fnc_nm("var_lmt_one");
 	var=NULL_CEWI; 
 	var_sct *var_nbr;
 	
-#line 5176 "ncoTree.cpp"
+#line 5242 "ncoTree.cpp"
 	
 	try {      // for error handling
 		ANTLR_USE_NAMESPACE(antlr)RefAST __t442 = _t;
@@ -5196,7 +5262,7 @@ var_sct * ncoTree::var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = __t442;
 		_t = _t->getNextSibling();
 		if ( inputState->guessing==0 ) {
-#line 3423 "ncoGrammer.g"
+#line 3492 "ncoGrammer.g"
 			
 			
 			int idx;
@@ -5297,7 +5363,7 @@ var_sct * ncoTree::var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			end0:       var_nbr=nco_var_free(var_nbr);
 			var_rhs=nco_var_free(var_rhs);   
 			
-#line 5301 "ncoTree.cpp"
+#line 5367 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -5316,18 +5382,18 @@ var_sct * ncoTree::var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 var_sct * ncoTree::var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 	bool bram
 ) {
-#line 3528 "ncoGrammer.g"
+#line 3597 "ncoGrammer.g"
 	var_sct *var;
-#line 5322 "ncoTree.cpp"
+#line 5388 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_one_lhs_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3528 "ncoGrammer.g"
+#line 3597 "ncoGrammer.g"
 	
 	const std::string fnc_nm("var_lmt_one_lhs");
 	var=NULL_CEWI; 
 	var_sct *var_nbr;
 	
-#line 5331 "ncoTree.cpp"
+#line 5397 "ncoTree.cpp"
 	
 	try {      // for error handling
 		ANTLR_USE_NAMESPACE(antlr)RefAST __t446 = _t;
@@ -5351,7 +5417,7 @@ var_sct * ncoTree::var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 		_t = __t446;
 		_t = _t->getNextSibling();
 		if ( inputState->guessing==0 ) {
-#line 3534 "ncoGrammer.g"
+#line 3603 "ncoGrammer.g"
 			
 			int idx; 
 			int var_id; 
@@ -5496,7 +5562,7 @@ var_sct * ncoTree::var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 			var_rhs=nco_var_free(var_rhs); 
 			var_nbr=nco_var_free(var_nbr); 
 			
-#line 5500 "ncoTree.cpp"
+#line 5566 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
@@ -5513,18 +5579,18 @@ var_sct * ncoTree::var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t,
 }
 
 var_sct * ncoTree::var_lmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
-#line 3682 "ncoGrammer.g"
+#line 3751 "ncoGrammer.g"
 	var_sct *var;
-#line 5519 "ncoTree.cpp"
+#line 5585 "ncoTree.cpp"
 	ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t;
 	ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST;
 	ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST;
-#line 3682 "ncoGrammer.g"
+#line 3751 "ncoGrammer.g"
 	
 	const std::string fnc_nm("var_lmt");
 	var=NULL_CEWI; 
 	
-#line 5528 "ncoTree.cpp"
+#line 5594 "ncoTree.cpp"
 	
 	try {      // for error handling
 		ANTLR_USE_NAMESPACE(antlr)RefAST __t450 = _t;
@@ -5537,7 +5603,7 @@ var_sct * ncoTree::var_lmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 		_t = __t450;
 		_t = _t->getNextSibling();
 		if ( inputState->guessing==0 ) {
-#line 3687 "ncoGrammer.g"
+#line 3756 "ncoGrammer.g"
 			
 			bool bram;   // Check for a RAM variable
 			bool bnrm;
@@ -5778,7 +5844,7 @@ var_sct * ncoTree::var_lmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) {
 			
 			end2: var_rhs=nco_var_free(var_rhs); 
 			
-#line 5782 "ncoTree.cpp"
+#line 5848 "ncoTree.cpp"
 		}
 	}
 	catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) {
diff --git a/src/nco/mpncbo.c b/src/nco/mpncbo.c
index fa048d6..5ae3f42 100644
--- a/src/nco/mpncbo.c
+++ b/src/nco/mpncbo.c
@@ -196,7 +196,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */
   
   nm_id_sct *dmn_lst_1;
@@ -240,8 +240,7 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -382,8 +381,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
@@ -1031,7 +1030,7 @@ main(int argc,char **argv)
   if(FILE_2_RETRIEVED_FROM_REMOTE_LOCATION && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in_2);
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncbo-specific memory */
     if(fl_in_1) fl_in_1=(char *)nco_free(fl_in_1);
     if(fl_in_2) fl_in_2=(char *)nco_free(fl_in_2);
@@ -1087,7 +1086,7 @@ main(int argc,char **argv)
     if(xtr_nbr_1 > 0) var_out=nco_var_lst_free(var_out,xtr_nbr_1);
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     var_fix_out=(var_sct **)nco_free(var_fix_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI 
   MPI_Finalize();
diff --git a/src/nco/mpncecat.c b/src/nco/mpncecat.c
index dda5b22..eb106ea 100644
--- a/src/nco/mpncecat.c
+++ b/src/nco/mpncecat.c
@@ -156,7 +156,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   
   nm_id_sct *dmn_lst;
   nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */
@@ -196,8 +196,7 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -338,8 +337,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -922,7 +921,7 @@ main(int argc,char **argv)
 #endif /* end !ENABLE_MPI */
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncecat-specific memory cleanup */
     if(rec_dmn_nm) rec_dmn_nm=(char *)nco_free(rec_dmn_nm);
     
@@ -968,7 +967,7 @@ main(int argc,char **argv)
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     var_fix=(var_sct **)nco_free(var_fix);
     var_fix_out=(var_sct **)nco_free(var_fix_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/mpncflint.c b/src/nco/mpncflint.c
index 59a5b51..3d52c4e 100644
--- a/src/nco/mpncflint.c
+++ b/src/nco/mpncflint.c
@@ -172,7 +172,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   
   nm_id_sct *dmn_lst;
   nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */
@@ -218,8 +218,7 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -355,8 +354,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -961,7 +960,7 @@ main(int argc,char **argv)
   if(FILE_2_RETRIEVED_FROM_REMOTE_LOCATION && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in_2);
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncflint-specific memory */
     if(fl_in_1) fl_in_1=(char *)nco_free(fl_in_1);
     if(fl_in_2) fl_in_2=(char *)nco_free(fl_in_2);
@@ -1015,7 +1014,7 @@ main(int argc,char **argv)
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     if(nbr_var_fix > 0) var_fix=nco_var_lst_free(var_fix,nbr_var_fix);
     if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/mpncpdq.c b/src/nco/mpncpdq.c
index 0ca3e82..58b5e99 100644
--- a/src/nco/mpncpdq.c
+++ b/src/nco/mpncpdq.c
@@ -179,7 +179,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   
   nm_id_sct *dmn_lst;
   nm_id_sct *dmn_rdr_lst;
@@ -361,8 +361,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -1189,7 +1189,7 @@ main(int argc,char **argv)
 #endif /* end !ENABLE_MPI */
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncpdq-specific memory cleanup */
     if(dmn_rdr_nbr > 0){
       /* Free dimension correspondence list */
@@ -1258,7 +1258,7 @@ main(int argc,char **argv)
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     var_fix=(var_sct **)nco_free(var_fix);
     var_fix_out=(var_sct **)nco_free(var_fix_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/mpncra.c b/src/nco/mpncra.c
index 0bc018e..c3680e1 100644
--- a/src/nco/mpncra.c
+++ b/src/nco/mpncra.c
@@ -204,7 +204,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   
   nco_int base_time_srt=nco_int_CEWI;
   nco_int base_time_crr=nco_int_CEWI;
@@ -250,8 +250,7 @@ main(int argc,char **argv)
   static struct option opt_lng[]=
     { /* Structure ordered by short option key if possible */
       /* Long options with no argument, no short option counterpart */
-      {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-      {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+            {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
       {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
       {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
       {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -399,8 +398,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -1461,7 +1460,7 @@ main(int argc,char **argv)
 #endif /* !ENABLE_MPI */
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncra-specific memory cleanup */
     if(nco_prg_id == ncra || nco_prg_id == ncrcat) lmt_rec=nco_lmt_free(lmt_rec);
     
@@ -1510,7 +1509,7 @@ main(int argc,char **argv)
     var_fix=(var_sct **)nco_free(var_fix);
     var_out=(var_sct **)nco_free(var_out);
 #endif /* !0 */
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
   nco_exit_gracefully();
   return EXIT_SUCCESS;
diff --git a/src/nco/mpncwa.c b/src/nco/mpncwa.c
index 5ae0fc3..b4cb974 100644
--- a/src/nco/mpncwa.c
+++ b/src/nco/mpncwa.c
@@ -186,7 +186,7 @@ main(int argc,char **argv)
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WGT_MSK_CRD_VAR=True; /* [flg] Weight and/or mask coordinate variables */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */
   nco_bool flg_opt_a=False; /* Option a */
   nco_bool flg_rdd=False; /* [flg] Retain degenerate dimensions */
@@ -235,8 +235,7 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -404,8 +403,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
@@ -1298,7 +1297,7 @@ main(int argc,char **argv)
   } /* end loop over fl_idx */
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncwa-specific memory */
     if(dmn_avg_nbr > 0) dmn_avg=(dmn_sct **)nco_free(dmn_avg);
     if(msk) msk=nco_var_free(msk);
@@ -1344,7 +1343,7 @@ main(int argc,char **argv)
     var_prc=(var_sct **)nco_free(var_prc);
     var_fix=(var_sct **)nco_free(var_fix);
     var_out=(var_sct **)nco_free(var_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncap.c b/src/nco/ncap.c
index aa3268d..2bda44e 100644
--- a/src/nco/ncap.c
+++ b/src/nco/ncap.c
@@ -226,7 +226,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
 
   nm_id_sct *dmn_lst=NULL;
   nm_id_sct *xtr_lst=NULL; /* Non-processed variables to copy to OUTPUT */
@@ -254,7 +254,6 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -390,8 +389,8 @@ main(int argc,char **argv)
 	cnk_plc_sng=(char *)strdup(optarg);
 	cnk_plc=nco_cnk_plc_get(cnk_plc_sng);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -915,7 +914,7 @@ main(int argc,char **argv)
   (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncap-specific memory */
     /* fxm: ncap-specific memory freeing instructions go here */
     for(idx=0;idx<sym_tbl_nbr;idx++){
@@ -980,7 +979,7 @@ main(int argc,char **argv)
     var_prc_out=(var_sct **)nco_free(var_prc_out);
     var_fix=(var_sct **)nco_free(var_fix);
     var_fix_out=(var_sct **)nco_free(var_fix_out);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
   /* End timer */ 
   ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */
diff --git a/src/nco/ncatted.c b/src/nco/ncatted.c
index 961b5b7..551d64a 100644
--- a/src/nco/ncatted.c
+++ b/src/nco/ncatted.c
@@ -197,7 +197,7 @@ main(int argc,char **argv)
   nco_bool FL_OUT_NEW=False;
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
   nco_bool flg_typ_mch=False; /* [flg] Type-match attribute edits */
 
   size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */
@@ -216,8 +216,7 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -291,8 +290,8 @@ main(int argc,char **argv)
         bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
         gaa_arg[gaa_nbr++]=(char *)strdup(optarg);
@@ -472,7 +471,7 @@ main(int argc,char **argv)
   if(FL_RTR_RMT_LCN && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncatted-specific memory */
     for(int idx=0;idx<nbr_aed;idx++) aed_arg[idx]=(char *)nco_free(aed_arg[idx]);
     for(int idx=0;idx<nbr_aed;idx++){
@@ -496,7 +495,7 @@ main(int argc,char **argv)
     if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr);
 
     trv_tbl_free(trv_tbl);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncbo.c b/src/nco/ncbo.c
index f460a1a..be8342c 100644
--- a/src/nco/ncbo.c
+++ b/src/nco/ncbo.c
@@ -120,7 +120,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */
 
   char **fl_lst_abb=NULL; /* Option a */
@@ -253,7 +253,6 @@ main(int argc,char **argv)
     {"formula_terms",no_argument,0,0}, /* [flg] Extract formula_terms variables */
     {"no_frm_trm",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
     {"no_formula_terms",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -264,6 +263,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */	  
     {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
     {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */
@@ -284,6 +285,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -344,8 +347,6 @@ main(int argc,char **argv)
     {"xcl",no_argument,0,'x'},
     {"operation",required_argument,0,'y'},
     {"op_typ",required_argument,0,'y'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -387,6 +388,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -414,8 +419,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_cll_msr") || !strcmp(opt_crr,"no_cell_measures")) EXTRACT_CLL_MSR=False; /* [flg] Do not extract cell_measures variables */
       if(!strcmp(opt_crr,"frm_trm") || !strcmp(opt_crr,"formula_terms")) EXTRACT_FRM_TRM=True; /* [flg] Extract formula_terms variables */
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
@@ -428,6 +433,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
       if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){
         ppc_arg[ppc_nbr]=(char *)strdup(optarg);
@@ -544,9 +553,10 @@ main(int argc,char **argv)
       nco_op_typ_sng=(char *)strdup(optarg);
       nco_op_typ=nco_op_typ_get(nco_op_typ_sng);
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -561,6 +571,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   /* Initialize traversal tables */
   (void)trv_tbl_init(&trv_tbl_1);
   (void)trv_tbl_init(&trv_tbl_2);
@@ -684,7 +697,7 @@ main(int argc,char **argv)
   if(FILE_2_RETRIEVED_FROM_REMOTE_LOCATION && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in_2);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncbo-specific memory */
     if(fl_in_1) fl_in_1=(char *)nco_free(fl_in_1);
     if(fl_in_2) fl_in_2=(char *)nco_free(fl_in_2);
@@ -726,7 +739,7 @@ main(int argc,char **argv)
     flg_dne2=(nco_dmn_dne_t *)nco_free(flg_dne2);
     flg_dne=(nco_dmn_dne_t *)nco_free(flg_dne);
 
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncecat.c b/src/nco/ncecat.c
index 93f2c69..0cab325 100644
--- a/src/nco/ncecat.c
+++ b/src/nco/ncecat.c
@@ -113,7 +113,7 @@ main(int argc,char **argv)
   nco_bool USE_MM3_WORKAROUND=False; /* [flg] Faster copy on Multi-record Multi-variable netCDF3 files */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
   nco_bool RECORD_AGGREGATE=True; /* Option G */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
 
   char **fl_lst_abb=NULL; /* Option a */
   char **fl_lst_in;
@@ -242,7 +242,6 @@ main(int argc,char **argv)
     {"formula_terms",no_argument,0,0}, /* [flg] Extract formula_terms variables */
     {"no_frm_trm",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
     {"no_formula_terms",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -251,6 +250,8 @@ main(int argc,char **argv)
     {"gag",no_argument,0,0}, /* [flg] Group aggregation */
     {"aggregate_group",no_argument,0,0}, /* [flg] Group aggregation */
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"md5_dgs",no_argument,0,0}, /* [flg] Perform MD5 digests */
     {"md5_digest",no_argument,0,0}, /* [flg] Perform MD5 digests */
     {"mrd",no_argument,0,0}, /* [enm] Multiple Record Dimension convention */
@@ -275,6 +276,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -341,8 +344,6 @@ main(int argc,char **argv)
     {"auxiliary",required_argument,0,'X'},
     {"exclude",no_argument,0,'x'},
     {"xcl",no_argument,0,'x'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -382,6 +383,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -409,8 +414,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_cll_msr") || !strcmp(opt_crr,"no_cell_measures")) EXTRACT_CLL_MSR=False; /* [flg] Do not extract cell_measures variables */
       if(!strcmp(opt_crr,"frm_trm") || !strcmp(opt_crr,"formula_terms")) EXTRACT_FRM_TRM=True; /* [flg] Extract formula_terms variables */
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -422,6 +427,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"md5_dgs") || !strcmp(opt_crr,"md5_digest")){
         if(!md5) md5=nco_md5_ini();
 	md5->dgs=True;
@@ -564,9 +573,10 @@ main(int argc,char **argv)
     case 'x': /* Exclude rather than extract variables specified with -v */
       EXCLUDE_INPUT_LIST=True;
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -581,6 +591,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   trv_tbl_init(&trv_tbl);
 
   if(GROUP_AGGREGATE){
@@ -951,7 +964,7 @@ main(int argc,char **argv)
   (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
 
     /* NCO-generic clean-up */
     /* Free individual strings/arrays */
@@ -996,7 +1009,7 @@ main(int argc,char **argv)
       for(idx=0;idx<lmt_nbr;idx++) flg_dne[idx].dim_nm=(char *)nco_free(flg_dne[idx].dim_nm);
       if(flg_dne) flg_dne=(nco_dmn_dne_t *)nco_free(flg_dne);
     } /* RECORD_AGGREGATE */
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncflint.c b/src/nco/ncflint.c
index f704960..6281580 100644
--- a/src/nco/ncflint.c
+++ b/src/nco/ncflint.c
@@ -110,7 +110,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
 
   char **fl_lst_abb=NULL; /* Option a */
   char **fl_lst_in;
@@ -245,7 +245,6 @@ main(int argc,char **argv)
     {"formula_terms",no_argument,0,0}, /* [flg] Extract formula_terms variables */
     {"no_frm_trm",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
     {"no_formula_terms",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -254,6 +253,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
     {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
     {"fix_rec_crd",no_argument,0,0}, /* [flg] Do not interpolate/multiply record coordinate variables */
@@ -275,6 +276,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -340,8 +343,6 @@ main(int argc,char **argv)
     {"auxiliary",required_argument,0,'X'},
     {"exclude",no_argument,0,'x'},
     {"xcl",no_argument,0,'x'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -381,6 +382,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -408,8 +413,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_cll_msr") || !strcmp(opt_crr,"no_cell_measures")) EXTRACT_CLL_MSR=False; /* [flg] Do not extract cell_measures variables */
       if(!strcmp(opt_crr,"frm_trm") || !strcmp(opt_crr,"formula_terms")) EXTRACT_FRM_TRM=True; /* [flg] Extract formula_terms variables */
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fix_rec_crd")) FIX_REC_CRD=True; /* [flg] Do not interpolate/multiply record coordinate variables */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
@@ -422,6 +427,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
       if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){
         ppc_arg[ppc_nbr]=(char *)strdup(optarg);
@@ -571,9 +580,10 @@ main(int argc,char **argv)
     case 'x': /* Exclude rather than extract variables specified with -v */
       EXCLUDE_INPUT_LIST=True;
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -588,6 +598,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   if(CMD_LN_NTP_VAR && CMD_LN_NTP_WGT){
     (void)fprintf(stdout,"%s: ERROR interpolating variable (-i) and fixed weight(s) (-w) both set\n",nco_prg_nm_get());
     nco_exit(EXIT_FAILURE);
@@ -925,7 +938,7 @@ main(int argc,char **argv)
   if(FILE_2_RETRIEVED_FROM_REMOTE_LOCATION && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in_2);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncflint-specific memory */
     if(fl_in_1) fl_in_1=(char *)nco_free(fl_in_1);
     if(fl_in_2) fl_in_2=(char *)nco_free(fl_in_2);
@@ -969,7 +982,7 @@ main(int argc,char **argv)
     for(idx=0;idx<lmt_nbr;idx++) flg_dne[idx].dim_nm=(char *)nco_free(flg_dne[idx].dim_nm);
     if(flg_dne) flg_dne=(nco_dmn_dne_t *)nco_free(flg_dne);
     if(gpe) gpe=(gpe_sct *)nco_gpe_free(gpe);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncks.c b/src/nco/ncks.c
index 368239c..67a03f3 100644
--- a/src/nco/ncks.c
+++ b/src/nco/ncks.c
@@ -106,6 +106,7 @@
 /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */
 #define MAIN_PROGRAM_FILE
 #include "libnco.h" /* netCDF Operator (NCO) library */
+#include "nco.h"
 
 int 
 main(int argc,char **argv)
@@ -157,8 +158,6 @@ main(int argc,char **argv)
   const char * const CVS_Revision="$Revision$";
   const char * const opt_sht_lst="34567aABb:CcD:d:FG:g:HhL:l:MmOo:Pp:qQrRs:t:uVv:X:xz-:";
 
-  const char fnc_nm[]="main()"; /* [sng] Function name */
-
   cnk_sct cnk; /* [sct] Chunking structure */
 
 #if defined(__cplusplus) || defined(PGI_CC)
@@ -261,13 +260,14 @@ main(int argc,char **argv)
   nco_bool PRN_VAR_DATA_TGL=False; /* [flg] Toggle print variable data Option H */
   nco_bool PRN_VAR_METADATA=False; /* [flg] Print variable metadata */
   nco_bool PRN_VAR_METADATA_TGL=False; /* [flg] Toggle print variable metadata Option m */
+  nco_bool PRN_CLN_LGB=False; /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
   nco_bool PRN_VRB=False; /* [flg] Print data and metadata by default */
   nco_bool RETAIN_ALL_DIMS=False; /* [flg] Retain all dimensions */
   nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   nco_bool flg_rgr=False; /* [flg] Regrid */
   nco_bool flg_trr=False; /* [flg] Terraref */
 
@@ -291,6 +291,11 @@ main(int argc,char **argv)
   
   static struct option opt_lng[]={ /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
+    {"calendar",no_argument,0,0}, /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
+    {"cln_lgb",no_argument,0,0}, /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
+    {"prn_cln_lgb",no_argument,0,0}, /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
+    {"prn_lgb",no_argument,0,0}, /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
+    {"timestamp",no_argument,0,0}, /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
     {"cdl",no_argument,0,0}, /* [flg] Print CDL */
     {"cll_msr",no_argument,0,0}, /* [flg] Extract cell_measures variables */
     {"cell_measures",no_argument,0,0}, /* [flg] Extract cell_measures variables */
@@ -300,7 +305,6 @@ main(int argc,char **argv)
     {"formula_terms",no_argument,0,0}, /* [flg] Extract formula_terms variables */
     {"no_frm_trm",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
     {"no_formula_terms",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -314,6 +318,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdn",no_argument,0,0}, /* [flg] Print hidden attributes */
     {"hidden",no_argument,0,0}, /* [flg] Print hidden attributes */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"id",no_argument,0,0}, /* [flg] Print normally hidden information, like file, group, and variable IDs */
     {"lbr",no_argument,0,0},
     {"library",no_argument,0,0},
@@ -489,8 +495,6 @@ main(int argc,char **argv)
     {"auxiliary",required_argument,0,'X'},
     {"exclude",no_argument,0,'x'},
     {"xcl",no_argument,0,'x'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {"get_grp_info",no_argument,0,0},
     {"get_file_info",no_argument,0,0},
     {"lbr_rcd",no_argument,0,0},
@@ -548,6 +552,7 @@ main(int argc,char **argv)
         bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif bfr_sz */
+      if(!strcmp(opt_crr,"calendar") || !strcmp(opt_crr,"cln_lgb") || !strcmp(opt_crr,"prn_cln_lgb") || !strcmp(opt_crr,"prn_lgb") || !strcmp(opt_crr,"timestamp")) PRN_CLN_LGB=True; /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
       if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -588,8 +593,8 @@ main(int argc,char **argv)
         nco_exit(EXIT_SUCCESS);
       } /* endif "copyright" */
       if(!strcmp(opt_crr,"cdl")) PRN_CDL=True; /* [flg] Print CDL */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fix_rec_dmn") || !strcmp(opt_crr,"no_rec_dmn")){
         const char fix_pfx[]="fix_"; /* [sng] Prefix string to fix dimension */
         rec_dmn_nm=(char *)nco_malloc((strlen(fix_pfx)+strlen(optarg)+1L)*sizeof(char));
@@ -610,6 +615,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"lbr") || !strcmp(opt_crr,"library")){
         (void)nco_lbr_vrs_prn();
         nco_exit(EXIT_SUCCESS);
@@ -672,7 +681,7 @@ main(int argc,char **argv)
 	rgr_var=(char *)strdup(optarg);
       } /* !rgr_var */
       if(!strcmp(opt_crr,"secret") || !strcmp(opt_crr,"scr") || !strcmp(opt_crr,"shh")){
-        (void)fprintf(stdout,"Hidden/unsupported NCO options:\nCompiler used\t\t--cmp, --compiler\nChunk cache size\t\t--cnk_csh_byt\nCopyright\t\t--cpy, --copyright, --license\nHidden functions\t--scr, --ssh, --secret\nLibrary used\t\t--lbr, --library\nMemory clean\t\t--mmr_cln, --cln, --clean\nMemory dirty\t\t--mmr_drt, --drt, --dirty\nMPI implementation\t--mpi_implementation\nNo-clobber files\t--no_clb, --no-clobber\nPseudonym\t\t--pseudonym, -Y (ncra only)\nSpinlock\t\t--spinlock\nSt [...]
+        (void)fprintf(stdout,"Hidden/unsupported NCO options:\nCompiler used\t\t--cmp, --compiler\nCopyright\t\t--cpy, --copyright, --license\nHidden functions\t--scr, --ssh, --secret\nLibrary used\t\t--lbr, --library\nMemory clean\t\t--mmr_cln, --cln, --clean\nMemory dirty\t\t--mmr_drt, --drt, --dirty\nMPI implementation\t--mpi_implementation\nNo-clobber files\t--no_clb, --no-clobber\nPseudonym\t\t--pseudonym, -Y (ncra only)\nSpinlock\t\t--spinlock\nStreams\t\t\t--srm\nSysconf\t\t\t--sy [...]
         nco_exit(EXIT_SUCCESS);
       } /* endif "shh" */
       if(!strcmp(opt_crr,"srm")) PRN_SRM=True; /* [flg] Print ncStream */
@@ -889,9 +898,10 @@ main(int argc,char **argv)
     case 'z': /* Print absolute path of all input variables then exit */
       GET_LIST=True;
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -906,6 +916,10 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* 20170107: Unlike all other operators, ncks may benefit from setting chunk cache when input file (not output file) is netCDF4 because there is anecdotal evidence that ncdump netCDF4 print speed may be improved by cache adjustments. We cannot verify whether input, output, or both file formats are netCDF4 because nco_set_chunk_cache() must be called before opening file(s). Setting this for netCDF3 library is harmless and calls a no-op stub function */
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
 #ifdef _LANGINFO_H
 /* Internationalization i18n
    Linux Journal 200211 p. 57--59 http://www.linuxjournal.com/article/6176 
@@ -1035,25 +1049,6 @@ main(int argc,char **argv)
     if(fl_out && fl_out_fmt != NC_FORMAT_NETCDF4 && nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING Group Path Edit (GPE) requires netCDF4 output format in most cases (except flattening) but user explicitly requested output format = %s. This command will fail if the output file requires netCDF4 features like groups, non-atomic types, or multiple record dimensions. However, it _will_ autoconvert netCDF4 atomic types (e.g., NC_STRING, NC_UBYTE...) to netCDF3 atomic types (e.g [...]
   } /* !gpe */
 
-  /* 20170107: Unlike all other operators, ncks may benefit from setting chunk cache when input file (not output file is netCDF4, because it has to be printed, and there is anecdotal evidence that ncdump print speed may be improved by cache adjustments */
-  if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC || fl_in_fmt == NC_FORMAT_NETCDF4 || fl_in_fmt == NC_FORMAT_NETCDF4_CLASSIC){
-    float pmp_fvr_frc; /* [frc] Pre-emption favor fraction */
-    size_t cnk_csh_byt_crr; /* I [B] Chunk cache size current setting */
-    size_t nelemsp; /* [nbr] Chunk slots in raw data chunk cache hash table */
-    if(cnk_csh_byt > 0ULL){
-      /* Use user-specified chunk cache size if available */
-      //cnk->cnk_csh_byt=cnk_csh_byt;
-      nco_get_chunk_cache(&cnk_csh_byt_crr,&nelemsp,&pmp_fvr_frc);
-      rcd+=nco_set_chunk_cache(cnk_csh_byt,nelemsp,pmp_fvr_frc);
-    } /* !cnk_csh_byt */
-    
-    /* Report current system cache settings */
-    if(nco_dbg_lvl_get() >= nco_dbg_scl){
-      nco_get_chunk_cache(&cnk_csh_byt_crr,&nelemsp,&pmp_fvr_frc);
-      (void)fprintf(stderr,"%s: INFO %s reports cnk_csh_byt = %ld, nelemsp = %ld, pmp_fvr_frc = %g\n",nco_prg_nm_get(),fnc_nm,cnk_csh_byt_crr,nelemsp,pmp_fvr_frc);
-    } /* !dbg */
-  } /* !netCDF4 */
-
   /* Terraref */
   if(flg_trr){
     char *trr_out;
@@ -1226,6 +1221,7 @@ main(int argc,char **argv)
     prn_flg.PRN_MSS_VAL_BLANK=PRN_MSS_VAL_BLANK;
     prn_flg.PRN_VAR_DATA=PRN_VAR_DATA;
     prn_flg.PRN_VAR_METADATA=PRN_VAR_METADATA;
+    prn_flg.PRN_CLN_LGB=PRN_CLN_LGB;
 
     /* Derived formats */
     if(prn_flg.cdl){
@@ -1320,7 +1316,7 @@ close_and_free:
   if(FL_RTR_RMT_LCN && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in);
   
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncks-specific memory */
     if(fl_bnr) fl_bnr=(char *)nco_free(fl_bnr);
     if(rec_dmn_nm) rec_dmn_nm=(char *)nco_free(rec_dmn_nm); 
@@ -1365,7 +1361,7 @@ close_and_free:
     if(smr_sng) smr_sng=(char *)nco_free(smr_sng);
     if(smr_xtn_sng) smr_xtn_sng=(char *)nco_free(smr_xtn_sng);
     rec_dmn_nm_fix=(char *)nco_free(rec_dmn_nm_fix);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
   
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/nco.h b/src/nco/nco.h
index e67049b..be28e0a 100644
--- a/src/nco/nco.h
+++ b/src/nco/nco.h
@@ -336,7 +336,7 @@ extern "C" {
 # define NCO_VERSION_MINOR 6
 #endif /* !NCO_VERSION_MINOR */
 #ifndef NCO_VERSION_PATCH
-# define NCO_VERSION_PATCH 4
+# define NCO_VERSION_PATCH 5
 #endif /* !NCO_VERSION_PATCH */
 #ifndef NCO_VERSION_NOTE
 # define NCO_VERSION_NOTE "" /* Blank for final versions, non-blank (e.g., "beta37") for pre-release versions */
@@ -346,7 +346,7 @@ extern "C" {
 # define NCO_LIB_VERSION ( NCO_VERSION_MAJOR * 100 + NCO_VERSION_MINOR * 10 + NCO_VERSION_PATCH )
 #endif /* !NCO_LIB_VERSION */
 #ifndef NCO_VERSION
-# define NCO_VERSION "4.6.4"
+# define NCO_VERSION "4.6.5"
 #endif /* !NCO_VERSION */
 
 /* Compatibility tokens new to netCDF4 netcdf.h: */
@@ -974,6 +974,7 @@ extern "C" {
     nco_bool PRN_MSS_VAL_BLANK; /* [flg] Print missing values as blanks */
     nco_bool PRN_VAR_DATA; /* [flg] Print variable data */
     nco_bool PRN_VAR_METADATA; /* [flg] Print variable metadata */
+    nco_bool PRN_CLN_LGB; /* [flg] Print UDUnits-formatted calendar dates/times human-legibly */
   } prn_fmt_sct;
   
   /* Types used in Terraref structure */
diff --git a/src/nco/nco_att_utl.c b/src/nco/nco_att_utl.c
index ea71f20..0c0c16a 100644
--- a/src/nco/nco_att_utl.c
+++ b/src/nco/nco_att_utl.c
@@ -1962,11 +1962,9 @@ nco_glb_att_add /* [fnc] Add global attributes */
   if(sng_fnl) sng_fnl=(char *)nco_free(sng_fnl);
 
   /* jm fxm use more descriptive name than i---what does i count? */
-  for(int index=0;gaa_lst[index].key;index++){
-      gaa_nbr=index;
-  } /* end loop over i */
+  for(int index=0;gaa_lst[index].key;index++,gaa_nbr++); /* end loop over i */
 
-  for(gaa_idx=0;gaa_idx<=gaa_nbr;gaa_idx++){
+  for(gaa_idx=0;gaa_idx<gaa_nbr;gaa_idx++){
     /* Insert attribute value */
     att_val.cp=gaa_lst[gaa_idx].val;
     /* Initialize attribute edit structure */
diff --git a/src/nco/nco_cln_utl.c b/src/nco/nco_cln_utl.c
index 14ce35c..9bff06b 100644
--- a/src/nco/nco_cln_utl.c
+++ b/src/nco/nco_cln_utl.c
@@ -8,17 +8,20 @@
    GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */
 
 #include "nco_cln_utl.h" /* Calendar utilities */
+#include "libnco.h"
+#include "nco.h"
 
 /* Arrays to hold calendar type units */
 /* Format: year, month, day, hour, minute, second, origin, offset */
-double DATA_360[8]={31104000.0,2592000.0,86400.0,3600.0,60.0,1,0.0,0.0};
-double DATA_365[8]={31536000.0,2628000.0,86400.0,3600.0,60.0,1,0.0,0.0};
-double DATA_366[8]={31622400.0,2635200.0,86400.0,3600.0,60.0,1,0.0,0.0};
+/* origin for all calendars is 2001-01-01 (seconds)  (same as origin for udunits xalendar) */
+static  double DATA_360[8]={31104000.0,2592000.0,86400.0,3600.0,60.0,1.0,31104000.0*2001.0,0.0};
+static double DATA_365[8]={31536000.0,2628000.0,86400.0,3600.0,60.0,1.0,31536000.0*2001.0,0.0};
+static double DATA_366[8]={31622400.0,2635200.0,86400.0,3600.0,60.0,1.0,63276422400.0,0.0};
 
 /* Days in months */
-int DAYS_PER_MONTH_360[12]={30,30,30,30,30,30,30,30,30,30,30,30};
-int DAYS_PER_MONTH_365[12]={31,28,31,30,31,30,31,31,30,31,30,31};
-int DAYS_PER_MONTH_366[12]={31,29,31,30,31,30,31,31,30,31,30,31};
+static int DAYS_PER_MONTH_360[12]={30,30,30,30,30,30,30,30,30,30,30,30};
+static int DAYS_PER_MONTH_365[12]={31,28,31,30,31,30,31,31,30,31,30,31};
+static int DAYS_PER_MONTH_366[12]={31,29,31,30,31,30,31,31,30,31,30,31};
 
 /* Size of temporary buffer used in parsing calendar dates */
 #define NCO_MAX_LEN_TMP_SNG 200
@@ -139,8 +142,7 @@ nco_newdate /* [fnc] Compute date a specified number of days from input date */
 tm_typ /* O [enm] Units type */
 nco_cln_get_tm_typ /* Returns time unit type or tm_void if not found */
 (const char *ud_sng){ /* I [ptr] Units string  */
-  int idx;
-  int len; 
+  size_t len; 
   char *lcl_sng;  
   tm_typ rcd_typ;
   
@@ -151,7 +153,7 @@ nco_cln_get_tm_typ /* Returns time unit type or tm_void if not found */
   
   /* Convert to lower case */
   len=strlen(lcl_sng);
-  for(idx=0;idx<len;idx++) lcl_sng[idx]=tolower(lcl_sng[idx]);
+  for(size_t idx=0;idx<len;idx++) lcl_sng[idx]=tolower(lcl_sng[idx]);
   
   if(!strcmp(lcl_sng,"year") || !strcmp(lcl_sng,"years")) rcd_typ=tm_year;
   else if(!strcmp(lcl_sng,"month") || !strcmp(lcl_sng,"months")) rcd_typ=tm_month;
@@ -164,6 +166,50 @@ nco_cln_get_tm_typ /* Returns time unit type or tm_void if not found */
   return rcd_typ;
 } /* end nco_cln_get_tm_typ() */
 
+
+char *                 /* O [sng] contains newly malloced output string */
+nco_cln_fmt_tm         /*   [fnc] format an output string */
+(tm_cln_sct *ttx,      /* I [ptr] Calendar structure */
+int ifmt)              /* I [int] format type */
+{
+ char bdate[200]={0};
+ char btime[200]={0};
+ char *buff;
+
+ buff=(char*)nco_malloc( sizeof(char) * NCO_MAX_LEN_FMT_SNG );
+
+ switch(ifmt)
+ {
+    /* plain format all out */
+    case 1:
+     sprintf(buff,"%04d-%02d-%02d %02d:%02d:%f", ttx->year,ttx->month, ttx->day,ttx->hour,ttx->min,ttx->sec  );
+     break;
+
+    /* do date and time if time not all zero */
+    case 2:
+      sprintf(bdate,"%04d-%02d-%02d", ttx->year,ttx->month, ttx->day);
+      if( ttx->hour !=0 || ttx->min!=0 || ttx->sec !=0.0 )
+      {
+        int isec;
+        double m_sec, frac_sec;
+
+        frac_sec=modf(ttx->sec, &m_sec);
+        isec=(int)m_sec;
+
+        if( frac_sec==0.0)
+          sprintf(btime, " %02d:%02d:%02d", ttx->hour,ttx->min, isec );
+        else
+          sprintf(btime, " %02d:%02d:%02.7f", ttx->hour,ttx->min, ttx->sec );
+      }
+      sprintf(buff,"%s%s", bdate,btime);
+      break;
+
+ }
+
+   return buff;
+}
+
+
 nco_cln_typ /* [enm] Calendar type */
 nco_cln_get_cln_typ /* [fnc] Determine calendar type or cln_nil if not found */
 (const char *ud_sng) /* I [ptr] Units string */
@@ -229,6 +275,82 @@ nco_cln_days_in_year_prior_to_given_month /* [fnc] Number of days in year prior
   return idays;
 } /* end nco_cln_days_in_year_prior_to_given_month() */
 
+
+void
+nco_cln_pop_tm         /* [fnc] Calculate other members  in cln_sct from value*/
+(tm_cln_sct *cln_sct) /* I/O [ptr] Calendar structure */
+{
+  int idx;
+  int *days_per_month=NULL_CEWI;
+  long ivalue;
+  long days;
+  double fr_value;
+  double m_value;
+  double *data=NULL_CEWI;
+
+  switch(cln_sct->sc_cln)
+  {
+    case cln_360:
+      data=DATA_360;
+      days_per_month=DAYS_PER_MONTH_360;
+      break;
+
+    case cln_365:
+      data=DATA_365;
+      days_per_month=DAYS_PER_MONTH_365;
+      break;
+
+    case cln_366:
+       data=DATA_366;
+       days_per_month=DAYS_PER_MONTH_366;
+       break;
+
+    case cln_std:
+    case cln_grg:
+    case cln_jul:
+    case cln_nil:
+      break;
+  } /* end switch */
+
+
+  /* take account of origin */
+
+
+  /* get integer value and fraction part - nb add origin */
+  fr_value=modf(cln_sct->value+(double)data[6], &m_value);
+
+  ivalue=(long)m_value;
+
+  /* integer arithmetic kind of */
+  cln_sct->sec= (ivalue % 60);
+  cln_sct->sec+=fr_value;
+
+  cln_sct->min =   (ivalue % (long)data[3]) /  (long)data[4];
+  cln_sct->hour =  (ivalue % (long)data[2]) / (long)data[3];
+  cln_sct->year=  ivalue / (long)data[0];
+
+  /* days from start of year remember  zero based */
+  days= ivalue % (long)data[0] / (long)data[2];
+
+  /* remember a calendar is one based NOT zero based */
+  days+=1;
+  cln_sct->month=1;
+
+  for(idx=0 ; idx<12 ;idx++  )
+  {
+    if( days - days_per_month[idx] <=0 )
+      break;
+
+    days -= days_per_month[idx];
+      ++cln_sct->month;
+  }
+  cln_sct->day=days;
+
+
+  return;
+} /* end nco_cln_pop_tm() */
+
+
 void
 nco_cln_pop_val /* [fnc] Calculate value in cln_sct */ 
 (tm_cln_sct *cln_sct) /* I/O [ptr] structure */
@@ -244,8 +366,10 @@ nco_cln_pop_val /* [fnc] Calculate value in cln_sct */
       data[2]*(cln_sct->day-1)+
       data[3]*cln_sct->hour+
       data[4]*cln_sct->min+
-      data[5]*(double)cln_sct->sec;
-    break; 
+      data[5]*cln_sct->sec;
+      /* subtract origin */
+      cln_sct->value-=data[6];
+      break;
   case cln_365:  
     data=DATA_365;    
     cln_sct->value=data[0]*(cln_sct->year-1)+
@@ -253,8 +377,10 @@ nco_cln_pop_val /* [fnc] Calculate value in cln_sct */
       data[2]*(cln_sct->day-1)+
       data[3]*cln_sct->hour+
       data[4]*cln_sct->min+
-      data[5]*(double)cln_sct->sec;
-    break;
+      data[5]*cln_sct->sec;
+      /* subtract origin */
+      cln_sct->value-=data[6];
+      break;
   case cln_366:
     data=DATA_366;    
     cln_sct->value=data[0]*(cln_sct->year-1)+
@@ -262,18 +388,23 @@ nco_cln_pop_val /* [fnc] Calculate value in cln_sct */
       data[2]*(cln_sct->day-1)+
       data[3]*cln_sct->hour+
       data[4]*cln_sct->min+
-      data[5]*(double)cln_sct->sec;
-    break;
+      data[5]*cln_sct->sec;
+      /* subtract origin */
+      cln_sct->value-=data[6];
+      break;
   case cln_std:
   case cln_grg:
   case cln_jul:
   case cln_nil:
-    break;
+      break;
   } /* end switch */
   
   return;
 } /* end nco_cln_pop_val() */
 
+
+
+
 double /* O [dbl] time in (base) seconds of tm_typ */
 nco_cln_val_tm_typ
 ( nco_cln_typ lmt_cln, /* I [enm] Calendar type */ 
@@ -325,6 +456,18 @@ nco_cln_val_tm_typ
   return scl;
 } /* end nco_cln_typ_val() */
 
+
+void
+nco_cln_prn_tm         /* [fnc] print tm sct*/
+(tm_cln_sct *cln_sct) /* I [ptr] Calendar structure */
+{
+
+  (void)fprintf(stderr ,"%s: tm_sct cln_type=%d date=\"%d-%d-%d %d:%d:%g\" value=%g\n", nco_prg_nm_get(),cln_sct->sc_cln,
+              cln_sct->year, cln_sct->month, cln_sct->day,cln_sct->hour,cln_sct->min, cln_sct->sec,cln_sct->value );
+
+   return;
+}
+
 int /* O [flg] String is calendar date */
 nco_cln_chk_tm /* [fnc] Is string a UDUnits-compatible calendar format, e.g., "PERIOD since REFERENCE_DATE" */
 (const char *unit_sng) /* I [sng] Units string */
@@ -376,7 +519,18 @@ nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */
   lgb_sng[0]='\0'; /* CEWI */
   return NCO_NOERR;
 } /* end nco_cln_sng_rbs() */
-  
+
+int
+nco_cln_var_prs
+(const char *fl_unt_sng,
+ nco_cln_typ lmt_cln,
+ int ifmt,
+ var_sct *var,
+ var_sct *var_ret)
+{
+  return NCO_ERR;
+} /*  !nco_cln_var_prs() */
+
 #endif /* !ENABLE_UDUNITS */
 
 #ifdef ENABLE_UDUNITS
@@ -547,7 +701,7 @@ var_sct *var) /* I/O [var_sct] var values modified - can be NULL  */
   is_date=nco_cln_chk_tm(fl_bs_sng);
 
   /* Use custom time functions if irregular calendar */
-  if(is_date && (lmt_cln == cln_360 || lmt_cln == cln_365))
+  if(is_date && (lmt_cln == cln_360 || lmt_cln == cln_365 || lmt_cln == cln_366))
     rcd=nco_cln_clc_tm(fl_unt_sng,fl_bs_sng,lmt_cln,og_val,var);  
   else if(og_val != (double *)NULL) 
     rcd=nco_cln_clc_dbl_dff(fl_unt_sng,fl_bs_sng,og_val);
@@ -566,7 +720,7 @@ const char *fl_bs_sng,  /* I [ptr] units attribute string from disk */
 nco_cln_typ lmt_cln,    /* I [enum] Calendar type of coordinate var */ 
 double *og_val)         /* O [dbl] output value */
 {
-  const char fnc_nm[]="nco_cln_clc_dbl_org"; /* [sng] Function name */
+  const char fnc_nm[]="nco_cln_clc_dbl_org()"; /* [sng] Function name */
 
   int is_date=0;  /* set to true if date/time unit */
   int rcd=0;
@@ -676,7 +830,9 @@ nco_cln_clc_tm /* [fnc] Difference between two coordinate units */
   if(unt_tm_typ == bs_tm_typ) scl_val=1.0; else scl_val=nco_cln_val_tm_typ(lmt_cln,unt_tm_typ)/nco_cln_val_tm_typ(lmt_cln,bs_tm_typ);
   
   if(nco_dbg_lvl_get() >= nco_dbg_crr){
-    (void)fprintf(stderr,"%s: %s reports offset=%g, scale factor=%g",nco_prg_nm_get(),fnc_nm,crr_val,scl_val);
+    nco_cln_prn_tm(&unt_cln_sct);
+    nco_cln_prn_tm(&bs_cln_sct);
+    (void)fprintf(stderr,"%s: %s reports offset=%g, scale factor=%g unt_val=%f bs_val=%f\n",nco_prg_nm_get(),fnc_nm,crr_val,scl_val, unt_cln_sct.value, bs_cln_sct.value);
     if(og_val) (void)fprintf(stderr,", *og_val=%g",*og_val);
     (void)fprintf(stderr,"\n");
   } /* !dbg */
@@ -694,7 +850,7 @@ nco_cln_clc_tm /* [fnc] Difference between two coordinate units */
 
     if(var->type == NC_DOUBLE){
       double *dp;
-      dp=op1.dp;   
+      dp=op1.dp;
       if(var->has_mss_val){  
 	double mss_dbl=var->mss_val.dp[0]; 
 	for(idx=0;idx<sz;idx++)
@@ -706,13 +862,13 @@ nco_cln_clc_tm /* [fnc] Difference between two coordinate units */
 
     if(var->type == NC_FLOAT){
       float *fp;
-      fp=op1.fp;   
+      fp=op1.fp;
       if(var->has_mss_val){  
 	float mss_flt=var->mss_val.fp[0]; 
 	for(idx=0;idx<sz;idx++)
-	   if(fp[idx] != mss_flt) fp[idx]=fp[idx]*scl_val+crr_val;                      
+	  if(fp[idx] != mss_flt) fp[idx]=fp[idx]*(float)scl_val+(float)crr_val;                      
       }else{
-	for(idx=0;idx<sz;idx++) fp[idx]=fp[idx]*scl_val+crr_val;                      
+	for(idx=0;idx<sz;idx++) fp[idx]=fp[idx]*(float)scl_val+(float)crr_val;                      
       } /* !has_mss_val */
     } /* !NC_FLOAT */
    (void)cast_nctype_void(var->type,&op1);
@@ -730,16 +886,41 @@ nco_cln_prs_tm /* UDUnits2 Extract time stamp from parsed UDUnits string */
   const char fnc_nm[]="nco_cln_prs_tm()"; /* [sng] Function name */
 
   char *bfr;
-
-  char *dt_sng;
+  char *dt_sng=NULL;
   int cnv_nbr;
   int ut_rcd; /* [enm] UDUnits2 status */
-
+  int year;
+  int month;
+  int day;
   ut_system *ut_sys;
   ut_unit *ut_sct_in; /* UDUnits structure, input units */
 
   bfr=(char *)nco_calloc(NCO_MAX_LEN_TMP_SNG,sizeof(char));
 
+
+
+
+  /* There is a problem letting udunits do the parsing for the other calendars - that is when parsing non regular dates
+     eg for "all_leap" (cln_366) we have dates like 2001-02-29  which cannot be meaningfully parsed by udunits
+     e.g for 360_days (cln_360)  we have dates like 1903-2-29, 1903-2-30  so we need to parse the date portion of the string here*/
+
+
+   strcpy(bfr,unt_sng); 
+    
+   if( (dt_sng=strstr(bfr,"since")))
+    dt_sng+=5;
+   else if ( (dt_sng=strstr(bfr,"from")))
+    dt_sng+=4;
+   else if ( (dt_sng=strstr(bfr,"after")))
+    dt_sng+=5;
+   else if (( dt_sng=strstr(bfr,"s@")))
+    dt_sng+=2;
+
+   if(!dt_sng) return NCO_ERR;
+
+   cnv_nbr=sscanf(dt_sng,"%d-%d-%d",&tm_in->year,&tm_in->month,&tm_in->day);
+   if(nco_dbg_lvl_get() >= nco_dbg_crr) (void)fprintf(stderr,"%s: INFO %s reports sscanf() converted %d values and it should have converted 3 values, format string=\"%s\"\n",nco_prg_nm_get(),fnc_nm,cnv_nbr,dt_sng);
+
   /* When empty, ut_read_xml() uses environment variable UDUNITS2_XML_PATH, if any
      Otherwise it uses default initial location hardcoded when library was built */
   if(nco_dbg_lvl_get() >= nco_dbg_vrb) ut_set_error_message_handler(ut_write_to_stderr); else ut_set_error_message_handler(ut_ignore);
@@ -770,7 +951,8 @@ nco_cln_prs_tm /* UDUnits2 Extract time stamp from parsed UDUnits string */
 
   dt_sng=strstr(bfr,"since");
   dt_sng+=(size_t)6;
-  cnv_nbr=sscanf(dt_sng,"%d-%d-%d %d:%d:%f",&tm_in->year,&tm_in->month,&tm_in->day,&tm_in->hour,&tm_in->min,&tm_in->sec);
+  /* nb we dont need yar,month,day as that have been parsed earlier in THIS function */
+  cnv_nbr=sscanf(dt_sng,"%d-%d-%d %d:%d:%lf",&year,&month,&day,&tm_in->hour,&tm_in->min,&tm_in->sec);
   
   /* Set defaults */ 
   if(cnv_nbr < 6) tm_in->sec=0.0;
@@ -862,6 +1044,135 @@ nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */
 
 } /* end nco_cln_sng_rbs() */
 
+
+int
+nco_cln_var_prs
+(const char *fl_unt_sng,
+ nco_cln_typ lmt_cln,
+ int ifmt,
+ var_sct *var,
+ var_sct *var_ret
+)
+{
+  size_t sz;
+  size_t idx;
+  char empty_sng[1];
+
+  double resolution;
+  tm_cln_sct tm;
+
+
+
+  /* base units for udunits */
+  const char *bs_sng="seconds since 2001-01-01";
+  const char *fnc_nm="nco_cln_var_prs";
+  empty_sng[0]='\0';
+
+  // if( lmt_cln != cln_std )
+  //   return NCO_ERR;
+  if(var->type !=NC_DOUBLE && var->type!=NC_FLOAT)
+    nco_var_cnf_typ(NC_DOUBLE,var);
+
+  if(nco_dbg_lvl_get() >= nco_dbg_crr)
+     (void)fprintf(stderr,"%s: %s reports unt_sng=%s bs_sng=%s calendar=%d\n",nco_prg_nm_get(),fnc_nm,fl_unt_sng,bs_sng,lmt_cln);
+
+  /* rebase to seconds since blah-blah */
+  if(nco_cln_clc_dbl_var_dff(fl_unt_sng,bs_sng,lmt_cln, (double*)NULL, var ) != NCO_NOERR )
+     return NCO_ERR;
+
+
+
+  cast_void_nctype(var->type,&var->val);
+
+  if(var_ret->type !=NC_STRING)
+      nco_var_cnf_typ(NC_STRING, var_ret);
+
+  if( var_ret->val.vp)
+      var_ret->val.vp=(void*)nco_free(var_ret->val.vp);
+
+  var_ret->val.vp=nco_malloc( sizeof(nco_string) *var_ret->sz);
+
+
+  var_ret->has_mss_val=True;
+  var_ret->mss_val.vp=nco_malloc(sizeof(nco_string*));
+
+  cast_void_nctype(var_ret->type,&var_ret->val);
+
+  var_ret->mss_val.sngp[0]=strdup(empty_sng);
+
+
+  sz=var->sz;
+
+  tm.sc_cln=lmt_cln;
+
+
+  // (void)fprintf(stderr,"%s: %s reports var \"%s\" has missing value %d\n",nco_prg_nm_get(),fnc_nm,var->nm,var->has_mss_val);
+
+
+
+  if(var->type == NC_DOUBLE) {
+    double mss_val_dbl;
+    if(var->has_mss_val)
+       mss_val_dbl=var->mss_val.dp[0];
+
+    for (idx = 0; idx < sz; idx++) {
+
+
+      if(var->has_mss_val && var->val.dp[idx]==mss_val_dbl) {
+        var_ret->val.sngp[idx] = strdup(empty_sng);
+        continue;
+      }
+
+      tm.value = var->val.dp[idx];
+
+      if (lmt_cln == cln_360 || lmt_cln == cln_365 || lmt_cln == cln_366)
+        nco_cln_pop_tm(&tm);
+      else
+        (void) ut_decode_time(tm.value, &tm.year, &tm.month, &tm.day, &tm.hour, &tm.min, &tm.sec, &resolution);
+
+      var_ret->val.sngp[idx] = nco_cln_fmt_tm(&tm, ifmt);
+
+    }
+  }
+  else if(var->type==NC_FLOAT){
+
+    float mss_val_flt;
+    if(var->has_mss_val)
+       mss_val_flt=var->mss_val.fp[0];
+
+    for (idx = 0; idx < sz; idx++) {
+
+      if(var->has_mss_val && var->val.fp[idx]==mss_val_flt ){
+        var_ret->val.sngp[idx] = strdup(empty_sng);
+        continue;
+      }
+
+
+      tm.value = (double) (var->val.fp[idx]);
+
+      if (lmt_cln == cln_360 || lmt_cln == cln_365 || lmt_cln == cln_366)
+        nco_cln_pop_tm(&tm);
+      else
+        (void) ut_decode_time(tm.value, &tm.year, &tm.month, &tm.day, &tm.hour, &tm.min, &tm.sec, &resolution);
+
+      var_ret->val.sngp[idx] = nco_cln_fmt_tm(&tm, ifmt);
+
+    }
+
+  }
+
+
+  cast_nctype_void(var->type,&var->val);
+  cast_nctype_void(var_ret->type,&var->val);
+
+    return NCO_NOERR;
+
+} /* end nco_cln_var_prs() */
+
+
+
+
+
 # endif /* HAVE_UDUNITS2_H */
 #endif /* ENABLE_UDUNITS */
 /* End UDUnits-related routines*/
diff --git a/src/nco/nco_cln_utl.h b/src/nco/nco_cln_utl.h
index 700f0f8..9a0a947 100644
--- a/src/nco/nco_cln_utl.h
+++ b/src/nco/nco_cln_utl.h
@@ -13,10 +13,14 @@
 #ifndef NCO_CLN_UTL_H
 #define NCO_CLN_UTL_H
 
+
 #ifdef HAVE_CONFIG_H
-# include <config.h> /* Autotools tokens */
+#include <config.h> /* Autotools tokens */
 #endif /* !HAVE_CONFIG_H */
 
+// #include "../../config.h" /* Autotools tokens */
+// #define ENABLE_UDUNITS
+
 /* Standard header files */
 #include <ctype.h> /* isalnum(), isdigit(), tolower() */
 #include <stdio.h> /* stderr, FILE, NULL, printf */
@@ -46,6 +50,8 @@
 #include "nco_ctl.h" /* Program flow control functions */
 #include "nco_sng_utl.h" /* String utilities */
 
+
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
@@ -69,7 +75,7 @@ extern "C" {
     int day;
     int hour;
     int min;
-    float sec;
+    double sec;
     double value;
   } tm_cln_sct;
   
@@ -86,7 +92,7 @@ extern "C" {
   tm_typ /* [enum] Units type */
   nco_cln_get_tm_typ /* returns time unit type or tm_void if not found */
   (const char *ud_sng); /* I [ptr] units string */
-  
+
   nco_cln_typ /* [enum] Calendar type */    
   nco_cln_get_cln_typ /* [fnc] Calendar type or cln_nil if not found */
   (const char *ud_sng); /* I [ptr] units string */
@@ -99,7 +105,20 @@ extern "C" {
   void
   nco_cln_pop_val /* [fnc] Calculate value in cln_sct */ 
   (tm_cln_sct *cln_sct);/* I/O [ptr] Calendar structure */
-  
+
+  void
+  nco_cln_pop_tm         /* [fnc] Calculate other members  in cln_sct from value*/
+  (tm_cln_sct *cln_sct); /* I/O [ptr] Calendar structure */
+
+  void
+  nco_cln_prn_tm         /* [fnc] print tm sct*/
+  (tm_cln_sct *cln_sct); /* I [ptr] Calendar structure */
+
+  char*                    /* O [sng] contains newly malloced output string */
+  nco_cln_fmt_tm           /*   [fnc] format an output string */
+  (tm_cln_sct *cln_sct,   /* I [ptr] Calendar structure */
+   int fmt);              /* I [int] format type */
+
   double /* O [dbl] time in (base) seconds of tm_typ */
   nco_cln_val_tm_typ /* [fnc] */
   (nco_cln_typ lmt_cln, /* I [enum] Calendar type */
@@ -122,16 +141,24 @@ extern "C" {
    nco_cln_typ lmt_cln,    /* I [enum] Calendar type of coordinate var */ 
    double *val_dbl,           /* I/O [dbl] var values modified */
    var_sct *var);           /* I/O [var_sct] var values modified */
-  
-#ifdef ENABLE_UDUNITS
-# ifdef HAVE_UDUNITS2_H
 
-  cv_converter * /* UDUnits converter */
-  nco_cln_cnv_mk /* [fnc] UDUnits2 create a custom converter  */
-  (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */
-   const char *fl_bs_sng);/* I [ptr] units attribute string from disk */
+  int
+  nco_cln_var_prs
+  (const char *fl_unt_sng,
+   nco_cln_typ lmt_cln,
+   int ifmt,
+   var_sct *var,
+   var_sct *var_out
+  );
 
   int /* [flg] NCO_NOERR or NCO_ERR */ 
+  nco_cln_clc_dbl_org   /* [fnc] difference between two co-ordinate units */
+  (const char *val_unt_sng, /* I [ptr] input value and  units in the same string */
+   const char *fl_bs_sng,  /* I [ptr] units attribute string from disk */
+   nco_cln_typ lmt_cln,    /* I [enum] Calendar type of coordinate var */ 
+   double *og_val);         /* O [dbl] output value */
+  
+  int /* [flg] NCO_NOERR or NCO_ERR */ 
   nco_cln_clc_dbl_var_dff /* [fnc] difference between two co-ordinate units */
   (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */
    const char *fl_bs_sng,  /* I [ptr] units attribute string from disk */
@@ -139,19 +166,28 @@ extern "C" {
    double *val_dbl,           /* I/O [dbl] var values modified */
    var_sct *var);           /* I/O [var_sct] var values modified */
 
+  int /* [rcd] Return code */
+  nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */
+  (const ptr_unn val, /* I [sct] Value to rebase */
+   const long val_idx, /* I [idx] Index into 1-D array of values */
+   const nc_type val_typ, /* I [enm] Value type */
+   const char *unit_sng, /* I [sng] Units string */
+   char *lgb_sng); /* O [sng] Legible version of input string */
+
+#ifdef ENABLE_UDUNITS
+# ifdef HAVE_UDUNITS2_H
+
+  cv_converter * /* UDUnits converter */
+  nco_cln_cnv_mk /* [fnc] UDUnits2 create a custom converter  */
+  (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */
+   const char *fl_bs_sng);/* I [ptr] units attribute string from disk */
+
   int /* [flg] NCO_NOERR or NCO_ERR */ 
   nco_cln_clc_dbl_dff /* [fnc] difference between two co-ordinate units */
   (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */
    const char *fl_bs_sng, /* I [ptr] units attribute string from disk */
    double *og_val);
 
-  int /* [flg] NCO_NOERR or NCO_ERR */ 
-  nco_cln_clc_dbl_org   /* [fnc] difference between two co-ordinate units */
-  (const char *val_unt_sng, /* I [ptr] input value and  units in the same string */
-   const char *fl_bs_sng,  /* I [ptr] units attribute string from disk */
-   nco_cln_typ lmt_cln,    /* I [enum] Calendar type of coordinate var */ 
-   double *og_val);         /* O [dbl] output value */
-  
   int /* O [flg] NCO_NOERR or NCO_ERR */ 
   nco_cln_clc_tm /* [fnc] Difference between two time coordinate units */
   (const char *fl_unt_sng, /* I [ptr] user units attribute string */
@@ -165,14 +201,6 @@ extern "C" {
   (const char *unt_sng, /* I [ptr] units attribute string */  
    tm_cln_sct *tm_in); /*  O [sct] struct to be populated */
 
-  int /* [rcd] Return code */
-  nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */
-  (const ptr_unn val, /* I [sct] Value to rebase */
-   const long val_idx, /* I [idx] Index into 1-D array of values */
-   const nc_type val_typ, /* I [enm] Value type */
-   const char *unit_sng, /* I [sng] Units string */
-   char *lgb_sng); /* O [sng] Legible version of input string */
-
 # endif /* !HAVE_UDUNITS2_H */
 #endif /* !ENABLE_UDUNITS */
 
diff --git a/src/nco/nco_cnk.c b/src/nco/nco_cnk.c
index a960d18..06e144f 100644
--- a/src/nco/nco_cnk.c
+++ b/src/nco/nco_cnk.c
@@ -131,6 +131,36 @@ nco_dfl_case_cnk_plc_err(void) /* [fnc] Print error and exit for illegal switch(
 } /* end nco_dfl_case_cnk_plc_err() */
 
 int /* [rcd] Return code */
+nco_cnk_csh_ini /* [fnc] Initialize global chunk cache user-specified input */
+(const size_t cnk_csh_byt) /* I [B] Chunk cache size */
+{
+  /* Purpose: Initialize chunking from user-specified inputs */
+
+  const char fnc_nm[]="nco_cnk_csh_ini()"; /* [sng] Function name */
+
+  float pmp_fvr_frc; /* [frc] Pre-emption favor fraction */
+
+  int rcd=0; /* [enm] Return code  */
+  
+  size_t cnk_csh_byt_crr; /* I [B] Chunk cache size current setting */
+  size_t nelemsp; /* [nbr] Chunk slots in raw data chunk cache hash table */
+
+  if(cnk_csh_byt > 0ULL){
+    /* Use user-specified chunk cache size if available */
+    rcd+=nco_get_chunk_cache(&cnk_csh_byt_crr,&nelemsp,&pmp_fvr_frc);
+    rcd+=nco_set_chunk_cache(cnk_csh_byt,nelemsp,pmp_fvr_frc);
+  } /* !cnk_csh_byt */
+  
+    /* Report current system cache settings */
+  if(nco_dbg_lvl_get() >= nco_dbg_scl){
+    rcd+=nco_get_chunk_cache(&cnk_csh_byt_crr,&nelemsp,&pmp_fvr_frc);
+    (void)fprintf(stderr,"%s: INFO %s reports chunk cache size = cnk_csh_byt = %ld B, # of slots in raw data chunk cache has table = nelemsp = %ld, pre-emption favor fraction = pmp_fvr_frc = %g\n",nco_prg_nm_get(),fnc_nm,cnk_csh_byt_crr,nelemsp,pmp_fvr_frc);
+  } /* !dbg */
+
+  return rcd;
+} /* end nco_cnk_csh_ini() */
+
+int /* [rcd] Return code */
 nco_cnk_ini /* [fnc] Initialize chunking from user-specified inputs */
 (const int in_id, /* I [id] netCDF input file ID */
  const char * const fl_out, /* I [sng] Output filename */
diff --git a/src/nco/nco_cnk.h b/src/nco/nco_cnk.h
index 773c8f0..7b18f4e 100644
--- a/src/nco/nco_cnk.h
+++ b/src/nco/nco_cnk.h
@@ -74,6 +74,10 @@ const char * /* O [sng] Chunking policy string */
 nco_cnk_plc_sng_get /* [fnc] Convert chunking policy enum to string */
 (const int nco_cnk_plc); /* I [enm] Chunking policy */
 
+int /* [rcd] Return code */
+nco_cnk_csh_ini /* [fnc] Initialize global chunk cache user-specified input */
+(const size_t cnk_csh_byt); /* I [B] Chunk cache size */
+
 int /* [rcd] [enm] Return code */
 nco_cnk_ini /* [fnc] Initialize chunking from user-specified inputs */
 (const int in_id, /* I [id] netCDF input file ID */
diff --git a/src/nco/nco_ctl.c b/src/nco/nco_ctl.c
index 341f80d..6a8eca5 100644
--- a/src/nco/nco_ctl.c
+++ b/src/nco/nco_ctl.c
@@ -504,7 +504,8 @@ nco_exit /* [fnc] Wrapper for exit() */
   }else{
     if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: ERROR Exiting through %s which will now call %s\n",nco_prg_nm_get(),fnc_nm,exit_nm);
 #ifdef NCO_ABORT_ON_ERROR
-    abort();
+    exit(rcd);
+//    abort();
 #else /* !NCO_ABORT_ON_ERROR */
     exit(rcd);
 #endif /* !NCO_ABORT_ON_ERROR */
@@ -712,7 +713,7 @@ nco_lbr_vrs_prn(void) /* [fnc] Print netCDF library version */
     cmp_dat_sng=(char *)strdup("Unknown");
   } /* endif */
 
-  (void)fprintf(stderr,"Linked to netCDF library version %s, compiled %s\n",lbr_vrs_sng,cmp_dat_sng);
+  (void)fprintf(stderr,"Linked to netCDF library version %s compiled %s\n",lbr_vrs_sng,cmp_dat_sng);
 
   cmp_dat_sng=(char *)nco_free(cmp_dat_sng);
   lbr_vrs_sng=(char *)nco_free(lbr_vrs_sng);
@@ -843,7 +844,7 @@ nco_nmn_get(void) /* [fnc] Return mnemonic that describes current NCO version */
 { 
   /* Purpose: Return mnemonic describing current NCO version
      Always include terminal \n so mnemonic does not dangle */
-  return "JAWS\n";
+  return "Promotion\n";
 } /* end nco_nmn_get() */
 
 char * /* O [sng] nm_in stripped of any path (i.e., program name stub) */ 
@@ -954,32 +955,32 @@ nco_usg_prn(void)
 
   switch(prg_lcl){
   case ncap:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl lmn] [-D nco_dbg_lvl] [-F] [-f] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-s algebra] [-S fl.nco] [-t thr_nbr] [-v] in.nc [out.nc]\n");
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl lmn] [-D nco_dbg_lvl] [-F] [-f] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-s algebra] [-S fl.nco] [-t thr_nbr] [-v] in.nc [out.nc]\n");
     break;
   case ncatted:
     opt_sng=(char *)strdup("[-a ...] [--bfr byt] [-D nco_dbg_lvl] [--glb ...] [-h] [--hdr_pad nbr] [-l path] [-O] [-o out.nc] [-p path] [-R] [-r] [-t] in.nc [[out.nc]]\n");
     break;
   case ncbo:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] [-y op_typ] in_1.nc in_2.nc [out.nc]\n");
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] [-y op_typ] in_1.nc i [...]
     break;
   case ncflint:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_crd] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-i var,val] [-L lvl] [-l path] [--msa] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-v ...] [-X box] [-x] [-w wgt_1[,wgt_2]] in_1.nc in_2.nc  [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_crd] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-i var,val] [-L lvl] [-l path] [--msa] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-v ...] [-X box] [-x] [-w wgt_1[,wgt_2]]  [...]
     break;
   case ncks:
-    opt_sng=(char *)strdup("[-3] [-4] [-5] [-6] [-7] [-A] [-a] [-b fl_bnr] [--bfr byt] [-C] [-c] [--cdl] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_dmn dim] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [--grp_xtr_var_xcl] [-H] [-h] [--hdn] [--hdr_pad nbr] [--jsn] [--jsn_fmt lvl] [-L lvl] [-l path] [-M] [-m] [--map map.nc] [--md5_dgs] [--md5_wrt] [--mk_rec_dmn dim] [--msa]  [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-5] [-6] [-7] [-A] [-a] [-b fl_bnr] [--bfr byt] [-C] [-c] [--cal] [--cdl] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_dmn dim] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [--grp_xtr_var_xcl] [-H] [-h] [--hdn] [--hdr_pad nbr] [--jsn] [--jsn_fmt lvl] [-L lvl] [-l path] [-M] [-m] [--map map.nc] [--md5_dgs] [--md5_wrt] [--mk_rec_dmn dim]  [...]
     break;
   case ncpdq:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [-M pck_map] [--mrd] [--msa] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-P pck_plc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-U] [-v ...]  [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [-M pck_map] [--mrd] [--msa] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-P pck_plc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn [...]
     break;
   case ncra:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cb] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...]  [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--mro] [--msa] [-N] [-n ...] [--no_cll_msr] [--no_cll_mth] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t  [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cb] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...]  [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--mro] [--msa] [-N] [-n ...] [--no_cll_msr] [--no_cll_mth] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all]  [...]
     break;
   case ncfe:
   case ncge:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...]  [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [--nsm_fl] [--nsm_grp] [--nsm_sfx] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-- [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...]  [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [--nsm_fl] [--nsm_grp] [--nsm_sfx] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all]  [...]
     break;
   case ncrcat:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdr_pad nbr] [-L lvl] [-l path] [--md5_digest] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] i [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdr_pad nbr] [-L lvl] [-l path] [--md5_digest] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t thr_nbr] [--unn] [-v ...] [...]
     break;
   case ncecat:
     opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--gag] [--glb ...] [-H] [-h] [--hdr_pad nbr] [-L lvl] [-l path] [-M] [--md5_digest] [--mrd] [--msa] [-n ...] [--no_cll_msr] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-u ulm_nm] [--unn] [-v [...]
@@ -988,7 +989,7 @@ nco_usg_prn(void)
     opt_sng=(char *)strdup("[-a ...] [--bfr byt] [-D nco_dbg_lvl] [-d ...] [-g ...] [--glb ...] [-h] [--hdr_pad nbr] [-l path] [-O] [-o out.nc] [-p path] [-R] [-r] [-v ...] in.nc [[out.nc]]\n");
     break;
   case ncwa:
-    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [-B mask_cond] [-b] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-I] [-L lvl] [-l path] [-m mask] [-M mask_val] [-N] [--no_cll_msr] [--no_cll_mth] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_a [...]
+    opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [-B mask_cond] [-b] [--bfr byt] [-C] [-c] [--cnk_byt byt] [--cnk_csh byt] [--cnk_dmn nm,lmn] [--cnk_map map] [--cnk_min byt] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-I] [-L lvl] [-l path] [-m mask] [-M mask_val] [-N] [--no_cll_msr] [--no_cll_mth] [--no_frm_trm] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [- [...]
     break;
   default: nco_dfl_case_prg_id_err(); break;
   } /* end switch */
@@ -1026,6 +1027,7 @@ nco_usg_prn(void)
   if(strstr(opt_sng,"[-C]")) (void)fprintf(stdout,"-C, --nocoords\t\tAssociated coordinate variables should not be processed\n");
   if(strstr(opt_sng,"[-c]")) (void)fprintf(stdout,"-c, --crd, --coords\tCoordinate variables will all be processed\n");
   if(strstr(opt_sng,"--cb")) (void)fprintf(stdout,"    --cb, --clm_bnd\tCF Climatology bounds will be processed (see also --c2b)\n");
+  if(strstr(opt_sng,"--cal")) (void)fprintf(stdout,"    --cal\t\tPrint UDUnits-compatible dates/times in human-legible calendar format\n");
   if(strstr(opt_sng,"--cdl")) (void)fprintf(stdout,"    --cdl\t\tPrint CDL (netCDF lingua franca used by ncdump/ncgen)\n");
   if(strstr(opt_sng,"--cnk_byt")) (void)fprintf(stdout,"    --cnk_byt, --chunk_byte sz_byt\tChunksize in bytes\n");
   if(strstr(opt_sng,"--cnk_csh")) (void)fprintf(stdout,"    --cnk_csh, --chunk_cache sz_byt\tChunk cache size in bytes\n");
diff --git a/src/nco/nco_fl_utl.c b/src/nco/nco_fl_utl.c
index cfb697f..8e8b386 100644
--- a/src/nco/nco_fl_utl.c
+++ b/src/nco/nco_fl_utl.c
@@ -1392,14 +1392,16 @@ nco_fl_open /* [fnc] Open file using appropriate buffer size hints and verbosity
 
   size_t bfr_sz_hnt_lcl; /* [B] Buffer size hint */
 
+  static nco_bool FIRST_INFO=True;
+
   /* Initialize local buffer size hint with user-input value */
   bfr_sz_hnt_lcl= (bfr_sz_hnt) ? *bfr_sz_hnt : NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */
 
   /* Is request implicit and sufficiently verbose? */
-  flg_rqs_vrb_mpl = ((bfr_sz_hnt == NULL || *bfr_sz_hnt == NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_var) ? True : False;
+  flg_rqs_vrb_mpl = ((bfr_sz_hnt == NULL || *bfr_sz_hnt == NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_var && FIRST_INFO) ? True : False;
 
   /* Is request explicit and sufficiently verbose? */
-  flg_rqs_vrb_xpl = ((bfr_sz_hnt != NULL && *bfr_sz_hnt != NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_fl)  ? True : False;
+  flg_rqs_vrb_xpl = ((bfr_sz_hnt != NULL && *bfr_sz_hnt != NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_fl && FIRST_INFO) ? True : False;
 
   /* Print implicit or explicit buffer request depending on debugging level */
   if(flg_rqs_vrb_mpl) (void)fprintf(stderr,"%s: INFO %s reports nc__open() will request file buffer of default size\n",nco_prg_nm_get(),fnc_nm); 
@@ -1421,13 +1423,18 @@ nco_fl_open /* [fnc] Open file using appropriate buffer size hints and verbosity
   rcd+=nco_inq_format_extended(*nc_id,&fl_fmt_xtn_crr,&mode);
   if(fl_fmt_xtn_prv != nco_fmt_xtn_nil){
     /* Complain if set value of extended type does not match current type */
-    if(fl_fmt_xtn_prv != fl_fmt_xtn_crr) (void)fprintf(stderr,"%s: INFO %s reports current extended filetype = %s does not equal previous extended filetype = %s. This is expected when NCO is instructed to convert filetypes, i.e., to read from one type and write to another. And when NCO generates grids or templates (which are always netCDF3) when the input file is netCDF4. It is also expected when multi-file operators receive files known to be of different types. However, it could also in [...]
+    if(nco_dbg_lvl_get() >= nco_dbg_fl && fl_fmt_xtn_prv != fl_fmt_xtn_crr && FIRST_INFO) (void)fprintf(stderr,"%s: INFO %s reports current extended filetype = %s does not equal previous extended filetype = %s. This is expected when NCO is instructed to convert filetypes, i.e., to read from one type and write to another. And when NCO generates grids or templates (which are always netCDF3) when the input file is netCDF4. It is also expected when multi-file operators receive files known to [...]
   }else{
     /* Set undefined extended file type to actual extended filetype */
     nco_fmt_xtn_set(fl_fmt_xtn_crr);
   } /* endif */
-  if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Extended filetype of %s is %s, mode = %d\n",nco_prg_nm_get(),fl_nm,nco_fmt_xtn_sng(fl_fmt_xtn_crr),mode);
+  if(nco_dbg_lvl_get() >= nco_dbg_scl && FIRST_INFO) (void)fprintf(stderr,"%s: INFO %s reports extended filetype of %s is %s, mode = %d\n",nco_prg_nm_get(),fnc_nm,fl_nm,nco_fmt_xtn_sng(fl_fmt_xtn_crr),mode);
 
+  if(FIRST_INFO && nco_dbg_lvl_get() >= nco_dbg_fl){
+    (void)fprintf(stderr,"%s: INFO %s will not print any more INFO messages if this file is opened again. (Many NCO operators open the same file multiple times when OpenMP is enabled, %s prints INFO messages only the first time because successive messages are usually redundant).\n",nco_prg_nm_get(),fnc_nm,fnc_nm);
+    FIRST_INFO=False;
+  } /* !FIRST_INFO */
+    
   return rcd;
 } /* end nco_fl_open() */
 
diff --git a/src/nco/nco_lst_utl.c b/src/nco/nco_lst_utl.c
index 8450943..06437ae 100644
--- a/src/nco/nco_lst_utl.c
+++ b/src/nco/nco_lst_utl.c
@@ -92,7 +92,7 @@ nco_fmt_sng_printf_subst /* [fnc] Replace printf() format statements */
 
   /* Replace match with desired format */
   fmt_sng_new=(char *)strdup(fmt_sng);
-  if(mch_nbr){
+  if(mch_nbr && fmt_sng && strlen(fmt_sng)){
     mch_psn_srt=result->rm_so; /* [B] Byte offset from start of string to start of substring */
     mch_psn_end=result->rm_eo-1L; /* [B] Byte offset from start of string to end of substring */
     (void)nco_realloc(fmt_sng_new,(mch_psn_srt+strlen(fmt_sng)-mch_psn_end+2L)*sizeof(char));
diff --git a/src/nco/nco_msa.c b/src/nco/nco_msa.c
index 32c2d5e..4b46bfe 100644
--- a/src/nco/nco_msa.c
+++ b/src/nco/nco_msa.c
@@ -171,17 +171,15 @@ read_lbl:
 
 	  (void)nco_inq_format(vara->nc_id,&fl_in_fmt);
 
-	  /* 20170207: Turn-off USE_NC4_SRD_WORKAROUND in all situations due to TODO nco1135
-	     ncks -v zg -H -C -d time,0,1 -d lev,0,2,2 ~/nco/data/in.nc # works
-	     ncks -v zg -H -C -d time,0,1 -d lev,0,2,2 ~/nco/data/in_4c.nc # borken */
-	  if((fl_in_fmt == NC_FORMAT_NETCDF4 || fl_in_fmt == NC_FORMAT_NETCDF4_CLASSIC) && (dmn_srd_nbr == 1))
-	    USE_NC4_SRD_WORKAROUND=False;
+	  /* 20170207: Turn-off USE_NC4_SRD_WORKAROUND unless non-unity stride is only in first dimension */
+	  if((fl_in_fmt == NC_FORMAT_NETCDF4 || fl_in_fmt == NC_FORMAT_NETCDF4_CLASSIC) && (dmn_srd_nbr == 1) && (dmn_srd[0] != 1L)) USE_NC4_SRD_WORKAROUND=True;
 
 	  if(!USE_NC4_SRD_WORKAROUND){
 	    if(nco_dbg_lvl_get() >= nco_dbg_var && srd_prd > 1L) (void)fprintf(stderr,"%s: INFO %s reports calling nco_get_vars() for strided hyperslab access. In case of slow response, please ask NCO developers to extend USE_NC4_SRD_WORKAROUND to handle your use-case.\n",nco_prg_nm_get(),fnc_nm);
 	    (void)nco_get_vars(vara->nc_id,vara->id,dmn_srt,dmn_cnt,dmn_srd,vp,vara->type);
 	  }else{
-	    /* 20170207: This USE_NC4_SRD_WORKAROUND code is broken */
+	    /* 20170207: Original USE_NC4_SRD_WORKAROUND code was broken because it was applied to interior dimensions but did not account for interleaving
+	       20170208: New USE_NC4_SRD_WORKAROUND code only applies to non-unity stride in first dimension */
 	    int srd_nbr; /* [nbr] Number of strides requested in the single strided dimension (not number of strided dimensions) */
 	    int srd_idx; /* [idx] Counter for how many times to call nco_get_var() */
 	    int idx_srd; /* [idx] Index of strided dimension */
@@ -191,12 +189,8 @@ read_lbl:
 
 	    if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s using USE_NC4_SRD_WORKAROUND for faster access to strided hyperslabs in netCDF4 datasets\n",nco_prg_nm_get(),fnc_nm);
 
-	    /* Find strided dimension */
-	    for(dmn_idx=0;dmn_idx<dpt_crr_max;dmn_idx++)
-	      if(dmn_srd[dmn_idx] != 1L) break;
-
-	    assert(dmn_idx != dpt_crr_max);
-	    idx_srd=dmn_idx;
+	    /* Strided dimension must be first dimension */
+	    idx_srd=0;
 
 	    /* Find size of hyperslab of each stride */
 	    for(dmn_idx=0;dmn_idx<dpt_crr_max;dmn_idx++)
diff --git a/src/nco/nco_mss_val.c b/src/nco/nco_mss_val.c
index 54c5ab1..fb0fb46 100644
--- a/src/nco/nco_mss_val.c
+++ b/src/nco/nco_mss_val.c
@@ -256,7 +256,7 @@ nco_mss_val_cp /* [fnc] Copy missing value from var1 to var2 */
 } /* end nco_mss_val_cp() */
   
 int /* O [flg] Variable has missing value on output */
-nco_mss_val_get /* [fnc] Update number of attributes, missing_value of variable */
+nco_mss_val_get /* [fnc] Update number of attributes, missing value of variable */
 (const int nc_id, /* I [id] netCDF input-file ID */
  var_sct * const var) /* I/O [sct] Variable with missing_value to update */
 {
@@ -348,7 +348,7 @@ nco_mss_val_get /* [fnc] Update number of attributes, missing_value of variable
 } /* end nco_mss_val_get() */
 
 nco_bool /* O [flg] Variable has missing value */
-nco_mss_val_get_dbl /* [fnc] Return missing_value of variable, if any, as double precision number */
+nco_mss_val_get_dbl /* [fnc] Return missing value of variable, if any, as double precision number */
 (const int nc_id, /* I [id] netCDF input-file ID */
  const int var_id, /* I [id] netCDF variable ID */
  double *mss_val_dbl) /* O [frc] Missing value in double precision */
@@ -389,10 +389,14 @@ nco_mss_val_get_dbl /* [fnc] Return missing_value of variable, if any, as double
     } /* end if */
     /* If we got this far then retrieve attribute */
     has_mss_val=True;
-    /* Oddly, ARM uses NC_CHAR for type of missing_value, so make allowances for this */
-    (void)nco_get_att(nc_id,var_id,att_nm,mss_val_dbl,NC_DOUBLE);
-    //(void)fprintf(stderr,"%s: INFO NC_DOUBLE version of \"%s\" attribute for %s is %g\n",nco_prg_nm_get(),att_nm,var_nm,*mss_val_dbl);
-    if(!isfinite(*mss_val_dbl)) (void)fprintf(stderr,"%s: WARNING NC_DOUBLE version of \"%s\" attribute for %s fails isfinite(), value is %s\n",nco_prg_nm_get(),att_nm,var_nm,(isnan(*mss_val_dbl)) ? "NaN" : ((isinf(*mss_val_dbl)) ? "Infinity" : ""));
+    /* Only retrieve value when pointer is non-NULL
+       This prevents excessive retrievals and (potentially) printing of lengthy WARNINGS below */
+    if(mss_val_dbl){
+      /* Oddly, ARM uses NC_CHAR for type of missing_value, so make allowances for this */
+      (void)nco_get_att(nc_id,var_id,att_nm,mss_val_dbl,NC_DOUBLE);
+      //(void)fprintf(stderr,"%s: INFO NC_DOUBLE version of \"%s\" attribute for %s is %g\n",nco_prg_nm_get(),att_nm,var_nm,*mss_val_dbl);
+      if(!isfinite(*mss_val_dbl)) (void)fprintf(stderr,"%s: WARNING NC_DOUBLE version of \"%s\" attribute for %s fails isfinite(), value is %s, which can cause unpredictable results.\nHINT: If arithmetic results (e.g., from regridding) fails or values seem weird, retry after first converting %s to normal number with, e.g., \"ncatted -a %s,%s,m,f,1.0e36 in.nc out.nc\"\n",nco_prg_nm_get(),att_nm,var_nm,(isnan(*mss_val_dbl)) ? "NaN" : ((isinf(*mss_val_dbl)) ? "Infinity" : ""),nco_mss_val_sn [...]
+    } /* !mss_val_dbl */
     break;
   } /* end loop over att */
 
diff --git a/src/nco/nco_mss_val.h b/src/nco/nco_mss_val.h
index 9895298..6c3dd96 100644
--- a/src/nco/nco_mss_val.h
+++ b/src/nco/nco_mss_val.h
@@ -56,12 +56,12 @@ nco_mss_val_cp /* [fnc] Copy missing value from var1 to var2 */
  var_sct * const var2); /* I/O [sct] Variable with missing value to fill in/overwrite */
 
 int /* O [flg] Variable has missing value on output */
-nco_mss_val_get /* [fnc] Update number of attributes, missing_value of variable */
+nco_mss_val_get /* [fnc] Update number of attributes, missing value of variable */
 (const int nc_id, /* I [id] netCDF input-file ID */
  var_sct * const var); /* I/O [sct] Variable with missing_value to update */
 
 nco_bool /* O [flg] Variable has missing value */
-nco_mss_val_get_dbl /* [fnc] Return missing_value of variable, if any, as double precision number */
+nco_mss_val_get_dbl /* [fnc] Return missing value of variable, if any, as double precision number */
 (const int nc_id, /* I [id] netCDF input-file ID */
  const int var_id, /* I [id] netCDF variable ID */
  double *mss_val_dbl); /* O [frc] Missing value in double precision */
diff --git a/src/nco/nco_netcdf.c b/src/nco/nco_netcdf.c
index 22f9d0f..c9256fc 100644
--- a/src/nco/nco_netcdf.c
+++ b/src/nco/nco_netcdf.c
@@ -94,7 +94,7 @@ nco_err_exit /* [fnc] Print netCDF error message, routine name, then exit */
 #else /* !ENABLE_NETCDF4 */ 
      (void)fprintf(stdout,"Are your input files netCDF4 format?  (http://nco.sf.net/nco.html#fmt_inq shows how to tell.) If so then installing or re-building a netCDF4-compatible version of NCO should solve this problem. First upgrade netCDF to version 4.x, then install NCO using those netCDF 4.x libraries.\n2. NC_ENOTNC can occur when users attempt to utilize diskless (i.e., RAM) files.  In this case remove the diskless switches (e.g., --ram or --diskless) and then re-issue the command. \n"); 
 #endif /* !ENABLE_NETCDF4 */ 
-     (void)fprintf(stdout,"2. NCO attempts to read other filetypes (HDF4, HDF-EOS2, pnetCDF) for which support must be (but was not) enabled at netCDF build-time. NCO can access HDF4 files if NCO is first re-linked to a version of netCDF configured with the --enable-hdf4 option. This is a non-standard netCDF build option described here: http://www.unidata.ucar.edu/software/netcdf/docs/build_hdf4.html. NCO can access pnetCDF files if NCO is first re-linked netCDF version 4.4.0 or later.\n [...]
+     (void)fprintf(stdout,"2. NCO attempts to read other filetypes (HDF4, HDF-EOS2, pnetCDF) for which support must be (but was not) enabled at netCDF build-time. NCO can access HDF4 files if NCO is first re-linked to a version of netCDF configured with the --enable-hdf4 option. This is a non-standard netCDF build option described here: http://www.unidata.ucar.edu/software/netcdf/docs/build_hdf4.html. NCO can access pnetCDF files if NCO is first re-linked to netCDF version 4.4.0 or later [...]
   case NC_ERANGE: (void)fprintf(stdout,"ERROR NC_ERANGE Result not representable in output file\nHINT: NC_ERANGE errors typically occur after an arithmetic operation results in a value not representible by the output variable type when NCO attempts to write those values to an output file.  Possible workaround: Promote the variable to higher precision before attempting arithmetic.  For example,\nncap2 -O -s \'foo=double(foo);\' in.nc in.nc\nFor more details, see http://nco.sf.net/nco.html [...]
   case NC_EUNLIMIT: (void)fprintf(stdout,"ERROR NC_UNLIMIT NC_UNLIMITED size already in use\nHINT: NC_EUNLIMIT errors can occur when attempting to convert netCDF4 classic files that contain multiple record dimensions into a netCDF3 file that allows only one record dimension. In this case, try first fixing the excess record dimension(s) (with, e.g., ncks --fix_rec_dmn) and then convert to netCDF3. For more details, see http://nco.sf.net/nco.html#fix_rec_dmn\n"); break;
   case NC_EVARSIZE: (void)fprintf(stdout,"ERROR NC_EVARSIZE One or more variable sizes violate format constraints\nHINT: NC_EVARSIZE errors can occur when attempting to aggregate netCDF3 classic files together into outputs that exceed the capacity of the netCDF3 classic file format, e.g., a variable with size in excess of 2^31 bytes. In this case, try altering the output file type to netCDF3 classic with 64-bit offsets (with --64) or to netCDF4 (with -4). For more details, see http://nco [...]
diff --git a/src/nco/nco_ppc.c b/src/nco/nco_ppc.c
index cb07a3d..e008214 100644
--- a/src/nco/nco_ppc.c
+++ b/src/nco/nco_ppc.c
@@ -87,10 +87,7 @@ nco_ppc_ini /* Set PPC based on user specifications */
   if(sng_fnl) sng_fnl=(char *)nco_free(sng_fnl);
 
   /* jm fxm use more descriptive name than i---what does i count? */
-  for(int index=0;(ppc_lst+index)->key;index++){
-      ppc_var_nbr=index;
-  } /* end loop over i */
-  ppc_var_nbr++;
+  for(int index=0;(ppc_lst+index)->key;index++, ppc_var_nbr++); /* end loop over i */
 
   // ppc_lst=(kvm_sct *)nco_malloc(NC_MAX_VARS*sizeof(kvm_sct));
 
diff --git a/src/nco/nco_prn.c b/src/nco/nco_prn.c
index 672aa23..f8c285e 100644
--- a/src/nco/nco_prn.c
+++ b/src/nco/nco_prn.c
@@ -1,4 +1,5 @@
 /* $Header$ */
+/* $Header$ */
 
 /* Purpose: Print variables, attributes, metadata */
 
@@ -8,6 +9,7 @@
    GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */
 
 #include "nco_prn.h" /* Print variables, attributes, metadata */
+#include "nco.h"
 
 int 
 nco_att_nbr        /* [fnc] return number of atts in var or global atts in group */ 
@@ -822,6 +824,93 @@ nco_typ_fmt_sng /* [fnc] Provide sprintf() format string for specified type */
   return (char *)NULL;
 } /* end nco_typ_fmt_sng() */
 
+
+void
+nco_prn_var_val_cmt /* 0 print to stdout var values as CDL comment (delimited by comma ) */
+(var_sct *var,          /* I [sct] variable to print */
+ const prn_fmt_sct * const prn_flg)  /* I [sct] Print-format information */
+{
+  nco_bool is_mss_val=False;
+  long lmn;
+  long sz;
+  size_t val_sz_byt;
+  char *fmt_sng_mss_val=NULL;
+  char dlm_sng[200]={0};
+  const char *mss_val_sng="_";
+  /* Print each element with user-supplied formatting code */
+  /* Replace C language '\X' escape codes with ASCII bytes */
+
+  sz=var->sz;
+  sprintf(dlm_sng, "%s",nco_typ_fmt_sng_var_cdl(var->type));
+
+  (void)sng_ascii_trn(dlm_sng);
+
+  if(var->has_mss_val) val_sz_byt=nco_typ_lng(var->type);
+
+  // (void)printf(stdout,"nco_prn_var_val_cmt(): fmt_sng_mss_val=%s\n","hello" );
+
+  /* Assume -s argument (dlm_sng) formats entire string
+   Otherwise, one could assume that field will be printed with format nco_typ_fmt_sng(var->type),
+   and that user is only allowed to affect text between fields. 
+   This would be accomplished with:
+   (void)sprintf(var_sng,"%s%s",nco_typ_fmt_sng(var->type),dlm_sng);*/
+
+  /* Find replacement format string at most once, then re-use */
+  #ifdef NCO_HAVE_REGEX_FUNCTIONALITY
+    /* Replace printf()-format statements with format for missing values */
+      fmt_sng_mss_val=nco_fmt_sng_printf_subst(dlm_sng);
+  #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */
+
+  /* Print type in English in prefix text */
+  if(var->type == NC_STRING) (void)fprintf(stdout,"calendar format: "); else (void)fprintf(stdout,"%s value%s : ",cdl_typ_nm(var->type),(var->sz > 1 ? "s":""));
+
+  for(lmn=0;lmn<sz;lmn++){
+
+    if(prn_flg->PRN_MSS_VAL_BLANK && var->has_mss_val){
+      /* memcmp() triggers  pedantic warning unless pointer arithmetic is cast to type char */
+      if(var->type == NC_STRING) is_mss_val=!strcmp(var->val.sngp[lmn],var->mss_val.sngp[0]); else is_mss_val=!memcmp((char *)var->val.vp+lmn*val_sz_byt,var->mss_val.vp,(size_t)val_sz_byt);
+    } /* !PRN_MSS_VAL_BLANK */
+      
+    if(prn_flg->PRN_MSS_VAL_BLANK && var->has_mss_val && is_mss_val){
+      if(strcmp(dlm_sng,fmt_sng_mss_val)){
+	(void)fprintf(stdout,fmt_sng_mss_val,mss_val_sng);
+      }else{
+	(void)fprintf(stdout,"%s",mss_val_sng);
+      } /* !strcmp() */
+    }else{ /* !is_mss_val */
+        switch(var->type){
+          case NC_FLOAT: (void)fprintf(stdout,dlm_sng,var->val.fp[lmn]); break;
+          case NC_DOUBLE: (void)fprintf(stdout,dlm_sng,var->val.dp[lmn]); break;
+          case NC_SHORT: (void)fprintf(stdout,dlm_sng,var->val.sp[lmn]); break;
+          case NC_INT: (void)fprintf(stdout,dlm_sng,var->val.ip[lmn]); break;
+          case NC_CHAR: (void)fprintf(stdout,dlm_sng,var->val.cp[lmn]); break;
+          case NC_BYTE: (void)fprintf(stdout,dlm_sng,var->val.bp[lmn]); break;
+          case NC_UBYTE: (void)fprintf(stdout,dlm_sng,var->val.ubp[lmn]); break;
+          case NC_USHORT: (void)fprintf(stdout,dlm_sng,var->val.usp[lmn]); break;
+          case NC_UINT: (void)fprintf(stdout,dlm_sng,var->val.uip[lmn]); break;
+          case NC_INT64: (void)fprintf(stdout,dlm_sng,var->val.i64p[lmn]); break;
+          case NC_UINT64: (void)fprintf(stdout,dlm_sng,var->val.ui64p[lmn]); break;
+          case NC_STRING: (void)fprintf(stdout,dlm_sng,var->val.sngp[lmn]); break;
+          default: nco_dfl_case_nc_type_err(); break;
+       } /* end switch */
+
+    } /* !is_mss_val */
+    if(lmn<sz-1)
+      (void)fprintf(stdout,", ");
+
+  } /* end loop over element */
+
+  (void)fprintf(stdout,"\n");
+
+  if(fmt_sng_mss_val) fmt_sng_mss_val=(char *)nco_free(fmt_sng_mss_val);
+
+
+
+}/* end nco_prn_var_val_cmt() */
+
+
+
+
 void
 nco_prn_var_val_lmt /* [fnc] Print variable data */
 (const int in_id, /* I [id] netCDF input file ID */
@@ -1489,7 +1578,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
   char *sng_val_sng=NULL_CEWI; /* [sng] String of NC_CHAR */
   char *sng_val_sng_cpy; /* [sng] Copy of sng_val_sng to avoid cppcheck error about using sng_val_sng as both parameter and desitnation in sprintf(). NB: free() only one of these two pointers. */
   char *spr_sng=NULL; /* [sng] Output separator string */
-  char *unit_sng_var; /* [sng] Units string for variable */ 
+  char *unit_sng_var=NULL_CEWI; /* [sng] Units string for variable */
   char *unit_sng_crd=NULL_CEWI; /* [sng] Units string for coordinate */ 
 
   char chr_val; /* [sng] Current character */
@@ -1539,8 +1628,8 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
 
   nco_string sng_val; /* [sng] Current string */
 
-  var_sct var; /* [sct] Variable structure */
-  var_sct var_crd; /* [sct] Variable structure for associated coordinate variable */
+  var_sct *var=NULL_CEWI; /* [sct] Variable structure */
+  var_sct *var_aux=NULL_CEWI; /* used to hold var data to be printed as CDL comment AFTER regular var data */
 
   if(prn_flg->new_fmt && (CDL||TRD||JSN)) prn_ndn=prn_flg->ndn+prn_flg->var_fst;
   if(XML) prn_ndn=prn_flg->ndn;
@@ -1548,32 +1637,35 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
   /* Obtain group ID where variable is located */
   (void)nco_inq_grp_full_ncid(nc_id,var_trv->grp_nm_fll,&grp_id);
 
+  /* malloc space */
+  var=(var_sct*)nco_malloc(sizeof (var_sct));
+
   /* Set defaults */
-  (void)var_dfl_set(&var); 
+  (void)var_dfl_set(var);
 
   /* Initialize units string, overwrite later if necessary */
   unit_sng_var=&nul_chr;
 
   /* Get ID for requested variable */
-  var.nm=(char *)strdup(var_trv->nm);
-  var.nc_id=grp_id;
-  (void)nco_inq_varid(grp_id,var_trv->nm,&var.id);
+  var->nm=(char *)strdup(var_trv->nm);
+  var->nc_id=grp_id;
+  (void)nco_inq_varid(grp_id,var_trv->nm,&var->id);
 
   /* Get type of variable (get also name and number of dimensions for validation against parameter object) */
-  (void)nco_inq_var(grp_id,var.id,var_nm,&var.type,&var.nbr_dim,(int *)NULL,(int *)NULL);
+  (void)nco_inq_var(grp_id,var->id,var_nm,&var->type,&var->nbr_dim,(int *)NULL,(int *)NULL);
 
   /* Ensure we have correct variable */
   assert(var_trv->nco_typ == nco_obj_typ_var);
-  assert(var.nbr_dim == var_trv->nbr_dmn);
+  assert(var->nbr_dim == var_trv->nbr_dmn);
   assert(!strcmp(var_nm,var_trv->nm));
 
   /* Scalars */
-  if(var.nbr_dim == 0){
-    var.sz=1L;
-    var.val.vp=nco_malloc(nco_typ_lng(var.type));
+  if(var->nbr_dim == 0){
+    var->sz=1L;
+    var->val.vp=nco_malloc(nco_typ_lng(var->type));
     /* Block is critical/thread-safe for identical/distinct grp_id's */
     { /* begin potential OpenMP critical */
-      (void)nco_get_var1(grp_id,var.id,0L,var.val.vp,var.type);
+      (void)nco_get_var1(grp_id,var->id,0L,var->val.vp,var->type);
     } /* end potential OpenMP critical */
   }else{ /* ! Scalars */
     /* Allocate local MSA */
@@ -1584,56 +1676,119 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
     (void)nco_cpy_msa_lmt(var_trv,&lmt_msa);
 
     /* Call super-dooper recursive routine */
-    var.val.vp=nco_msa_rcr_clc((int)0,var.nbr_dim,lmt,lmt_msa,&var);
+    var->val.vp=nco_msa_rcr_clc((int)0,var->nbr_dim,lmt,lmt_msa,var);
   } /* ! Scalars */
 
+  /* Refresh missing value attribute, if any */
+  var->has_mss_val=nco_mss_val_get(var->nc_id,var);
+
+
 
-  if(var.nbr_dim)
+  unit_sng_var = nco_lmt_get_udu_att(grp_id,var->id,"units");
+  if( unit_sng_var && strlen(unit_sng_var)) {
+    flg_malloc_unit_var=True;
+    unit_cln_var=nco_cln_chk_tm(unit_sng_var);
+  }
+
+  if(unit_cln_var && ( prn_flg->PRN_CLN_LGB || nco_dbg_lvl_get()== nco_dbg_std)) {
+
+    var_sct *var_tmp=NULL_CEWI;
+    nco_cln_typ lmt_cln = cln_std;
+    char *cln_sng = (char *) NULL;
+
+    var_tmp=nco_var_dpl(var);
+
+    //(void)fprintf(stderr,"%s: %s reports var \"%s\" has missing value %d\n",nco_prg_nm_get(),fnc_nm,var.nm,var.has_mss_val);
+
+    cln_sng = nco_lmt_get_udu_att(grp_id, var->id, "calendar");
+    if (cln_sng)
+      lmt_cln = nco_cln_get_cln_typ(cln_sng);
+    else
+      lmt_cln = cln_std;
+
+    var_aux = nco_var_dpl(var);
+    var_aux->val.vp = nco_free(var_aux->val.vp);
+
+    if(var_aux->has_mss_val)
+      var_aux->mss_val.vp=nco_free(var_aux->mss_val.vp);
+    var_aux->has_mss_val=False;
+
+    nco_var_cnf_typ(NC_STRING, var_aux);
+
+    /* nb nco_cln_var_prs modifies var */
+    if (nco_cln_var_prs(unit_sng_var, lmt_cln, 2, var_tmp, var_aux) == NCO_NOERR) {
+      /* swap vars about */
+      if (prn_flg->PRN_CLN_LGB) {
+         var_sct *var_swp;
+          var_swp=var;
+          var=var_aux;
+          var_aux=var_swp;
+      }
+
+    }else{
+      /* nco_cln_var_prs() has failed  */
+      if (var_aux) var_aux = nco_var_free(var_aux);
+    }
+
+    if(var_tmp) var_tmp=(var_sct*)nco_var_free(var_tmp);
+    if (cln_sng) cln_sng = (char *) nco_free(cln_sng);
+
+  }
+
+  /* no need to print units if we are using a timestamp */
+  if(unit_cln_var || !prn_flg->PRN_DMN_UNITS){
+    unit_sng_var=(char*)nco_free(unit_sng_var);
+    flg_malloc_unit_var=False;
+    unit_sng_var=&nul_chr;
+  }
+
+  if(var->has_mss_val) val_sz_byt=nco_typ_lng(var->type);
+
+  if(var->nbr_dim)
   { 
     /* Allocate space for dimension information */
-    dim=(dmn_sct *)nco_malloc(var.nbr_dim*sizeof(dmn_sct));
+    dim=(dmn_sct *)nco_malloc(var->nbr_dim*sizeof(dmn_sct));
     /* Ensure val.vp is NULL-initialized (and thus not inadvertently free'd) when PRN_DMN_IDX_CRD_VAL is False */
-    for(int idx=0;idx<var.nbr_dim;idx++) dim[idx].val.vp=NULL; 
-    dmn_sbs_ram=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    dmn_sbs_dsk=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    mod_map_cnt=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    mod_map_rv_cnt=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    mod_map_in=(long *)nco_malloc(var.nbr_dim*sizeof(long));
+    for(int idx=0;idx<var->nbr_dim;idx++) dim[idx].val.vp=NULL;
+    dmn_sbs_ram=(long *)nco_malloc(var->nbr_dim*sizeof(long));
+    dmn_sbs_dsk=(long *)nco_malloc(var->nbr_dim*sizeof(long));
+    mod_map_cnt=(long *)nco_malloc(var->nbr_dim*sizeof(long));
+    mod_map_rv_cnt=(long *)nco_malloc(var->nbr_dim*sizeof(long));
+    mod_map_in=(long *)nco_malloc(var->nbr_dim*sizeof(long));
 
     /* Create mod_map_in */
-    for(int idx=0;idx<var.nbr_dim;idx++) mod_map_in[idx]=1L;
-    for(int idx=0;idx<var.nbr_dim;idx++)
-      for(int jdx=idx+1;jdx<var.nbr_dim;jdx++)
+    for(int idx=0;idx<var->nbr_dim;idx++) mod_map_in[idx]=1L;
+    for(int idx=0;idx<var->nbr_dim;idx++)
+      for(int jdx=idx+1;jdx<var->nbr_dim;jdx++)
         mod_map_in[idx]*=lmt_msa[jdx]->dmn_sz_org;
 
     /* Create mod_map_cnt */
-    for(int idx=0;idx<var.nbr_dim;idx++) mod_map_cnt[idx]=1L;
-    for(int idx=0;idx<var.nbr_dim;idx++)
-      for(int jdx=idx;jdx<var.nbr_dim;jdx++)
+    for(int idx=0;idx<var->nbr_dim;idx++) mod_map_cnt[idx]=1L;
+    for(int idx=0;idx<var->nbr_dim;idx++)
+      for(int jdx=idx;jdx<var->nbr_dim;jdx++)
         mod_map_cnt[idx]*=lmt_msa[jdx]->dmn_cnt;
 
     /* create mod_map_rv_cnt */ 
     long rsz=1L;
-    for(int jdx=var.nbr_dim-1;jdx>=0;jdx--)
+    for(int jdx=var->nbr_dim-1;jdx>=0;jdx--)
         mod_map_rv_cnt[jdx]=rsz*=lmt_msa[jdx]->dmn_cnt;
 
   }
 
   /* Call also initializes var.sz with final size */
   if(prn_flg->md5)
-    if(prn_flg->md5->dgs) (void)nco_md5_chk(prn_flg->md5,var_nm,var.sz*nco_typ_lng(var.type),grp_id,(long *)NULL,(long *)NULL,var.val.vp);
+    if(prn_flg->md5->dgs) (void)nco_md5_chk(prn_flg->md5,var_nm,var->sz*nco_typ_lng(var->type),grp_id,(long *)NULL,(long *)NULL,var->val.vp);
 
   /* Warn if variable is packed */
   if(nco_dbg_lvl_get() > 0)
-    if(nco_pck_dsk_inq(grp_id,&var))
+    if(nco_pck_dsk_inq(grp_id,var))
       (void)fprintf(stderr,"%s: WARNING will print packed values of variable \"%s\". Unpack first (with ncpdq -U) to see actual values.\n",nco_prg_nm_get(),var_nm);
 
-  /* Refresh number of attributes and missing value attribute, if any */
-  var.has_mss_val=nco_mss_val_get(var.nc_id,&var);
-  if(var.has_mss_val) val_sz_byt=nco_typ_lng(var.type);
 
   if(prn_flg->dlm_sng) dlm_sng=strdup(prn_flg->dlm_sng); /* [sng] User-specified delimiter string, if any */
-  if(dlm_sng){
+
+
+  if(dlm_sng ){
     /* Print variable with user-supplied dlm_sng (includes nbr_dmn == 0) */
     char *fmt_sng_mss_val=NULL;
 
@@ -1653,27 +1808,29 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
     fmt_sng_mss_val=nco_fmt_sng_printf_subst(dlm_sng);
 #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */
 
-    for(lmn=0;lmn<var.sz;lmn++){
+    for(lmn=0;lmn<var->sz;lmn++){
 
       /* memcmp() triggers pedantic warning unless pointer arithmetic is cast to type char * */
-      if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var.has_mss_val ? !memcmp((char *)var.val.vp+lmn*val_sz_byt,var.mss_val.vp,(size_t)val_sz_byt) : False; 
-
-      if(prn_flg->PRN_MSS_VAL_BLANK && is_mss_val){
+      if(prn_flg->PRN_MSS_VAL_BLANK && var->has_mss_val){
+        if(var->type==NC_STRING) is_mss_val=!strcmp(var->val.sngp[lmn],var->mss_val.sngp[0]); else is_mss_val=!memcmp((char *)var->val.vp+lmn*val_sz_byt,var->mss_val.vp,(size_t)val_sz_byt);
+      } /* !PRN_MSS_VAL_BLANK */
+	
+      if(prn_flg->PRN_MSS_VAL_BLANK && var->has_mss_val &&  is_mss_val){
         if(strcmp(dlm_sng,fmt_sng_mss_val)) (void)fprintf(stdout,fmt_sng_mss_val,mss_val_sng); else (void)fprintf(stdout,"%s, ",mss_val_sng);
       }else{ /* !is_mss_val */
-        switch(var.type){
-        case NC_FLOAT: (void)fprintf(stdout,dlm_sng,var.val.fp[lmn]); break;
-        case NC_DOUBLE: (void)fprintf(stdout,dlm_sng,var.val.dp[lmn]); break;
-        case NC_SHORT: (void)fprintf(stdout,dlm_sng,var.val.sp[lmn]); break;
-        case NC_INT: (void)fprintf(stdout,dlm_sng,var.val.ip[lmn]); break;
-        case NC_CHAR: (void)fprintf(stdout,dlm_sng,var.val.cp[lmn]); break;
-        case NC_BYTE: (void)fprintf(stdout,dlm_sng,var.val.bp[lmn]); break;
-        case NC_UBYTE: (void)fprintf(stdout,dlm_sng,var.val.ubp[lmn]); break;
-        case NC_USHORT: (void)fprintf(stdout,dlm_sng,var.val.usp[lmn]); break;
-        case NC_UINT: (void)fprintf(stdout,dlm_sng,var.val.uip[lmn]); break;
-        case NC_INT64: (void)fprintf(stdout,dlm_sng,var.val.i64p[lmn]); break;
-        case NC_UINT64: (void)fprintf(stdout,dlm_sng,var.val.ui64p[lmn]); break;
-        case NC_STRING: (void)fprintf(stdout,dlm_sng,var.val.sngp[lmn]); break;
+        switch(var->type){
+        case NC_FLOAT: (void)fprintf(stdout,dlm_sng,var->val.fp[lmn]); break;
+        case NC_DOUBLE: (void)fprintf(stdout,dlm_sng,var->val.dp[lmn]); break;
+        case NC_SHORT: (void)fprintf(stdout,dlm_sng,var->val.sp[lmn]); break;
+        case NC_INT: (void)fprintf(stdout,dlm_sng,var->val.ip[lmn]); break;
+        case NC_CHAR: (void)fprintf(stdout,dlm_sng,var->val.cp[lmn]); break;
+        case NC_BYTE: (void)fprintf(stdout,dlm_sng,var->val.bp[lmn]); break;
+        case NC_UBYTE: (void)fprintf(stdout,dlm_sng,var->val.ubp[lmn]); break;
+        case NC_USHORT: (void)fprintf(stdout,dlm_sng,var->val.usp[lmn]); break;
+        case NC_UINT: (void)fprintf(stdout,dlm_sng,var->val.uip[lmn]); break;
+        case NC_INT64: (void)fprintf(stdout,dlm_sng,var->val.i64p[lmn]); break;
+        case NC_UINT64: (void)fprintf(stdout,dlm_sng,var->val.ui64p[lmn]); break;
+        case NC_STRING: (void)fprintf(stdout,dlm_sng,var->val.sngp[lmn]); break;
         default: nco_dfl_case_nc_type_err(); break;
         } /* end switch */
       } /* !is_mss_val */
@@ -1697,36 +1854,36 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
 
     if(CDL){     
       chr2sng_sf=chr2sng_cdl;
-      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_var_cdl(var.type)); 
+      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_var_cdl(var->type));
     } /* !CDL */
     if(XML){     
       chr2sng_sf=chr2sng_xml;
-      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_att_xml(var.type));   
+      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_att_xml(var->type));
     } /* !XML */
     if(JSN){
       chr2sng_sf=chr2sng_jsn;
-      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_att_xml(var.type));   
+      (void)sprintf(fmt_sng,"%s",nco_typ_fmt_sng_att_xml(var->type));
       /* If var is size=1 (scalar?) then no array brackets */   
-      if(var.sz == 1) (void)fprintf(stdout,"%*s\"data\": ",prn_ndn,spc_sng); else (void)fprintf(stdout,"%*s\"data\": [",prn_ndn,spc_sng);   
+      if(var->sz == 1) (void)fprintf(stdout,"%*s\"data\": ",prn_ndn,spc_sng); else (void)fprintf(stdout,"%*s\"data\": [",prn_ndn,spc_sng);
       /* use bracketing array if needed */ 
-      if(prn_flg->jsn_data_brk && var.nbr_dim >=2) JSN_BRK=True;     
+      if(prn_flg->jsn_data_brk && var->nbr_dim >=2) JSN_BRK=True;
     } /* !JSN */
 
     nm_cdl=nm2sng_cdl(var_nm);
 
     if(XML){
       /* User may override default separator string for XML only */
-      if(var.type == NC_STRING || var.type == NC_CHAR) spr_sng= (prn_flg->spr_chr) ? prn_flg->spr_chr : spr_xml_chr; else spr_sng= (prn_flg->spr_nmr) ? prn_flg->spr_nmr : spr_xml_nmr;
+      if(var->type == NC_STRING || var->type == NC_CHAR) spr_sng= (prn_flg->spr_chr) ? prn_flg->spr_chr : spr_xml_chr; else spr_sng= (prn_flg->spr_nmr) ? prn_flg->spr_nmr : spr_xml_nmr;
 
       (void)fprintf(stdout,"%*s<values",prn_ndn+prn_flg->var_fst,spc_sng);
       /* Print non-whitespace separators between elements */
-      if((var.sz == 1L && var.type == NC_STRING) || var.sz > 1L){
+      if((var->sz == 1L && var->type == NC_STRING) || var->sz > 1L){
 	/* Ensure string variable value does not contain separator string */
-	if(var.type == NC_CHAR)
-	  if(strstr(var.val.cp,spr_sng)) spr_sng=spr_xml_chr_bck;
-	if(var.type == NC_STRING){
-	  for(lmn=0;lmn<var.sz;lmn++){
-	    if(strstr(var.val.sngp[lmn],spr_sng)){
+	if(var->type == NC_CHAR)
+	  if(strstr(var->val.cp,spr_sng)) spr_sng=spr_xml_chr_bck;
+	if(var->type == NC_STRING){
+	  for(lmn=0;lmn<var->sz;lmn++){
+	    if(strstr(var->val.sngp[lmn],spr_sng)){
 	      spr_sng=spr_xml_chr_bck;
 	      break;
 	    } /* endif */
@@ -1740,13 +1897,13 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
 	while(spr_sng_idx < spr_sng_lng)
 	  if(!isspace(spr_sng[spr_sng_idx])) break; else spr_sng_idx++;
 	if(spr_sng_idx < spr_sng_lng) (void)fprintf(stdout," separator=\"%s\"",spr_sng);
-	if(var.type == NC_CHAR && var.nbr_dim > 1 && FIRST_WARNING && nco_dbg_lvl_get() > 0){
+	if(var->type == NC_CHAR && var->nbr_dim > 1 && FIRST_WARNING && nco_dbg_lvl_get() > 0){
 	  /* 20131122: Warnings about XML ambiguities caused by spr_sng appearing in val_sng would go here
 	     New procedure to pre-check strings above obviates need for this in all all cases except one:
 	     Multi-dimensional NC_CHAR variables may have embedded NULs that prevent strstr(val,spr_sng)
 	     appearances of spr_sng after first NUL. Could use GNU-specific memmem() instead?
 	     Balance of simplicity and readability suggests warning at most once */
-	  (void)fprintf(stderr,"%s: WARNING %s converting to NcML multi-dimensional variable %s, presumably an array of strings of type %s, with NcML separator \"%s\". NCO performs precautionary checks with strstr(val,spr) to identify presence of separator string (spr) in data (val) and, if it detects a match, automatically switches to a backup separator string (\"%s\"). However limitations of strstr() may lead to false negatives when separator string occurs in data beyond the first string in m [...]
+	  (void)fprintf(stderr,"%s: WARNING %s converting to NcML multi-dimensional variable %s, presumably an array of strings of type %s, with NcML separator \"%s\". NCO performs precautionary checks with strstr(val,spr) to identify presence of separator string (spr) in data (val) and, if it detects a match, automatically switches to a backup separator string (\"%s\"). However limitations of strstr() may lead to false negatives when separator string occurs in data beyond the first string in m [...]
 	  FIRST_WARNING=False;
 	} /* endif WARNING */
       } /* var.sz */
@@ -1754,13 +1911,13 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
     } /* !xml */
     if(CDL) (void)fprintf(stdout,"%*s%s = ",prn_ndn,spc_sng,nm_cdl);
     nm_cdl=(char *)nco_free(nm_cdl);
-    var_szm1=var.sz-1L;
+    var_szm1=var->sz-1L;
     is_compound=nco_prn_cpd_chk(var_trv,trv_tbl);
 
     /* Pre-compute elements that need brace punctuation */
     if(is_compound){
       /* Create brace list */
-      for(dmn_idx=1;dmn_idx<var.nbr_dim;dmn_idx++){ /* NB: dimension index starts at 1 */
+      for(dmn_idx=1;dmn_idx<var->nbr_dim;dmn_idx++){ /* NB: dimension index starts at 1 */
         dmn_trv=nco_dmn_trv_sct(var_trv->var_dmn[dmn_idx].dmn_id,trv_tbl); 
         cpd_rec_dmn[dmn_idx]=False;
         if(dmn_trv->is_rec_dmn){
@@ -1771,23 +1928,29 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
       } /* end loop over dimensions */
     } /* !is_compound */
 
-    for(lmn=0;lmn<var.sz;lmn++){
+    for(lmn=0;lmn<var->sz;lmn++){
 
       /* do bracketing of data if specified */
       if(JSN_BRK)
-        for(int bdz=var.nbr_dim-1; bdz>=1 ; bdz--) 
-          if( lmn % mod_map_rv_cnt[bdz] == 0)
-	      (void)fprintf(stdout,"[");   
-
-      /* memcmp() triggers pedantic warning unless pointer arithmetic is cast to type char * */
-      if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var.has_mss_val ? !memcmp((char *)var.val.vp+lmn*val_sz_byt,var.mss_val.vp,(size_t)val_sz_byt) : False;  
-
-      if(prn_flg->PRN_MSS_VAL_BLANK && is_mss_val){
+        for(int bdz=var->nbr_dim-1;bdz>=1;bdz--)
+          if(lmn % mod_map_rv_cnt[bdz] == 0)
+	    (void)fprintf(stdout,"[");   
+
+      is_mss_val=False;
+      if(prn_flg->PRN_MSS_VAL_BLANK && var->has_mss_val){
+        if(var->type == NC_STRING) is_mss_val = !strcmp( var->val.sngp[lmn] ,var->mss_val.sngp[0]);
+	  /* in regular CDL format for NC_CHAR if FillValue is NOT '\0' then the char is printed as is */
+	else if(var->type==NC_CHAR) is_mss_val=False;
+	/* memcmp() triggers pedantic warning unless pointer arithmetic is cast to type char * */
+	else is_mss_val=!memcmp((char *)var->val.vp+lmn*val_sz_byt,var->mss_val.vp,(size_t)val_sz_byt);
+      } /* !PRN_MSS_VAL_BLANK */
+	
+      if(is_mss_val){
         (void)sprintf(val_sng,"%s",mss_val_sng);
       }else{ /* !is_mss_val */
-        switch(var.type){
+        switch(var->type){
         case NC_FLOAT: 
-          val_flt=var.val.fp[lmn];
+          val_flt=var->val.fp[lmn];
           if(isfinite(val_flt)){
             rcd_prn=snprintf(val_sng,(size_t)NCO_ATM_SNG_LNG,fmt_sng,val_flt);
             (void)sng_trm_trl_zro(val_sng,prn_flg->nbr_zro);
@@ -1796,7 +1959,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
           } /* endelse */
           break;
         case NC_DOUBLE:
-          val_dbl=var.val.dp[lmn];
+          val_dbl=var->val.dp[lmn];
           if(isfinite(val_dbl)){
             rcd_prn=snprintf(val_sng,(size_t)NCO_ATM_SNG_LNG,fmt_sng,val_dbl);
             (void)sng_trm_trl_zro(val_sng,prn_flg->nbr_zro);
@@ -1804,11 +1967,11 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
             if(isnan(val_dbl)) (void)sprintf(val_sng,"NaN"); else if(isinf(val_dbl)) (void)sprintf(val_sng,"%sInfinity",(val_dbl < 0.0) ? "-" : "");
           } /* endelse */
           break;
-        case NC_SHORT: (void)sprintf(val_sng,fmt_sng,var.val.sp[lmn]); break;
-        case NC_INT: (void)sprintf(val_sng,fmt_sng,var.val.ip[lmn]); break;
+        case NC_SHORT: (void)sprintf(val_sng,fmt_sng,var->val.sp[lmn]); break;
+        case NC_INT: (void)sprintf(val_sng,fmt_sng,var->val.ip[lmn]); break;
         case NC_CHAR: 
-          chr_val=var.val.cp[lmn];
-          if(var.nbr_dim == 0){
+          chr_val=var->val.cp[lmn];
+          if(var->nbr_dim == 0){
             if(CDL||TRD||JSN) (void)fprintf(stdout,"\"");
             if(chr_val != '\0') (void)fprintf(stdout,"%s",(*chr2sng_sf)(chr_val,val_sng));
             if(CDL||TRD||JSN) (void)fprintf(stdout,"\"");
@@ -1817,7 +1980,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
             /* Multi-dimensional string arrays of NC_CHAR */
             val_sng[0]='\0';
             if(lmn == 0L){
-              sng_lng=lmt_msa[var.nbr_dim-1]->dmn_cnt;
+              sng_lng=lmt_msa[var->nbr_dim-1]->dmn_cnt;
               sng_lngm1=sng_lng-1UL;
               /* Worst case is printable strings are four times longer than unformatted, i.e. '\\' == "\\\\" */
               sng_val_sng_cpy=sng_val_sng=(char *)nco_malloc(4*sng_lng+1UL);
@@ -1837,14 +2000,14 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
             if(lmn == var_szm1) sng_val_sng=(char *)nco_free(sng_val_sng);
           } /* var.nbr_dim > 0 */
           break;
-        case NC_BYTE: (void)sprintf(val_sng,fmt_sng,var.val.bp[lmn]); break;
-        case NC_UBYTE: (void)sprintf(val_sng,fmt_sng,var.val.ubp[lmn]); break;
-        case NC_USHORT: (void)sprintf(val_sng,fmt_sng,var.val.usp[lmn]); break;
-        case NC_UINT: (void)sprintf(val_sng,fmt_sng,var.val.uip[lmn]); break;
-        case NC_INT64: (void)sprintf(val_sng,fmt_sng,var.val.i64p[lmn]); break;
-        case NC_UINT64: (void)sprintf(val_sng,fmt_sng,var.val.ui64p[lmn]); break;
+        case NC_BYTE: (void)sprintf(val_sng,fmt_sng,var->val.bp[lmn]); break;
+        case NC_UBYTE: (void)sprintf(val_sng,fmt_sng,var->val.ubp[lmn]); break;
+        case NC_USHORT: (void)sprintf(val_sng,fmt_sng,var->val.usp[lmn]); break;
+        case NC_UINT: (void)sprintf(val_sng,fmt_sng,var->val.uip[lmn]); break;
+        case NC_INT64: (void)sprintf(val_sng,fmt_sng,var->val.i64p[lmn]); break;
+        case NC_UINT64: (void)sprintf(val_sng,fmt_sng,var->val.ui64p[lmn]); break;
         case NC_STRING: 
-          sng_val=var.val.sngp[lmn];
+          sng_val=var->val.sngp[lmn];
           sng_lng=strlen(sng_val);
           sng_lngm1=sng_lng-1UL;
           /* Worst case is printable strings are six or four times longer than unformatted, i.e., '\"' == """ or '\\' == "\\\\" */
@@ -1865,141 +2028,102 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
         } /* end switch */
       } /* !is_mss_val */
 
-      if(var.type != NC_CHAR && var.type != NC_STRING) (void)fprintf(stdout,"%s",val_sng);
+      if(  var->type != NC_CHAR ||  (var->type == NC_STRING && is_mss_val))
+        (void)fprintf(stdout,"%s",val_sng);
 
       /* do bracketing of data if specified */
       if(JSN_BRK)
-        for(int bdz=var.nbr_dim-1; bdz>=1 ; bdz--) 
+        for(int bdz=var->nbr_dim-1; bdz>=1 ; bdz--)
           if( (lmn+1) % mod_map_rv_cnt[bdz] == 0)
 	      (void)fprintf(stdout,"]");   
 
 
       if( lmn != var_szm1 )
-	 if( (var.type == NC_CHAR && lmn%sng_lng == sng_lngm1) || var.type != NC_CHAR  )
-           (void)fprintf(stdout,"%s", spr_sng );  	
+        if( (var->type == NC_CHAR && lmn%sng_lng == sng_lngm1) || var->type != NC_CHAR  )
+          (void)fprintf(stdout,"%s", spr_sng );
 
       /* if(var.type != NC_CHAR && var.type != NC_STRING ) (void)fprintf(stdout,"%s%s",val_sng,(lmn != var_szm1) ? spr_sng : ""); */
 
     } /* end loop over element */
     rcd_prn+=0; /* CEWI */
-    if(CDL) (void)fprintf(stdout," ;\n");
+
+    if(CDL){
+      if(var_aux && nco_dbg_lvl_get() == nco_dbg_std ){
+        fprintf(stdout, "; // ");
+        // print out list of values as a CDL text comment
+        nco_prn_var_val_cmt(var_aux,prn_flg);
+      }else {
+        (void) fprintf(stdout, " ;\n");
+      }
+
+    }
     if(XML) (void)fprintf(stdout,"</values>\n");
     /* close out array bracket if sz>1 */ 
-    if(JSN && var.sz > 1 ) (void)fprintf(stdout,"]");
+    if(JSN && var->sz > 1 ) (void)fprintf(stdout,"]");
 
   } /* end if CDL_OR_JSN_OR_XML */
 
-  if(prn_flg->PRN_DMN_UNITS){
-    const char units_nm[]="units"; /* [sng] Name of units attribute */
-    int rcd_lcl; /* [rcd] Return code */
-    int att_id; /* [id] Attribute ID */
-    long att_sz;
-    nc_type att_typ;
-
-    /* Does variable have character attribute named units_nm? */
-    rcd_lcl=nco_inq_attid_flg(grp_id,var.id,units_nm,&att_id);
-    if(rcd_lcl == NC_NOERR){
-      (void)nco_inq_att(grp_id,var.id,units_nm,&att_typ,&att_sz);
-      if(att_typ == NC_CHAR){
-        unit_sng_var=(char *)nco_malloc((att_sz+1L)*nco_typ_lng(att_typ));
-        (void)nco_get_att(grp_id,var.id,units_nm,unit_sng_var,att_typ);
-        unit_sng_var[(att_sz+1L)*nco_typ_lng(att_typ)-1L]='\0';
-        flg_malloc_unit_var=True;
-
-	/* CDM documentation on time coordinates:
-	   http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/CDM/CalendarDateTime.html
-	   "As of CDM version 4.3, dates are no longer handled by the UDUnits library. This allows handling non-standard Calendars. This change only affects datetime coordinate handling, called time coordinates in CF. For all other dimensional units, the UDUnits package is still used.
-	   The UDUnit date grammar is difficult to understand. Heres an approximate regular expression:
-	   period SINCE [-]Y[Y[Y[Y]]]-MM-DD[(T| )hh[:mm[:ss[.sss*]]][ [+|-]hh[[:]mm]]]
-	   The CDM uses the W3C profile of ISO 8601 formatting for reading and writing calendar dates" */
-
-	/* Are units those of a calendar? */
-	unit_cln_var=nco_cln_chk_tm(unit_sng_var);
-        if(nco_dbg_lvl_get() == nco_dbg_crr) (void)fprintf(stdout,"%s: INFO %s reports units string \"%s\" is %sa calendar string\n",nco_prg_nm_get(),fnc_nm,unit_sng_var,unit_cln_var ? "" : "not " );
-
-      } /* end if */
-    } /* end if */
-  } /* end if PRN_DMN_UNITS */
 
-  if(var.nbr_dim == 0 && !dlm_sng && TRD){
+  if(var->nbr_dim == 0 && !dlm_sng && TRD){
     /* Variable is scalar, byte, or character */
     lmn=0L;
-    if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var.has_mss_val ? !memcmp(var.val.vp,var.mss_val.vp,(size_t)val_sz_byt) : False; 
-    if(prn_flg->PRN_DMN_VAR_NM) (void)sprintf(var_sng,"%*s%%s = %s %%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var.type)); else (void)sprintf(var_sng,"%*s%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var.type));
+    if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var->has_mss_val ? !memcmp(var->val.vp,var->mss_val.vp,(size_t)val_sz_byt) : False;
+    if(prn_flg->PRN_DMN_VAR_NM) (void)sprintf(var_sng,"%*s%%s = %s %%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var->type)); else (void)sprintf(var_sng,"%*s%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var->type));
     if(prn_flg->PRN_MSS_VAL_BLANK && is_mss_val){
       if(prn_flg->PRN_DMN_VAR_NM) (void)fprintf(stdout,"%*s%s = %s %s\n",prn_ndn,spc_sng,var_nm,mss_val_sng,unit_sng_var); else (void)fprintf(stdout,"%*s%s\n",prn_ndn,spc_sng,mss_val_sng);
     }else{ /* !is_mss_val */
       if(prn_flg->PRN_DMN_VAR_NM){
-        switch(var.type){
-        case NC_FLOAT: (void)fprintf(stdout,var_sng,var_nm,var.val.fp[lmn],unit_sng_var); break;
-        case NC_DOUBLE: (void)fprintf(stdout,var_sng,var_nm,var.val.dp[lmn],unit_sng_var); break;
-        case NC_SHORT: (void)fprintf(stdout,var_sng,var_nm,var.val.sp[lmn],unit_sng_var); break;
-        case NC_INT: (void)fprintf(stdout,var_sng,var_nm,var.val.ip[lmn],unit_sng_var); break;
+        switch(var->type){
+        case NC_FLOAT: (void)fprintf(stdout,var_sng,var_nm,var->val.fp[lmn],unit_sng_var); break;
+        case NC_DOUBLE: (void)fprintf(stdout,var_sng,var_nm,var->val.dp[lmn],unit_sng_var); break;
+        case NC_SHORT: (void)fprintf(stdout,var_sng,var_nm,var->val.sp[lmn],unit_sng_var); break;
+        case NC_INT: (void)fprintf(stdout,var_sng,var_nm,var->val.ip[lmn],unit_sng_var); break;
         case NC_CHAR:
-          if(var.val.cp[lmn] != '\0'){
-            (void)sprintf(var_sng,"%*s%%s = '%s' %%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var.type));
-            (void)fprintf(stdout,var_sng,var_nm,var.val.cp[lmn],unit_sng_var);
+          if(var->val.cp[lmn] != '\0'){
+            (void)sprintf(var_sng,"%*s%%s = '%s' %%s\n",prn_ndn,spc_sng,nco_typ_fmt_sng(var->type));
+            (void)fprintf(stdout,var_sng,var_nm,var->val.cp[lmn],unit_sng_var);
           }else{ /* Deal with NUL character here */
             (void)fprintf(stdout,"%*s%s = \"\" %s\n",prn_ndn,spc_sng,var_nm,unit_sng_var);
           } /* end if */
           break;
-        case NC_BYTE: (void)fprintf(stdout,var_sng,var_nm,(unsigned char)var.val.bp[lmn],unit_sng_var); break;
-        case NC_UBYTE: (void)fprintf(stdout,var_sng,var_nm,var.val.ubp[lmn],unit_sng_var); break;
-        case NC_USHORT: (void)fprintf(stdout,var_sng,var_nm,var.val.usp[lmn],unit_sng_var); break;
-        case NC_UINT: (void)fprintf(stdout,var_sng,var_nm,var.val.uip[lmn],unit_sng_var); break;
-        case NC_INT64: (void)fprintf(stdout,var_sng,var_nm,var.val.i64p[lmn],unit_sng_var); break;
-        case NC_UINT64: (void)fprintf(stdout,var_sng,var_nm,var.val.ui64p[lmn],unit_sng_var); break;
-        case NC_STRING: (void)fprintf(stdout,var_sng,var_nm,var.val.sngp[lmn],unit_sng_var); break;
+        case NC_BYTE: (void)fprintf(stdout,var_sng,var_nm,(unsigned char)var->val.bp[lmn],unit_sng_var); break;
+        case NC_UBYTE: (void)fprintf(stdout,var_sng,var_nm,var->val.ubp[lmn],unit_sng_var); break;
+        case NC_USHORT: (void)fprintf(stdout,var_sng,var_nm,var->val.usp[lmn],unit_sng_var); break;
+        case NC_UINT: (void)fprintf(stdout,var_sng,var_nm,var->val.uip[lmn],unit_sng_var); break;
+        case NC_INT64: (void)fprintf(stdout,var_sng,var_nm,var->val.i64p[lmn],unit_sng_var); break;
+        case NC_UINT64: (void)fprintf(stdout,var_sng,var_nm,var->val.ui64p[lmn],unit_sng_var); break;
+        case NC_STRING: (void)fprintf(stdout,var_sng,var_nm,var->val.sngp[lmn],unit_sng_var); break;
         default: nco_dfl_case_nc_type_err(); break;
         } /* end switch */
       }else{ /* !PRN_DMN_VAR_NM */
-        switch(var.type){
-        case NC_FLOAT: (void)fprintf(stdout,var_sng,var.val.fp[lmn]); break;
-        case NC_DOUBLE: (void)fprintf(stdout,var_sng,var.val.dp[lmn]); break;
-        case NC_SHORT: (void)fprintf(stdout,var_sng,var.val.sp[lmn]); break;
-        case NC_INT: (void)fprintf(stdout,var_sng,var.val.ip[lmn]); break;
+        switch(var->type){
+        case NC_FLOAT: (void)fprintf(stdout,var_sng,var->val.fp[lmn]); break;
+        case NC_DOUBLE: (void)fprintf(stdout,var_sng,var->val.dp[lmn]); break;
+        case NC_SHORT: (void)fprintf(stdout,var_sng,var->val.sp[lmn]); break;
+        case NC_INT: (void)fprintf(stdout,var_sng,var->val.ip[lmn]); break;
         case NC_CHAR:
-          if(var.val.cp[lmn] != '\0'){
-            (void)sprintf(var_sng,"'%s'\n",nco_typ_fmt_sng(var.type));
-            (void)fprintf(stdout,var_sng,var.val.cp[lmn]);
+          if(var->val.cp[lmn] != '\0'){
+            (void)sprintf(var_sng,"'%s'\n",nco_typ_fmt_sng(var->type));
+            (void)fprintf(stdout,var_sng,var->val.cp[lmn]);
           }else{ /* Deal with NUL character here */
             (void)fprintf(stdout, "\"\"\n");
           } /* end if */
           break;
-        case NC_BYTE: (void)fprintf(stdout,var_sng,(unsigned char)var.val.bp[lmn]); break;
-        case NC_UBYTE: (void)fprintf(stdout,var_sng,var.val.ubp[lmn]); break;
-        case NC_USHORT: (void)fprintf(stdout,var_sng,var.val.usp[lmn]); break;
-        case NC_UINT: (void)fprintf(stdout,var_sng,var.val.uip[lmn]); break;
-        case NC_INT64: (void)fprintf(stdout,var_sng,var.val.i64p[lmn]); break;
-        case NC_UINT64: (void)fprintf(stdout,var_sng,var.val.ui64p[lmn]); break;
-        case NC_STRING: (void)fprintf(stdout,var_sng,var.val.sngp[lmn]); break;
+        case NC_BYTE: (void)fprintf(stdout,var_sng,(unsigned char)var->val.bp[lmn]); break;
+        case NC_UBYTE: (void)fprintf(stdout,var_sng,var->val.ubp[lmn]); break;
+        case NC_USHORT: (void)fprintf(stdout,var_sng,var->val.usp[lmn]); break;
+        case NC_UINT: (void)fprintf(stdout,var_sng,var->val.uip[lmn]); break;
+        case NC_INT64: (void)fprintf(stdout,var_sng,var->val.i64p[lmn]); break;
+        case NC_UINT64: (void)fprintf(stdout,var_sng,var->val.ui64p[lmn]); break;
+        case NC_STRING: (void)fprintf(stdout,var_sng,var->val.sngp[lmn]); break;
         default: nco_dfl_case_nc_type_err(); break;
         } /* end switch */
       } /* !PRN_DMN_VAR_NM */
     } /* !is_mss_val */
   } /* end if variable is scalar, byte, or character */
 
-  if(var.nbr_dim > 0 && !dlm_sng && TRD){
+  if(var->nbr_dim > 0 && !dlm_sng && TRD){
 
-    /*
-    dim=(dmn_sct *)nco_malloc(var.nbr_dim*sizeof(dmn_sct));
-    for(int idx=0;idx<var.nbr_dim;idx++) dim[idx].val.vp=NULL; 
-    dmn_sbs_ram=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    dmn_sbs_dsk=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    mod_map_cnt=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-    mod_map_in=(long *)nco_malloc(var.nbr_dim*sizeof(long));
-
-    for(int idx=0;idx<var.nbr_dim;idx++) mod_map_in[idx]=1L;
-    for(int idx=0;idx<var.nbr_dim;idx++)
-      for(int jdx=idx+1;jdx<var.nbr_dim;jdx++)
-        mod_map_in[idx]*=lmt_msa[jdx]->dmn_sz_org;
-
-    for(int idx=0;idx<var.nbr_dim;idx++) mod_map_cnt[idx]=1L;
-    for(int idx=0;idx<var.nbr_dim;idx++)
-      for(int jdx=idx;jdx<var.nbr_dim;jdx++)
-        mod_map_cnt[idx]*=lmt_msa[jdx]->dmn_cnt;
-
-    */  
 
     /* Read coordinate dimensions if required */
     if(prn_flg->PRN_DMN_IDX_CRD_VAL){
@@ -2020,7 +2144,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
           continue;
         }else if(var_trv->var_dmn[idx].is_crd_var){
           /* Dimension is a coordinate */
-
+          var_sct var_crd;
           /* Get coordinate from table */
           crd_sct *crd=var_trv->var_dmn[idx].crd;
 
@@ -2051,12 +2175,12 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
 	    nc_type att_typ;
 	    
 	    /* Does coordinate have character attribute named units_nm? */
-	    rcd_lcl=nco_inq_attid_flg(grp_id,var.id,units_nm,&att_id);
+	    rcd_lcl=nco_inq_attid_flg(grp_id,var->id,units_nm,&att_id);
 	    if(rcd_lcl == NC_NOERR){
-	      (void)nco_inq_att(grp_id,var.id,units_nm,&att_typ,&att_sz);
+	      (void)nco_inq_att(grp_id,var->id,units_nm,&att_typ,&att_sz);
 	      if(att_typ == NC_CHAR){
 		unit_sng_crd=(char *)nco_malloc((att_sz+1L)*nco_typ_lng(att_typ));
-		(void)nco_get_att(grp_id,var.id,units_nm,unit_sng_crd,att_typ);
+		(void)nco_get_att(grp_id,var->id,units_nm,unit_sng_crd,att_typ);
 		unit_sng_crd[(att_sz+1L)*nco_typ_lng(att_typ)-1L]='\0';
 		flg_malloc_unit_crd=True;
 		
@@ -2083,24 +2207,24 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
       } /* end for */
     } /* end if */
 
-    for(lmn=0;lmn<var.sz;lmn++){
+    for(lmn=0;lmn<var->sz;lmn++){
 
       /* memcmp() triggers pedantic warning unless pointer arithmetic is cast to type char * */
-      if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var.has_mss_val ? !memcmp((char *)var.val.vp+lmn*val_sz_byt,var.mss_val.vp,(size_t)val_sz_byt) : False; 
+      if(prn_flg->PRN_MSS_VAL_BLANK) is_mss_val = var->has_mss_val ? !memcmp((char *)var->val.vp+lmn*val_sz_byt,var->mss_val.vp,(size_t)val_sz_byt) : False;
 
       /* Calculate RAM indices from current limit */
-      for(int idx=0;idx<var.nbr_dim;idx++)
-        dmn_sbs_ram[idx]=(lmn%mod_map_cnt[idx])/(idx == var.nbr_dim-1 ? 1L : mod_map_cnt[idx+1]);
+      for(int idx=0;idx<var->nbr_dim;idx++)
+        dmn_sbs_ram[idx]=(lmn%mod_map_cnt[idx])/(idx == var->nbr_dim-1 ? 1L : mod_map_cnt[idx+1]);
 
       /* Calculate disk indices from RAM indices */
-      (void)nco_msa_ram_2_dsk(dmn_sbs_ram,lmt_msa,var.nbr_dim,dmn_sbs_dsk,(lmn == var.sz-1L));
+      (void)nco_msa_ram_2_dsk(dmn_sbs_ram,lmt_msa,var->nbr_dim,dmn_sbs_dsk,(lmn == var->sz-1L));
 
       /* Find variable index relative to disk */
       var_dsk=0;
-      for(int idx=0;idx<var.nbr_dim;idx++) var_dsk+=dmn_sbs_dsk[idx]*mod_map_in[idx];
+      for(int idx=0;idx<var->nbr_dim;idx++) var_dsk+=dmn_sbs_dsk[idx]*mod_map_in[idx];
 
       /* Skip rest of loop unless element is first in string */
-      if(var.type == NC_CHAR && dmn_sbs_ram[var.nbr_dim-1] > 0) goto lbl_chr_prn;
+      if(var->type == NC_CHAR && dmn_sbs_ram[var->nbr_dim-1] > 0) goto lbl_chr_prn;
 
       /* Print dimensions with indices along with values if they are coordinate variables */
       if(prn_flg->PRN_DMN_IDX_CRD_VAL){
@@ -2112,7 +2236,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
         for(int idx=0;idx<var_trv->nbr_dmn;idx++){
 
           /* Reverse dimension ordering for Fortran convention */
-          if(prn_flg->FORTRAN_IDX_CNV) dmn_idx=var.nbr_dim-1-idx; else dmn_idx=idx;
+          if(prn_flg->FORTRAN_IDX_CNV) dmn_idx=var->nbr_dim-1-idx; else dmn_idx=idx;
 
           /* Format and print dimension part of output string for non-coordinate variables */
 
@@ -2185,7 +2309,7 @@ nco_prn_var_val_trv /* [fnc] Print variable data (GTT version) */
       /* Print all characters in last dimension each time penultimate dimension subscript changes to its start value */
 lbl_chr_prn:
 
-      if(var.type == NC_CHAR){
+      if(var->type == NC_CHAR){
         static nco_bool NUL_CHR_IN_SLB;
         static char *prn_sng;
         static int chr_cnt;
@@ -2194,8 +2318,8 @@ lbl_chr_prn:
         static long var_dsk_end;
 
         /* At beginning of character array */
-        if(dmn_sbs_ram[var.nbr_dim-1] == 0L) {
-          dmn_sz=lmt_msa[var.nbr_dim-1]->dmn_cnt;
+        if(dmn_sbs_ram[var->nbr_dim-1] == 0L) {
+          dmn_sz=lmt_msa[var->nbr_dim-1]->dmn_cnt;
           prn_sng=(char *)nco_malloc((size_t)dmn_sz+1UL);
           var_dsk_srt=var_dsk;
           var_dsk_end=var_dsk;
@@ -2204,14 +2328,14 @@ lbl_chr_prn:
         } /* end if */
 
         /* In middle of array---save characters to prn_sng */
-        prn_sng[chr_cnt++]=var.val.cp[lmn];
-        if(var.val.cp[lmn] == '\0' && !NUL_CHR_IN_SLB){
+        prn_sng[chr_cnt++]=var->val.cp[lmn];
+        if(var->val.cp[lmn] == '\0' && !NUL_CHR_IN_SLB){
           var_dsk_end=var_dsk;
           NUL_CHR_IN_SLB=True;
         } /* end if */
 
         /* At end of character array */
-        if(dmn_sbs_ram[var.nbr_dim-1] == dmn_sz-1L){
+        if(dmn_sbs_ram[var->nbr_dim-1] == dmn_sz-1L){
           if(NUL_CHR_IN_SLB){
             (void)sprintf(var_sng,"%%s[%%ld--%%ld]=\"%%s\" %%s");
           }else{
@@ -2233,7 +2357,7 @@ lbl_chr_prn:
       } /* end if NC_CHAR */
 
       /* Print variable name, index, and value */
-      if(prn_flg->PRN_DMN_VAR_NM) (void)sprintf(var_sng,"%*s%%s%s%%ld%s=%s %%s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,prn_flg->FORTRAN_IDX_CNV ? "(" : "[",prn_flg->FORTRAN_IDX_CNV ? ")" : "]",nco_typ_fmt_sng(var.type)); else (void)sprintf(var_sng,"%*s%s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,nco_typ_fmt_sng(var.type));
+      if(prn_flg->PRN_DMN_VAR_NM) (void)sprintf(var_sng,"%*s%%s%s%%ld%s=%s %%s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,prn_flg->FORTRAN_IDX_CNV ? "(" : "[",prn_flg->FORTRAN_IDX_CNV ? ")" : "]",nco_typ_fmt_sng(var->type)); else (void)sprintf(var_sng,"%*s%s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,nco_typ_fmt_sng(var->type));
       if(prn_flg->FORTRAN_IDX_CNV){
         (void)sng_idx_dlm_c2f(var_sng);
         var_dsk++;
@@ -2243,35 +2367,35 @@ lbl_chr_prn:
         if(prn_flg->PRN_DMN_VAR_NM) (void)fprintf(stdout,"%*s%s%s%ld%s=%s %s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,var_nm,prn_flg->FORTRAN_IDX_CNV ? "(" : "[",var_dsk,prn_flg->FORTRAN_IDX_CNV ? ")" : "]",mss_val_sng,unit_sng_var); else (void)fprintf(stdout,"%*s%s\n",(var_trv->is_crd_var) ? prn_ndn : 0,spc_sng,mss_val_sng); 
       }else{ /* !is_mss_val */
         if(prn_flg->PRN_DMN_VAR_NM){
-          switch(var.type){
-          case NC_FLOAT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.fp[lmn],unit_sng_var); break;
-          case NC_DOUBLE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.dp[lmn],unit_sng_var); break;
-          case NC_SHORT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.sp[lmn],unit_sng_var); break;
-          case NC_INT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.ip[lmn],unit_sng_var); break;
-          case NC_CHAR: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.cp[lmn],unit_sng_var); break;
-          case NC_BYTE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,(unsigned char)var.val.bp[lmn],unit_sng_var); break;
-          case NC_UBYTE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.ubp[lmn],unit_sng_var); break;
-          case NC_USHORT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.usp[lmn],unit_sng_var); break;
-          case NC_UINT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.uip[lmn],unit_sng_var); break;
-          case NC_INT64: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.i64p[lmn],unit_sng_var); break;
-          case NC_UINT64: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.ui64p[lmn],unit_sng_var); break;
-          case NC_STRING: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var.val.sngp[lmn],unit_sng_var); break;
+          switch(var->type){
+          case NC_FLOAT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.fp[lmn],unit_sng_var); break;
+          case NC_DOUBLE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.dp[lmn],unit_sng_var); break;
+          case NC_SHORT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.sp[lmn],unit_sng_var); break;
+          case NC_INT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.ip[lmn],unit_sng_var); break;
+          case NC_CHAR: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.cp[lmn],unit_sng_var); break;
+          case NC_BYTE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,(unsigned char)var->val.bp[lmn],unit_sng_var); break;
+          case NC_UBYTE: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.ubp[lmn],unit_sng_var); break;
+          case NC_USHORT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.usp[lmn],unit_sng_var); break;
+          case NC_UINT: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.uip[lmn],unit_sng_var); break;
+          case NC_INT64: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.i64p[lmn],unit_sng_var); break;
+          case NC_UINT64: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.ui64p[lmn],unit_sng_var); break;
+          case NC_STRING: (void)fprintf(stdout,var_sng,var_nm,var_dsk,var->val.sngp[lmn],unit_sng_var); break;
           default: nco_dfl_case_nc_type_err(); break;
           } /* end switch */
         }else{ /* !PRN_DMN_VAR_NM */
-          switch(var.type){
-          case NC_FLOAT: (void)fprintf(stdout,var_sng,var.val.fp[lmn],unit_sng_var); break;
-          case NC_DOUBLE: (void)fprintf(stdout,var_sng,var.val.dp[lmn],unit_sng_var); break;
-          case NC_SHORT: (void)fprintf(stdout,var_sng,var.val.sp[lmn],unit_sng_var); break;
-          case NC_INT: (void)fprintf(stdout,var_sng,var.val.ip[lmn],unit_sng_var); break;
-          case NC_CHAR: (void)fprintf(stdout,var_sng,var.val.cp[lmn],unit_sng_var); break;
-          case NC_BYTE: (void)fprintf(stdout,var_sng,(unsigned char)var.val.bp[lmn],unit_sng_var); break;
-          case NC_UBYTE: (void)fprintf(stdout,var_sng,var.val.ubp[lmn],unit_sng_var); break;
-          case NC_USHORT: (void)fprintf(stdout,var_sng,var.val.usp[lmn],unit_sng_var); break;
-          case NC_UINT: (void)fprintf(stdout,var_sng,var.val.uip[lmn],unit_sng_var); break;
-          case NC_INT64: (void)fprintf(stdout,var_sng,var.val.i64p[lmn],unit_sng_var); break;
-          case NC_UINT64: (void)fprintf(stdout,var_sng,var.val.ui64p[lmn],unit_sng_var); break;
-          case NC_STRING: (void)fprintf(stdout,var_sng,var.val.sngp[lmn],unit_sng_var); break;
+          switch(var->type){
+          case NC_FLOAT: (void)fprintf(stdout,var_sng,var->val.fp[lmn],unit_sng_var); break;
+          case NC_DOUBLE: (void)fprintf(stdout,var_sng,var->val.dp[lmn],unit_sng_var); break;
+          case NC_SHORT: (void)fprintf(stdout,var_sng,var->val.sp[lmn],unit_sng_var); break;
+          case NC_INT: (void)fprintf(stdout,var_sng,var->val.ip[lmn],unit_sng_var); break;
+          case NC_CHAR: (void)fprintf(stdout,var_sng,var->val.cp[lmn],unit_sng_var); break;
+          case NC_BYTE: (void)fprintf(stdout,var_sng,(unsigned char)var->val.bp[lmn],unit_sng_var); break;
+          case NC_UBYTE: (void)fprintf(stdout,var_sng,var->val.ubp[lmn],unit_sng_var); break;
+          case NC_USHORT: (void)fprintf(stdout,var_sng,var->val.usp[lmn],unit_sng_var); break;
+          case NC_UINT: (void)fprintf(stdout,var_sng,var->val.uip[lmn],unit_sng_var); break;
+          case NC_INT64: (void)fprintf(stdout,var_sng,var->val.i64p[lmn],unit_sng_var); break;
+          case NC_UINT64: (void)fprintf(stdout,var_sng,var->val.ui64p[lmn],unit_sng_var); break;
+          case NC_STRING: (void)fprintf(stdout,var_sng,var->val.sngp[lmn],unit_sng_var); break;
           default: nco_dfl_case_nc_type_err(); break;
           } /* end switch */
         } /* !PRN_DMN_VAR_NM */
@@ -2281,7 +2405,7 @@ lbl_chr_prn:
     (void)fflush(stdout);
 
     /* Clean-up information for multi-dimensional arrays */
-    for(int idx=0;idx<var.nbr_dim;idx++) if(dim[idx].val.vp) dim[idx].val.vp=nco_free(dim[idx].val.vp);
+    for(int idx=0;idx<var->nbr_dim;idx++) if(dim[idx].val.vp) dim[idx].val.vp=nco_free(dim[idx].val.vp);
     if(dim) dim=(dmn_sct *)nco_free(dim);
     if(dmn_sbs_ram) dmn_sbs_ram=(long *)nco_free(dmn_sbs_ram);
     if(dmn_sbs_dsk) dmn_sbs_dsk=(long *)nco_free(dmn_sbs_dsk);
@@ -2291,13 +2415,19 @@ lbl_chr_prn:
 
   } /* end if variable has more than one dimension */
 
-  /* Free value buffer */
-  if(var.type == NC_STRING)
-      for(lmn=0;lmn<var.sz;lmn++)
-	if(var.val.sngp[lmn]) var.val.sngp[lmn]=(nco_string)nco_free(var.val.sngp[lmn]);
-  var.val.vp=nco_free(var.val.vp);
-  var.mss_val.vp=nco_free(var.mss_val.vp);
-  var.nm=(char *)nco_free(var.nm);
+
+
+  /* Free value buffer *
+  if(var->type == NC_STRING)
+     //nco_string_lst_free(var.val.sngp,var.sz);
+      for(lmn=0;lmn<var->sz;lmn++)
+	    if(var->val.sngp[lmn]) var->val.sngp[lmn]=(nco_string)nco_free(var->val.sngp[lmn]);
+
+  var->val.vp=nco_free(var->val.vp);
+
+  var->mss_val.vp=nco_free(var->mss_val.vp);
+  var->nm=(char *)nco_free(var->nm);
+  */
 
   if(flg_malloc_unit_crd) unit_sng_crd=(char *)nco_free(unit_sng_crd);
   if(flg_malloc_unit_var) unit_sng_var=(char *)nco_free(unit_sng_var);
@@ -2307,11 +2437,15 @@ lbl_chr_prn:
   if(prn_flg->nwl_pst_val) (void)fprintf(stdout,"\n");
 
   /* Free (allocated for non scalars only) */
-  if(var.nbr_dim > 0){
+  if(var->nbr_dim > 0){
     (void)nco_lmt_msa_free(var_trv->nbr_dmn,lmt_msa);
     lmt=(lmt_sct **)nco_free(lmt);
   } /* endif */
 
+  var=nco_var_free(var);
+  /* free var_aux */
+  if(var_aux) var_aux=nco_var_free(var_aux);
+
 } /* end nco_prn_var_val_trv() */
 
 int /* [rcd] Return code */
@@ -2356,7 +2490,7 @@ nco_grp_prn /* [fnc] Recursively print group contents */
   int var_idx;                     /* [idx] Variable index */
   int var_nbr_xtr;                 /* [nbr] Number of extracted variables */
   
-  nco_bool JSN_BLOCK=False;         /* turns true is we have output a jsnblock -need so we add commas where needed */ 
+  nco_bool JSN_BLOCK=False;         /* turns true is we have output a jsnblock -need so we add commas where needed */
   const nco_bool CDL=prn_flg->cdl; /* [flg] CDL output */
   const nco_bool XML=prn_flg->xml; /* [flg] XML output */
   const nco_bool TRD=prn_flg->trd; /* [flg] Traditional output */
@@ -3311,7 +3445,7 @@ nco_prn_jsn /* [fnc] Recursively print group contents */
   int var_idx;                     /* [idx] Variable index */
   int var_nbr_xtr;                 /* [nbr] Number of extracted variables */
   int nbr_grp_xtr=0;               /* number of groups currently extracted */  
-  nco_bool JSN_BLOCK=False;         /* turns true is we have output a jsnblock -need so we add commas where needed */ 
+  nco_bool JSN_BLOCK=False;         /* turns true is we have output a jsnblock -need so we add commas where needed */
   
   nm_id_sct *dmn_lst; /* [sct] Dimension list */
   nm_id_sct *var_lst; /* [sct] Variable list */
diff --git a/src/nco/nco_prn.h b/src/nco/nco_prn.h
index 96e9e70..8420bb4 100644
--- a/src/nco/nco_prn.h
+++ b/src/nco/nco_prn.h
@@ -76,6 +76,11 @@ nco_typ_fmt_sng_att_xml /* [fnc] Provide sprintf() format string for specified a
 (const nc_type typ); /* I [enm] netCDF attribute type to provide XML format string for */
 
 void
+nco_prn_var_val_cmt     /* 0 print to stdout var values formatted  by prn_flg or dlm_sng_in  or */
+(var_sct *var,          /* I [sct] variable to print */
+const prn_fmt_sct * const prn_flg);  /* I [sct] Print-format information */
+
+void
 nco_prn_var_val_lmt /* [fnc] Print variable data */
 (const int in_id, /* I [id] netCDF input file ID */
  const char * const var_nm, /* I [sng] Variable name */
diff --git a/src/nco/nco_rgr.c b/src/nco/nco_rgr.c
index 72c7fe3..6ac8db0 100644
--- a/src/nco/nco_rgr.c
+++ b/src/nco/nco_rgr.c
@@ -218,10 +218,7 @@ nco_rgr_ini /* [fnc] Initialize regridding structure */
     if(sng_fnl) sng_fnl=(char *)nco_free(sng_fnl);
 
     /* Count number of keys */
-    for(rgr_var_idx=0;(rgr_lst+rgr_var_idx)->key;rgr_var_idx++){
-      rgr_var_nbr=rgr_var_idx;
-    } /* !rgr_var_idx */
-    rgr_var_nbr++;
+    for(rgr_var_idx=0;(rgr_lst+rgr_var_idx)->key;rgr_var_idx++,rgr_var_nbr++);/* !rgr_var_idx */
   } /* !rgr_arg_nbr */
 
   /* NULL-initialize key-value properties required for string variables */
@@ -1715,19 +1712,20 @@ nco_rgr_map /* [fnc] Regrid with external weights */
     else if((rcd=nco_inq_dimid_flg(in_id,"lat",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("lat");
     else if((rcd=nco_inq_dimid_flg(in_id,"Latitude",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("Latitude");
     else if((rcd=nco_inq_dimid_flg(in_id,"Lat",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("Lat");
-    else if((rcd=nco_inq_dimid_flg(in_id,"south_north",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("south_north");
+    else if((rcd=nco_inq_dimid_flg(in_id,"south_north",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("south_north"); /* WRF */
     else if((rcd=nco_inq_dimid_flg(in_id,"south_north_stag",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("south_north_stag");
-    else if((rcd=nco_inq_dimid_flg(in_id,"YDim:location",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("YDim:location");
-    else if((rcd=nco_inq_dimid_flg(in_id,"YDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("YDim:MOD_Grid_monthly_CMG_VI");
-    else if((rcd=nco_inq_dimid_flg(in_id,"natrack",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("natrack");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nj",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nj");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nlat",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nlat");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nscan",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nscan");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nTimes",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nTimes");
-    else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("GeoTrack");
-    else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("GeoTrack:L2_Standard_atmospheric&surface_product");
-    else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Along_Swath:mod04",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("Cell_Along_Swath:mod04");
+    else if((rcd=nco_inq_dimid_flg(in_id,"YDim:location",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("YDim:location"); /* AIRS L3 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"YDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("YDim:MOD_Grid_monthly_CMG_VI"); /* MODIS MOD13C2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"natrack",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("natrack"); /* MODIS DeepBlue SeaWiFS L2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nj",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nj"); /* CICE RTM */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nlat",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nlat"); /* POP */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nscan",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nscan"); /* AMSR, TRMM */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nTimes",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("nTimes"); /* OMI L2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("GeoTrack"); /* AIRS L2 DAP NC */
+    else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("GeoTrack:L2_Standard_atmospheric&surface_product"); /* AIRS L2 HDF */
+    else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Along_Swath:mod04",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("Cell_Along_Swath:mod04"); /* MODIS MOD04 L2 */
     else if((rcd=nco_inq_dimid_flg(in_id,"CO_Latitude",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("CO_Latitude");
+    else if((rcd=nco_inq_dimid_flg(in_id,"x",&dmn_id_lat)) == NC_NOERR) lat_nm_in=strdup("x"); /* NSIDC polar stereographic */
     else{
       (void)fprintf(stdout,"%s: ERROR %s reports unable to find latitude dimension in input file. Tried the usual suspects. HINT: Inform regridder of latitude dimension name with --rgr lat_nm=name\n",nco_prg_nm_get(),fnc_nm);
       nco_exit(EXIT_FAILURE);
@@ -1743,19 +1741,20 @@ nco_rgr_map /* [fnc] Regrid with external weights */
     else if((rcd=nco_inq_dimid_flg(in_id,"lon",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("lon");
     else if((rcd=nco_inq_dimid_flg(in_id,"Longitude",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("Longitude");
     else if((rcd=nco_inq_dimid_flg(in_id,"Lon",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("Lon");
-    else if((rcd=nco_inq_dimid_flg(in_id,"west_east",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("west_east");
+    else if((rcd=nco_inq_dimid_flg(in_id,"west_east",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("west_east"); /* WRF */
     else if((rcd=nco_inq_dimid_flg(in_id,"west_east_stag",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("west_east_stag");
-    else if((rcd=nco_inq_dimid_flg(in_id,"XDim:location",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("XDim:location");
-    else if((rcd=nco_inq_dimid_flg(in_id,"XDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("XDim:MOD_Grid_monthly_CMG_VI");
-    else if((rcd=nco_inq_dimid_flg(in_id,"ni",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("ni");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nlon",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nlon");
-    else if((rcd=nco_inq_dimid_flg(in_id,"npix",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("npix");
-    else if((rcd=nco_inq_dimid_flg(in_id,"npixel",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("npixel");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nxtrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nxtrack");
-    else if((rcd=nco_inq_dimid_flg(in_id,"nXtrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nXtrack");
-    else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("GeoXTrack");
-    else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("GeoXTrack:L2_Standard_atmospheric&surface_product");
-    else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Across_Swath:mod04",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("Cell_Across_Swath:mod04");
+    else if((rcd=nco_inq_dimid_flg(in_id,"XDim:location",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("XDim:location"); /* AIRS L3 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"XDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("XDim:MOD_Grid_monthly_CMG_VI"); /* MODIS MOD13C2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"ni",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("ni"); /* CICE RTM */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nlon",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nlon"); /* POP */
+    else if((rcd=nco_inq_dimid_flg(in_id,"npix",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("npix"); /* AMSR */
+    else if((rcd=nco_inq_dimid_flg(in_id,"npixel",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("npixel"); /* TRMM */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nxtrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nxtrack"); /* MODIS DeepBlue SeaWiFS L2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"nXtrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("nXtrack"); /* OMI L2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("GeoXTrack"); /* AIRS L2 DAP NC */
+    else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("GeoXTrack:L2_Standard_atmospheric&surface_product"); /* AIRS L2 HDF */
+    else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Across_Swath:mod04",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("Cell_Across_Swath:mod04"); /* MODIS MOD04 L2 */
+    else if((rcd=nco_inq_dimid_flg(in_id,"y",&dmn_id_lon)) == NC_NOERR) lon_nm_in=strdup("y"); /* NSIDC polar stereographic */
     else{
       (void)fprintf(stdout,"%s: ERROR %s reports unable to find longitude dimension in input file. Tried the usual suspects. HINT: Inform regridder of longitude dimension name with --rgr lon_nm=name\n",nco_prg_nm_get(),fnc_nm);
       nco_exit(EXIT_FAILURE);
@@ -2180,9 +2179,7 @@ nco_rgr_map /* [fnc] Regrid with external weights */
 	  dmn_in_fst=0;
 	  rcd=nco_inq_var_packing(in_id,var_id_in,&flg_pck);
 	  if(flg_pck) (void)fprintf(stdout,"%s: WARNING %s reports variable \"%s\" is packed so results unpredictable. HINT: If regridded values seems weird, retry after unpacking input file with, e.g., \"ncpdq -U in.nc out.nc\"\n",nco_prg_nm_get(),fnc_nm,var_nm);
-	  has_mss_val=nco_mss_val_get_dbl(in_id,var_id_in,&mss_val_dbl);
-	  if(has_mss_val && !isfinite(mss_val_dbl)) (void)fprintf(stdout,"%s: WARNING %s reports variable \"%s\" has %s attribute that fails isfinite() (value is %s) so results are unpredictable. HINT: If regridding fails or values seem weird, retry after converting %s to normal number with, e.g., \"ncatted -a %s,%s,m,f,1.0e36 in.nc out.nc\"\n",nco_prg_nm_get(),fnc_nm,var_nm,nco_mss_val_sng_get(),(isnan(mss_val_dbl)) ? "NaN" : ((isinf(mss_val_dbl)) ? "Infinity" : ""),nco_mss_val_sng_get(),nco_m [...]
-	  if(flg_pck) (void)fprintf(stdout,"%s: WARNING %s reports variable \"%s\" is packed so results unpredictable. HINT: If regridded values seem weird, retry after unpacking input file with, e.g., \"ncpdq -U in.nc out.nc\"\n",nco_prg_nm_get(),fnc_nm,var_nm);
+	  has_mss_val=nco_mss_val_get_dbl(in_id,var_id_in,(double *)NULL);
 	  for(dmn_idx=0;dmn_idx<dmn_nbr_in;dmn_idx++){
 	    rcd=nco_inq_dimname(in_id,dmn_id_in[dmn_idx],dmn_nm);
 	    //dmn_idx_in_out_pre_rgr[dmn_idx]=dmn_idx;
@@ -3650,6 +3647,8 @@ nco_sph_plg_area /* [fnc] Compute area of spherical polygon */
 	 lat_bnd_rdn[idx_c] == lat_bnd_rdn[idx_a]){
 	flg_ltr_cll=flg_ltr_crr=True;
       } /* endif */
+      /* 20170217: Temporarily turn-off latitude circle diagnostics because Sungduk's POP case breaks them */
+      flg_ltr_cll=flg_ltr_crr=False;
       if(flg_ltr_crr){
 	double ngl_ltr_a; /* [rdn] Interior angle/small circle arc a, canonical latitude-triangle geometry */
 	double ngl_ltr_b; /* [rdn] Interior angle/great circle arc b, canonical latitude-triangle geometry */
@@ -3692,8 +3691,10 @@ nco_sph_plg_area /* [fnc] Compute area of spherical polygon */
 	/* Numeric conditioning uncertain. Approaches divide-by-zero when lon_dlt << 1 */
 	xpn_x=lat_bnd_sin[idx_ltr_b]*(1.0-cos(lon_dlt))/sin(lon_dlt);
 	area_crc=2.0*atan(xpn_x);
+	/* 20170217: Sungduk's POP regrid triggers following abort():
+	   ncremap -D 1 -i ~/pop_g16.nc -d ~/cam_f19.nc -o ~/foo.nc */
 	if(xpn_x < 0.0) abort();
-	// if(lat_bnd[idx_ltr_b] > 0.0) area_crc+=-lon_dlt*lat_bnd_sin[idx_ltr_b]; else area_crc+=+lon_dlt*lat_bnd_sin[idx_ltr_b];
+	//if(lat_bnd[idx_ltr_b] > 0.0) area_crc+=-lon_dlt*lat_bnd_sin[idx_ltr_b]; else area_crc+=+lon_dlt*lat_bnd_sin[idx_ltr_b];
 	area_crc+=-lon_dlt*lat_bnd_sin[idx_ltr_b];
 	area_ltr+=area_crc;
 	area_ltr_ttl+=area_crc;
@@ -3722,7 +3723,7 @@ nco_sph_plg_area /* [fnc] Compute area of spherical polygon */
 	  } /* !idx_xpn */
 	  (void)fprintf(stdout,"%s: Latitude-triangle area using series approximation...not implemented yet\n",nco_prg_nm_get());
 	} /* !0 */
-	if(nco_dbg_lvl_get() >= nco_dbg_std){
+	if(nco_dbg_lvl_get() >= nco_dbg_scl){
 	  (void)fprintf(stdout,"%s: INFO %s col_idx = %u triangle %d spherical area, latitude-triangle area, %% difference: %g, %g, %g\n",nco_prg_nm_get(),fnc_nm,col_idx,tri_nbr,xcs_sph,xcs_sph+area_crc,100.0*area_crc/xcs_sph);
 	  if(fabs(area_crc/xcs_sph) > 0.1){
 	    (void)fprintf(stdout,"%s: DBG Non-spherical correction exceeds 10%% for current triangle with ABC vertices at lat,lon [dgr] = %g, %g\n%g, %g\n%g, %g\n",nco_prg_nm_get(),lat_bnd[idx_ltr_a],lon_bnd[idx_ltr_a],lat_bnd[idx_ltr_b],lon_bnd[idx_ltr_b],lat_bnd[idx_ltr_c],lon_bnd[idx_ltr_c]);
@@ -3732,10 +3733,10 @@ nco_sph_plg_area /* [fnc] Compute area of spherical polygon */
     } /* !tri_idx */
     if(flg_ltr_cll){
       /* Current gridcell contained at least one latitude-triangle */
-      (void)fprintf(stdout,"%s: INFO %s col_idx = %u spherical area, latitude-gridcell area, %% difference: %g, %g, %g\n",nco_prg_nm_get(),fnc_nm,col_idx,area[col_idx],area_ltr,100.0*(area_ltr-area[col_idx])/area[col_idx]);
+      if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s col_idx = %u spherical area, latitude-gridcell area, %% difference: %g, %g, %g\n",nco_prg_nm_get(),fnc_nm,col_idx,area[col_idx],area_ltr,100.0*(area_ltr-area[col_idx])/area[col_idx]);
     } /* !flg_ltr_cll */    
   } /* !col_idx */
-  (void)fprintf(stdout,"%s: INFO %s total spherical area, latitude-gridcell area, %% difference, crc_ttl, crc_abs_ttl: %g, %g, %g, %g, %g\n",nco_prg_nm_get(),fnc_nm,area_ttl,area_ltr_ttl,100.0*(area_ltr_ttl-area_ttl)/area_ttl,area_crc_ttl,area_crc_abs_ttl);
+  if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s total spherical area, latitude-gridcell area, %% difference, crc_ttl, crc_abs_ttl: %g, %g, %g, %g, %g\n",nco_prg_nm_get(),fnc_nm,area_ttl,area_ltr_ttl,100.0*(area_ltr_ttl-area_ttl)/area_ttl,area_crc_ttl,area_crc_abs_ttl);
   if(lat_bnd_rdn) lat_bnd_rdn=(double *)nco_free(lat_bnd_rdn);
   if(lon_bnd_rdn) lon_bnd_rdn=(double *)nco_free(lon_bnd_rdn);
   if(lat_bnd_cos) lat_bnd_cos=(double *)nco_free(lat_bnd_cos);
@@ -5253,14 +5254,6 @@ nco_grd_nfr /* [fnc] Infer SCRIP-format grid file from input data file */
   int dmn_id_lat=NC_MIN_INT; /* [id] Dimension ID */
   int dmn_id_lon=NC_MIN_INT; /* [id] Dimension ID */
 
-  /* Locate dimensions that must be present in unstructured files */
-  if((rcd=nco_inq_dimid_flg(in_id,"ncol",&dmn_id_col)) == NC_NOERR) col_dmn_nm=strdup("ncol"); /* CAM */
-  else if((rcd=nco_inq_dimid_flg(in_id,"lndgrid",&dmn_id_col)) == NC_NOERR) col_dmn_nm=strdup("lndgrid"); /* CLM */
-  else if((rcd=nco_inq_dimid_flg(in_id,"nCells",&dmn_id_col)) == NC_NOERR) col_dmn_nm=strdup("nCells"); /* MPAS-O/I */
-  else if((rcd=nco_inq_dimid_flg(in_id,"nEdges",&dmn_id_col)) == NC_NOERR) col_dmn_nm=strdup("nEdges"); /* MPAS-O/I */
-  else if((rcd=nco_inq_dimid_flg(in_id,"sounding_id",&dmn_id_col)) == NC_NOERR) col_dmn_nm=strdup("sounding_id"); /* OCO2 */
-  if(col_dmn_nm) flg_grd_1D=True;
-
   /* Begin CF-coordinates block */
   cf_crd_sct *cf=NULL;
   char *rgr_var; /* [sng] Variable for special regridding treatment */
@@ -5365,12 +5358,12 @@ nco_grd_nfr /* [fnc] Infer SCRIP-format grid file from input data file */
     nco_bool crd1_is_lat=False; /* [flg] Second coordinate is latitude */
     nco_bool crd1_is_lon=False; /* [flg] Second coordinate is longitude */
     if(cf->unt_sng[0]){
-      if(!strcasecmp(cf->unt_sng[0],"degrees_north")) crd0_is_lat=True;
-      if(!strcasecmp(cf->unt_sng[0],"degrees_east")) crd0_is_lon=True;
+      if(!strcasecmp(cf->unt_sng[0],"degrees_north") || !strcasecmp(cf->unt_sng[0],"degree_north") || !strcasecmp(cf->unt_sng[0],"degree_N") || !strcasecmp(cf->unt_sng[0],"degrees_N") || !strcasecmp(cf->unt_sng[0],"degreeN") || !strcasecmp(cf->unt_sng[0],"degreesN")) crd0_is_lat=True;
+      if(!strcasecmp(cf->unt_sng[0],"degrees_east") || !strcasecmp(cf->unt_sng[0],"degree_east") || !strcasecmp(cf->unt_sng[0],"degree_E") || !strcasecmp(cf->unt_sng[0],"degrees_E") || !strcasecmp(cf->unt_sng[0],"degreeE") || !strcasecmp(cf->unt_sng[0],"degreesE")) crd0_is_lon=True;
     } /* endif */      
     if(cf->unt_sng[1]){
-      if(!strcasecmp(cf->unt_sng[1],"degrees_north")) crd1_is_lat=True;
-      if(!strcasecmp(cf->unt_sng[1],"degrees_east")) crd1_is_lon=True;
+      if(!strcasecmp(cf->unt_sng[1],"degrees_north") || !strcasecmp(cf->unt_sng[1],"degree_north") || !strcasecmp(cf->unt_sng[1],"degree_N") || !strcasecmp(cf->unt_sng[1],"degrees_N") || !strcasecmp(cf->unt_sng[1],"degreeN") || !strcasecmp(cf->unt_sng[1],"degreesN")) crd1_is_lat=True;
+      if(!strcasecmp(cf->unt_sng[1],"degrees_east") || !strcasecmp(cf->unt_sng[1],"degree_east") || !strcasecmp(cf->unt_sng[1],"degree_E") || !strcasecmp(cf->unt_sng[1],"degrees_E") || !strcasecmp(cf->unt_sng[1],"degreeE") || !strcasecmp(cf->unt_sng[1],"degreesE")) crd1_is_lon=True;
     } /* endif */      
     assert((crd0_is_lat && crd1_is_lon) || (crd0_is_lon && crd1_is_lat));
     int idx_lat;
@@ -5422,75 +5415,6 @@ nco_grd_nfr /* [fnc] Infer SCRIP-format grid file from input data file */
   rcd=NC_NOERR;
   /* End CF-coordinates block */
   
-  /* Locate dimensions that must be present in rectangular files */
-  if(dmn_id_lat == NC_MIN_INT){
-    if(lat_dmn_nm && (rcd=nco_inq_dimid_flg(in_id,rgr->lat_dmn_nm,&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup(rgr->lat_dmn_nm);
-    else if((rcd=nco_inq_dimid_flg(in_id,"latitude",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("latitude");
-    else if((rcd=nco_inq_dimid_flg(in_id,"lat",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("lat");
-    else if((rcd=nco_inq_dimid_flg(in_id,"Latitude",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("Latitude"); /* HIRDLS */
-    else if((rcd=nco_inq_dimid_flg(in_id,"Lat",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("Lat");
-    else if((rcd=nco_inq_dimid_flg(in_id,"CO_Latitude",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("CO_Latitude"); /* MLS */
-  } /* !dmn_id_lat */
-  
-  if(dmn_id_lon == NC_MIN_INT){
-    if(lon_dmn_nm && (rcd=nco_inq_dimid_flg(in_id,rgr->lon_dmn_nm,&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup(rgr->lon_dmn_nm);
-    else if((rcd=nco_inq_dimid_flg(in_id,"longitude",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("longitude");
-    else if((rcd=nco_inq_dimid_flg(in_id,"lon",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("lon");
-    else if((rcd=nco_inq_dimid_flg(in_id,"Longitude",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("Longitude");
-    else if((rcd=nco_inq_dimid_flg(in_id,"Lon",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("Lon");
-  } /* !dmn_id_lon */
-  
-  /* Try known curvilinear dimension names for latitude and longitude */
-  if(!lat_dmn_nm || !lon_dmn_nm){
-    if(!lat_dmn_nm){
-      if((rcd=nco_inq_dimid_flg(in_id,"south_north",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("south_north"); /* WRF */
-      else if((rcd=nco_inq_dimid_flg(in_id,"YDim:location",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("YDim:location"); /* AIRS L3 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"YDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("YDim:MOD_Grid_monthly_CMG_VI"); /* MODIS MOD13C2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nTimes",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("nTimes"); /* OMI L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("GeoTrack"); /* AIRS L2 DAP NC */
-      else if((rcd=nco_inq_dimid_flg(in_id,"GeoTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("GeoTrack:L2_Standard_atmospheric&surface_product"); /* AIRS L2 HDF */
-      else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Along_Swath:mod04",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("Cell_Along_Swath:mod04"); /* MODIS MOD04 L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"phony_dim_0",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("phony_dim_0"); /* OMI */
-      else if((rcd=nco_inq_dimid_flg(in_id,"y",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("phony_dim_0"); /* MAR */
-      else if((rcd=nco_inq_dimid_flg(in_id,"lat2d",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("phony_dim_0"); /* RACMO */
-      else if((rcd=nco_inq_dimid_flg(in_id,"natrack",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("natrack"); /* MODIS DeepBlue SeaWiFS L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nj",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("nj"); /* CICE RTM */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nlat",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("nlat"); /* POP */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nscan",&dmn_id_lat)) == NC_NOERR) lat_dmn_nm=strdup("nscan"); /* AMSR, TRMM */
-    } /* !lat_dmn_nm */
-    if(!lon_dmn_nm){
-      if((rcd=nco_inq_dimid_flg(in_id,"west_east",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("west_east"); /* WRF */
-      else if((rcd=nco_inq_dimid_flg(in_id,"XDim:location",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("XDim:location"); /* AIRS L3 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"XDim:MOD_Grid_monthly_CMG_VI",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("XDim:MOD_Grid_monthly_CMG_VI"); /* MODIS MOD13C2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nxtrack",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("nxtrack"); /* MODIS DeepBlue SeaWiFS L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nXtrack",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("nXtrack"); /* OMI L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("GeoXTrack"); /* AIRS L2 DAP NC */
-      else if((rcd=nco_inq_dimid_flg(in_id,"GeoXTrack:L2_Standard_atmospheric&surface_product",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("GeoXTrack:L2_Standard_atmospheric&surface_product"); /* AIRS L2 HDF */
-      else if((rcd=nco_inq_dimid_flg(in_id,"Cell_Across_Swath:mod04",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("Cell_Across_Swath:mod04"); /* MODIS MOD04 L2 */
-      else if((rcd=nco_inq_dimid_flg(in_id,"phony_dim_1",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("phony_dim_1"); /* OMI */
-      else if((rcd=nco_inq_dimid_flg(in_id,"x",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("phony_dim_1"); /* MAR */
-      else if((rcd=nco_inq_dimid_flg(in_id,"lon2d",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("phony_dim_1"); /* RACMO */
-      else if((rcd=nco_inq_dimid_flg(in_id,"ni",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("ni"); /* CICE RTM */
-      else if((rcd=nco_inq_dimid_flg(in_id,"nlon",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("nlon"); /* POP */
-      else if((rcd=nco_inq_dimid_flg(in_id,"npix",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("npix"); /* AMSR */
-      else if((rcd=nco_inq_dimid_flg(in_id,"npixel",&dmn_id_lon)) == NC_NOERR) lon_dmn_nm=strdup("npixel"); /* TRMM */
-    } /* !lon_dmn_nm */
-  } /* !lat_dmn_nm */
-
-  if(!(lat_dmn_nm && lon_dmn_nm) && !col_dmn_nm){
-    (void)fprintf(stdout,"%s: ERROR %s unable to identify latitude and/or longitude dimension and/or column dimension.\n",nco_prg_nm_get(),fnc_nm);
-    nco_exit(EXIT_FAILURE);
-  } /* !col_dmn_nm !lat_dmn_nm !lon_dmn_nm */
-    
-  /* Locate spatial dimensions that may be present
-     NB: bounds dimensions may present a special problem
-     CAM-FV and CAM-SE use nbnd for temporal bounds and have no spatial bounds dimension
-     CAM3 uses tbnd for temporal bounds and has no spatial bounds dimension
-     CICE and POP use d2 for temporal bounds, and CICE uses nvertices for spatial bounds while POP uses nothing
-     Hence search for nvertices before nbnd to ensure spatial bound is found first */
-  if((rcd=nco_inq_dimid_flg(in_id,"nv",&dmn_id_bnd)) == NC_NOERR) bnd_dmn_nm=strdup("nv"); /* fxm */
-  else if((rcd=nco_inq_dimid_flg(in_id,"nvertices",&dmn_id_bnd)) == NC_NOERR) bnd_dmn_nm=strdup("nvertices"); /* CICE */
-  
   /* Locate fields that must be present in input file
      Currently these variables must be in root group
      This fails for, e.g., OMI L2 which has coordinates /GEOLOCATION_DATA/[Latitude,Longitude]
@@ -5535,21 +5459,22 @@ nco_grd_nfr /* [fnc] Infer SCRIP-format grid file from input data file */
     nco_exit(EXIT_FAILURE);
   } /* !lat_nm_in */
     
-  /* Use dimension IDs to get dimension sizes and grid size */
-  if(flg_grd_1D){
-    rcd+=nco_inq_dimlen(in_id,dmn_id_col,&col_nbr);
-    lat_nbr=lon_nbr=col_nbr;
-  }else{
-    rcd+=nco_inq_dimlen(in_id,dmn_id_lat,&lat_nbr);
-    rcd+=nco_inq_dimlen(in_id,dmn_id_lon,&lon_nbr);
-    col_nbr=NC_MIN_INT;
-  } /* !flg_grd_1D */
-  if(dmn_id_bnd != NC_MIN_INT) rcd+=nco_inq_dimlen(in_id,dmn_id_bnd,&grd_crn_nbr);
-  if(dmn_id_bnd != NC_MIN_INT) rcd+=nco_inq_dimlen(in_id,dmn_id_bnd,&bnd_nbr);
-  
   /* Rank of coordinates determines whether grid is curvilinear */
   rcd+=nco_inq_varndims(in_id,lat_ctr_id,&lat_rnk);
   rcd+=nco_inq_varndims(in_id,lon_ctr_id,&lon_rnk);
+  /* If lat_ctr and lon_ctr share same and only dimension then grid is unstructured */
+  if(lat_rnk*lon_rnk == 1){
+    rcd+=nco_inq_vardimid(in_id,lat_ctr_id,&dmn_id_lat);
+    rcd+=nco_inq_vardimid(in_id,lon_ctr_id,&dmn_id_lon);
+    if(dmn_id_lat == dmn_id_lon){
+      dmn_id_col=dmn_id_lat;
+      dmn_id_lat=NC_MIN_INT;
+      dmn_id_lon=NC_MIN_INT;
+      rcd+=nco_inq_dimname(in_id,dmn_id_col,dmn_nm);
+      col_dmn_nm=(char *)strdup(dmn_nm);
+      flg_grd_1D=True;
+    } /* !unstructured */
+  } /* lat_rnk == lon_rnk == 1 */
   if(lat_rnk*lon_rnk == 1 && dmn_id_lat != NC_MIN_INT && dmn_id_lon != NC_MIN_INT){
     flg_grd_crv=False;
     flg_grd_2D=True;
@@ -5563,6 +5488,51 @@ nco_grd_nfr /* [fnc] Infer SCRIP-format grid file from input data file */
     nco_exit(EXIT_FAILURE);
   } /* !3D */
   if(lat_rnk*lon_rnk != 1 && lat_rnk*lon_rnk != 4) assert(False);
+
+  /* Scrutinize coordinates for their dimensions
+     NB: Unstructure already known */
+  if(flg_grd_2D){
+    rcd+=nco_inq_dimname(in_id,dmn_id_lat,dmn_nm);
+    lat_dmn_nm=(char *)strdup(dmn_nm);
+    rcd+=nco_inq_dimname(in_id,dmn_id_lon,dmn_nm);
+    lon_dmn_nm=(char *)strdup(dmn_nm);
+  } /* !flg_grd_2D */
+  if(flg_grd_crv){
+    rcd+=nco_inq_vardimid(in_id,lat_ctr_id,dmn_ids);
+    /* fxm: use cf struct and match with units name, if any? normally curvilinear grid dimensions are just pixel dimensions that are not aligned north-south or east-west */
+    dmn_id_lat=dmn_ids[0];
+    dmn_id_lon=dmn_ids[1];
+    rcd+=nco_inq_dimname(in_id,dmn_id_lat,dmn_nm);
+    lat_dmn_nm=(char *)strdup(dmn_nm);
+    rcd+=nco_inq_dimname(in_id,dmn_id_lon,dmn_nm);
+    lon_dmn_nm=(char *)strdup(dmn_nm);
+  } /* !flg_grd_crv */
+  
+  if(!(lat_dmn_nm && lon_dmn_nm) && !col_dmn_nm){
+    (void)fprintf(stdout,"%s: ERROR %s unable to identify latitude and/or longitude dimension and/or column dimension.\n",nco_prg_nm_get(),fnc_nm);
+    nco_exit(EXIT_FAILURE);
+  } /* !col_dmn_nm !lat_dmn_nm !lon_dmn_nm */
+    
+  /* Locate spatial dimensions that may be present
+     NB: bounds dimensions may present a special problem
+     CAM-FV and CAM-SE use nbnd for temporal bounds and have no spatial bounds dimension
+     CAM3 uses tbnd for temporal bounds and has no spatial bounds dimension
+     CICE and POP use d2 for temporal bounds, and CICE uses nvertices for spatial bounds while POP uses nothing
+     Hence search for nvertices before nbnd to ensure spatial bound is found first */
+  if((rcd=nco_inq_dimid_flg(in_id,"nv",&dmn_id_bnd)) == NC_NOERR) bnd_dmn_nm=strdup("nv"); /* fxm */
+  else if((rcd=nco_inq_dimid_flg(in_id,"nvertices",&dmn_id_bnd)) == NC_NOERR) bnd_dmn_nm=strdup("nvertices"); /* CICE */
+  
+  /* Use dimension IDs to get dimension sizes and grid size */
+  if(flg_grd_1D){
+    rcd+=nco_inq_dimlen(in_id,dmn_id_col,&col_nbr);
+    lat_nbr=lon_nbr=col_nbr;
+  }else{
+    rcd+=nco_inq_dimlen(in_id,dmn_id_lat,&lat_nbr);
+    rcd+=nco_inq_dimlen(in_id,dmn_id_lon,&lon_nbr);
+    col_nbr=NC_MIN_INT;
+  } /* !flg_grd_1D */
+  if(dmn_id_bnd != NC_MIN_INT) rcd+=nco_inq_dimlen(in_id,dmn_id_bnd,&grd_crn_nbr);
+  if(dmn_id_bnd != NC_MIN_INT) rcd+=nco_inq_dimlen(in_id,dmn_id_bnd,&bnd_nbr);
   
   if(flg_grd_1D){
     /* Unstructured grid (e.g., CAM-SE) */
diff --git a/src/nco/nco_sld.c b/src/nco/nco_sld.c
index b0ca24c..c659913 100644
--- a/src/nco/nco_sld.c
+++ b/src/nco/nco_sld.c
@@ -65,11 +65,7 @@ nco_trr_ini /* [fnc] Initialize Terraref structure */
 
   if(sng_fnl) sng_fnl=(char *)nco_free(sng_fnl);
 
-  /* jm fxm use more descriptive name than i---what does i count? */
-  for(int index=0;(trr_lst+index)->key;index++){
-      trr_var_nbr=index;
-  } /* end loop over i */
-  trr_var_nbr++;
+  for(int index=0;(trr_lst+index)->key;index++, trr_var_nbr++);
   
   /* NULL-initialize key-value properties required for string variables */
   trr->ttl=NULL; /* [sng] Title */
diff --git a/src/nco/nco_sng_utl.c b/src/nco/nco_sng_utl.c
index 1465138..c819319 100644
--- a/src/nco/nco_sng_utl.c
+++ b/src/nco/nco_sng_utl.c
@@ -622,6 +622,9 @@ sng_ascii_trn /* [fnc] Replace C language '\X' escape codes in string with ASCII
       (void)fprintf(stderr,"%s: WARNING C language escape code %.2s found in string, not translating to NUL since this would make the subsequent portion of the string invisible to all C Standard Library string functions\n",nco_prg_nm_get(),backslash_ptr); 
       trn_flg=False;
       /* 20101013: Tried changing above behavior to following, and it opened a Hornet's nest of problems... */
+      /* 20170221: Use-case where translating "\0" to NUL would be helpful is when user needs to pad netCDF3 character
+	 array value to size of underlying dimension, and have user-specified value NUL-terminated short of full 
+	 dimension size */
       /* *backslash_ptr='\0'; *//* 000   0     00    NUL '\0' */
       /*      (void)fprintf(stderr,"%s: WARNING translating C language escape code \"\\0\" found in user-supplied string to NUL. This will make the subsequent portion of the string, if any, invisible to C Standard Library string functions. And that may cause unintended consequences.\n",nco_prg_nm_get());*/
       break;
@@ -632,7 +635,7 @@ sng_ascii_trn /* [fnc] Replace C language '\X' escape codes in string with ASCII
     } /* end switch */
     if(trn_flg){
       /* Remove character after backslash character */
-      (void)memmove(backslash_ptr+1,backslash_ptr+2,(strlen(backslash_ptr+2)+1)*sizeof(char));
+      (void)memmove(backslash_ptr+1,backslash_ptr+2,(strlen(backslash_ptr+2)+1L)*sizeof(char));
       /* Count translations performed */
       trn_nbr++;
     } /* end if */
diff --git a/src/nco/nco_sng_utl.h b/src/nco/nco_sng_utl.h
index a9fdae5..00fab35 100644
--- a/src/nco/nco_sng_utl.h
+++ b/src/nco/nco_sng_utl.h
@@ -25,6 +25,7 @@
 #endif /* !HAVE_STRINGS_H */
 
 #ifdef _MSC_VER
+# define NEED_STRSEP
 # define NEED_STRCASECMP
 # define NEED_STRCASESTR
 #endif /* !_MSC_VER */
diff --git a/src/nco/ncpdq.c b/src/nco/ncpdq.c
index f1d5848..432ba13 100644
--- a/src/nco/ncpdq.c
+++ b/src/nco/ncpdq.c
@@ -202,7 +202,7 @@ main(int argc,char **argv)
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   nco_bool flg_dmn_prc_usr_spc=False; /* [flg] Processed dimensions specified on command line */
 
   size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */
@@ -240,7 +240,6 @@ main(int argc,char **argv)
     {"formula_terms",no_argument,0,0}, /* [flg] Extract formula_terms variables */
     {"no_frm_trm",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
     {"no_formula_terms",no_argument,0,0}, /* [flg] Do not extract formula_terms variables */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -249,6 +248,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"mrd",no_argument,0,0}, /* [enm] Multiple Record Dimension convention */
     {"multiple_record_dimension",no_argument,0,0}, /* [enm] Multiple Record Dimension convention */
     {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
@@ -271,6 +272,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -341,8 +344,6 @@ main(int argc,char **argv)
     {"auxiliary",required_argument,0,'X'},
     {"exclude",no_argument,0,'x'},
     {"xcl",no_argument,0,'x'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -385,6 +386,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -412,8 +417,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_cll_msr") || !strcmp(opt_crr,"no_cell_measures")) EXTRACT_CLL_MSR=False; /* [flg] Do not extract cell_measures variables */
       if(!strcmp(opt_crr,"frm_trm") || !strcmp(opt_crr,"formula_terms")) EXTRACT_FRM_TRM=True; /* [flg] Extract formula_terms variables */
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
@@ -425,12 +430,16 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
+      if(!strcmp(opt_crr,"mrd") || !strcmp(opt_crr,"multiple_record_dimension")) nco_mrd_cnv=nco_mrd_allow; /* [enm] Multiple Record Dimension convention */
+      if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
       if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){
         ppc_arg[ppc_nbr]=(char *)strdup(optarg);
         ppc_nbr++;
       } /* endif "ppc" */
-      if(!strcmp(opt_crr,"mrd") || !strcmp(opt_crr,"multiple_record_dimension")) nco_mrd_cnv=nco_mrd_allow; /* [enm] Multiple Record Dimension convention */
-      if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */
       if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */
       if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */
       if(!strcmp(opt_crr,"unn") || !strcmp(opt_crr,"union")) GRP_VAR_UNN=True;
@@ -560,9 +569,10 @@ main(int argc,char **argv)
     case 'x': /* Exclude rather than extract variables specified with -v */
       EXCLUDE_INPUT_LIST=True;
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -577,6 +587,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   /* Set re-order flag */
   if(dmn_rdr_nbr > 0) IS_REORDER=True; 
 
@@ -941,7 +954,7 @@ main(int argc,char **argv)
   (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncpdq-specific memory cleanup */
     if(dmn_rdr_nbr > 0){
       if(dmn_rdr_nbr_in > 0) dmn_rdr_lst_in=nco_sng_lst_free(dmn_rdr_lst_in,dmn_rdr_nbr_in);
@@ -1000,7 +1013,7 @@ main(int argc,char **argv)
     for(idx=0;idx<lmt_nbr;idx++) flg_dne[idx].dim_nm=(char *)nco_free(flg_dne[idx].dim_nm);
     if(flg_dne) flg_dne=(nco_dmn_dne_t *)nco_free(flg_dne);
     if(gpe) gpe=(gpe_sct *)nco_gpe_free(gpe);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncra.c b/src/nco/ncra.c
index 102861e..6d2e30c 100644
--- a/src/nco/ncra.c
+++ b/src/nco/ncra.c
@@ -266,7 +266,7 @@ main(int argc,char **argv)
   nco_bool flg_cll_mth=True; /* [flg] Add/modify cell_methods attributes */
   nco_bool flg_cb=False; /* [flg] Climatology bounds */
   nco_bool flg_c2b=False; /* [flg] Climatology bounds-to-time bounds */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   nco_bool flg_skp1; /* [flg] Current record is not dimension of this variable */
   nco_bool flg_skp2; /* [flg] Current record is not dimension of this variable */
 
@@ -331,7 +331,6 @@ main(int argc,char **argv)
     {"cb",no_argument,0,0}, /* [sct] Climatology bounds */
     {"clm2bnd",no_argument,0,0}, /* [sct] Climatology bounds-to-time bounds */
     {"c2b",no_argument,0,0}, /* [sct] Climatology bounds-to-time bounds */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -344,6 +343,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"md5_dgs",no_argument,0,0}, /* [flg] Perform MD5 digests */
     {"md5_digest",no_argument,0,0}, /* [flg] Perform MD5 digests */
     {"mro",no_argument,0,0}, /* [flg] Multi-Record Output */
@@ -368,6 +369,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -440,8 +443,6 @@ main(int argc,char **argv)
     {"math",required_argument,0,'y'},
     {"operation",required_argument,0,'y'},
     {"op_typ",required_argument,0,'y'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -492,6 +493,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -521,8 +526,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
       if(!strcmp(opt_crr,"cll_mth") || !strcmp(opt_crr,"cell_methods")) flg_cll_mth=True; /* [flg] Add/modify cell_methods attributes */
       if(!strcmp(opt_crr,"no_cll_mth") || !strcmp(opt_crr,"no_cell_methods")) flg_cll_mth=False; /* [flg] Add/modify cell_methods attributes */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"clm_bnd") || !strcmp(opt_crr,"cb")) flg_cb=True; /* [sct] Climatology bounds */
       if(!strcmp(opt_crr,"clm2bnd") || !strcmp(opt_crr,"c2b")) flg_c2b=flg_cb=True; /* [sct] Climatology bounds-to-time bounds */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
@@ -538,6 +543,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"md5_dgs") || !strcmp(opt_crr,"md5_digest")){
         if(!md5) md5=nco_md5_ini();
         md5->dgs=True;
@@ -717,9 +726,10 @@ main(int argc,char **argv)
       nco_op_typ_sng=(char *)strdup(optarg);
       if(nco_prg_id == ncra || nco_prg_id == ncfe) nco_op_typ=nco_op_typ_get(nco_op_typ_sng);
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -734,6 +744,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   /* Process positional arguments and fill in filenames */
   fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN);
 
@@ -1796,7 +1809,7 @@ main(int argc,char **argv)
   (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* NCO-generic clean-up */
     /* Free individual strings/arrays */
     if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln);
@@ -1854,7 +1867,7 @@ main(int argc,char **argv)
     if(rec_usd_cml) rec_usd_cml=(long *)nco_free(rec_usd_cml);
     if(REC_LST_DSR) REC_LST_DSR=(nco_bool *)nco_free(REC_LST_DSR);
 
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncrename.c b/src/nco/ncrename.c
index 05ed2c4..ae0cf6a 100644
--- a/src/nco/ncrename.c
+++ b/src/nco/ncrename.c
@@ -147,7 +147,7 @@ main(int argc,char **argv)
   nco_bool FL_OUT_NEW=False;
   nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */
   nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */
-  nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
 
   rnm_sct *var_rnm_lst=NULL_CEWI;
   rnm_sct *dmn_rnm_lst=NULL_CEWI;
@@ -169,8 +169,7 @@ main(int argc,char **argv)
   static struct option opt_lng[] =
   { /* Structure ordered by short option key if possible */
     /* Long options with no argument, no short option counterpart */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
-    {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
+        {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
     {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -245,8 +244,8 @@ main(int argc,char **argv)
         bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){
         gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *));
         gaa_arg[gaa_nbr++]=(char *)strdup(optarg);
@@ -646,7 +645,7 @@ main(int argc,char **argv)
   if(FL_RTR_RMT_LCN && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncrename-specific memory */
     for(int idx=0;idx<nbr_att_rnm;idx++) att_rnm_arg[idx]=(char *)nco_free(att_rnm_arg[idx]);
     for(int idx=0;idx<nbr_dmn_rnm;idx++) dmn_rnm_arg[idx]=(char *)nco_free(dmn_rnm_arg[idx]);
@@ -671,7 +670,7 @@ main(int argc,char **argv)
     if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr);
     if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr);
     (void)trv_tbl_free(trv_tbl);
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
 #ifdef ENABLE_MPI
   MPI_Finalize();
diff --git a/src/nco/ncwa.c b/src/nco/ncwa.c
index 67ca775..0419f6a 100644
--- a/src/nco/ncwa.c
+++ b/src/nco/ncwa.c
@@ -216,7 +216,7 @@ main(int argc,char **argv)
   nco_bool WGT_MSK_CRD_VAR=True; /* [flg] Weight and/or mask coordinate variables */
   nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */
   nco_bool flg_cll_mth=True; /* [flg] Add/modify cell_methods attributes */
-  nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */
+  nco_bool flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
   nco_bool flg_dmn_prc_usr_spc=False; /* [flg] Processed dimensions specified on command line */
   nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */
   nco_bool flg_rdd=False; /* [flg] Retain degenerate dimensions */
@@ -267,7 +267,6 @@ main(int argc,char **argv)
     {"cell_methods",no_argument,0,0}, /* [flg] Add/modify cell_methods attributes */
     {"no_cll_mth",no_argument,0,0}, /* [flg] Do not add/modify cell_methods attributes */
     {"no_cell_methods",no_argument,0,0}, /* [flg] Do not add/modify cell_methods attributes */
-    {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */
     {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */
@@ -282,6 +281,8 @@ main(int argc,char **argv)
     {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */
     {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
     {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */
+    {"help",no_argument,0,0},
+    {"hlp",no_argument,0,0},
     {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */
     {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */
     {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */
@@ -296,6 +297,8 @@ main(int argc,char **argv)
     {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */
     {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */
     {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */
+    {"cnk_csh",required_argument,0,0}, /* [B] Chunk cache size in bytes */
+    {"chunk_cache",required_argument,0,0}, /* [B] Chunk cache size in bytes */
     {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */
     {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */
     {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */
@@ -378,8 +381,6 @@ main(int argc,char **argv)
     {"wgt_var",no_argument,0,'w'},
     {"operation",required_argument,0,'y'},
     {"op_typ",required_argument,0,'y'},
-    {"help",no_argument,0,'?'},
-    {"hlp",no_argument,0,'?'},
     {0,0,0,0}
   }; /* end opt_lng */
   int opt_idx=0; /* Index of current long option into opt_lng array */
@@ -422,6 +423,10 @@ main(int argc,char **argv)
         cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif cnk_byt */
+      if(!strcmp(opt_crr,"cnk_csh") || !strcmp(opt_crr,"chunk_cache")){
+        cnk_csh_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
+        if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
+      } /* endif cnk_csh_byt */
       if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){
         cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
@@ -451,8 +456,8 @@ main(int argc,char **argv)
       if(!strcmp(opt_crr,"no_frm_trm") || !strcmp(opt_crr,"no_formula_terms")) EXTRACT_FRM_TRM=False; /* [flg] Do not extract formula_terms variables */
       if(!strcmp(opt_crr,"cll_mth") || !strcmp(opt_crr,"cell_methods")) flg_cll_mth=True; /* [flg] Add/modify cell_methods attributes */
       if(!strcmp(opt_crr,"no_cll_mth") || !strcmp(opt_crr,"no_cell_methods")) flg_cll_mth=False; /* [flg] Add/modify cell_methods attributes */
-      if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */
-      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_mmr_cln=True; /* [flg] Clean memory prior to exit */
+      if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_mmr_cln=False; /* [flg] Clean memory prior to exit */
       if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */
       if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt);
       if(!strcmp(opt_crr,"dbl") || !strcmp(opt_crr,"rth_dbl")) nco_rth_cnv=nco_rth_flt_dbl; /* [flg] Arithmetic convention: promote float to double */
@@ -467,6 +472,10 @@ main(int argc,char **argv)
         hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10);
         if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd);
       } /* endif "hdr_pad" */
+      if(!strcmp(opt_crr,"help") || !strcmp(opt_crr,"hlp")){
+	(void)nco_usg_prn();
+	nco_exit(EXIT_SUCCESS);
+      } /* endif "help" */
       if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){
         ppc_arg[ppc_nbr]=(char *)strdup(optarg);
         ppc_nbr++;
@@ -629,9 +638,10 @@ main(int argc,char **argv)
       nco_op_typ_sng=(char *)strdup(optarg);
       nco_op_typ=nco_op_typ_get(nco_op_typ_sng);
       break;
-    case '?': /* Print proper usage */
+    case '?': /* Question mark means unrecognized option, print proper usage then EXIT_FAILURE */
+      (void)fprintf(stdout,"%s: ERROR in command-line syntax/options. Missing or unrecognized option. Please reformulate command accordingly.\n",nco_prg_nm_get());
       (void)nco_usg_prn();
-      nco_exit(EXIT_SUCCESS);
+      nco_exit(EXIT_FAILURE);
       break;
     case '-': /* Long options are not allowed */
       (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get());
@@ -646,6 +656,9 @@ main(int argc,char **argv)
     if(opt_crr) opt_crr=(char *)nco_free(opt_crr);
   } /* end while loop */
 
+  /* Set/report global chunk cache */
+  rcd+=nco_cnk_csh_ini(cnk_csh_byt);
+
   /* Initialize traversal table */ 
   trv_tbl_init(&trv_tbl);
 
@@ -1219,7 +1232,7 @@ main(int argc,char **argv)
   (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id);
 
   /* Clean memory unless dirty memory allowed */
-  if(flg_cln){
+  if(flg_mmr_cln){
     /* ncwa-specific memory */
     if(dmn_avg_nbr > 0) dmn_avg=(dmn_sct **)nco_free(dmn_avg);
     if(msk_nm) msk_nm=(char *)nco_free(msk_nm);
@@ -1265,7 +1278,7 @@ main(int argc,char **argv)
     if(flg_dne) flg_dne=(nco_dmn_dne_t *)nco_free(flg_dne);
     /* Free traversal table */
     trv_tbl_free(trv_tbl); 
-  } /* !flg_cln */
+  } /* !flg_mmr_cln */
 
   /* End timer */ 
   ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/nco.git



More information about the Pkg-grass-devel mailing list