diff --git a/AMDiS/src/ElInfo.cc b/AMDiS/src/ElInfo.cc
index 346d9db299d2b390d39365ad4c592480d9d6bf07..95970a068c67fa649c7fe06a0d3e74f527575d38 100644
--- a/AMDiS/src/ElInfo.cc
+++ b/AMDiS/src/ElInfo.cc
@@ -14,6 +14,8 @@
 
 namespace AMDiS {
 
+  std::map<unsigned long, mtl::dense2D<double> > ElInfo::subElemMatrices;
+
   ElInfo::ElInfo(Mesh *aMesh) 
     : mesh(aMesh),
       element(NULL),
diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h
index 2b75dcfd335911ec5c42af923d04c941af293519..a60d70b194657b6f101ffe3e6edf4fecc1baecb1 100644
--- a/AMDiS/src/ElInfo.h
+++ b/AMDiS/src/ElInfo.h
@@ -544,6 +544,8 @@ namespace AMDiS {
     mtl::dense2D<double> subElemCoordsMat_so;
 
   public:
+    static std::map<unsigned long, mtl::dense2D<double> > subElemMatrices;
+
     /** \brief 
      * child_vertex[el_type][child][i] = father's local vertex index of new 
      * vertex i. 4 stands for the newly generated vertex .
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index 44ebec462cb9a194abd04976af1f6240556469b6..9fc6000d7bee21654f0c276673846f9012dcf4b7 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -697,18 +697,25 @@ namespace AMDiS {
     switch (degree) {
     case 1:
       {
-      mat = mat_d1;
-      dense2D<double> tmpMat(num_rows(mat), num_rows(mat));
-
-      for (int i = 0; i < refinementPathLength; i++) {
-	if (refinementPath & (1 << i)) {
-	  tmpMat = mat_d1_right * mat;
-	  mat = tmpMat;
-	} else  {
-	  tmpMat = mat_d1_left * mat;
-	  mat = tmpMat;
+	if (subElemMatrices.count(refinementPath) > 0) {
+	  mat = subElemMatrices[refinementPath];
+	  return;
 	}
-      }
+
+	mat = mat_d1;
+	dense2D<double> tmpMat(num_rows(mat), num_rows(mat));
+	
+	for (int i = 0; i < refinementPathLength; i++) {
+	  if (refinementPath & (1 << i)) {
+	    tmpMat = mat_d1_right * mat;
+	    mat = tmpMat;
+	  } else  {
+	    tmpMat = mat_d1_left * mat;
+	    mat = tmpMat;
+	  }
+	}
+
+	subElemMatrices[refinementPath] = mat;
       }
       break;
     default:
diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc
index 9816d17f4b37da90967d95b76516417c5646e6a7..db21cd06e7254450d2b70ee39eb9cdf8fc1dab3f 100644
--- a/AMDiS/src/ProblemVec.cc
+++ b/AMDiS/src/ProblemVec.cc
@@ -627,6 +627,8 @@ namespace AMDiS {
 
     //    printOpenmpTraverseInfo(this, true);
 
+    //    std::cout << "ElInfo = " << ElInfo::subElemMatrices.size() << std::endl;
+
     clock_t first = clock();
 #ifdef _OPENMP
     double wtime = omp_get_wtime();