diff --git a/AMDiS/src/io/Arh3Writer.h b/AMDiS/src/io/Arh3Writer.h
index 4312209b89603a0fbb7c7aeda69219d79b35a3bb..9f286e87f54f0d842fc59b9ee1af6d4a814b3fc1 100644
--- a/AMDiS/src/io/Arh3Writer.h
+++ b/AMDiS/src/io/Arh3Writer.h
@@ -6,9 +6,9 @@
 #include "detail/Arh3Writer.h"
 
 #ifdef HAVE_PARALLEL_DOMAIN_AMDIS
-#define WRITE_MACRO false
+#define WRITE_MACRO Macroformat::NONE
 #else
-#define WRITE_MACRO true
+#define WRITE_MACRO Macroformat::PT_MACROFILE
 #endif
 
 namespace AMDiS { namespace io {
@@ -50,9 +50,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(SystemVector *sysVec,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
       std::vector<DOFVector<double>*> vecs;
       for (int i = 0; i < sysVec->getSize(); i++)
@@ -63,9 +63,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(SystemVector &sysVec,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
       writeFile(&sysVec, filename, writeParallel, cps, dataformat, writeMacro);
     }
@@ -75,9 +75,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(DOFVector<double>* vec0,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
         std::vector<DOFVector<double>*> vecs;
         vecs.push_back(vec0);
@@ -89,9 +89,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(DOFVector<double>& vec0,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
         writeFile(&vec0, filename, writeParallel, cps, dataformat, writeMacro);
     }
@@ -101,9 +101,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(std::vector<DOFVector<double>*> vecs,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
       detail::write(filename, NULL, vecs, writeParallel, cps, dataformat, writeMacro);
     }
@@ -112,9 +112,9 @@ namespace AMDiS { namespace io {
     inline void writeFile(Mesh *mesh,
 			  std::string filename,
 			  bool writeParallel = true,
-			  Cpsformat cps = NONE,
+			  Cpsformat::Value cps = Cpsformat::NONE,
 			  std::string dataformat = "SF64",
-			  bool writeMacro = WRITE_MACRO)
+			  Macroformat::Value writeMacro = WRITE_MACRO)
     {
       std::vector<DOFVector<double>*> vecs;
       detail::write(filename, mesh, vecs, writeParallel, cps, dataformat, writeMacro);
diff --git a/AMDiS/src/io/detail/Arh3Reader.cc b/AMDiS/src/io/detail/Arh3Reader.cc
index 38285fdb3aeb03a3c7e318ecba29f7f3730b2812..99958000c38fdfabf585a71df35a0a3058e90a2e 100644
--- a/AMDiS/src/io/detail/Arh3Reader.cc
+++ b/AMDiS/src/io/detail/Arh3Reader.cc
@@ -228,7 +228,7 @@ namespace AMDiS { namespace io {
 	TEST_EXIT(file.is_open())
 	  ("Cannot open file %s\n", filename.c_str());
       
-	Cpsformat cps = NONE;
+	Cpsformat::Value cps = Cpsformat::NONE;
 	uint32_t headerLen = 0;
 	uint32_t nMacroElements = 0;
 	uint32_t nValueVectors = 0;
@@ -246,15 +246,15 @@ namespace AMDiS { namespace io {
 	file.read(reinterpret_cast<char*>(&nValueVectors), 4);
 	file.read(reinterpret_cast<char*>(&nMacroElements), 4);
 	file.read(reinterpret_cast<char*>(&cpsflag), 4);
-	cps = static_cast<Cpsformat>(cpsflag);
+	cps = static_cast<Cpsformat::Value>(cpsflag);
 	
 #ifdef HAVE_COMPRESSION
-	TEST_EXIT(cps == ZLIB  || 
-		  cps == BZIP2 ||
-		  cps == NONE)
+	TEST_EXIT(cps == Cpsformat::ZLIB  || 
+		  cps == Cpsformat::BZIP2 ||
+		  cps == Cpsformat::NONE)
 	  ("Cannot read Arh2 file. Currently only support zlib and bzip2 compression.\n");
 #else
-	TEST_EXIT(cps == NONE)
+	TEST_EXIT(cps == Cpsformat::NONE)
 	  ("HAVE_COMPRESSION OFF. Cannot read compressed Arh2 file.\n");	
 #endif
 	  
@@ -323,7 +323,7 @@ namespace AMDiS { namespace io {
 	  dataformat.push_back(tmpString);
 	}
 	
-	// Read macroFile_nl
+	// Read macroFile_nl //TODO
 	uint32_t macroFile_nl = 0;
 	file.read(reinterpret_cast<char*>(&macroFile_nl), 4);
 	if (macroFile_nl > 0) {
@@ -412,13 +412,13 @@ namespace AMDiS { namespace io {
 	  boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
 	  switch(cps)
 	  {
-	    case ZLIB:
+	    case Cpsformat::ZLIB:
 	      in.push(boost::iostreams::zlib_decompressor());
 	      break;
-	    case BZIP2:
+	    case Cpsformat::BZIP2:
 	      in.push(boost::iostreams::bzip2_decompressor());
 	      break;
-	    case NONE:
+	    case Cpsformat::NONE:
 	      break;
 	    default:
 	      MSG("NOT correct compression flag.\n");
@@ -662,7 +662,7 @@ namespace AMDiS { namespace io {
 	uint32_t nValueVectors = 0;
 	uint32_t nFeSpaces = 0;
 	int cpsflag = 0, fileSize = 0;
-	Cpsformat cps = NONE;    
+	Cpsformat::Value cps = Cpsformat::NONE;    
 	
 	firstRead(file, "sarh", MAJOR, MINOR);
 
@@ -673,12 +673,12 @@ namespace AMDiS { namespace io {
 	file.read(reinterpret_cast<char*>(&nValueVectors), 4);
 	file.read(reinterpret_cast<char*>(&nMacroElements), 4);
 	file.read(reinterpret_cast<char*>(&cpsflag), 4);
-	cps = static_cast<Cpsformat>(cpsflag);
+	cps = static_cast<Cpsformat::Value>(cpsflag);
 	
 #ifdef HAVE_COMPRESSION
-	TEST_EXIT(cps == ZLIB  || 
-		  cps == BZIP2 ||
-		  cps == NONE)
+	TEST_EXIT(cps == Cpsformat::ZLIB  || 
+		  cps == Cpsformat::BZIP2 ||
+		  cps == Cpsformat::NONE)
 	  ("Cannot read Arh2 file. Currently only support zlib and bzip2 compression.\n");
 #else
 	TEST_EXIT(cps == NONE)
@@ -746,13 +746,13 @@ namespace AMDiS { namespace io {
 	  boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
 	  switch(cps)
 	  {
-	    case ZLIB:
+	    case Cpsformat::ZLIB:
 	      in.push(boost::iostreams::zlib_decompressor());
 	      break;
-	    case BZIP2:
+	    case Cpsformat::BZIP2:
 	      in.push(boost::iostreams::bzip2_decompressor());
 	      break;
-	    case NONE:
+	    case Cpsformat::NONE:
 	      break;
 	    default:
 	      MSG("NOT correct compression flag.\n");
@@ -857,7 +857,7 @@ namespace AMDiS { namespace io {
 	file.read(const_cast<char*>(baseDir.data()), baseDirLen);
 	file.read(reinterpret_cast<char*>(&nFiles), 4);
 	file.read(reinterpret_cast<char*>(&macroFile_nl), 4);
-	if (macroFile_nl > 0) {
+	if (macroFile_nl > 0) { //TODO
 	  macroFilename.resize(macroFile_nl, ' ');
 	  file.read(const_cast<char*>(macroFilename.data()), macroFile_nl);
 	}
diff --git a/AMDiS/src/io/detail/Arh3Writer.cc b/AMDiS/src/io/detail/Arh3Writer.cc
index 1ba137c49b271ef7703801a13e43f35a5a44ec13..e3675fc3f314b3a2c27cd22105df1a1ca8e25f32 100644
--- a/AMDiS/src/io/detail/Arh3Writer.cc
+++ b/AMDiS/src/io/detail/Arh3Writer.cc
@@ -32,9 +32,9 @@ namespace AMDiS { namespace io {
   			DOFVector<double>* vec1,
   			DOFVector<double>* vec2,
 			bool writeParallel,
-			Cpsformat cps,
+			Cpsformat::Value cps,
 			string dataformat,
-			bool writeMacro)
+			Macroformat::Value writeMacro)
       {
         vector<DOFVector<double>*> vecs(0);
         if (vec0 != NULL)
@@ -97,22 +97,24 @@ namespace AMDiS { namespace io {
       }
   
 #ifdef HAVE_PARALLEL_DOMAIN_AMDIS  
-      void writeParallelFile(string filename, Mesh* mesh, bool createSubDir, bool writeMacro)
+      void writeParallelFile(string filename, Mesh* mesh, bool createSubDir, Macroformat::Value writeMacro)
       {
 	ofstream file;
         file.open(filename.c_str(), ios::out | ios::binary | ios::trunc);
 	
 	string typeId = "parh", macroFilename = "", perFilename = "";
 	string baseDir = createSubDir ?  "./data/" : "./";
+	string macroFile = "";
+	uint32_t macroFile_nl = 0;
 	string macroData = "", periodicData = "";
 	uint32_t baseDirLen = baseDir.length();
 	Parameters::get(mesh->getName() + "->macro file name", macroFilename);
 	Parameters::get(mesh->getName() + "->periodic file", perFilename);
 	
+	bool hasPeriodic = perFilename.length();
 	int major = AMDiS::io::Arh3Reader::PARH_MAJOR; 
         int minor = AMDiS::io::Arh3Reader::PARH_MINOR;
 	uint32_t nFiles = MPI::COMM_WORLD.Get_size();
-	uint32_t macroFile_nl = 0;
 	map<int, int> partitionMap = 
 	  Parallel::MeshDistributor::globalMeshDistributor->getPartitionMap();
 	uint32_t nMacros = partitionMap.size();
@@ -130,16 +132,26 @@ namespace AMDiS { namespace io {
 	file.write(baseDir.c_str(), baseDirLen);
 	file.write(reinterpret_cast<char*>(&nFiles), 4);
 	
-	if (writeMacro && macroFilename.length()) {
-	  macroFile_nl = 13;
-	  readFileToString(macroFilename, macroData);
+	if (writeMacro != Macroformat::NONE && macroFilename.length()) {
 	  
-	  if (perFilename.length()) {
-	    macroFile_nl = 27;
-	    readFileToString(perFilename, periodicData);
+	  if (writeMacro == Macroformat::PT_MACROFILE) {
+	    macroFile = !hasPeriodic ? macroFilename : 
+	      macroFilename + ';' + perFilename;
+	    
+	    macroFile_nl = macroFile.length();
+	  } else if (writeMacro == Macroformat::THIS) {
+	    macroFile_nl = 13;
+	    readFileToString(macroFilename, macroData);
+	    
+	    if (hasPeriodic) {
+	      macroFile_nl = 27;
+	      readFileToString(perFilename, periodicData);
+	    }
+	    macroFile.resize(macroFile_nl, ' ');
 	  }
 	}
 	file.write(reinterpret_cast<char*>(&macroFile_nl), 4);
+	file.write(macroFile.c_str(), macroFile_nl);
 	file.write(reinterpret_cast<char*>(&nMacros), 4);
 	
 	map<int, int>::const_iterator it = partitionMap.begin();
@@ -150,12 +162,12 @@ namespace AMDiS { namespace io {
 	}
 	
 	// write macro and periodic file
-	if (writeMacro && macroFilename.length()) {
+	if (writeMacro == Macroformat::THIS && macroFilename.length()) {
 	  file.seekp(0, ios_base::end);
 	  long macroPos = file.tellp(), perPos = 0;
 	  file.write(macroData.c_str(), macroData.length());
 	  
-	  if (perFilename.length()) {
+	  if (hasPeriodic) {
 	    perPos = file.tellp();
 	    file.write(periodicData.c_str(), periodicData.length());
 	  }
@@ -167,9 +179,12 @@ namespace AMDiS { namespace io {
 		       4 +		//nFiles
 		       4;		//macroFile_nl
 	  file.seekp(offset);
-	  file << "this:" << macroPos;
-	  if (perFilename.length())
-	    file << ";this:" << perPos;
+	  file.write("this:", 5);
+	  file.write(reinterpret_cast<char*>(&macroPos), 8);
+	  if (hasPeriodic) {
+	    file.write(";this:", 6);
+	    file.write(reinterpret_cast<char*>(&perPos), 8);
+	  }
 	}
       }
 #endif
@@ -178,9 +193,9 @@ namespace AMDiS { namespace io {
 		 Mesh* mesh, 
 		 vector<DOFVector<double>*> vecs,
 		 bool writeParallel,
-		 Cpsformat cps,
+		 Cpsformat::Value cps,
 		 string dataformat,
-		 bool writeMacro)
+		 Macroformat::Value writeMacro)
       {
 	FUNCNAME("Arh3Writer::detail::write()");
 	
@@ -257,8 +272,9 @@ namespace AMDiS { namespace io {
                                Mesh *mesh,
                                vector<DOFVector<double>*> vecs,
                                map<const FiniteElemSpace*, vector<int> >& feSpaces,
-			       Cpsformat cps,
-			       string dataformat)
+			       Cpsformat::Value cps,
+			       string dataformat,
+			       Macroformat::Value writeMacro)
       {
         FUNCNAME("Arh3Writer::detail::writeHeader()");
 // 	int nbits = boost::lexical_cast<int>(dataformat.substr(2, 2));
@@ -286,7 +302,26 @@ namespace AMDiS { namespace io {
 	  el = st.traverseNext(el);
 	}
 	
-        uint32_t dow = mesh->getGeo(WORLD);
+	string macroFilename = "", perFilename = "";
+	string macroFile = "";
+	uint32_t macroFile_nl = 0;
+	Parameters::get(mesh->getName() + "->macro file name", macroFilename);
+	Parameters::get(mesh->getName() + "->periodic file", perFilename);
+	
+	if (writeMacro != Macroformat::NONE && macroFilename.length()) {
+	  
+	  if (writeMacro == Macroformat::PT_MACROFILE) {
+	    macroFile = !perFilename.length() ? macroFilename : 
+	      macroFilename + ';' + perFilename;
+	    
+	    macroFile_nl = macroFile.length();
+	  } else if (writeMacro == Macroformat::THIS) {
+	    macroFile_nl = perFilename.length() ? 27 : 13;
+	    macroFile.resize(macroFile_nl, ' ');
+	  }
+	}
+
+	uint32_t dow = mesh->getGeo(WORLD);
         uint32_t dim = mesh->getDim();
         uint32_t headerLen = 34 +                         //fixed part of header 
 			     nMacroElements * 12 + 12 +   //macroElemnts table
@@ -294,7 +329,8 @@ namespace AMDiS { namespace io {
 			     nFeSpaces * 20 + 	          //feSpaces table
 			     valueNamesLen + 	          //value vector table
 			     nValueVectors * 12 +         //also value vector table
-			     4;				  //macroFile_nl
+			     4 +			  //macroFile_nl
+			     macroFile_nl;		  //macroFile
         string typeId = "sarh";
 #ifndef HAVE_COMPRESSION
 	cps = NONE;
@@ -370,17 +406,17 @@ namespace AMDiS { namespace io {
 	  file.write(dataformat.c_str(), 4);
         }
         
-        uint32_t macroFile_nl = 0;
         file.write(reinterpret_cast<char*>(&macroFile_nl), 4);
+	file.write(macroFile.c_str(), macroFile_nl);
         return headerLen;
       }
  
       void writeAux(string filename, Mesh *mesh,
                         vector<DOFVector<double>*> vecs,
                         bool writeParallel,
-			Cpsformat cps,
+			Cpsformat::Value cps,
 			string dataformat,
-			bool writeMacro)
+			Macroformat::Value writeMacro)
       {
         FUNCNAME("Arh3Writer::detail::writeAux()");
 	
@@ -404,7 +440,7 @@ namespace AMDiS { namespace io {
 	vector<std::set<DegreeOfFreedom> > visited(sortedFeSpaces.size());
 	pair<std::set<DegreeOfFreedom>::iterator,bool> ret;
         //file header information 
-        int headerLen = writeHeader(file, mesh, vecs, sortedFeSpaces, cps, dataformat);
+        int headerLen = writeHeader(file, mesh, vecs, sortedFeSpaces, cps, dataformat, writeMacro);
     
         //macro elements information
         MeshStructure elementStructure;
@@ -528,8 +564,10 @@ namespace AMDiS { namespace io {
 	TEST_EXIT(macroSize.size() == (unsigned)mesh->getNumberOfMacros())("Should not happen.\n");
 	//reset the macro positions in file
 	setMacrosPos(file, headerLen, macroSize);
-	if (writeMacro)
-	  setMacroFile(file, headerLen, mesh);
+	
+	if (writeMacro == Macroformat::THIS)
+	  setMacroFile(file, headerLen, mesh, writeMacro);
+	
         file.close();
         MSG("ARH file written to: %s\n", filename.c_str());
       }
@@ -553,18 +591,22 @@ namespace AMDiS { namespace io {
 	file.write(reinterpret_cast<char*>(&startPos), 4);
       }
       
-      void setMacroFile(std::ofstream& file, int headerLen, Mesh* mesh)
+      void setMacroFile(std::ofstream& file, int headerLen, Mesh* mesh, Macroformat::Value writeMacro)
       {
+	FUNCNAME("setMacroFile()");
+	
+	TEST_EXIT(writeMacro == Macroformat::THIS)
+	  ("This function should only be called under Macroformat::THIS.\n");
+	
 	string macroFilename = "", perFilename = "";
 	string macroData = "", periodicData = "";
 	
 	Parameters::get(mesh->getName() + "->macro file name", macroFilename);
 	Parameters::get(mesh->getName() + "->periodic file", perFilename);
+	bool hasPeriodic = perFilename.length();
 	
-	if (!macroFilename.length()) {
-	  WARNING("macro file not found.\n");
+	if (!macroFilename.length())
 	  return;
-	}
 	
 	// write macro file to the end
 	readFileToString(macroFilename, macroData);
@@ -573,24 +615,22 @@ namespace AMDiS { namespace io {
 	file.write(macroData.c_str(), macroData.length());
 	
 	// write periodic file to the end
-	if (perFilename.length()) {
+	if (hasPeriodic) {
 	  readFileToString(perFilename, periodicData);
 	  perPos = file.tellp();
 	  file.write(periodicData.c_str(), periodicData.length());
 	}
 	
 	// update macroFile_nl
-	uint32_t macroFile_nl = perFilename.length() ? 27 : 13;
-	file.seekp(headerLen - 4);
-	file.write(reinterpret_cast<char*>(&macroFile_nl), 4);
-	file << "this:" << macroPos;
-	if (perFilename.length())
-	  file << ";this:" << perPos;
-	
-	// update headerLen
-	headerLen += macroFile_nl;
-	file.seekp(6);
-	file.write(reinterpret_cast<char*>(&headerLen), 4);
+	int offset = hasPeriodic ? 27 : 13;
+	file.seekp(headerLen - offset);
+	
+	file.write("this:", 5);
+	file.write(reinterpret_cast<char*>(&macroPos), 8);
+	if (hasPeriodic) {
+	  file.write(";this:", 6);
+	  file.write(reinterpret_cast<char*>(&perPos), 8);
+	}
       }
       
       void readFileToString(std::string filename, std::string& data)
@@ -606,7 +646,7 @@ namespace AMDiS { namespace io {
 				    MeshStructure &code,
 				    vector<vector<double> >& values,
                                     map<const FiniteElemSpace*, vector<int> >& feSpaces,
-				    Cpsformat cps,
+				    Cpsformat::Value cps,
 				    string dataformat)
       {
 	stringstream dataStream(ios::out | ios::in | ios::binary);
@@ -640,13 +680,13 @@ namespace AMDiS { namespace io {
 #ifdef HAVE_COMPRESSION
 	switch(cps)
 	{
-	  case ZLIB: 
+	  case Cpsformat::ZLIB: 
 	    in.push(boost::iostreams::zlib_compressor());
 	    break;
-	  case BZIP2:
+	  case Cpsformat::BZIP2:
 	    in.push(boost::iostreams::bzip2_compressor());
 	    break;
-	  case NONE:
+	  case Cpsformat::NONE:
 	    break;
 	  default:
 	    MSG("NOT correct compression flag.\n");
diff --git a/AMDiS/src/io/detail/Arh3Writer.h b/AMDiS/src/io/detail/Arh3Writer.h
index fdc3607772f7134421b23d2b9e3033bc7e722905..66f003e8cf3c756f23a59a3920d96ccc920c8281 100644
--- a/AMDiS/src/io/detail/Arh3Writer.h
+++ b/AMDiS/src/io/detail/Arh3Writer.h
@@ -13,11 +13,23 @@ namespace AMDiS { namespace io {
 
   namespace Arh3Writer
   {
-    typedef enum{
-        NONE = 0,
-	ZLIB = 1,
-	BZIP2 = 2
-    } Cpsformat;
+    namespace Cpsformat
+    {
+      typedef enum{
+	  NONE = 0, // no compression
+	  ZLIB = 1, // zlib compression
+	  BZIP2 = 2 // bzip2 compression
+      } Value;
+    };
+    
+    namespace Macroformat
+    {
+      typedef enum{
+	  NONE = 0, 		// no macro
+	  PT_MACROFILE = 1, 	// pointer to macro file
+	  THIS = 2		// pointer to this file, at the end of this file
+      } Value;
+    };
     
     typedef enum{SI08, SI16, SI32, SI64, UI08, UI16, UI32, UI64, SF32, SF64} Valformat;
     
@@ -42,9 +54,9 @@ namespace AMDiS { namespace io {
                       DOFVector<double>* vec1 = NULL,
                       DOFVector<double>* vec2 = NULL,
 		      bool writeParallel = true,
-		      Cpsformat cps = NONE,
+		      Cpsformat::Value cps = Cpsformat::NONE,
 		      std::string dataformat = "SF64",
-		      bool writeMacro = false);
+		      Macroformat::Value writeMacro = Macroformat::NONE);
     
       /**
        * \ingroup Output
@@ -70,15 +82,15 @@ namespace AMDiS { namespace io {
 		  Mesh* mesh, 
 		  std::vector<DOFVector<double>*> vecs,
 		  bool writeParallel = true,
-		  Cpsformat cps = NONE,
+		  Cpsformat::Value cps = Cpsformat::NONE,
 		  std::string dataformat = "SF64",
-		  bool writeMacro = false);
+		  Macroformat::Value writeMacro = Macroformat::NONE);
 
        void writeAux(std::string filename, Mesh *mesh,
 		       std::vector<DOFVector<double>*> vecs,
-		       bool writeParallel, Cpsformat cps,
+		       bool writeParallel, Cpsformat::Value cps,
 		       std::string dataformat,
-		       bool writeMacro = false);
+		       Macroformat::Value writeMacro = Macroformat::NONE);
 
        ///\return the size of the macro block in file
        std::pair<int, int> writeMacroElement(std::ofstream &file,
@@ -86,7 +98,7 @@ namespace AMDiS { namespace io {
                                   std::vector<std::vector<double> >& values,
                                   std::map<const FiniteElemSpace*, 
 				  std::vector<int> >& feSpaces, 
-				  Cpsformat cps, std::string dataformat);
+				  Cpsformat::Value cps, std::string dataformat);
        
        int writeValues(std::stringstream& file,
 		       std::string dataformat, 
@@ -100,15 +112,19 @@ namespace AMDiS { namespace io {
                             std::vector<DOFVector<double>*> vecs,
                             std::map<const FiniteElemSpace*, 
 			    std::vector<int> >& feSpaces, 
-			    Cpsformat cps, 
-			    std::string dataformat);    
+			    Cpsformat::Value cps, 
+			    std::string dataformat,
+			    Macroformat::Value writeMacro);    
        
        ///internal method, don't call
        void setMacrosPos(std::ofstream& file, int headerLen,
 	                    std::vector<std::pair<int, int> >& macroSize);  
        
        ///internal method, don't call
-       void setMacroFile(std::ofstream& file, int headerLen, Mesh* mesh);
+       void setMacroFile(std::ofstream& file, 
+			 int headerLen, 
+			 Mesh* mesh,
+			 Macroformat::Value writeMacro);  
        
        void readFileToString(std::string filename, std::string& data);
        
@@ -123,7 +139,7 @@ namespace AMDiS { namespace io {
        void writeParallelFile(std::string filename,
 			      Mesh* mesh,
 			      bool createSubDir,
-			      bool writeMacro = true);
+			      Macroformat::Value writeMacro = Macroformat::NONE);
 #endif
     }//end namespace detail
   } // end namespace Arh3Writer