diff --git a/FunctionSpace/BasisVector.cpp b/FunctionSpace/BasisVector.cpp
index b639e1d598e457668acd183c749ef3dcdb721afb..abec04f83eff009d28a168509eb79793f1ee4c4d 100644
--- a/FunctionSpace/BasisVector.cpp
+++ b/FunctionSpace/BasisVector.cpp
@@ -13,11 +13,29 @@ BasisVector::~BasisVector(void){
 string BasisVector::toString(void) const{
   stringstream stream;
 
-  for(int i = 0; i < size; i++)
-    stream << "[" << "]" << endl
-	   << "[" << "]" << endl
-	   << "[" << "]" << endl
-	   << endl;
+  for(int i = 0; i < nVertex; i++)
+    stream << "f(" << i << ") = " << endl
+	   << "[ " <<(*(*node)[i])[0].toString() << " ]" << endl
+	   << "[ " <<(*(*node)[i])[1].toString() << " ]" << endl
+	   << "[ " <<(*(*node)[i])[2].toString() << " ]" << endl;
+
+  for(int i = 0; i < nEdge; i++)
+    stream << "f(" << i + nVertex << ") = " << endl 
+	   << "[ " << (*(*(*edge)[0])[i])[0].toString() << " ]" << endl
+	   << "[ " << (*(*(*edge)[0])[i])[1].toString() << " ]" << endl
+	   << "[ " << (*(*(*edge)[0])[i])[2].toString() << " ]" << endl;
+
+  for(int i = 0; i < nFace; i++)
+    stream << "f(" << i + nVertex + nEdge << ") = " << endl 
+	   << "[ " << (*(*(*face)[0])[i])[0].toString() << " ]" << endl
+	   << "[ " << (*(*(*face)[0])[i])[1].toString() << " ]" << endl
+	   << "[ " << (*(*(*face)[0])[i])[2].toString() << " ]" << endl;
+
+  for(int i = 0; i < nCell; i++)
+    stream << "f(" << i + nVertex + nEdge + nFace << ") = " 
+	   << "[ " << (*(*cell)[i])[0].toString() << " ]" << endl
+	   << "[ " << (*(*cell)[i])[1].toString() << " ]" << endl
+	   << "[ " << (*(*cell)[i])[2].toString() << " ]" << endl;
 
   return stream.str();
 }
diff --git a/FunctionSpace/TriEdgeBasis.cpp b/FunctionSpace/TriEdgeBasis.cpp
index eb02ba7dc87eb62c0da62a51a034944862543000..b1069425586158e22a502bce801d23c2b72d8364 100644
--- a/FunctionSpace/TriEdgeBasis.cpp
+++ b/FunctionSpace/TriEdgeBasis.cpp
@@ -131,6 +131,24 @@ TriEdgeBasis::TriEdgeBasis(int order){
     v[l].mul(lagrange[2]);
   }
 
+  vector<Polynomial> gradL1 = lagrange[0].gradient();
+  vector<Polynomial> gradL2 = lagrange[1].gradient();
+  
+  vector<Polynomial> l2GradL1(gradL1);
+  l2GradL1[0].mul(lagrange[1]);
+  l2GradL1[1].mul(lagrange[1]);
+  l2GradL1[2].mul(lagrange[1]);
+  
+  vector<Polynomial> l1GradL2(gradL2);
+  l1GradL2[0].mul(lagrange[0]);
+  l1GradL2[1].mul(lagrange[0]);
+  l1GradL2[2].mul(lagrange[0]);
+  
+  vector<Polynomial> subGradL1L2(l2GradL1);
+  subGradL1L2[0].sub(l1GradL2[0]);
+  subGradL1L2[1].sub(l1GradL2[1]);
+  subGradL1L2[2].sub(l1GradL2[2]);
+
   unsigned int i = 0;
   
   // Cell Based (Type 1) //
@@ -179,11 +197,13 @@ TriEdgeBasis::TriEdgeBasis(int order){
 
   // Cell Based (Type 3) //
   for(int l = 0; l < orderMinus; l++){
-    (*cell)[i] = new vector<Polynomial>(*(*cell)[0]);
-
-    (*cell)[i]->at(0).mul(v[l]);
-    (*cell)[i]->at(1).mul(v[l]);
-    (*cell)[i]->at(2).mul(v[l]);
+    vector<Polynomial> subGradL1L2V(subGradL1L2);
+    
+    subGradL1L2V[0].mul(v[l]);
+    subGradL1L2V[1].mul(v[l]);
+    subGradL1L2V[2].mul(v[l]);
+    
+    (*cell)[i] = new vector<Polynomial>(subGradL1L2V);
     
     i++;
   }