diff --git a/FunctionSpace/HexReferenceSpace.cpp b/FunctionSpace/HexReferenceSpace.cpp
index ce427cdd6076b7e3e05a1039e4a79528104e22c9..cc6806496a5605c0e9609007088153ca61d44da1 100644
--- a/FunctionSpace/HexReferenceSpace.cpp
+++ b/FunctionSpace/HexReferenceSpace.cpp
@@ -1,10 +1,26 @@
 #include <sstream>
+
 #include "HexReferenceSpace.h"
 #include "MHexahedron.h"
 
 using namespace std;
 
 HexReferenceSpace::HexReferenceSpace(void){
+  // Look if a serialized HexReferenceSpace is present in root //
+  // If it does, load it                                       //
+  // If not, create it and serialize it for an other time      //
+
+  try{
+    init(string("hex.refSpace"));
+  }
+
+  catch(std::exception& exception){
+    initHex();
+    serialize("hex.refSpace");
+  }
+}
+
+void HexReferenceSpace::initHex(void){
   // Vertex Definition //
   nVertex = 8;
 
diff --git a/FunctionSpace/HexReferenceSpace.h b/FunctionSpace/HexReferenceSpace.h
index bd03576f047eaa6c3092806564c7fd424cc7c406..28a0cccc1e5a9318958f20ed0a1a442bfeeee81c 100644
--- a/FunctionSpace/HexReferenceSpace.h
+++ b/FunctionSpace/HexReferenceSpace.h
@@ -17,6 +17,9 @@ class HexReferenceSpace: public ReferenceSpace{
   virtual ~HexReferenceSpace(void);
 
   virtual std::string toLatex(void) const;
+
+ private:
+  void initHex(void);
 };
 
 /**
diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp
index 1eeb3dec43983e65c2aebebef639742911aa6840..49a5669a496361621b7dea15212aa2c66f91cfa6 100644
--- a/FunctionSpace/ReferenceSpace.cpp
+++ b/FunctionSpace/ReferenceSpace.cpp
@@ -16,28 +16,7 @@ ReferenceSpace::ReferenceSpace(void){
 }
 
 ReferenceSpace::ReferenceSpace(const std::string& path){
-  // Read file //
-  // Open Stream
-  ifstream input;
-  input.exceptions(std::ifstream::failbit | std::ifstream::badbit);
-  input.open(path.c_str(), std::ifstream::binary);
-
-  // Get size of stream (go to stream end)
-  input.seekg(0, std::ifstream::end);
-  const size_t size = input.tellg();
-
-  // Reset stream possition
-  input.seekg(0, std::ifstream::beg);
-
-  // Alloc byte stream & Read file
-  char* stream = new char[size];
-  input.read(stream, size);
-
-  // Init from stream
-  init(stream);
-
-  // Free stream
-  delete[] stream;
+  init(path);
 }
 
 ReferenceSpace::~ReferenceSpace(void){
@@ -113,6 +92,7 @@ void ReferenceSpace::init(const char* stream){
   offset += sizeof(size_t);
 
   pTree = new PermutationTree(stream + offset);
+  cout << pTree->toString() << endl;
   offset += tSize;
 
   // RefSpace Node Id
@@ -125,8 +105,31 @@ void ReferenceSpace::init(const char* stream){
   // Oredered {Edge, Face} Node Idx
   offset += unserialize(stream + offset, orderedEdgeNodeIdx);
   offset += unserialize(stream + offset, orderedFaceNodeIdx);
+}
 
-  cout << offset << endl;
+void ReferenceSpace::init(const std::string& path){
+  // Read file //
+  // Open Stream
+  ifstream input;
+  input.exceptions(std::ifstream::failbit | std::ifstream::badbit);
+  input.open(path.c_str(), std::ifstream::binary);
+
+  // Get size of stream (go to stream end)
+  input.seekg(0, std::ifstream::end);
+  const size_t size = input.tellg();
+
+  // Reset stream possition
+  input.seekg(0, std::ifstream::beg);
+
+  // Alloc byte stream & Read file
+  char* stream = new char[size];
+  input.read(stream, size);
+
+  // Init from stream
+  init(stream);
+
+  // Free stream
+  delete[] stream;
 }
 
 void ReferenceSpace::
diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h
index 68c26a3717b9b974afb52450b3ba1ba8b3354dee..ac6600bcdcdf740f14b57ed3bf3ed5dfa5e20918 100644
--- a/FunctionSpace/ReferenceSpace.h
+++ b/FunctionSpace/ReferenceSpace.h
@@ -104,6 +104,7 @@ class ReferenceSpace{
 
   void init(void);
   void init(const char* stream);
+  void init(const std::string& path);
 
  private:
   void getOrderedEdge(void);
diff --git a/FunctionSpace/TriReferenceSpace.cpp b/FunctionSpace/TriReferenceSpace.cpp
index e7b9399f6233fca7e7fe6fd624c97650226e5414..449502e939f6151c430107db219082deb0f32f7d 100644
--- a/FunctionSpace/TriReferenceSpace.cpp
+++ b/FunctionSpace/TriReferenceSpace.cpp
@@ -1,10 +1,26 @@
 #include <sstream>
+
 #include "TriReferenceSpace.h"
 #include "MTriangle.h"
 
 using namespace std;
 
 TriReferenceSpace::TriReferenceSpace(void){
+  // Look if a serialized TriReferenceSpace is present in root //
+  // If it does, load it                                       //
+  // If not, create it and serialize it for an other time      //
+
+  try{
+    init(string("tri.refSpace"));
+  }
+
+  catch(std::exception& exception){
+    initTri();
+    serialize("tri.refSpace");
+  }
+}
+
+void TriReferenceSpace::initTri(void){
   // Vertex Definition //
   nVertex = 3;
 
diff --git a/FunctionSpace/TriReferenceSpace.h b/FunctionSpace/TriReferenceSpace.h
index 9f52b5d64eb9fe56dd5fff7e840c95d15bc77b25..86dafed6560caffb4e591e3e13827c64e1f771e7 100644
--- a/FunctionSpace/TriReferenceSpace.h
+++ b/FunctionSpace/TriReferenceSpace.h
@@ -17,6 +17,9 @@ class TriReferenceSpace: public ReferenceSpace{
   virtual ~TriReferenceSpace(void);
 
   virtual std::string toLatex(void) const;
+
+ private:
+  void initTri(void);
 };
 
 /**