diff --git a/FunctionSpace/BasisHierarchical0From.cpp b/FunctionSpace/BasisHierarchical0From.cpp
index c6290335c3e95d65a8354aec4e29f0354221a903..27fd1a3cadbdf6600974cfb66d5a84cd38b6ef1b 100644
--- a/FunctionSpace/BasisHierarchical0From.cpp
+++ b/FunctionSpace/BasisHierarchical0From.cpp
@@ -25,7 +25,7 @@ BasisHierarchical0From::~BasisHierarchical0From(void){
   if(hasGrad){
     for(unsigned int i = 0; i < nRefSpace; i++){
       for(unsigned int j = 0; j < nFunction; j++)
-	delete grad[i][j];
+        delete grad[i][j];
 
       delete[] grad[i];
     }
diff --git a/FunctionSpace/BasisLagrange.cpp b/FunctionSpace/BasisLagrange.cpp
index 4475930788f60030b43473a894e1dd6e178ea01e..1b8525aaf68d7666b3cdef87a4b1b1ca1780c8a1 100644
--- a/FunctionSpace/BasisLagrange.cpp
+++ b/FunctionSpace/BasisLagrange.cpp
@@ -1,6 +1,8 @@
 #include "Exception.h"
 #include "BasisLagrange.h"
 
+using namespace std;
+
 BasisLagrange::BasisLagrange(void){
   scalar = true;
 }
@@ -10,30 +12,40 @@ BasisLagrange::~BasisLagrange(void){
 
 unsigned int BasisLagrange::
 getNOrientation(void) const{
-  throw Exception("BasisLagrange::Not Implemented");
+  return refSpace->getNPermutation();
 }
 
 unsigned int BasisLagrange::
 getOrientation(const MElement& element) const{
-  throw Exception("BasisLagrange::Not Implemented");
+  return refSpace->getPermutation(element);
 }
 
 fullMatrix<double>* BasisLagrange::
 getFunctions(const MElement& element,
-	     double u, double v, double w) const{
-  throw Exception("BasisLagrange::Not Implemented");
-}
+             double u, double v, double w) const{
 
-fullMatrix<double>* BasisLagrange::getFunctions(unsigned int orientation,
-						double u, double v, double w) const{
+  // Fill Matrix //
+  fullMatrix<double> tmp;
+  fullMatrix<double> point(1, 3);
+  point(0, 0) = u;
+  point(0, 1) = v;
+  point(0, 2) = w;
 
-  throw Exception("BasisLagrange::Not Implemented");
-  /*
-  // Alloc Memory //
-  fullMatrix<double>  tmp(nFunction, 1);
-  fullMatrix<double>* values = new fullMatrix<double>(nFunction, 1);
+  lBasis->f(point, tmp);
+
+  // Transpose 'tmp': otherwise not coherent with df !!
+  fullMatrix<double> values = tmp.transpose();
+
+  // Get Inorder & Return //
+  return inorder(refSpace->getPermutation(element), values);
+}
+
+fullMatrix<double>* BasisLagrange::
+getFunctions(unsigned int orientation,
+             double u, double v, double w) const{
 
   // Fill Matrix //
+  fullMatrix<double> tmp;
   fullMatrix<double> point(1, 3);
   point(0, 0) = u;
   point(0, 1) = v;
@@ -41,18 +53,19 @@ fullMatrix<double>* BasisLagrange::getFunctions(unsigned int orientation,
 
   lBasis->f(point, tmp);
 
-  *values = tmp.transpose(); // Otherwise not coherent with df !!
+  // Transpose 'tmp': otherwise not coherent with df !!
+  fullMatrix<double> values = tmp.transpose();
 
-  // Return //
-  return values;
-  */
+  // Get Inorder & Return //
+  return inorder(orientation, values);
 }
 
 void BasisLagrange::preEvaluateFunctions(const fullMatrix<double>& point) const{
   throw Exception("BasisLagrange::Not Implemented");
 }
 
-void BasisLagrange::preEvaluateDerivatives(const fullMatrix<double>& point) const{
+void BasisLagrange::
+preEvaluateDerivatives(const fullMatrix<double>& point) const{
   throw Exception("BasisLagrange::Not Implemented");
 }
 
@@ -76,14 +89,14 @@ BasisLagrange::getPreEvaluatedDerivatives(unsigned int orientation) const{
   throw Exception("BasisLagrange::Not Implemented");
 }
 
-std::vector<double> BasisLagrange::
+vector<double> BasisLagrange::
 project(const MElement& element,
-	const std::vector<double>& coef,
-	const FunctionSpaceScalar& fSpace){
+        const vector<double>& coef,
+        const FunctionSpaceScalar& fSpace){
 
   // Init New Coefs //
   const unsigned int size = lPoint->size1();
-  std::vector<double> newCoef(size);
+  vector<double> newCoef(size);
 
   // Interpolation at Lagrange Points //
   for(unsigned int i = 0; i < size; i++){
@@ -93,22 +106,22 @@ project(const MElement& element,
     uvw(2) = (*lPoint)(i, 2);
 
     newCoef[i] = fSpace.interpolateInRefSpace(element,
-					      coef,
-					      uvw);
+                                              coef,
+                                              uvw);
   }
 
   // Return ;
   return newCoef;
 }
 
-std::vector<fullVector<double> > BasisLagrange::
+vector<fullVector<double> > BasisLagrange::
 project(const MElement& element,
-	const std::vector<double>& coef,
-	const FunctionSpaceVector& fSpace){
+        const vector<double>& coef,
+        const FunctionSpaceVector& fSpace){
 
   // Init New Coefs //
   const unsigned int size = lPoint->size1();
-  std::vector<fullVector<double> > newCoef(size);
+  vector<fullVector<double> > newCoef(size);
 
   // Interpolation at Lagrange Points //
   for(unsigned int i = 0; i < size; i++){
@@ -118,10 +131,32 @@ project(const MElement& element,
     uvw(2) = (*lPoint)(i, 2);
 
     newCoef[i] = fSpace.interpolateInRefSpace(element,
-					      coef,
-					      uvw);
+                                              coef,
+                                              uvw);
   }
 
   // Return ;
   return newCoef;
 }
+
+fullMatrix<double>* BasisLagrange::inorder(unsigned int orientation,
+                                           fullMatrix<double>& mat) const{
+  // Matrix Size //
+  const int nRow = mat.size1();
+  const int nCol = mat.size2();
+
+  // Order //
+  const vector<unsigned int>* order =
+    refSpace->getAllLagrangeNode()[orientation];
+
+  // Alloc new matrix //
+  fullMatrix<double>* ret = new fullMatrix<double>(nRow, nCol);
+
+  // Populate //
+  for(int i = 0; i < nRow; i++)
+    for(int j = 0; j < nCol; j++)
+      (*ret)(i, j) = mat((*order)[i], j);
+
+  // Return //
+  return ret;
+}
diff --git a/FunctionSpace/BasisLagrange.h b/FunctionSpace/BasisLagrange.h
index eec1c84aeea482ed33aa97e0ee794e6c4dc47afc..37d85d31e34d7df1569df87f830fd580055fa32d 100644
--- a/FunctionSpace/BasisLagrange.h
+++ b/FunctionSpace/BasisLagrange.h
@@ -6,6 +6,7 @@
 #include "FunctionSpaceVector.h"
 #include "fullMatrix.h"
 #include "polynomialBasis.h"
+#include "ReferenceSpaceLagrange.h"
 
 /**
    @interface BasisLagrange
@@ -25,8 +26,9 @@
 
 class BasisLagrange: public BasisLocal{
  protected:
-  polynomialBasis*    lBasis; // Lagrange Basis
-  fullMatrix<double>* lPoint; // Lagrange Points
+  polynomialBasis*        lBasis;   // Lagrange Basis
+  fullMatrix<double>*     lPoint;   // Lagrange Points
+  ReferenceSpaceLagrange* refSpace; // Reference Space
 
  public:
   virtual ~BasisLagrange(void);
@@ -35,10 +37,10 @@ class BasisLagrange: public BasisLocal{
   virtual unsigned int getOrientation(const MElement& element) const;
 
   virtual fullMatrix<double>* getFunctions(const MElement& element,
-					   double u, double v, double w) const;
+                                           double u, double v, double w) const;
 
   virtual fullMatrix<double>* getFunctions(unsigned int orientation,
-					   double u, double v, double w) const;
+                                           double u, double v, double w) const;
 
   virtual void preEvaluateFunctions(const fullMatrix<double>& point) const;
   virtual void preEvaluateDerivatives(const fullMatrix<double>& point) const;
@@ -60,16 +62,19 @@ class BasisLagrange: public BasisLocal{
 
   std::vector<double>
     project(const MElement& element,
-	    const std::vector<double>& coef,
-	    const FunctionSpaceScalar& fSpace);
+            const std::vector<double>& coef,
+            const FunctionSpaceScalar& fSpace);
 
   std::vector<fullVector<double> >
     project(const MElement& element,
-	    const std::vector<double>& coef,
-	    const FunctionSpaceVector& fSpace);
+            const std::vector<double>& coef,
+            const FunctionSpaceVector& fSpace);
 
  protected:
   BasisLagrange(void);
+
+  fullMatrix<double>* inorder(unsigned int orientation,
+                              fullMatrix<double>& mat) const;
 };
 
 
diff --git a/FunctionSpace/CMakeLists.txt b/FunctionSpace/CMakeLists.txt
index 76ac483c8f5cc4ced879c5ff6f89b993514f2088..4b8ac0a8edf2aa2f2a264ca0fb373727db993eeb 100644
--- a/FunctionSpace/CMakeLists.txt
+++ b/FunctionSpace/CMakeLists.txt
@@ -13,6 +13,9 @@ set(SRC
   QuadReferenceSpace.cpp
   TetReferenceSpace.cpp
 
+  ReferenceSpaceLagrange.cpp
+  TriLagrangeReferenceSpace.cpp
+
   Basis.cpp
   BasisLocal.cpp
   BasisGenerator.cpp
diff --git a/FunctionSpace/ReferenceSpace.cpp b/FunctionSpace/ReferenceSpace.cpp
index 0a89ba922ba471a3731877f1d1eee98a6d2c6b27..bc7c8c21f52c41961fe72b8fb745a9e4874a6310 100644
--- a/FunctionSpace/ReferenceSpace.cpp
+++ b/FunctionSpace/ReferenceSpace.cpp
@@ -158,17 +158,17 @@ void ReferenceSpace::populate(node* pTreeRoot){
       pTreeRoot->next[i].last[depth] = nextLast;
 
       for(unsigned int j = 0; j < depth; j++)
-	pTreeRoot->next[i].last[j] = pTreeRoot->last[j];
+        pTreeRoot->next[i].last[j] = pTreeRoot->last[j];
 
       // Possibilities of child node
       pTreeRoot->next[i].number   = nextNumber;
       pTreeRoot->next[i].possible = new unsigned int[nextNumber];
 
       for(unsigned int j = 0; j < nextNumber; j++){
-	  if(pTreeRoot->possible[j] == nextLast)
-	    offset = 1;
+        if(pTreeRoot->possible[j] == nextLast)
+          offset = 1;
 
-	  pTreeRoot->next[i].possible[j] = pTreeRoot->possible[j + offset];
+        pTreeRoot->next[i].possible[j] = pTreeRoot->possible[j + offset];
       }
 
       // Populate each child node (until a leaf is found)
@@ -199,8 +199,8 @@ void ReferenceSpace::getEdge(void){
 
     for(unsigned int i = 0; i < nEdge; i++)
       (*tmp)[i] = inOrder(p,
-			  refEdge[i][0],
-			  refEdge[i][1]);
+                          refEdge[i][0],
+                          refEdge[i][1]);
     (*edge)[p] = tmp;
   }
 }
@@ -214,9 +214,9 @@ void ReferenceSpace::getTriFace(void){
 
     for(unsigned int i = 0; i < nFace; i++)
       (*tmp)[i] = inOrder(p,
-			  refFace[i][0],
-			  refFace[i][1],
-			  refFace[i][2]);
+                          refFace[i][0],
+                          refFace[i][1],
+                          refFace[i][2]);
     (*face)[p] = tmp;
   }
 }
@@ -230,9 +230,9 @@ void ReferenceSpace::getQuaFace(void){
 
     for(unsigned int i = 0; i < nFace; i++)
       (*tmp)[i] = inOrder(p,
-			  refFace[i][0],
-			  refFace[i][1],
-			  refFace[i][2],
+                          refFace[i][0],
+                          refFace[i][1],
+                          refFace[i][2],
                           refFace[i][3]);
     (*face)[p] = tmp;
   }
@@ -240,8 +240,8 @@ void ReferenceSpace::getQuaFace(void){
 
 const vector<unsigned int>* ReferenceSpace::
 inOrder(unsigned int permutation,
-	unsigned int a,
-	unsigned int b){
+        unsigned int a,
+        unsigned int b){
 
   unsigned int v;
   unsigned int k = 0;
@@ -262,9 +262,9 @@ inOrder(unsigned int permutation,
 
 const std::vector<unsigned int>* ReferenceSpace::
 inOrder(unsigned int permutation,
-	unsigned int a,
-	unsigned int b,
-	unsigned int c){
+        unsigned int a,
+        unsigned int b,
+        unsigned int c){
 
   unsigned int v;
   unsigned int k = 0;
@@ -285,9 +285,9 @@ inOrder(unsigned int permutation,
 
 const std::vector<unsigned int>* ReferenceSpace::
 inOrder(unsigned int permutation,
-	unsigned int a,
-	unsigned int b,
-	unsigned int c,
+        unsigned int a,
+        unsigned int b,
+        unsigned int c,
         unsigned int d){
 
   unsigned int opposite;
@@ -354,13 +354,13 @@ unsigned int ReferenceSpace::getPermutation(const MElement& elem) const{
 
   catch(...){
     throw Exception("Cannot Find Reference Space for Element %d",
-		    element.getNum());
+                    element.getNum());
   }
 }
 
 unsigned int ReferenceSpace::treeLookup(const node* root,
-					vector<pair<unsigned int, MVertex*> >&
-					sortedArray){
+                                        vector<pair<unsigned int, MVertex*> >&
+                                        sortedArray){
   // Temp Data //
   unsigned int choice;
   unsigned int i;
@@ -414,8 +414,8 @@ string ReferenceSpace::toString(void) const{
 
     for(unsigned int j = 0; j < nEdge; j++)
       stream << "      -- ["
-	     << edge->at(i)->at(j)->at(0) << ", "
-	     << edge->at(i)->at(j)->at(1) << "]" << endl;
+             << edge->at(i)->at(j)->at(0) << ", "
+             << edge->at(i)->at(j)->at(1) << "]" << endl;
   }
 
   stream << "Faces Permutations:" << endl;
@@ -425,9 +425,9 @@ string ReferenceSpace::toString(void) const{
 
     for(unsigned int j = 0; j < nFace; j++)
       stream << "      -- ["
-	     << face->at(i)->at(j)->at(0) << ", "
-	     << face->at(i)->at(j)->at(1) << ", "
-	     << face->at(i)->at(j)->at(2) << "]" << endl;
+             << face->at(i)->at(j)->at(0) << ", "
+             << face->at(i)->at(j)->at(1) << ", "
+             << face->at(i)->at(j)->at(2) << "]" << endl;
   }
 
   return stream.str();
@@ -449,3 +449,16 @@ string ReferenceSpace::toString(const node* node) const{
 
   return stream.str();
 }
+
+string ReferenceSpace::toLatex(void) const{
+  stringstream stream;
+
+  stream << "\\documentclass{article}" << endl << endl
+         << "\\begin{document}"        << endl
+
+         << "\texttt{toLatex} not implemented" << endl
+
+         << "\\end{document}"          << endl;
+
+  return stream.str();
+}
diff --git a/FunctionSpace/ReferenceSpace.h b/FunctionSpace/ReferenceSpace.h
index cf8f78a578cf470d9ad037af2f4a46b5e383d90e..f376d9f2ee06646ccadb79e1fdcd341fbc760a33 100644
--- a/FunctionSpace/ReferenceSpace.h
+++ b/FunctionSpace/ReferenceSpace.h
@@ -67,15 +67,15 @@ class ReferenceSpace{
 
   unsigned int getPermutation(const MElement& element) const;
 
-  std::vector<const std::vector<const std::vector<unsigned int>*>*>&
+  const std::vector<const std::vector<const std::vector<unsigned int>*>*>&
     getAllEdge(void) const;
 
-  std::vector<const std::vector<const std::vector<unsigned int>*>*>&
+  const std::vector<const std::vector<const std::vector<unsigned int>*>*>&
     getAllFace(void) const ;
 
-  std::string toString(void) const;
+  virtual std::string toString(void) const;
 
-  virtual std::string toLatex(void) const = 0;
+  virtual std::string toLatex(void) const;
 
  protected:
   ReferenceSpace(void);
@@ -93,26 +93,26 @@ class ReferenceSpace{
   void getQuaFace(void);
 
   const std::vector<unsigned int>* inOrder(unsigned int permutation,
-					   unsigned int a,
-					   unsigned int b);
+                                           unsigned int a,
+                                           unsigned int b);
 
   const std::vector<unsigned int>* inOrder(unsigned int permutation,
-					   unsigned int a,
-					   unsigned int b,
-					   unsigned int c);
+                                           unsigned int a,
+                                           unsigned int b,
+                                           unsigned int c);
 
   const std::vector<unsigned int>* inOrder(unsigned int permutation,
-					   unsigned int a,
-					   unsigned int b,
-					   unsigned int c,
+                                           unsigned int a,
+                                           unsigned int b,
+                                           unsigned int c,
                                            unsigned int d);
 
   static bool sortPredicate(const std::pair<unsigned int, MVertex*>& a,
-			    const std::pair<unsigned int, MVertex*>& b);
+                            const std::pair<unsigned int, MVertex*>& b);
 
   static unsigned int treeLookup(const node* root,
-				 std::vector<std::pair<unsigned int, MVertex*> >&
-				 sortedArray);
+                                 std::vector<std::pair<unsigned int, MVertex*> >&
+                                 sortedArray);
 
   std::string toString(const node* node) const;
 };
@@ -188,13 +188,13 @@ ReferenceSpace::getNPermutation(void) const{
 }
 
 inline
-std::vector<const std::vector<const std::vector<unsigned int>*>*>&
+const std::vector<const std::vector<const std::vector<unsigned int>*>*>&
 ReferenceSpace::getAllEdge(void) const{
   return *edge;
 }
 
 inline
-std::vector<const std::vector<const std::vector<unsigned int>*>*>&
+const std::vector<const std::vector<const std::vector<unsigned int>*>*>&
 ReferenceSpace::getAllFace(void) const{
   return *face;
 }
@@ -202,7 +202,7 @@ ReferenceSpace::getAllFace(void) const{
 inline
 bool
 ReferenceSpace::sortPredicate(const std::pair<unsigned int, MVertex*>& a,
-			      const std::pair<unsigned int, MVertex*>& b){
+                              const std::pair<unsigned int, MVertex*>& b){
   return a.second->getNum() < b.second->getNum();
 }
 
diff --git a/FunctionSpace/ReferenceSpaceLagrange.cpp b/FunctionSpace/ReferenceSpaceLagrange.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4a5ad4ec4f89670377e75c899fcab4d5cdc8891d
--- /dev/null
+++ b/FunctionSpace/ReferenceSpaceLagrange.cpp
@@ -0,0 +1,129 @@
+#include <sstream>
+#include "ReferenceSpaceLagrange.h"
+
+using namespace std;
+
+ReferenceSpaceLagrange::ReferenceSpaceLagrange(void){
+  // Init to NULL //
+  node = NULL;
+}
+
+ReferenceSpaceLagrange::~ReferenceSpaceLagrange(void){
+  // If 'node' allocated //
+  if(node){
+    for(unsigned int p = 0; p < nPerm; p++)
+      delete (*node)[p];
+
+    delete node;
+  }
+}
+
+void ReferenceSpaceLagrange::getLagrangeNode(void){
+  // Alloc //
+  vector<unsigned int>* tmp;
+  node = new vector<const vector<unsigned int>*>(nPerm);
+
+  // Populate //
+  for(unsigned int p = 0; p < nPerm; p++){
+    // Alloc Temp //
+    tmp = new vector<unsigned int>(nNode);
+
+    // Vertex based node
+    for(unsigned int i = 0; i < nVertex; i++)
+      (*tmp)[i] = i;
+
+    // Edge based node
+    for(unsigned int e = 0; e < nEdge; e++)
+      edgeSeq(*tmp,
+              nVertex + nNodePerEdge *  e,
+              nVertex + nNodePerEdge *  e,
+              nVertex + nNodePerEdge * (e + 1),
+              refEdge[e],
+              *(*(*edge)[p])[e]);
+
+    // Face based node
+    for(unsigned int f = 0; f < nFace; f++)
+      faceSeq(*tmp,
+              nVertex + nNodePerEdge * nEdge + nNodePerFace *  f,
+              nVertex + nNodePerEdge * nEdge + nNodePerFace *  f,
+              nVertex + nNodePerEdge * nEdge + nNodePerFace * (f + 1),
+              refFace[f],
+              *(*(*face)[p])[f],
+              nNodePerEdge);
+
+    // Insert in node
+    (*node)[p] = tmp;
+  }
+}
+
+void ReferenceSpaceLagrange::edgeSeq(vector<unsigned int>& vec,
+                                     unsigned int  startIdx,
+                                     unsigned int  startVal,
+                                     unsigned int  stopVal,
+                                     unsigned int* refEdge,
+                                     const vector<unsigned int>& edge){
+
+  // Is reverted ? //
+  const bool isRevert = (edge[0] != refEdge[0]);
+
+  // Index //
+  unsigned int val = startVal;
+  unsigned int idx;
+
+  // Depending if edge is reverted ...
+  if(isRevert)
+    idx = startIdx + stopVal - startVal - 1;
+
+  else
+    idx = startIdx;
+
+  // Populate //
+  for(; val < stopVal; val++){
+    vec[idx] = val;
+
+    if(isRevert)
+      idx--;
+
+    else
+      idx++;
+  }
+}
+
+void ReferenceSpaceLagrange::faceSeq(vector<unsigned int>& vec,
+                                     unsigned int  startIdx,
+                                     unsigned int  startVal,
+                                     unsigned int  stopVal,
+                                     unsigned int* refFace,
+                                     const vector<unsigned int>& face,
+                                     unsigned int  nNodePerEdge){
+  // Index //
+  unsigned int val = startVal;
+  unsigned int idx = startIdx;
+
+  // Populate //
+  for(; val < stopVal; val++){
+    vec[idx] = val;
+    idx++;
+  }
+}
+
+string ReferenceSpaceLagrange::toString(void) const{
+  const unsigned int nNodeMinus = nNode - 1;
+  stringstream       stream;
+
+  stream << ReferenceSpace::toString();
+
+  stream << "Lagrange Nodes Permutations:" << endl;
+
+  for(unsigned int i = 0; i < nPerm; i++){
+    stream << "  * RefSpace #" << i + 1 << ":" << endl
+           << "      -- [";
+
+    for(unsigned int j = 0; j < nNodeMinus; j++)
+      stream << node->at(i)->at(j) << ", ";
+
+    stream << node->at(i)->at(nNodeMinus) << "]" << endl;
+  }
+
+  return stream.str();
+}
diff --git a/FunctionSpace/ReferenceSpaceLagrange.h b/FunctionSpace/ReferenceSpaceLagrange.h
new file mode 100644
index 0000000000000000000000000000000000000000..0fd71a79127609d6b361a6bca854963dfbf0f792
--- /dev/null
+++ b/FunctionSpace/ReferenceSpaceLagrange.h
@@ -0,0 +1,76 @@
+#ifndef _REFERENCESPACELAGRANGE_H_
+#define _REFERENCESPACELAGRANGE_H_
+
+#include "ReferenceSpace.h"
+
+/**
+   @interface ReferenceSpaceLagrange
+   @brief Base interface for all Lagrange ReferenceSpace%s
+
+   This class is a particular ReferenceSpace for
+   @em Lagrange Basis.@n
+
+   This class adds the notion of Lagrange points and
+   their permutations depending on the orientation
+   of a MElement.@n
+
+   Lagrange points are ordered in a way such that
+   Lagrange function must be taken in that order in order
+   to have an oriented basis.@n
+
+   Because the number of Lagrange Points depends on
+   the the order of the Lagrange Basis,
+   a ReferenceSpaceLagrange shall depend on the order.
+ */
+
+class ReferenceSpaceLagrange: public ReferenceSpace{
+ protected:
+  // Lagrange Node Permutation //
+  unsigned int nNode;
+  unsigned int nNodePerEdge;
+  unsigned int nNodePerFace;
+  unsigned int nNodePerCell;
+
+  std::vector<const std::vector<unsigned int>*>* node;
+
+ public:
+  virtual ~ReferenceSpaceLagrange(void);
+
+  const std::vector<const std::vector<unsigned int>*>&
+    getAllLagrangeNode(void) const;
+
+  virtual std::string toString(void) const;
+
+ protected:
+  ReferenceSpaceLagrange(void);
+
+  void getLagrangeNode(void);
+
+  static void edgeSeq(std::vector<unsigned int>& vec,
+                      unsigned int  startIdx,
+                      unsigned int  startVal,
+                      unsigned int  stopVal,
+                      unsigned int* refEdge,
+                      const std::vector<unsigned int>& edge);
+
+  static void faceSeq(std::vector<unsigned int>& vec,
+                      unsigned int  startIdx,
+                      unsigned int  startVal,
+                      unsigned int  stopVal,
+                      unsigned int* refFace,
+                      const std::vector<unsigned int>& face,
+                      unsigned int  nNodePerEdge);
+};
+
+
+/////////////////////
+// Inline Function //
+/////////////////////
+
+inline
+const std::vector<const std::vector<unsigned int>*>&
+ReferenceSpaceLagrange::getAllLagrangeNode(void) const{
+  return *node;
+}
+
+#endif
diff --git a/FunctionSpace/TriLagrangeBasis.cpp b/FunctionSpace/TriLagrangeBasis.cpp
index 3da698d557160f36b788150c4c4355dda44378ed..ac249adab14292048174793270253392aac6336b 100644
--- a/FunctionSpace/TriLagrangeBasis.cpp
+++ b/FunctionSpace/TriLagrangeBasis.cpp
@@ -1,6 +1,9 @@
 #include "Exception.h"
 #include "TriLagrangeBasis.h"
 #include "pointsGenerators.h"
+#include "TriLagrangeReferenceSpace.h"
+
+#include <iostream>
 
 TriLagrangeBasis::TriLagrangeBasis(unsigned int order){
   // If order 0 (Nedelec): use order 1
@@ -25,11 +28,16 @@ TriLagrangeBasis::TriLagrangeBasis(unsigned int order){
   // Init Lagrange Point //
   lPoint = new fullMatrix<double>
     (gmshGeneratePointsTriangle(order, false));
+
+  // ReferenceSpace //
+  refSpace = new TriLagrangeReferenceSpace(order);
+  std::cout << refSpace->toString() << std::endl;
 }
 
 TriLagrangeBasis::~TriLagrangeBasis(void){
   delete lBasis;
   delete lPoint;
+  delete refSpace;
 }
 
 unsigned int TriLagrangeBasis::getTag(unsigned int order){
diff --git a/FunctionSpace/TriReferenceSpace.cpp b/FunctionSpace/TriReferenceSpace.cpp
index bb9f03a24a55d2c90b0a96117d3b68bce6e6ecda..c56567d901c6b866cf6b39e3c477f5321afb5294 100644
--- a/FunctionSpace/TriReferenceSpace.cpp
+++ b/FunctionSpace/TriReferenceSpace.cpp
@@ -50,30 +50,30 @@ string TriReferenceSpace::toLatex(void) const{
 
   stream << "\\documentclass{article}" << endl << endl
 
-	 << "\\usepackage{longtable}"  << endl
-	 << "\\usepackage{tikz}"       << endl
-	 << "\\usetikzlibrary{arrows}" << endl << endl
+         << "\\usepackage{longtable}"  << endl
+         << "\\usepackage{tikz}"       << endl
+         << "\\usetikzlibrary{arrows}" << endl << endl
 
-	 << "\\begin{document}"                                   << endl
-	 << "\\tikzstyle{vertex} = [circle, fill = black!25]"     << endl
-	 << "\\tikzstyle{line}   = [draw, thick, black, -latex']" << endl << endl
+         << "\\begin{document}"                                   << endl
+         << "\\tikzstyle{vertex} = [circle, fill = black!25]"     << endl
+         << "\\tikzstyle{line}   = [draw, thick, black, -latex']" << endl << endl
 
-	 << "\\begin{longtable}{ccc}" << endl << endl;
+         << "\\begin{longtable}{ccc}" << endl << endl;
 
   for(unsigned int p = 0; p < nPerm; p++){
     stream << "\\begin{tikzpicture}" << endl
 
-	   << "\\node[vertex] (n0) at(0, 0) {$" << perm[p][0] << "$};" << endl
-	   << "\\node[vertex] (n1) at(3, 0) {$" << perm[p][1] << "$};" << endl
-	   << "\\node[vertex] (n2) at(0, 3) {$" << perm[p][2] << "$};" << endl
+           << "\\node[vertex] (n0) at(0, 0) {$" << perm[p][0] << "$};" << endl
+           << "\\node[vertex] (n1) at(3, 0) {$" << perm[p][1] << "$};" << endl
+           << "\\node[vertex] (n2) at(0, 3) {$" << perm[p][2] << "$};" << endl
            << endl;
 
     for(unsigned int i = 0; i < 3; i++)
       stream << "\\path[line]"
-	     << " (n" << (*(*(*edge)[p])[i])[0] << ")"
-	     << " -- "
-	     << " (n" << (*(*(*edge)[p])[i])[1] << ");"
-	     << endl;
+             << " (n" << (*(*(*edge)[p])[i])[0] << ")"
+             << " -- "
+             << " (n" << (*(*(*edge)[p])[i])[1] << ");"
+             << endl;
 
     if((p + 1) % 3)
       stream << "\\end{tikzpicture} & "        << endl << endl;
@@ -83,7 +83,7 @@ string TriReferenceSpace::toLatex(void) const{
   }
 
   stream << "\\end{longtable}" << endl
-	 << "\\end{document}"  << endl;
+         << "\\end{document}"  << endl;
 
   return stream.str();
 }