diff --git a/FunctionSpace/TetEdgeBasis.cpp b/FunctionSpace/TetEdgeBasis.cpp
index 71c9565c09aff1e6776aa2b11c850e78d1e7ee8f..ddcfefd9b9a2f080c8e05fca9cf94bdf7409d2e6 100644
--- a/FunctionSpace/TetEdgeBasis.cpp
+++ b/FunctionSpace/TetEdgeBasis.cpp
@@ -106,8 +106,6 @@ TetEdgeBasis::TetEdgeBasis(size_t order){
   }
 
   // Face Based //
-  // TO CHECK: Are Triangles face matching tets ?
-
   for(size_t s = 0; s < nOrientation; s++){
     size_t i = nEdge;
 
@@ -121,8 +119,8 @@ TetEdgeBasis::TetEdgeBasis(size_t order){
             lagrange[faceIdx[s][f][2]];
 
           Polynomial u =
-            intLegendre[l1].compose(lagrange[faceIdx[s][f][0]] -
-                                    lagrange[faceIdx[s][f][1]]
+            intLegendre[l1].compose(lagrange[faceIdx[s][f][1]] -
+                                    lagrange[faceIdx[s][f][0]]
                                     ,
                                     lagrange[faceIdx[s][f][0]] +
                                     lagrange[faceIdx[s][f][1]]);
diff --git a/FunctionSpace/TriEdgeBasis.cpp b/FunctionSpace/TriEdgeBasis.cpp
index b3005310f80ba7417fef4197a9b7307aa5055697..516c055bc0719a9fc5b5c8d3858f0497ff4e9882 100644
--- a/FunctionSpace/TriEdgeBasis.cpp
+++ b/FunctionSpace/TriEdgeBasis.cpp
@@ -104,137 +104,91 @@ TriEdgeBasis::TriEdgeBasis(size_t order){
   //     where f = 0, because triangles
   //     have only ONE face: the face '0'
 
-  // TO CHECK: Are Triangles face matching tets ?
-
-  // Alloc Temp
-  Polynomial** u               = new Polynomial*[nOrientation];
-  Polynomial** v               = new Polynomial*[nOrientation];
-  Polynomial*  p               = new Polynomial[nOrientation];
-  vector<Polynomial>** subGrad = new vector<Polynomial>*[nOrientation];
-
-  for(size_t s = 0; s < nOrientation; s++)
-    u[s] = new Polynomial[orderPlus];
-
-  for(size_t s = 0; s < nOrientation; s++)
-    v[s] = new Polynomial[orderPlus];
-
-  // Preliminaries
-  for(size_t s = 0; s < nOrientation; s++){
-    p[s] = lagrange[faceIdx[s][0][2]] * 2 - Polynomial(1, 0, 0, 0);
-
-    // Polynomial u(x) & v(x)
-    for(int l = 0; l < orderPlus; l++){
-      u[s][l] = intLegendre[l].compose(lagrange[faceIdx[s][0][1]] -
-                                       lagrange[faceIdx[s][0][0]],
-                                       lagrange[faceIdx[s][0][0]] +
-                                       lagrange[faceIdx[s][0][1]]);
-
-      v[s][l] = legendre[l].compose(p[s]);
-      v[s][l].mul(lagrange[faceIdx[s][0][2]]);
-    }
-
-    // Differences of grad(u) and grad(v)
-    vector<Polynomial> gradL1 = lagrange[faceIdx[s][0][0]].gradient();
-    vector<Polynomial> gradL2 = lagrange[faceIdx[s][0][1]].gradient();
-
-    vector<Polynomial> l2GradL1(gradL1);
-    l2GradL1[0].mul(lagrange[faceIdx[s][0][1]]);
-    l2GradL1[1].mul(lagrange[faceIdx[s][0][1]]);
-    l2GradL1[2].mul(lagrange[faceIdx[s][0][1]]);
-
-    vector<Polynomial> l1GradL2(gradL2);
-    l1GradL2[0].mul(lagrange[faceIdx[s][0][0]]);
-    l1GradL2[1].mul(lagrange[faceIdx[s][0][0]]);
-    l1GradL2[2].mul(lagrange[faceIdx[s][0][0]]);
-
-    subGrad[s] = new vector<Polynomial>(3);
-    (*subGrad[s])[0].sub(l1GradL2[0]);
-    (*subGrad[s])[1].sub(l1GradL2[1]);
-    (*subGrad[s])[2].sub(l1GradL2[2]);
-  }
-
-  // Face Basis
   for(size_t s = 0; s < nOrientation; s++){
     size_t i = nEdge;
 
-    // Type 1
     for(size_t l1 = 1; l1 < order; l1++){
       for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
-        vector<Polynomial> tmp1 = v[s][l2].gradient();
-        vector<Polynomial> tmp2 = u[s][l1].gradient();
-
-        tmp1[0].mul(u[s][l1]);
-        tmp1[1].mul(u[s][l1]);
-        tmp1[2].mul(u[s][l1]);
-
-        tmp2[0].mul(v[s][l2]);
-        tmp2[1].mul(v[s][l2]);
-        tmp2[2].mul(v[s][l2]);
-
-        tmp2[0].add(tmp1[0]);
-        tmp2[1].add(tmp1[1]);
-        tmp2[2].add(tmp1[2]);
-
-        basis[s][i] = new vector<Polynomial>(tmp2);
+        // Preliminary Type 1
+        Polynomial u =
+          intLegendre[l1].compose(lagrange[faceIdx[s][0][1]] -
+                                  lagrange[faceIdx[s][0][0]]
+                                  ,
+                                  lagrange[faceIdx[s][0][0]] +
+                                  lagrange[faceIdx[s][0][1]]);
+        Polynomial v =
+          lagrange[faceIdx[s][0][2]] *
+          legendre[l2].compose(lagrange[faceIdx[s][0][2]] * 2);
+
+        // Preliminary Type 2
+        vector<Polynomial> gradU = u.gradient();
+        vector<Polynomial> gradV = v.gradient();
+
+        vector<Polynomial> vGradU(gradU);
+        vGradU[0].mul(v);
+        vGradU[1].mul(v);
+        vGradU[2].mul(v);
+
+        vector<Polynomial> uGradV(gradV);
+        uGradV[0].mul(u);
+        uGradV[1].mul(u);
+        uGradV[2].mul(u);
+
+        vector<Polynomial> subGradUV(vGradU);
+        subGradUV[0].sub(uGradV[0]);
+        subGradUV[1].sub(uGradV[1]);
+        subGradUV[2].sub(uGradV[2]);
+
+        // Preliminary Type 3
+        vector<Polynomial> gradL1 = lagrange[faceIdx[s][0][0]].gradient();
+        vector<Polynomial> gradL2 = lagrange[faceIdx[s][0][1]].gradient();
+
+        vector<Polynomial> l2GradL1(gradL1);
+        l2GradL1[0].mul(lagrange[faceIdx[s][0][1]]);
+        l2GradL1[1].mul(lagrange[faceIdx[s][0][1]]);
+        l2GradL1[2].mul(lagrange[faceIdx[s][0][1]]);
+
+        vector<Polynomial> l1GradL2(gradL2);
+        l1GradL2[0].mul(lagrange[faceIdx[s][0][0]]);
+        l1GradL2[1].mul(lagrange[faceIdx[s][0][0]]);
+        l1GradL2[2].mul(lagrange[faceIdx[s][0][0]]);
+
+        vector<Polynomial> subGradL1L2V(l2GradL1);
+        subGradL1L2V[0].sub(l1GradL2[0]);
+        subGradL1L2V[1].sub(l1GradL2[1]);
+        subGradL1L2V[2].sub(l1GradL2[2]);
+
+        subGradL1L2V[0].mul(v);
+        subGradL1L2V[1].mul(v);
+        subGradL1L2V[2].mul(v);
+
+
+        // Type 1
+        basis[s][i] =
+          new vector<Polynomial>((u * v).gradient());
 
         i++;
-      }
-    }
-
-    // Type 2
-    for(size_t l1 = 1; l1 < order; l1++){
-      for(int l2 = 0; l2 + (int)l1 - 1 < orderMinus; l2++){
-        vector<Polynomial> tmp1 = v[s][l2].gradient();
-        vector<Polynomial> tmp2 = u[s][l1].gradient();
-
-        tmp1[0].mul(u[s][l1]);
-        tmp1[1].mul(u[s][l1]);
-        tmp1[2].mul(u[s][l1]);
 
-        tmp2[0].mul(v[s][l2]);
-        tmp2[1].mul(v[s][l2]);
-        tmp2[2].mul(v[s][l2]);
-
-        tmp2[0].sub(tmp1[0]);
-        tmp2[1].sub(tmp1[1]);
-        tmp2[2].sub(tmp1[2]);
-
-        basis[s][i] = new vector<Polynomial>(tmp2);
+        // Type 2
+        basis[s][i] =
+          new vector<Polynomial>(subGradUV);
 
         i++;
-      }
-    }
-
-    // Type 3
-    for(int l = 0; l < orderMinus; l++){
-      vector<Polynomial> subGradL1L2V(*subGrad[s]);
 
-      subGradL1L2V[0].mul(v[s][l]);
-      subGradL1L2V[1].mul(v[s][l]);
-      subGradL1L2V[2].mul(v[s][l]);
-
-      basis[s][i] = new vector<Polynomial>(subGradL1L2V);
+        // Type 3
+        if(l1 == 1){
+          basis[s][i] =
+            new vector<Polynomial>(subGradL1L2V);
 
-      i++;
+          i++;
+        }
+      }
     }
   }
 
-  // Free Temporary Sapce //
-  for(size_t s = 0; s < nOrientation; s++)
-    delete[] u[s];
-
-  for(size_t s = 0; s < nOrientation; s++)
-    delete[] v[s];
-
-  for(size_t s = 0; s < nOrientation; s++)
-    delete subGrad[s];
-
+  // Clear //
   delete[] legendre;
   delete[] intLegendre;
-  delete[] p;
-  delete[] u;
-  delete[] v;
-  delete[] subGrad;
 }
 
 TriEdgeBasis::~TriEdgeBasis(void){