diff --git a/modules/io/src/img/map_io_spi_handler.cc b/modules/io/src/img/map_io_spi_handler.cc
index 33c53994542fa00e60fa47bb6bd07efb38fabb22..f55c9a22d7262b2955204693e9431ea3bf037db0 100644
--- a/modules/io/src/img/map_io_spi_handler.cc
+++ b/modules/io/src/img/map_io_spi_handler.cc
@@ -77,7 +77,35 @@ namespace detail {
 
 using boost::format;
 
-struct spider_header {
+class spider_header {
+public:
+  spider_header():
+    fNslice(),fNrow(),fNrec(),fNlabel(),fIform(),fImami(),fFmax(),fFmin(),fAv(),fSig(),
+    fIhist(),fNcol(),fLabrec(),fIangle(),fPhi(),fTheta(),fPsi(),fXoff(),fYoff(),fZoff(),
+    fScale(),fLabbyt(),fLenbyt(),ffIstack(),fFlag(),fMaxim(),fImgnum(),fLastindx(),
+    fUn1(),fUn2(),Kangle(),fPhi1(),fTheta1(),fPsi1(),fPhi2(),fTheta2(),fPsi2(),
+    fEmpty1(),fRes(),fEmpty2(),szIDat(),szITim(),szITit()
+  {
+    for(unsigned i=0;i<12;++i){
+      fEmpty1[i]=0;
+    }
+    for(unsigned i=0;i<27;++i){
+      fRes[i]=0;
+    }
+    for(unsigned i=0;i<135;++i){
+      fEmpty2[i]=0;
+    }
+    for(unsigned i=0;i<12;++i){
+      szIDat[i]=0;
+    }
+    for(unsigned i=0;i<8;++i){
+      szITim[i]=0;
+    }
+    for(unsigned i=0;i<160;++i){
+      szITit[i]=0;
+    }
+  }
+
   float fNslice;  // nr of slices (1 for an image, negative nr of slices for new long label format
   float fNrow;    // nr row per slice (Y)
   float fNrec;    // total nr of records (unused).
@@ -184,7 +212,7 @@ void prep_header(spider_header& header, const img::Size& size, const geom::Vec3&
   for (int counter = 0; counter < 8; ++counter)  {
     header.szITim[counter] = time_for_header[counter];
   }
-  for (int counter = 0; counter < 160; ++counter)  {
+  for (int counter = 0; counter < title_for_header.size(); ++counter)  {
     header.szITit[counter] = title_for_header[counter];
   }
 }
@@ -280,24 +308,56 @@ void header_filler(std::istream& in,  spider_header& header)
 
 }
 
-void header_dumper(std::ostream& f, const spider_header& header,bool swap_flag)
+template<int CONVERSIONTYPE>
+void header_dumper(std::ostream& out, const spider_header& header)
 {
-  spider_header header_for_dumping;
-  header_for_dumping = header;
-
-  if (swap_flag) {
-    float * header_swap=reinterpret_cast<float*>(&header_for_dumping);
-    ost::io::swap_float(header_swap,sizeof(spider_header)/sizeof(float));
-  }
-
-  f.write(reinterpret_cast<const char*>(&header_for_dumping),sizeof(detail::spider_header));
-  unsigned char padding = 0;
-  for (int padding_counter=0; padding_counter < (static_cast<int>(header.fLabbyt)-static_cast<int>(sizeof(detail::spider_header))); ++padding_counter)
-  {
-    f.write(reinterpret_cast<char*>(&padding),sizeof(unsigned char));
-  }
+  BinaryOStream<CONVERSIONTYPE> f(out);
+  f << header.fNslice;  
+  f << header.fNrow;  
+  f << header.fNrec;    
+  f << header.fNlabel; 
+  f << header.fIform;   
+  f << header.fImami;  
+  f << header.fFmax;  
+  f << header.fFmin;  
+  f << header.fAv;      
+  f << header.fSig;    
+  f << header.fIhist;  
+  f << header.fNcol;    
+  f << header.fLabrec;
+  f << header.fIangle; 
+  f << header.fPhi;   
+  f << header.fTheta; 
+  f << header.fPsi;    
+  f << header.fXoff;  
+  f << header.fYoff;  
+  f << header.fZoff;    
+  f << header.fScale;  
+  f << header.fLabbyt; 
+  f << header.fLenbyt;
+  f << header.ffIstack;
+  f << header.fFlag;   
+  f << header.fMaxim;  
+  f << header.fImgnum; 
+  f << header.fLastindx;
+  f << header.fUn1;   
+  f << header.fUn2;   
+  f << header.Kangle;  
+  f << header.fPhi1;    
+  f << header.fTheta1; 
+  f << header.fPsi1;    
+  f << header.fPhi2;   
+  f << header.fTheta2; 
+  f << header.fPsi2;   
+  f.write(header.fEmpty1,12);
+  f.write(header.fRes,27);   
+  f.write(header.fEmpty2,135);
+  f.write(header.szIDat,12);   
+  f.write(header.szITim,8);  
+  f.write(header.szITit,160);  
 }
 
+
 template <int CONVERSIONTYPE,typename B>
 void real_filler(std::istream& in, const spider_header& header, img::ImageHandle& mh,double scale)
 {
@@ -374,7 +434,7 @@ void ExportSpiderHelper(const img::MapHandle& mh2, std::ostream& outfile,const S
 
   detail::prep_header(header,mh2.GetSize(),mh2.GetSpatialSampling(),stat.GetMinimum(),stat.GetMaximum(),stat.GetMean(),stat.GetStandardDeviation());
 
-  header_dumper(outfile, header,swap_flag);
+  header_dumper<CONVERSIONTYPE>(outfile, header);
 
   detail::print_header(header);