diff --git a/data-access/engine/src/vlkb/src/ast.cpp b/data-access/engine/src/vlkb/src/ast.cpp
index 60c05835e7f6730500b6d3a2b406afedab857c3a..578a35101ebc1970c7876eb3b7b827c9cb073b22 100644
--- a/data-access/engine/src/vlkb/src/ast.cpp
+++ b/data-access/engine/src/vlkb/src/ast.cpp
@@ -35,7 +35,7 @@ int vlkb_skyvertices(const string& pathname, const string& skysys_str)
 
    int maxHdu = 1;// FIXMEINT_MAX; // read all HDU's
 
-   std::vector<fitsfiles::Hdu> allHdus = 
+   std::vector<fitsfiles::Hdu> allHdus =
       fitsfiles::fname2hdrstr(pathname, maxHdu);
 
    for(unsigned int i=0; i<allHdus.size(); i++)
@@ -67,7 +67,7 @@ int vlkb_listbounds(const string& skysys_str, const string& specsys_str, const s
 
    int maxHdu = 1;//FIXME INT_MAX; // read all HDU's
 
-   std::vector<fitsfiles::Hdu> allHdus = 
+   std::vector<fitsfiles::Hdu> allHdus =
       fitsfiles::fname2hdrstr(pathname, maxHdu);
 
    for(unsigned int i=0; i<allHdus.size(); i++)
@@ -88,7 +88,7 @@ int vlkb_listbounds(const string& skysys_str, const string& specsys_str, const s
 
 
 //---------------------------------------------------------------------
-// header modif coord sys
+// header backup and modif
 //---------------------------------------------------------------------
 /*
 const string VELOLSRK{"System=VELO,StdOfRest=LSRK,Unit=km/s"};
@@ -102,6 +102,33 @@ void write_previous(string header, string filename)
 }
 
 
+int header_backup(const string& pathname, bool backup)
+{
+   LOG_trace(__func__);
+
+   int maxHdu = 1;//FIXME INT_MAX; // read all HDU's
+
+   std::vector<fitsfiles::Hdu> allHdus =
+      fitsfiles::fname2hdrstr(pathname, maxHdu);
+
+   for(unsigned int i=0; i<allHdus.size(); i++)
+   {
+      cerr << "HDU#" << i << endl;
+
+      fitsfiles::Hdu hd = allHdus.at(i);
+
+      if(backup)
+         write_previous(hd.m_header, pathname +"hdr" + ((i>0) ? "#" + to_string(i+1)  : "") );
+      else
+         cout << hd.m_header << endl;
+
+      // FIXME remove all explicit cout cerr to main.cpp and here use ostream&
+
+   }
+
+   return 0;
+}
+
 
 int header_modif_coordsys(const string& skysys_str, const string& specsys_str, const string& pathname)
 {
@@ -109,7 +136,7 @@ int header_modif_coordsys(const string& skysys_str, const string& specsys_str, c
 
    int maxHdu = 1;//FIXME INT_MAX; // read all HDU's
 
-   std::vector<fitsfiles::Hdu> allHdus = 
+   std::vector<fitsfiles::Hdu> allHdus =
       fitsfiles::fname2hdrstr(pathname, maxHdu);
 
    for(unsigned int i=0; i<allHdus.size(); i++)
@@ -132,6 +159,8 @@ int header_modif_coordsys(const string& skysys_str, const string& specsys_str, c
 }
 
 
+
+
 //---------------------------------------------------------------------
 // overlap with area given in query-string form (name=value&...)
 //---------------------------------------------------------------------
@@ -171,7 +200,7 @@ int vlkb_overlap(const string& pathname, const string& region, vector<uint_bound
 
    int maxHdu = 1;// INT_MAX; FIXME fitsfiles::header throws error reading behind end-of-file due to INT_MAX 
 
-   std::vector<fitsfiles::Hdu> allHdus = 
+   std::vector<fitsfiles::Hdu> allHdus =
       fitsfiles::fname2hdrstr(pathname, maxHdu);
 
    const coordinates coord = parse_coordinates(region.c_str());
diff --git a/data-access/engine/src/vlkb/src/ast.hpp b/data-access/engine/src/vlkb/src/ast.hpp
index 38683d62c92b672144f4a9ebf6ee8d1608125305..c6f417bccc403370353613f2818c428bfc270c90 100644
--- a/data-access/engine/src/vlkb/src/ast.hpp
+++ b/data-access/engine/src/vlkb/src/ast.hpp
@@ -8,6 +8,7 @@
 
 int vlkb_skyvertices(const std::string& pathname, const std::string& skysys_str);
 int vlkb_listbounds(const std::string& skysys_str, const std::string& specsys_str, const std::string& pathname);
+int header_backup(const std::string& pathname, bool backup = false);
 int header_modif_coordsys(const std::string& skysys_str, const std::string& specsys_str, const std::string& pathname);
 int vlkb_overlap(const std::string& pathname, const std::string& region, std::vector<uint_bounds>& bnds);
 
diff --git a/data-access/engine/src/vlkb/src/main.cpp b/data-access/engine/src/vlkb/src/main.cpp
index 741b14edd2c2c9797d8d0383658cd615bb828151..cf0c17ce1065fdc9ab7109aecd19bdf81a42e539 100644
--- a/data-access/engine/src/vlkb/src/main.cpp
+++ b/data-access/engine/src/vlkb/src/main.cpp
@@ -43,7 +43,7 @@ namespace vlkb
          << "Usage: " << progname << " <command> [cmd-options] [cmd-args]" << endl
          << "\n where commands are:\n "
          << "\n\t cutout imcopy cutpixels multicutout mergefiles\n"
-         << "\n\t listbounds header skyvertices overlap\n"
+         << "\n\t listbounds header headermodif skyvertices overlap\n"
          << "\n\t nullvals dropdegen checkcard addcard modcard rawdelcard\n"
          << std::endl
          << "Version: " << VERSIONSTR << " " << BUILD << std::endl;
@@ -55,7 +55,7 @@ namespace vlkb
 
    enum cmd_set {
       multicutout, mergefiles, cutout, imcopy, cutpixels,
-      listbounds, header, overlap, skyvertices, nullvals, dropdegen, checkcard, addcard, modcard, rawdelcard};
+      listbounds, header, headermodif, overlap, skyvertices, nullvals, dropdegen, checkcard, addcard, modcard, rawdelcard};
 
 
    // from bash or interpreters usually receive params as strings
@@ -64,19 +64,20 @@ namespace vlkb
    {
       cmd_set cmd;
 
-      if(cmdstr.compare("multicutout") == 0)  cmd = multicutout;
+      if(cmdstr.compare("multicutout") == 0)       cmd = multicutout;
       else if(cmdstr.compare("mergefiles") == 0)   cmd = mergefiles;
-      else if(cmdstr.compare("cutout") == 0)    cmd = cutout;
-      else if(cmdstr.compare("imcopy") == 0)    cmd = imcopy;
+      else if(cmdstr.compare("cutout") == 0)       cmd = cutout;
+      else if(cmdstr.compare("imcopy") == 0)       cmd = imcopy;
       else if(cmdstr.compare("cutpixels") == 0)    cmd = cutpixels;
       else if(cmdstr.compare("listbounds") == 0)   cmd = listbounds;
       else if(cmdstr.compare("header") == 0)       cmd = header;
+      else if(cmdstr.compare("headermodif") == 0)  cmd = headermodif;
       else if(cmdstr.compare("overlap") == 0)      cmd = overlap;
       else if(cmdstr.compare("skyvertices") == 0)  cmd = skyvertices;
-      else if(cmdstr.compare("nullvals") == 0)    cmd = nullvals;
+      else if(cmdstr.compare("nullvals") == 0)     cmd = nullvals;
       else if(cmdstr.compare("dropdegen") == 0)    cmd = dropdegen;
       else if(cmdstr.compare("checkcard") == 0)    cmd = checkcard;
-      else if(cmdstr.compare("addcard") == 0)     cmd = addcard;
+      else if(cmdstr.compare("addcard") == 0)      cmd = addcard;
       else if(cmdstr.compare("modcard") == 0)      cmd = modcard;
       else if(cmdstr.compare("rawdelcard") == 0)   cmd = rawdelcard;
       else
@@ -327,7 +328,46 @@ int cmd_header(int argc, char * argv[])
    if (argc < 2)
    {
       std::cerr
-         << "Usage:  header --sky=<SkySystem> --spec=<SpecSystem> <filename.fits>... \n"
+         << "Usage:  header [--backup] <pathname.fits>...\n"
+         << "\n"
+         << "Prints current header or writes the header into a file with the same pathname but 'fitshdr' extension.\n"
+         << "Arguments:\n"
+         << "   --backup  write current header from file 'pathname.fits' to 'pathname.fitshdr#n' where n is the HDU number.\n";
+      rc = EXIT_FAILURE;
+   }
+   else
+   {
+      bool backup = false;
+
+      for(int i=1; i<argc; i++)
+      {
+         if(0 == (string(argv[i]).substr(0,2+6)).compare("--backup"))
+         {
+            backup = true;
+         }
+         else
+         {
+            string pathname(argv[i]);
+            cout << to_string(i) << " : " << pathname << endl;
+
+            rc = header_backup(pathname, backup);
+            std::cout << "header_backup rc: " << rc << std::endl;
+         }
+      }
+      rc = EXIT_SUCCESS;
+   }
+   return rc;
+}
+
+
+int cmd_header_modif(int argc, char * argv[])
+{
+   int rc;
+
+   if (argc < 2)
+   {
+      std::cerr
+         << "Usage:  headermodif --sky=<SkySystem> --spec=<SpecSystem> <filename.fits>... \n"
          << "\n"
          << "Modify header for new coord system.\n"
          << "Arguments:\n"
@@ -638,6 +678,7 @@ int main (int argc, char * argv[])
          case vlkb::nullvals:    rc = cmd_nullvals(cmd_argc, cmd_argv); break;
          case vlkb::listbounds:  rc = cmd_listbounds(cmd_argc, cmd_argv); break;
          case vlkb::header:      rc = cmd_header(cmd_argc, cmd_argv); break;
+         case vlkb::headermodif: rc = cmd_header_modif(cmd_argc, cmd_argv); break;
          case vlkb::skyvertices: rc = cmd_skyvertices(cmd_argc, cmd_argv); break;
          case vlkb::overlap:     rc = cmd_overlap(cmd_argc, cmd_argv); break;