diff --git a/FitsIOServer/fitsbntbllineRW.cc b/FitsIOServer/fitsbntbllineRW.cc
index 939e1b30caf626647a272e7b285989171b8d7af0..f8731edf36fae5d293e330b07fdb36d7e7903a05 100644
--- a/FitsIOServer/fitsbntbllineRW.cc
+++ b/FitsIOServer/fitsbntbllineRW.cc
@@ -99,7 +99,7 @@ BnTblLine& FITS_BntblLineReader::ReadNextLine()
 
 
 
-FITS_BntblLineWriter::FITS_BntblLineWriter(char inputfile[],int dc, int fc,int ic, int cc, vector<string> names,DVList* ptr_dvl,  WriteMode wrm)
+FITS_BntblLineWriter::FITS_BntblLineWriter(char inputfile[],int dc, int fc,int ic, int cc, vector<string> names,DVList* ptr_dvl,  FitsFile::WriteMode wrm)
 {
   int k;
   int nbcols = dc+fc+ic+cc;
diff --git a/FitsIOServer/fitsbntbllineRW.h b/FitsIOServer/fitsbntbllineRW.h
index 95e84767aafe56b01a0b2b2cb5f32a081370ddd6..c3627a3afe9578b6700a2266970354fc9a4c8bb3 100644
--- a/FitsIOServer/fitsbntbllineRW.h
+++ b/FitsIOServer/fitsbntbllineRW.h
@@ -60,7 +60,7 @@ class  FITS_BntblLineWriter : public FitsIOHandler
 
 
 public:
- FITS_BntblLineWriter(char inputfile[],int dc, int fc, int ic, int cc, vector<string> names, DVList* dvl=NULL, WriteMode wrm = clear);
+ FITS_BntblLineWriter(char inputfile[],int dc, int fc, int ic, int cc, vector<string> names, DVList* dvl=NULL, FitsFile::WriteMode wrm = FitsFile::clear);
 ~FITS_BntblLineWriter();
  void WriteNextLine( BnTblLine& WorkLine);
 
diff --git a/FitsIOServer/fitsfile.cc b/FitsIOServer/fitsfile.cc
index 969332eeb10be532dfcbd233426234a94051faaa..abb4b8fa65e47df7722f0225985ad0aa3cbaed49 100644
--- a/FitsIOServer/fitsfile.cc
+++ b/FitsIOServer/fitsfile.cc
@@ -128,7 +128,7 @@ calls the method 'WriteToFits' from the inherited  object
 void FitsIOHandler::Write(char flnm[]) 
 
 {
-  FitsOutFile of(flnm, unknown);
+  FitsOutFile of(flnm, FitsFile::unknown);
   Write(of);
 }
 
@@ -207,7 +207,15 @@ FitsInFile::FitsInFile()
   InitNull();
 }
 
-FitsInFile::FitsInFile(char flnm[])
+FitsInFile::FitsInFile(string const & flnm)
+{
+    InitNull();
+   int status = 0;
+   fits_open_file(&fptr_,flnm.c_str(),READONLY,&status);
+   if( status ) printerror( status );
+}
+
+FitsInFile::FitsInFile(const char * flnm)
 {
     InitNull();
    int status = 0;
@@ -249,7 +257,7 @@ int FitsInFile::NbBlocks(char flnm[])
   return nbhdu;
 }
 
-void FitsInFile::GetBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl )
+void FitsInFile::GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOfExtension, int& naxis, vector<int>& naxisn, FitsDataType& dataType, DVList& dvl )
 {
   int status = 0;
   fitsfile* fileptr; 
@@ -261,14 +269,14 @@ void FitsInFile::GetBlockType(char flnm[], int hdunum, string& typeOfExtension,
   if( status ) printerror( status,"GetBlockType: erreur movabs");
   if(hdutype == IMAGE_HDU) 
     {
-      typeOfExtension = "IMAGE";
+      typeOfExtension = FitsExtensionType_IMAGE;
       int bitpix;
       GetImageParameters (fileptr, bitpix, naxis, naxisn);
-      if(bitpix == DOUBLE_IMG) dataType = "double";
+      if(bitpix == DOUBLE_IMG) dataType = FitsDataType_double;
       else
-	if(bitpix == FLOAT_IMG) dataType = "float";
+	if(bitpix == FLOAT_IMG) dataType = FitsDataType_float;
 	else
-	  if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = "int";
+	  if(bitpix == LONG_IMG || bitpix == SHORT_IMG ) dataType = FitsDataType_int;
 	  else 
 	    {
 	      cout << " bitpix= " << bitpix << endl;
@@ -288,19 +296,19 @@ void FitsInFile::GetBlockType(char flnm[], int hdunum, string& typeOfExtension,
 	for (k=0; k< naxisn.size(); k++) naxisn[k] *= nrows;
 	if(hdutype == ASCII_TBL)
 	  {
-	    typeOfExtension = "ASCII_TBL"; 
-	    dataType = "ASCII";
+	    typeOfExtension = FitsExtensionType_ASCII_TBL; 
+	    dataType = FitsDataType_ASCII;
 	  }
 	else
 	  {
-	    typeOfExtension = "BINARY_TBL";
-	    if(types[0] == 'D') dataType = "double";
+	    typeOfExtension = FitsExtensionType_BINARY_TBL;
+	    if(types[0] == 'D') dataType = FitsDataType_double;
 	    else
-	      if(types[0] == 'E') dataType = "float";
+	      if(types[0] == 'E') dataType = FitsDataType_float;
 	      else
-		if(types[0] == 'I' ) dataType = "int";
+		if(types[0] == 'I' ) dataType = FitsDataType_int;
 		else
-		  if(types[0] == 'S' ) dataType = "char*";
+		  if(types[0] == 'S' ) dataType = FitsDataType_char;
 		  else 
 		    {
 		      cout << " types[0]= " << types[0] << endl;
@@ -1092,10 +1100,21 @@ FitsOutFile::FitsOutFile()
 \param <WriteMode>  enum , WriteMode = clear -> if alreadyy exists, the file will be overwritten (else created) ; WriteMode = append -> further objects will be appended to the file if it exists (else : file created). WriteMode = unknown -> file created if does not exist, else : exception. (the last situation is the default)
 
    */
-FitsOutFile::FitsOutFile(char flnm[], WriteMode wrm)
+
+FitsOutFile::FitsOutFile(string const & flnm, WriteMode wrm)
 {
+  InitNull();
+  openoutputfitsfile(flnm.c_str(), wrm);
+}
 
+FitsOutFile::FitsOutFile(const char * flnm, WriteMode wrm)
+{
   InitNull();
+  openoutputfitsfile(flnm, wrm);
+}
+
+void FitsOutFile::openoutputfitsfile(const char * flnm, WriteMode wrm)
+{
   int status = 0; 
 
   // create new FITS file
diff --git a/FitsIOServer/fitsfile.h b/FitsIOServer/fitsfile.h
index 71917b2feb797ca546e309f7c8074b04806f4d2c..4a171fd2abe5921da6357aecd7dedf0343eba9ae 100644
--- a/FitsIOServer/fitsfile.h
+++ b/FitsIOServer/fitsfile.h
@@ -19,7 +19,6 @@ namespace SOPHYA {
   class FitsFile;
   class FitsInFile;
   class FitsOutFile;
-  enum WriteMode {append, clear, unknown};
   
 
 //
@@ -52,6 +51,21 @@ namespace SOPHYA {
 
  public:
 
+   enum WriteMode {append, clear, unknown};
+
+   enum FitsExtensionType {
+     FitsExtensionType_IMAGE,
+     FitsExtensionType_ASCII_TBL,
+     FitsExtensionType_BINARY_TBL
+   };
+   enum FitsDataType {
+     FitsDataType_double,
+     FitsDataType_float,
+     FitsDataType_int,
+     FitsDataType_char,
+     FitsDataType_ASCII
+   };
+
    FitsFile() { InitNull(); };
    virtual ~FitsFile();
    static string GetErrStatus(int status);
@@ -79,11 +93,12 @@ namespace SOPHYA {
 
  public:
    FitsInFile();
-   FitsInFile(char flnm[]);
+   FitsInFile(string const & flnm);
+   FitsInFile(const char * flnm);
    ~FitsInFile() { ; };
 
    static int  NbBlocks(char flnm[]);
-   static void GetBlockType(char flnm[], int hdunum, string& typeOfExtension, int& naxis, vector<int>& naxisn, string& dataType, DVList& dvl  );
+   static void GetBlockType(char flnm[], int hdunum, FitsExtensionType& typeOfExtension, int& naxis, vector<int>& naxisn, FitsDataType& dataType, DVList& dvl  );
    void        ReadFInit(int hdunum);
  
   /*! \return a reference on a DVList containing the keywords from FITS file */
@@ -191,9 +206,9 @@ static  void GetImageParameters (fitsfile* fileptr,int& bitpix,int& naxis,vector
 
  public:
 
-
    FitsOutFile();
-   FitsOutFile(char flnm[], WriteMode wrm = unknown );
+   FitsOutFile(string const & flnm, WriteMode wrm = unknown );
+   FitsOutFile(const char * flnm, WriteMode wrm = unknown );
    ~FitsOutFile() { ;};
    inline void InitNull() {imageOnPrimary_=false;}
 
@@ -241,6 +256,7 @@ void  DVListIntoPrimaryHeader(DVList& dvl) const;
 
   private :
 
+  void openoutputfitsfile(const char * flnm, WriteMode wrm);
   void writeSignatureOnFits() const; 
   void addKeywordsOfDVList(DVList& dvl) const;
 
diff --git a/FitsIOServer/fitsntuple.h b/FitsIOServer/fitsntuple.h
index bc5b904e83de34741c0495871bda615398265676..2b8c67f77a5ffa06589614f679f90578850435c1 100644
--- a/FitsIOServer/fitsntuple.h
+++ b/FitsIOServer/fitsntuple.h
@@ -65,6 +65,12 @@ inline void InitNull() { fistLineToBeRead_= -1; numberOfLinesToBeRead_= -1;}
 };
 //////////////////////////////////////////////////////////////////
 
+inline FitsOutFile& operator << (FitsOutFile& fios, NTuple & nt)
+  { FITS_NTuple fih(&nt); fih.Write(fios); return (fios); }
+
+inline FitsInFile& operator >> (FitsInFile& fiis, NTuple & nt)
+  { FITS_NTuple fih(&nt); fih.Read(fiis); return (fiis); }
+
 
 } // Fin du namespace
 
diff --git a/FitsIOServer/fitsspherehealpix.h b/FitsIOServer/fitsspherehealpix.h
index c61501e60e44dca2a75e2cb55cb14c05bb9a8f11..f31f70bd9b7907fe93f6606f95f81bf4f1da15e3 100644
--- a/FitsIOServer/fitsspherehealpix.h
+++ b/FitsIOServer/fitsspherehealpix.h
@@ -46,6 +46,14 @@ bool ownobj_;
 
 //////////////////////////////////////////////////////////////////
 
+template <class T>
+inline FitsOutFile& operator << (FitsOutFile& fios, SphereHEALPix<T> & sph)
+  { FITS_SphereHEALPix<T> fih(&sph); fih.Write(fios); return (fios); }
+
+template <class T>
+inline FitsInFile& operator >> (FitsInFile& fiis, SphereHEALPix<T> & arr)
+  { FITS_SphereHEALPix<T> fih(&sph); fih.Read(fiis); return (fiis); }
+
 
 } // Fin du namespace
 
diff --git a/FitsIOServer/fitstarray.h b/FitsIOServer/fitstarray.h
index d07fb970147ed4dd6373d37ac3456b61e75634cb..93ddcee441ce2bfdd36abd0a40aacd4e682fd51a 100644
--- a/FitsIOServer/fitstarray.h
+++ b/FitsIOServer/fitstarray.h
@@ -42,6 +42,13 @@ void WriteToFits(FitsOutFile& os) ;
 };
 //////////////////////////////////////////////////////////////////
 
+template <class T>
+inline FitsOutFile& operator << (FitsOutFile& fios, TArray<T> & arr)
+  { FITS_TArray<T> fih(&arr); fih.Write(fios); return (fios); }
+
+template <class T>
+inline FitsInFile& operator >> (FitsInFile& fiis, TArray<T> & arr)
+  { FITS_TArray<T> fih(&arr); fih.Read(fiis); return (fiis); }
 
 } // Fin du namespace
 
diff --git a/FitsIOServer/fitsxntuple.h b/FitsIOServer/fitsxntuple.h
index 703c41380100acf3ac7d2769ae84d00b9105954a..9e85d5938bfaea5ec120b62fa1e12f3ebafb3326 100644
--- a/FitsIOServer/fitsxntuple.h
+++ b/FitsIOServer/fitsxntuple.h
@@ -68,6 +68,11 @@ inline void InitNull()
 };
 //////////////////////////////////////////////////////////////////
 
+inline FitsOutFile& operator << (FitsOutFile& fios, XNTuple & nt)
+  { FITS_XNTuple fih(&nt); fih.Write(fios); return (fios); }
+
+inline FitsInFile& operator >> (FitsInFile& fiis, XNTuple & nt)
+  { FITS_XNTuple fih(&nt); fih.Read(fiis); return (fiis); }
 
 } // Fin du namespace