Index: trunk/Ohana/src/opihi/cmd.data/box.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/box.c	(revision 41363)
+++ trunk/Ohana/src/opihi/cmd.data/box.c	(revision 41379)
@@ -171,4 +171,33 @@
   }
 
+  if ((N = get_argument (argc, argv, "-dmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXm = atof(argv[N]);
+    graphmode.dMajorXp = atof(argv[N]);
+    graphmode.dMajorYm = atof(argv[N]);
+    graphmode.dMajorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-xdmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+xdmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-ydmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorYm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+ydmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
   if ((N = get_argument (argc, argv, "-flabel"))) {
     remove_argument (N, &argc, argv);
@@ -257,8 +286,9 @@
   gprint (GP_ERR, "    +y refers to the right y-axis, \n");
   gprint (GP_ERR, "  \n");
-  gprint (GP_ERR, "  -ticks [NNNN]  : turn on (1), off (0), or use default for ticks\n");
-  gprint (GP_ERR, "  -labels [NNNN] : turn on (1), off (0), or use default for label\n");
-  gprint (GP_ERR, "  -axis [NNNN]   : turn on (1), off (0), or use default for axis\n");
+  gprint (GP_ERR, "  -ticks [NNNN]  : turn on (1), off (0), or use default (2) for ticks\n");
+  gprint (GP_ERR, "  -labels [NNNN] : turn on (1), off (0), or use default (2) for label\n");
+  gprint (GP_ERR, "  -axis [NNNN]   : turn on (1), off (0), or use default (2) for axis\n");
   gprint (GP_ERR, "    the order for the NNNN values in the above options is: -x, -y, +x, +y\n");
+  gprint (GP_ERR, "    for ticks, 1, 2, 3 give fewer values (larger tick spacing)\n");
   gprint (GP_ERR, "  \n");
   gprint (GP_ERR, "  -tickpad : set the spacing between the ticks and the tick text \n");
@@ -274,4 +304,8 @@
   gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
   gprint (GP_ERR, "        -xfminor, -yfminor, +xfminor, +yfminor\n");
+  gprint (GP_ERR, "  \n");
+  gprint (GP_ERR, "  -dmajor : set the major tixk spacing (all axes)\n");
+  gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
+  gprint (GP_ERR, "        -xdmajor, -ydmajor, +xdmajor, +ydmajor\n");
   gprint (GP_ERR, "  \n");
   gprint (GP_ERR, "  -flabel : set the fraction of axis over which major ticks have labels (all axes)\n");
Index: trunk/Ohana/src/opihi/cmd.data/list_header.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/list_header.c	(revision 41363)
+++ trunk/Ohana/src/opihi/cmd.data/list_header.c	(revision 41379)
@@ -1,3 +1,5 @@
 # include "data.h"
+
+# define SKIP_HEADER(NAME) { if (!strncmp(line, NAME, strlen(NAME))) continue; }
 
 int header (int argc, char **argv) {
@@ -16,11 +18,69 @@
     LOADHEAD = TRUE;
   }
+  if ((N = get_argument (argc, argv, "-file"))) {
+    remove_argument (N, &argc, argv);
+    strcpy (filename, argv[N]);
+    remove_argument (N, &argc, argv);
+    LOADHEAD = TRUE;
+  }
+
+  char *COPYHEAD = NULL;
+  if ((N = get_argument (argc, argv, "-copy"))) {
+    if (LOADHEAD) {
+      gprint (GP_ERR, "-copy and -w are incompatible\n");
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+    COPYHEAD = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
 
   if (argc != 2) {
-    gprint (GP_ERR, "USAGE: header <buffer> [-w filename]\n");
+    gprint (GP_ERR, "USAGE: header <buffer> [-w filename] [-file filename] [-copy buffer]\n");
+    gprint (GP_ERR, "  -file / -w : replace buffer header with contents from file (PHU only)\n");
+    gprint (GP_ERR, "  -copy : replace buffer header with contents of buffer\n");
     return (FALSE);
   }
 
   if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+
+  if (COPYHEAD) {
+    Buffer *src = NULL;
+    if ((src = SelectBuffer (COPYHEAD, OLDBUFFER, TRUE)) == NULL) return (FALSE);
+
+    // loop over all lines in the header and copy one-by-one
+    // skip the special words:
+    
+    for (int i = 0; TRUE; i++) {
+      char *line = gfits_header_lineno (&src[0].header, i);
+      if (!line) break;
+
+      // skip special keywords
+      SKIP_HEADER ("SIMPLE");
+      SKIP_HEADER ("SIMPLE");
+      SKIP_HEADER ("BITPIX");
+      SKIP_HEADER ("NAXIS");
+      SKIP_HEADER ("EXTEND");
+      SKIP_HEADER ("UNSIGN");
+      SKIP_HEADER ("BSCALE");
+      SKIP_HEADER ("BZERO");
+      SKIP_HEADER ("NAXIS1");
+      SKIP_HEADER ("NAXIS2");
+      SKIP_HEADER ("NAXIS3");
+      SKIP_HEADER ("NAXIS4");
+      SKIP_HEADER ("NAXIS5");
+      SKIP_HEADER ("NAXIS6");
+      SKIP_HEADER ("NAXIS7");
+      SKIP_HEADER ("NAXIS8");
+      SKIP_HEADER ("NAXIS9");
+      SKIP_HEADER ("NAXIS10");
+      SKIP_HEADER ("PCOUNT");
+      SKIP_HEADER ("GCOUNT");
+
+      gfits_header_append_line_raw (&buf[0].header, line);
+    }
+    return TRUE;
+
+  }
 
   if (LOADHEAD) {
