diff --git a/fslcpgeom.cc b/fslcpgeom.cc
index 41595b03b4dfd2ffd3375322cf59e73c7836049d..3779c7437649608b577ebe7886d5887648362e43 100755
--- a/fslcpgeom.cc
+++ b/fslcpgeom.cc
@@ -17,12 +17,11 @@ void print_usage(const string& progname)
 
 int avwcpgeom_main(int argc, char *argv[])
 {
-  NiftiIO reader;
   NiftiHeader headerSrc,headerDest;
   string fullDestinationName(return_validimagefilename(string(argv[2])));
   try {
-    headerSrc=reader.loadHeader(return_validimagefilename(string(argv[1])));
-    headerDest=reader.loadHeader(fullDestinationName);
+    headerSrc=loadHeader(return_validimagefilename(string(argv[1])));
+    headerDest=loadHeader(fullDestinationName);
   } catch (...) {
     perror("Error opening files");
     return EXIT_FAILURE;
@@ -38,7 +37,7 @@ int avwcpgeom_main(int argc, char *argv[])
   }
 
   vector<NiftiExtension> extensions;
-  reader.loadImage(fullDestinationName,buffer,extensions,false);
+  loadImage(fullDestinationName,buffer,extensions,false);
 
   headerDest.sformCode = headerSrc.sformCode;
   headerDest.setSForm(headerSrc.getSForm());
@@ -49,7 +48,7 @@ int avwcpgeom_main(int argc, char *argv[])
   if (copydim)
     headerDest.dim=headerSrc.dim;
 
-  reader.saveImage(fullDestinationName,buffer,extensions,headerDest,FslIsCompressedFileType(fslFileType(fullDestinationName)));
+  saveImage(fullDestinationName,buffer,extensions,headerDest,FslIsCompressedFileType(fslFileType(fullDestinationName)));
 
   return 0;
 }
diff --git a/fslcreatehd.cc b/fslcreatehd.cc
index ce97d36dd85c7279829b67e1e47152b2988dcf9a..c102f89847f11ec6152e56ac88ea784a68d9d459 100755
--- a/fslcreatehd.cc
+++ b/fslcreatehd.cc
@@ -23,10 +23,136 @@ void print_usage(const string& progname)
 
 }
 
+NiftiHeader headerFromXML(vector<string> XMLreport)
+  {
+    NiftiHeader header;
+    int xyzUnits(0);
+    int tUnits(0);
+    int freqDim(0);
+    int phaseDim(0);
+    int sliceDim(0);
+    for(unsigned int setting=1;setting<XMLreport.size()-1;setting++) {
+        //Tokenise
+        size_t pos1=XMLreport[setting].find_first_of("  ")+2;
+        size_t pos2=XMLreport[setting].find_first_of(" ",pos1);
+        size_t pos3=XMLreport[setting].find_first_of('\'')+1;
+        size_t pos4=XMLreport[setting].find_last_of('\'');
+        string field(XMLreport[setting].substr(pos1,pos2-pos1));
+        string value(XMLreport[setting].substr(pos3,pos4-pos3));
+        istringstream values(value);
+        if ( field == "datatype" ) {
+    values >> header.datatype;
+        } else if ( field == "image_offset" ) {
+    values >> header.vox_offset;
+        } else if ( field == "sto_xyz_matrix" ) {
+    mat44 sForm;
+    for ( int i=0;i<4;i++ )
+      for ( int j=0;j<4;j++ )
+        values >> sForm.m[i][j];
+    header.setSForm(sForm);
+        } else if ( field == "ndim" ) {
+    values >> header.dim[0];
+        } else if ( field == "nx" ) {
+    values >> header.dim[1];
+        } else if ( field == "ny" ) {
+    values >> header.dim[2];
+        } else if ( field == "nz" ) {
+    values >> header.dim[3];
+        } else if ( field == "nt" ) {
+    values >> header.dim[4];
+        } else if ( field == "nu" ) {
+    values >> header.dim[5];
+        } else if ( field == "nv" ) {
+    values >> header.dim[6];
+        } else if ( field == "nw" ) {
+    values >> header.dim[7];
+        }else if ( field == "qfac" ) {
+    values >> header.pixdim[0];
+        } else if ( field == "dx" ) {
+    values >> header.pixdim[1];
+        } else if ( field == "dy" ) {
+    values >> header.pixdim[2];
+        } else if ( field == "dz" ) {
+    values >> header.pixdim[3];
+        } else if ( field == "dt" ) {
+    values >> header.pixdim[4];
+        } else if ( field == "du" ) {
+    values >> header.pixdim[5];
+        } else if ( field == "dv" ) {
+    values >> header.pixdim[6];
+        } else if ( field == "dw" ) {
+    values >> header.pixdim[7];
+        } else if ( field == "cal_min" ) {
+    values >> header.cal_min;
+        } else if ( field == "cal_max" ) {
+    values >> header.cal_max;
+        } else if ( field == "scl_slope" ) {
+    values >> header.sclSlope;
+        } else if ( field == "scl_inter" ) {
+    values >> header.sclInter;
+        } else if ( field == "intentCode" ) {
+    values >> header.sclSlope;
+        } else if ( field == "intent_p1" ) {
+    values >> header.sclInter;
+        } else if ( field == "intent_p2" ) {
+    values >> header.cal_min;
+        } else if ( field == "intent_p3" ) {
+    values >> header.cal_max;
+        } else if ( field == "intent_name" ) {
+    values >> header.intentName;
+        } else if ( field == "toffset" ) {
+    values >> header.toffset;
+        } else if ( field == "xyz_units" ) {
+    values >> xyzUnits;
+        } else if ( field == "time_units" ) {
+    values >> tUnits;
+        } else if ( field == "descrip" ) {
+    values >> header.description;
+        } else if ( field == "aux_file" ) {
+    values >> header.auxillaryFile;
+        } else if ( field == "qform_code" ) {
+    values >> header.qformCode;
+        } else if ( field == "sform_code" ) {
+    values >> header.sformCode;
+        } else if ( field == "quatern_b" ) {
+    values >> header.qB;
+        } else if ( field == "quatern_c" ) {
+    values >> header.qC;
+        } else if ( field == "quatern_d" ) {
+    values >> header.qD;
+        } else if ( field == "qoffset_x" ) {
+    values >> header.qX;
+        } else if ( field == "qoffset_y" ) {
+    values >> header.qY;
+        } else if ( field == "qoffset_z" ) {
+    values >> header.qZ;
+        } else if ( field == "freq_dim" ) {
+    values >> freqDim;
+        } else if ( field == "phase_dim" ) {
+    values >> phaseDim;
+        } else if ( field == "slice_dim" ) {
+    values >> sliceDim;
+        } else if ( field == "slice_code" ) {
+    values >> header.sliceCode;
+        } else if ( field == "slice_start" ) {
+    values >> header.sliceStart;
+        } else if ( field == "slice_end" ) {
+    values >> header.sliceEnd;
+        } else if ( field == "slice_duration" ) {
+    values >> header.sliceDuration;
+        } else {
+    //cerr << XMLreport[setting] << endl;
+    //cerr << "Unknown" << endl;
+        }
+    }
+    header.units=xyzUnits+tUnits;
+    header.sliceOrdering=freqDim | ( phaseDim << 2 ) | ( sliceDim << 4 );
+    header.bitsPerVoxel=header.bpvOfDatatype();
+    return header;
+  }
 
 int fslcreatehd_main(int argc, char *argv[])
 {
-  NiftiIO reader;
   vector <NiftiExtension> extensions;
   NiftiHeader header,originalHeader;
   char *buffer(NULL);
@@ -43,7 +169,7 @@ int fslcreatehd_main(int argc, char *argv[])
   if (FslFileExists(filename)) {
     existingImage = true;
     filename=return_validimagefilename(filename);
-    header=reader.loadImage(filename,buffer,extensions);
+    header=loadImage(filename,buffer,extensions);
     originalHeader=header;
   }
 
@@ -75,33 +201,27 @@ int fslcreatehd_main(int argc, char *argv[])
 
       if (strcmp(argv[1],"-")==0) {fileread=0;}
       newstr = (char *)calloc(10000,1);
-      if (fileread)
-      {
+      if (fileread) {
 	      inputfile.open (argv[1], ifstream::in | ifstream::binary);
-        if (!inputfile.is_open())
-        {
-	      cerr << "Cannot open file " << argv[1] << endl;
-	      return EXIT_FAILURE;
-	}
+        if (!inputfile.is_open()) {
+	        cerr << "Cannot open file " << argv[1] << endl;
+	        return EXIT_FAILURE;
+	      }
       }
 
-      do
-      {
-	  if (fileread)
-          {
-	    inputfile.getline(newstr,9999);  // maybe use > for delimiting character remove while increase size
-	  }
-          else
-          {
-	      if (fgets(newstr,9999,stdin)==NULL) break;
-	  }
-	  settings.push_back(string(newstr));
+      do {
+	      if (fileread) {
+	        inputfile.getline(newstr,9999);  // maybe use > for delimiting character remove while increase size
+	      } else {
+	        if (fgets(newstr,9999,stdin)==NULL) break;
+	      }
+	      settings.push_back(string(newstr));
       }  while (settings[settings.size()-1]!="/>");
 
-      header=NiftiHeader(settings);
+      header=headerFromXML(settings);
 
       if (fileread)
-	inputfile.close();
+	      inputfile.close();
   }
 
   /* reset datatype in case it has been overwritten */
@@ -125,7 +245,7 @@ int fslcreatehd_main(int argc, char *argv[])
 
     header.bitsPerVoxel=header.bpvOfDatatype();
     header.setNiftiVersion(FslNiftiVersionFileType(filetype),FslIsSingleFileType(filetype));
-    reader.saveImage(filename,buffer,extensions,header, FslIsCompressedFileType(filetype));
+    saveImage(filename,buffer,extensions,header, FslIsCompressedFileType(filetype));
 
   return 0;
   }
diff --git a/fslhd.cc b/fslhd.cc
index 773bac17bcf9e288f87b1aa24bee0c8058c83765..9d2171224a9bb18b2eb3d308b3ee6edbe531996c 100755
--- a/fslhd.cc
+++ b/fslhd.cc
@@ -1,6 +1,6 @@
 //     fslhd.cc - show image header
 //     Steve Smith, Mark Jenkinson and Matthew Webster, FMRIB Image Analysis Group
-//     Copyright (C) 2000-2012 University of Oxford
+//     Copyright (C) 2000-2019 University of Oxford
 //     CCOPYRIGHT
 
 #include "newimage/newimageall.h"
@@ -90,10 +90,9 @@ int main(int argc,char *argv[])
   if (argc < 2)
     return print_usage(string(argv[0]));
   bool reportXML(argc==3 && strcmp(argv[1],"-x")==0 );
-  NiftiIO reader;
   try {
     string filename(return_validimagefilename(argv[argc-1]));
-    NiftiHeader header(reader.loadHeader(filename));
+    NiftiHeader header(loadHeader(filename));
     if (reportXML)
       reportXMLHeader(header);
     else {
diff --git a/fslmerge.cc b/fslmerge.cc
index 01e8ea117e958e20ea33024aef4f69f14dc04f8a..4ebf90f76368087bac1fde3ed2be5d8aa920a808 100755
--- a/fslmerge.cc
+++ b/fslmerge.cc
@@ -1,6 +1,6 @@
 //     fslmerge.cc concatenate AVW files into a single output
 //     Steve Smith, David Flitney, Stuart Clare and Matthew Webster, FMRIB Image Analysis Group
-//     Copyright (C) 2000-2010 University of Oxford
+//     Copyright (C) 2000-2019 University of Oxford
 //     CCOPYRIGHT
 #define EXPOSE_TREACHEROUS
 #include "newimage/newimageall.h"
@@ -25,8 +25,7 @@ int fmrib_main(int argc, char *argv[])
   volume4D<T> input_volume;
   int direction,dimerror=0,xoffset=0,yoffset=0,zoffset=0,toffset=0;
 
-  NiftiIO reader;
-  NiftiHeader header(reader.loadHeader(return_validimagefilename(string(argv[3]))));
+  NiftiHeader header(loadHeader(return_validimagefilename(string(argv[3]))));
   float newTR(header.pixdim[4]);
 
   if (!strcmp(argv[1], "-t"))       direction=0;
@@ -54,7 +53,7 @@ int fmrib_main(int argc, char *argv[])
 
   for(int vol = 4; vol < argc; vol++)
   {
-    header=reader.loadHeader(return_validimagefilename(string(argv[vol])));
+    header=loadHeader(return_validimagefilename(string(argv[vol])));
     if (direction==0) tdimtot+=std::max(header.dim[4],(int64_t)1);
     if (direction==1) xdimtot+=std::max(header.dim[1],(int64_t)1);
     if (direction==2) ydimtot+=std::max(header.dim[2],(int64_t)1);
diff --git a/fslnvols.cc b/fslnvols.cc
index 2557dcba18e94bdd1fe11315769e29fe94def26e..47fb2e8962af765d98773c8e701a9cc844d44ebe 100755
--- a/fslnvols.cc
+++ b/fslnvols.cc
@@ -1,13 +1,13 @@
 //     fslnvols.cc   REALLY advanced program for counting the volumes in a 4D file
 //     Stephen Smith and Matthew Webster, FMRIB Image Analysis Group
-//     Copyright (C) 1999-2005 University of Oxford  
-//     CCOPYRIGHT  
+//     Copyright (C) 1999-2019 University of Oxford
+//     CCOPYRIGHT
 
 #include "newimage/newimageall.h"
 
 using namespace NEWIMAGE;
 
-void print_usage(const string& progname) 
+void print_usage(const string& progname)
 {
   cout << endl;
   cout << "Usage: fslnvols <input>" << endl;
@@ -21,14 +21,12 @@ int main(int argc,char *argv[])
     print_usage(progname);
     return 1;
   }
-  if (!FslFileExists(string(argv[1]))) 
-  { 
+  if (!FslFileExists(string(argv[1])))
+  {
     cout << "0" << endl;
     return 0; // the intended usage is to return "0" and not show an error
   }
-  NiftiIO reader;
-  NiftiHeader header(reader.loadHeader(return_validimagefilename(string(argv[1]))));
+  NiftiHeader header(loadHeader(return_validimagefilename(string(argv[1]))));
   cout << header.dim[4] << endl;
   return 0;
 }
-