diff --git a/FunctionSpace/HexNodeBasis.cpp b/FunctionSpace/HexNodeBasis.cpp
index 7f742391d5c09aa83a7642615737670c9899f96f..6e197f4dd48538221aa8f04fa60a5f53c6f77580 100644
--- a/FunctionSpace/HexNodeBasis.cpp
+++ b/FunctionSpace/HexNodeBasis.cpp
@@ -119,59 +119,51 @@ HexNodeBasis::HexNodeBasis(size_t order){
     basis[s][6] = new Polynomial(lagrange[6]);
     basis[s][7] = new Polynomial(lagrange[7]);
   }
-  /*
+
   // Edge Based //
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nVertex;
 
-  for(int l = 1; l < order; l++){
-    for(int e = 0; e < 12; e++){
-      (*basis)[i] = new Polynomial(
-        legendre[l].compose(lifting[edge1[e]] - lifting[edge2[e]]) *
-        (*(*basis)[edge1[e]] + *(*basis)[edge2[e]]));
+    for(size_t e = 0; e < 12; e++){
+      for(size_t l = 1; l < order; l++){
+        basis[s][i] =
+          new Polynomial(legendre[l].compose(lifting[edgeIdx[s][e][1]] -
+                                             lifting[edgeIdx[s][e][0]])
+                         *
+                         (lagrange[edgeIdx[s][e][0]] +
+                          lagrange[edgeIdx[s][e][1]]));
 
-      i++;
+        i++;
+      }
     }
   }
 
-
-  // Face Based (Preliminary) //
-  // Points definig Faces
-  const int face1[6] = {0, 3, 2, 1, 5, 4};
-  const int face2[6] = {1, 7, 6, 0, 6, 7};
-  const int face3[6] = {2, 6, 5, 4, 7, 3};
-  const int face4[6] = {3, 2, 1, 5, 4, 0};
-
-  // 'Xi' Functions
-  for(int f = 0; f < 6; f++)
-    xi[f]  = lifting[face1[f]] - lifting[face2[f]];
-
-  // 'Eta' Functions
-  for(int f = 0; f < 6; f++)
-    eta[f] = lifting[face1[f]] - lifting[face4[f]];
-
-  // 'Lambda' Functions
-  for(int f = 0; f < 6; f++)
-    lambda[f] =
-      *(*basis)[face1[f]] +
-      *(*basis)[face2[f]] +
-      *(*basis)[face3[f]] +
-      *(*basis)[face4[f]];
-
-
   // Face Based //
-  for(int l1 = 1; l1 < order; l1++){
-    for(int l2 = 1; l2 < order; l2++){
-      for(int f = 0; f < 6; f++){
-        (*basis)[i] = new Polynomial(
-          legendre[l1].compose(xi[f])  *
-          legendre[l2].compose(eta[f]) *
-          lambda[f]);
-
-        i++;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nVertex + nEdge;
+
+    for(size_t f = 0; f < 6; f++){
+      for(size_t l1 = 1; l1 < order; l1++){
+        for(size_t l2 = 1; l2 < order; l2++){
+          Polynomial sum =
+            lagrange[faceIdx[s][f][0]] +
+            lagrange[faceIdx[s][f][1]] +
+            lagrange[faceIdx[s][f][2]] +
+            lagrange[faceIdx[s][f][3]];
+
+          basis[s][i] =
+            new Polynomial(legendre[l1].compose(lifting[faceIdx[s][f][0]] -
+                                                lifting[faceIdx[s][f][1]])  *
+
+                           legendre[l2].compose(lifting[faceIdx[s][f][0]] -
+                                                lifting[faceIdx[s][f][3]])  *
+                           sum);
+          i++;
+        }
       }
     }
   }
 
-
   // Cell Based //
   Polynomial px = Polynomial(2, 1, 0, 0);
   Polynomial py = Polynomial(2, 0, 1, 0);
@@ -181,28 +173,50 @@ HexNodeBasis::HexNodeBasis(size_t order){
   py = py - Polynomial(1, 0, 0, 0);
   pz = pz - Polynomial(1, 0, 0, 0);
 
-  for(int l1 = 1; l1 < order; l1++){
-    for(int l2 = 1; l2 < order; l2++){
-      for(int l3 = 1; l3 < order; l3++){
-        (*basis)[i] =
-          new Polynomial(legendre[l1].compose(px) *
-                         legendre[l2].compose(py) *
-                         legendre[l3].compose(pz));
-
-        i++;
+  for(size_t s = 0; s < nRefSpace; s++){
+    size_t i = nVertex + nEdge + nFace;
+
+    for(size_t l1 = 1; l1 < order; l1++){
+      for(size_t l2 = 1; l2 < order; l2++){
+        for(size_t l3 = 1; l3 < order; l3++){
+          basis[s][i] =
+            new Polynomial(legendre[l1].compose(px) *
+                           legendre[l2].compose(py) *
+                           legendre[l3].compose(pz));
+
+          i++;
+        }
       }
     }
   }
 
+  // Mapping to Gmsh Quad //
+  // x = (u + 1) / 2
+  // y = (v + 1) / 2
+  //
+  // (x, y) = Zaglmayr Ref Quad
+  // (u, v) = Gmsh     Ref Quad
+
+  Polynomial  mapX(Polynomial(0.5, 1, 0, 0) +
+                   Polynomial(0.5, 0, 0, 0));
+
+  Polynomial  mapY(Polynomial(0.5, 0, 1, 0) +
+                   Polynomial(0.5, 0, 0, 0));
+
+  Polynomial  mapZ(Polynomial(0.5, 0, 0, 1) +
+                   Polynomial(0.5, 0, 0, 0));
+
+  for(size_t s = 0; s < nRefSpace; s++){
+    for(size_t i = 0; i < nFunction; i++){
+      Polynomial* tmp;
+      tmp = basis[s][i];
+      basis[s][i] = new Polynomial(tmp->compose(mapX, mapY, mapZ));
+      delete tmp;
+    }
+  }
 
   // Free Temporary Sapce //
   delete[] legendre;
-  delete[] lifting;
-
-  delete[] xi;
-  delete[] eta;
-  delete[] lambda;
-*/
 }
 
 HexNodeBasis::~HexNodeBasis(void){
diff --git a/FunctionSpace/Polynomial.cpp b/FunctionSpace/Polynomial.cpp
index e120bf25182f5ce3c78e91dfdd8956b770cbed65..b664eb9bee5902c13e2c5691cb162eb95039c35e 100644
--- a/FunctionSpace/Polynomial.cpp
+++ b/FunctionSpace/Polynomial.cpp
@@ -289,6 +289,17 @@ Polynomial Polynomial::compose(const Polynomial& otherA,
   return polynomialFromStack(stk);
 }
 
+Polynomial Polynomial::compose(const Polynomial& otherA,
+                               const Polynomial& otherB,
+                               const Polynomial& otherC) const{
+  stack<monomial_t> stk;
+
+  for(int i = 0; i < nMon; i++)
+    compose(&mon[i], otherA, otherB, otherC, &stk);
+
+  return polynomialFromStack(stk);
+}
+
 void Polynomial::operator=(const Polynomial& other){
   if(mon)
     delete[] mon;
@@ -603,6 +614,26 @@ void Polynomial::compose(const Polynomial::monomial_t* src,
   }
 }
 
+void Polynomial::compose(const Polynomial::monomial_t* src,
+                         Polynomial compA, Polynomial compB, Polynomial compC,
+                         stack<Polynomial::monomial_t>* stk){
+
+  compA.power(src->power[0]);
+  compB.power(src->power[1]);
+  compC.power(src->power[2]);
+
+  compA.mul(compB);
+  compA.mul(compC);
+  compA.mul(src->coef);
+
+  const int size = compA.nMon;
+
+  for(int i = 0; i < size; i++){
+    if(compA.mon[i].coef != 0)
+      stk->push(compA.mon[i]);
+  }
+}
+
 Polynomial Polynomial::
 polynomialFromStack(std::stack<Polynomial::monomial_t>& stk){
   Polynomial  newP;
diff --git a/FunctionSpace/Polynomial.h b/FunctionSpace/Polynomial.h
index b09500d2455e08fedd5a9ff9edd89d8e6e46a988..94951920bfecd6eea054d80a624807d9afbc3be0 100644
--- a/FunctionSpace/Polynomial.h
+++ b/FunctionSpace/Polynomial.h
@@ -68,6 +68,9 @@ class Polynomial{
   Polynomial compose(const Polynomial& other) const;
   Polynomial compose(const Polynomial& otherA,
                      const Polynomial& otherB) const;
+  Polynomial compose(const Polynomial& otherA,
+                     const Polynomial& otherB,
+                     const Polynomial& otherC) const;
 
   void operator=(const Polynomial& other);
 
@@ -104,6 +107,10 @@ class Polynomial{
                       Polynomial compA, Polynomial compB,
                       std::stack<monomial_t>* stk);
 
+  static void compose(const monomial_t* src,
+                      Polynomial compA, Polynomial compB, Polynomial compC,
+                      std::stack<monomial_t>* stk);
+
   static Polynomial polynomialFromStack(std::stack<monomial_t>& stk);
 
   static monomial_t* copyMonomial(const monomial_t* src, int size);