diff --git a/AMDiS/libtool b/AMDiS/libtool
index 5085abd47384de309fc7ed4c62546b5cf86917a0..d38e55be495c8cbc907369134c5f39de0d676fd1 100755
--- a/AMDiS/libtool
+++ b/AMDiS/libtool
@@ -51,32 +51,32 @@ build_old_libs=yes
 pic_mode=default
 
 # Whether or not to optimize for fast installation.
-fast_install=needless
+fast_install=yes
 
 # The host system.
 host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-redhat-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-redhat-linux-gnu
 build_os=linux-gnu
 
 # A sed program that does not truncate output.
-SED="/usr/bin/sed"
+SED="/bin/sed"
 
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
 Xsed="$SED -e 1s/^X//"
 
 # A grep program that handles long lines.
-GREP="/usr/bin/grep"
+GREP="/bin/grep"
 
 # An ERE matcher.
-EGREP="/usr/bin/grep -E"
+EGREP="/bin/grep -E"
 
 # A literal string matcher.
-FGREP="/usr/bin/grep -F"
+FGREP="/bin/grep -F"
 
 # A BSD- or MS-compatible name lister.
 NM="/usr/bin/nm -B"
@@ -128,7 +128,7 @@ old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib"
 old_postuninstall_cmds=""
 
 # A C compiler.
-LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
@@ -204,7 +204,7 @@ runpath_var=LD_RUN_PATH
 shlibpath_var=LD_LIBRARY_PATH
 
 # Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=yes
+shlibpath_overrides_runpath=no
 
 # Format of library name prefix.
 libname_spec="lib\$name"
@@ -233,10 +233,10 @@ finish_eval=""
 hardcode_into_libs=yes
 
 # Compile-time system search path for libraries.
-sys_lib_search_path_spec="/usr/lib64/gcc/x86_64-suse-linux/4.1.2 /usr/lib64 /lib64 /fastfs/wir/local/lib /usr/x86_64-suse-linux/lib"
+sys_lib_search_path_spec="/u/witkowski/local/lib /u/witkowski/local/intel/mkl/10.0.1.014/lib/32 /usr/lib/gcc/i386-redhat-linux/4.1.2 /usr/lib /lib"
 
 # Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 "
 
 # Whether dlopen is supported.
 dlopen_support=unknown
@@ -253,13 +253,13 @@ striplib="strip --strip-unneeded"
 
 
 # The linker used to build libraries.
-LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # Commands used to build an old-style archive.
 old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib"
 
 # A language specific compiler.
-CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
+CC="gcc"
 
 # Is the compiler the GNU compiler?
 with_gcc=yes
@@ -274,7 +274,7 @@ wl="-Wl,"
 pic_flag=" -fPIC -DPIC"
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag=""
+link_static_flag="-static"
 
 # Does compiler simultaneously support -c and -o options?
 compiler_c_o="yes"
@@ -8908,13 +8908,13 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
 # The linker used to build libraries.
-LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # Commands used to build an old-style archive.
 old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib"
 
 # A language specific compiler.
-CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicxx"
+CC="g++"
 
 # Is the compiler the GNU compiler?
 with_gcc=yes
@@ -8929,7 +8929,7 @@ wl="-Wl,"
 pic_flag=" -fPIC -DPIC"
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag=""
+link_static_flag="-static"
 
 # Does compiler simultaneously support -c and -o options?
 compiler_c_o="yes"
@@ -9039,17 +9039,17 @@ file_list_spec=""
 hardcode_action=immediate
 
 # The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs="/usr/lib64 /licsoft/libraries/openmpi/1.2.6/64bit/lib /usr/lib64/gcc/x86_64-suse-linux/4.1.2 /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64 /lib/../lib64 /usr/lib/../lib64 /fastfs/wir/local/lib /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../.."
+compiler_lib_search_dirs="/u/witkowski/local/lib /u/witkowski/local/intel/mkl/10.0.1.014/lib/32 /usr/lib/gcc/i386-redhat-linux/4.1.2 /usr/lib/gcc/i386-redhat-linux/4.1.2 /usr/lib/gcc/i386-redhat-linux/4.1.2/../../.."
 
 # Dependencies to place before and after the objects being linked to
 # create a shared library.
-predep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtbeginS.o"
-postdep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtendS.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crtn.o"
+predep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o"
+postdep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o"
 predeps=""
-postdeps="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -libverbs -lrt -lnuma -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s"
+postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path="-L/usr/lib64 -L/licsoft/libraries/openmpi/1.2.6/64bit/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/fastfs/wir/local/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../.."
+compiler_lib_search_path="-L/u/witkowski/local/lib -L/u/witkowski/local/intel/mkl/10.0.1.014/lib/32 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.."
 
 # ### END LIBTOOL TAG CONFIG: CXX
diff --git a/AMDiS/src/ElInfo.cc b/AMDiS/src/ElInfo.cc
index 567f7f741e665803db3fc0d3948b209a7d00e28f..a979dc81379ed3b07f1abc2e7569ff2ad6d468fe 100644
--- a/AMDiS/src/ElInfo.cc
+++ b/AMDiS/src/ElInfo.cc
@@ -14,9 +14,9 @@
 
 namespace AMDiS {
 
-  std::vector<std::map<unsigned long, mtl::dense2D<double> > > ElInfo::subElemMatrices(5);
+  std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > ElInfo::subElemMatrices(5);
 
-  std::vector<std::map<unsigned long, mtl::dense2D<double> > > ElInfo::subElemGradMatrices(5);
+  std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > ElInfo::subElemGradMatrices(5);
 
   ElInfo::ElInfo(Mesh *aMesh) 
     : mesh(aMesh),
diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h
index e536d155a3401c7dab644b837449e589f689c512..ad6e1017017acb326391fb87aaa3470d93d48591 100644
--- a/AMDiS/src/ElInfo.h
+++ b/AMDiS/src/ElInfo.h
@@ -248,12 +248,12 @@ namespace AMDiS {
 
     virtual mtl::dense2D<double>& getSubElemCoordsMat(int degree) const 
     {
-      return subElemMatrices[degree][refinementPath];
+      return subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
     }
 
     virtual mtl::dense2D<double>& getSubElemGradCoordsMat(int degree) const 
     {
-      return subElemGradMatrices[degree][refinementPath];
+      return subElemGradMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
     }
 
     /** \} */ 
@@ -542,21 +542,10 @@ namespace AMDiS {
 
     int refinementPathLength;
 
-    /** \brief
-     * This is a transformation matrix used during dual traverse. It is set, if
-     * the current element is the smaller element of an element pair in the traverse.
-     * Then this matrix defines a mapping for points defined in barycentric 
-     * coordinates on the larger element, to the barycentric coordinates of the smaller
-     * element.
-     */
-    mtl::dense2D<double> subElemCoordsMat;
-
-    mtl::dense2D<double> subElemGradCoordsMat;
-
   public:
-    static std::vector<std::map<unsigned long, mtl::dense2D<double> > > subElemMatrices;
+    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemMatrices;
     
-    static std::vector<std::map<unsigned long, mtl::dense2D<double> > > subElemGradMatrices;
+    static std::vector<std::map<std::pair<int, unsigned long>, mtl::dense2D<double> > > subElemGradMatrices;
 
     /** \brief 
      * child_vertex[el_type][child][i] = father's local vertex index of new 
diff --git a/AMDiS/src/ElInfo1d.cc b/AMDiS/src/ElInfo1d.cc
index 2ddefba00fbd770e3ce86d4b8f33346768244f70..5581a0a518677298d843c24de66303735d95948b 100644
--- a/AMDiS/src/ElInfo1d.cc
+++ b/AMDiS/src/ElInfo1d.cc
@@ -48,8 +48,8 @@ namespace AMDiS {
     Element *nb;
     MacroElement *mnb;
 
-    macroElement = const_cast<MacroElement*>( mel);
-    element = const_cast<Element*>( mel->getElement());
+    macroElement = const_cast<MacroElement*>(mel);
+    element = const_cast<Element*>(mel->getElement());
     parent = NULL;
     level = 0;
 
@@ -68,12 +68,12 @@ namespace AMDiS {
       int neighbours =  mesh->getGeo(NEIGH);
       for (int i = 0; i < neighbours; i++) {
 	nb = NULL;
-	if ((mnb = const_cast<MacroElement*>( mel->getNeighbour(i)))) {
+	if ((mnb = const_cast<MacroElement*>(mel->getNeighbour(i)))) {
 	  if (fillFlag.isSet(Mesh::FILL_OPP_COORDS)) {
 	    oppC = mnb->coord[i];
 	  }
 
-	  nb = const_cast<Element*>( mnb->getElement());
+	  nb = const_cast<Element*>(mnb->getElement());
 
 	  while (!(nb->isLeaf())) { // make nb nearest element
 	    if (fillFlag.isSet(Mesh::FILL_OPP_COORDS)) {
@@ -83,7 +83,7 @@ namespace AMDiS {
 		oppC = (mel->coord[i] + oppC) * 0.5;
 	      }
 	    }
-	    nb = const_cast<Element*>( nb->getChild(1-i));
+	    nb = const_cast<Element*>(nb->getChild(1-i));
 	  }
 
 	  if (fillFlag.isSet(Mesh::FILL_OPP_COORDS)) {
@@ -190,7 +190,7 @@ namespace AMDiS {
   /*  return the absulute value of the determinant from the                   */
   /*  transformation to the reference element                                 */
   /****************************************************************************/
-  double ElInfo1d::getElementNormal( WorldVector<double> &elementNormal) const
+  double ElInfo1d::getElementNormal(WorldVector<double> &elementNormal) const
   {
     FUNCNAME("ElInfo::getElementNormal()");
 
@@ -254,7 +254,7 @@ namespace AMDiS {
 	  if (fillFlag.isSet(Mesh::FILL_OPP_COORDS))
 	    oppC = elInfoOld->coord[i];
 	} else {
-	  nb = const_cast<Element*>( elInfoOld->getNeighbour(i));
+	  nb = const_cast<Element*>(elInfoOld->getNeighbour(i));
 
 	  if (nb && fillFlag.isSet(Mesh::FILL_OPP_COORDS))
 	    oppC = elInfoOld->oppCoord[i];
@@ -268,7 +268,7 @@ namespace AMDiS {
 	      else
 		oppC = (coord[i] + oppC) * 0.5;
 	    }
-	    nb = const_cast<Element*>( nb->getChild(1-i));
+	    nb = const_cast<Element*>(nb->getChild(1-i));
 	  }
 
 	  if (fillFlag.isSet(Mesh::FILL_OPP_COORDS))
@@ -284,9 +284,8 @@ namespace AMDiS {
       boundary[1 - ichild] = INTERIOR;
 
       if (elInfoOld->getProjection(0) && 
-	  elInfoOld->getProjection(0)->getType() == VOLUME_PROJECTION) {
-	projection[0] = elInfoOld->getProjection(0);
-      }
+	  elInfoOld->getProjection(0)->getType() == VOLUME_PROJECTION)
+	projection[0] = elInfoOld->getProjection(0);      
     }   
   }
 
@@ -297,7 +296,7 @@ namespace AMDiS {
 
     using namespace mtl;
 
-    if (subElemMatrices[degree].count(refinementPath) == 0) {
+    if (subElemMatrices[degree].count(std::make_pair(refinementPathLength, refinementPath)) == 0) {
       switch (degree) {
       case 1:
 	{
@@ -306,15 +305,15 @@ namespace AMDiS {
 	  
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d1_right * mat;
+	      tmpMat = mat * mat_d1_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d1_left * mat;
+	      tmpMat = mat * mat_d1_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[1][refinementPath] = mat;  
+	  subElemMatrices[1][std::make_pair(refinementPathLength, refinementPath)] = mat;
 	}
 	
 	break;	
@@ -325,15 +324,15 @@ namespace AMDiS {
 	  
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d2_right * mat;
+	      tmpMat = mat * mat_d2_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d2_left * mat;
+	      tmpMat = mat * mat_d2_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[2][refinementPath] = mat;  
+	  subElemMatrices[2][std::make_pair(refinementPathLength, refinementPath)] = mat;  
 	}
 	break;
       default:
@@ -341,7 +340,7 @@ namespace AMDiS {
       }
     }
 
-    return subElemMatrices[degree][refinementPath];
+    return subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 
 
@@ -353,16 +352,16 @@ namespace AMDiS {
 
     using namespace mtl;
 
-    if (subElemGradMatrices[degree].count(refinementPath) == 0) {
+    if (subElemGradMatrices[degree].count(std::make_pair(refinementPathLength, refinementPath)) == 0) {
       dense2D<double> mat(mat_d1);
 
       for (int i = 0; i < refinementPathLength; i++)
 	mat *= 0.5;
 
-      subElemGradMatrices[1][refinementPath] = mat;
+      subElemGradMatrices[1][std::make_pair(refinementPathLength, refinementPath)] = mat;
     }
 
-    return subElemGradMatrices[degree][refinementPath];
+    return subElemGradMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 
 
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index 1b93c930b42400c6625d274a4f7c52d073381522..4596461862117697f468c1c31d252c0f44a23698 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -765,7 +765,7 @@ namespace AMDiS {
 
     using namespace mtl;
 
-    if (subElemMatrices[degree].count(refinementPath) == 0) {
+    if (subElemMatrices[degree].count(std::make_pair(refinementPathLength, refinementPath)) == 0) {
       switch (degree) {
       case 1:
 	{
@@ -774,15 +774,15 @@ namespace AMDiS {
 
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d1_right * mat;
+	      tmpMat = mat * mat_d1_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d1_left * mat;
+	      tmpMat = mat * mat_d1_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[1][refinementPath] = mat;  
+	  subElemMatrices[1][std::make_pair(refinementPathLength, refinementPath)] = mat;  
 	}
 	break;
       case 2:
@@ -792,15 +792,15 @@ namespace AMDiS {
 
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d2_right * mat;
+	      tmpMat = mat * mat_d2_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d2_left * mat;
+	      tmpMat = mat * mat_d2_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[2][refinementPath] = mat;  
+	  subElemMatrices[2][std::make_pair(refinementPathLength, refinementPath)] = mat;
 	}
 	break;
       case 3:
@@ -810,15 +810,15 @@ namespace AMDiS {
 
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d3_right * mat;
+	      tmpMat = mat * mat_d3_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d3_left * mat;
+	      tmpMat = mat * mat_d3_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[3][refinementPath] = mat;  
+	  subElemMatrices[3][std::make_pair(refinementPathLength, refinementPath)] = mat;
 	}
 	break;
       case 4:
@@ -828,15 +828,15 @@ namespace AMDiS {
 
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
-	      tmpMat = mat_d4_right * mat;
+	      tmpMat = mat * mat_d4_right;
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d4_left * mat;
+	      tmpMat = mat * mat_d4_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[4][refinementPath] = mat;  
+	  subElemMatrices[4][std::make_pair(refinementPathLength, refinementPath)] = mat;
 	}
 	break;
 
@@ -845,7 +845,7 @@ namespace AMDiS {
       }
     }
 
-    return subElemMatrices[degree][refinementPath];
+    return subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 
 
@@ -857,7 +857,7 @@ namespace AMDiS {
 
     using namespace mtl;
 
-    if (subElemGradMatrices[degree].count(refinementPath) == 0) {
+    if (subElemGradMatrices[degree].count(std::make_pair(refinementPathLength, refinementPath)) == 0) {
       dense2D<double> mat(3, 3), tmpMat(3, 3);
       mat = 1;
 
@@ -881,10 +881,9 @@ namespace AMDiS {
 	  mat = tmpMat;
 	}
 
-      subElemGradMatrices[1][refinementPath] = mat;
+      subElemGradMatrices[1][std::make_pair(refinementPathLength, refinementPath)] = mat;
     }
 
-    return subElemGradMatrices[degree][refinementPath];
-
+    return subElemGradMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 }
diff --git a/AMDiS/src/ElInfo3d.cc b/AMDiS/src/ElInfo3d.cc
index 792ed4a146f767ecf6f0c5836e0e653545ce6598..2a3148be16fd82e5bb76620d74f3f1b05032592b 100644
--- a/AMDiS/src/ElInfo3d.cc
+++ b/AMDiS/src/ElInfo3d.cc
@@ -738,7 +738,7 @@ namespace AMDiS {
 
     using namespace mtl;
 
-    if (subElemMatrices[degree].count(refinementPath) == 0) {
+    if (subElemMatrices[degree].count(std::make_pair(refinementPathLength, refinementPath)) == 0) {
       switch (degree) {
       case 1:
 	{
@@ -748,18 +748,18 @@ namespace AMDiS {
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
 	      if ((level + i) % 3 == 0)
-		tmpMat = mat_d1_l0_right * mat;
+		tmpMat = mat * mat_d1_l0_right;
 	      else
-		tmpMat = mat_d1_l12_right * mat;
+		tmpMat = mat * mat_d1_l12_right;
 
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d1_left * mat;
+	      tmpMat = mat * mat_d1_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[degree][refinementPath] = mat;  
+	  subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)] = mat;  
 	}
 	break;
       case 4:
@@ -770,18 +770,18 @@ namespace AMDiS {
 	  for (int i = 0; i < refinementPathLength; i++) {
 	    if (refinementPath & (1 << i)) {
 	      if ((level + i) % 3 == 0)
-		tmpMat = mat_d4_l0_right * mat;
+		tmpMat = mat * mat_d4_l0_right;
  	      else
- 		tmpMat = mat_d4_l12_right * mat;
+ 		tmpMat = mat * mat_d4_l12_right;
 
 	      mat = tmpMat;
 	    } else  {
-	      tmpMat = mat_d4_left * mat;
+	      tmpMat = mat * mat_d4_left;
 	      mat = tmpMat;
 	    }
 	  }
 
-	  subElemMatrices[degree][refinementPath] = mat;  
+	  subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)] = mat;  
 	}
 	break;	
       default:
@@ -789,7 +789,7 @@ namespace AMDiS {
       }
     }
 
-    return subElemMatrices[degree][refinementPath];
+    return subElemMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 
 
@@ -799,7 +799,7 @@ namespace AMDiS {
 
     ERROR_EXIT("Not yet implemented!\n");
 
-    return subElemGradMatrices[degree][refinementPath];
+    return subElemGradMatrices[degree][std::make_pair(refinementPathLength, refinementPath)];
   }
 
 }
diff --git a/AMDiS/src/ZeroOrderAssembler.cc b/AMDiS/src/ZeroOrderAssembler.cc
index 24916f89858e97edf66f93345e7cffc267aea3f9..a771684dab49dbb97ead5aa1ee7f534187552582 100644
--- a/AMDiS/src/ZeroOrderAssembler.cc
+++ b/AMDiS/src/ZeroOrderAssembler.cc
@@ -65,12 +65,12 @@ namespace AMDiS {
 
     // create new assembler
     if (!optimized) {
-      newAssembler = new StandardZOA(op, assembler, quad);
+    newAssembler = new StandardZOA(op, assembler, quad);
     } else {
       if (pwConst)
-     	newAssembler = new PrecalcZOA(op, assembler, quad);
+      	newAssembler = new PrecalcZOA(op, assembler, quad);
       else
-     	newAssembler = new FastQuadZOA(op, assembler, quad);      
+      	newAssembler = new FastQuadZOA(op, assembler, quad);      
     }
 
     subAssemblers->push_back(newAssembler);