diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc
index adc1b6423b249b472d5e7d76074d39dd2d7fd41b..3e24e16673168f66d2126658f9052b524de2bca8 100644
--- a/AMDiS/src/Assembler.cc
+++ b/AMDiS/src/Assembler.cc
@@ -299,9 +299,8 @@ namespace AMDiS {
 
     for (int i = 0; i < nBasFcts; i++) {
       uhOldLoc2[i] = 0.0;
-      for (int j = 0; j < nBasFcts; j++) {
+      for (int j = 0; j < nBasFcts; j++)
 	uhOldLoc2[i] += m[j][i] * uhOldLoc[i];
-      }      
     }
 
     
@@ -312,9 +311,8 @@ namespace AMDiS {
     
     for (int i = 0; i < nBasFcts; i++) {
       double val = 0.0;
-      for (int j = 0; j < nBasFcts; j++) {
+      for (int j = 0; j < nBasFcts; j++)
 	val += elementMatrix[i][j] * uhOldLoc2[j];
-      }
       vec[i] += val;
     }
     
@@ -322,6 +320,7 @@ namespace AMDiS {
     delete [] uhOldLoc2;
   }
 
+
   void Assembler::initElement(const ElInfo *smallElInfo, 
 			      const ElInfo *largeElInfo,
 			      Quadrature *quad)
@@ -336,6 +335,7 @@ namespace AMDiS {
       zeroOrderAssembler->initElement(smallElInfo, largeElInfo, quad);
   }
 
+
   void Assembler::checkQuadratures()
   { 
     if (secondOrderAssembler) {
diff --git a/AMDiS/src/DualTraverse.cc b/AMDiS/src/DualTraverse.cc
index de4ccd81d86b2e012f4adc93ebe04e385d39d069..709f34c1c945e2ed7801b688bff46342ae7ba61d 100644
--- a/AMDiS/src/DualTraverse.cc
+++ b/AMDiS/src/DualTraverse.cc
@@ -165,6 +165,7 @@ namespace AMDiS {
     }
   }
 
+
   void DualTraverse::fillSubElInfo(ElInfo *elInfo1, 
 				   ElInfo *elInfo2,
 				   ElInfo *elInfoSmall,
@@ -173,19 +174,36 @@ namespace AMDiS {
     if (!fillSubElemMat)
       return;
 
-    //     mtl::dense2D<double>& subCoordsMat = 
-    //       const_cast<mtl::dense2D<double>&>(elInfoSmall->getSubElemCoordsMat());
-    //     mtl::dense2D<double>& subCoordsMat_so = 
-    //       const_cast<mtl::dense2D<double>&>(elInfoSmall->getSubElemCoordsMat_so());
-
-    if (elInfo1 == elInfoSmall) {
-      //       stack1.getCoordsInElem(elInfo2, basisFcts, subCoordsMat);
-      //       stack1.getCoordsInElem_so(elInfo2, basisFcts, subCoordsMat_so);
+    if (elInfo1 == elInfoSmall)
       stack1.fillRefinementPath(*elInfoSmall, *elInfo2);
-    } else {
-      //       stack2.getCoordsInElem(elInfo1, basisFcts, subCoordsMat);
-      //       stack2.getCoordsInElem_so(elInfo1, basisFcts, subCoordsMat_so);
-      stack2.fillRefinementPath(*elInfoSmall, *elInfo1);
-    }
+    else
+      stack2.fillRefinementPath(*elInfoSmall, *elInfo1);    
+  }
+
+
+  int DualTraverse::getFace(DualElInfo *dualElInfo, int largeFace)
+  {
+    FUNCNAME("DualTraverse::getFace()");
+
+    TEST_EXIT_DBG(dualElInfo)("No dual element info object!\n");
+
+    ElInfo *largeElInfo = dualElInfo->largeElInfo;
+    ElInfo *smallElInfo = dualElInfo->smallElInfo;
+
+    TEST_EXIT_DBG(largeElInfo->getLevel() <= smallElInfo->getLevel())
+      ("Should not happen!\n");
+
+    if (largeElInfo->getLevel() == smallElInfo->getLevel())
+      return largeFace;
+
+    int refinementPathLength = smallElInfo->getRefinementPathLength();
+    unsigned long refinementPath = smallElInfo->getRefinementPath();
+
+    TEST_EXIT_DBG(refinementPathLength != 0)
+      ("Refinement path is empty. This should not happen!\n");
+
+    std::cout << "REFINEMENTPATHLENGTH = " << refinementPathLength << std::endl;
+
+    return -1;
   }
 }
diff --git a/AMDiS/src/DualTraverse.h b/AMDiS/src/DualTraverse.h
index 0c4059b2039bf2fbe7873325a4b58e9d65fb4c31..8226414014cc2828246ae0517b84eea2e475b3ca 100644
--- a/AMDiS/src/DualTraverse.h
+++ b/AMDiS/src/DualTraverse.h
@@ -115,6 +115,16 @@ namespace AMDiS {
       fillSubElemMat = b;
       basisFcts = fcts;
     }
+
+    /** \brief
+     * Checks if the small element has an edge/face which is part of a given edge/face
+     * of the large element. If this is the case, it returns the local number of the 
+     * small edge/face, and -1 otherwise.
+     *
+     * \param[in]  dualElInfo    Dual element info with large and small element infos.
+     * \param[in]  largeFace     A local edge/face number on the large element.
+     */
+    static int getFace(DualElInfo *dualElInfo, int largeFace);    
       
   protected:
     /** \brief
diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h
index b61dc357befd0d580a996c230169090cef728cc4..2b75dcfd335911ec5c42af923d04c941af293519 100644
--- a/AMDiS/src/ElInfo.h
+++ b/AMDiS/src/ElInfo.h
@@ -227,6 +227,19 @@ namespace AMDiS {
       return parametric; 
     }
 
+    /// Returns \ref refinementPath
+    inline unsigned long getRefinementPath() const
+    {
+      return refinementPath;
+    } 
+
+    /// Get \ref refinementPathLength
+    inline int getRefinementPathLength() const
+    {
+      return refinementPathLength;
+    }
+
+
     virtual void getSubElemCoordsMat(mtl::dense2D<double>& mat,
 				     int basisFctsDegree) const {}
 
diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc
index 9a837edc5a99bfc25b706fa09e30f4915fbf1878..ae87da7a8ae1b82d9f5dc7a5af90f737c7900a7b 100644
--- a/AMDiS/src/ElInfo2d.cc
+++ b/AMDiS/src/ElInfo2d.cc
@@ -716,12 +716,9 @@ namespace AMDiS {
 	if (refinementPath & (1 << i)) {
 	  tmpMat = mat_d1_right * mat;
 	  mat = tmpMat;
-	  //	  mat *= mat_d1_right;
 	} else  {
 	  tmpMat = mat_d1_left * mat;
 	  mat = tmpMat;
-
-	  //	  mat *= mat_d1_left;
 	}
       }
       }
diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc
index 7d8136d79c1135522b13c07b5b6cc89df006ccf8..9d3bd3d74291062b7e60cbddf13e939ba8434729 100644
--- a/AMDiS/src/Operator.cc
+++ b/AMDiS/src/Operator.cc
@@ -132,6 +132,8 @@ namespace AMDiS {
   {
     FUNCNAME("OperatorTerm::getGradientsAtQPs()");
 
+    ERROR_EXIT("Not yet tested!\n");
+
     TEST_EXIT(smallElInfo->getMesh() == vec->getFESpace()->getMesh() ||
 	      largeElInfo->getMesh() == vec->getFESpace()->getMesh())
       ("There is something wrong!\n");
@@ -1026,7 +1028,12 @@ namespace AMDiS {
 					 AbstractFunction<WorldMatrix<double>, WorldVector<double> > *af,
 					 AbstractFunction<WorldVector<double>, WorldMatrix<double> > *divAf,
 					 bool symm) 
-    : SecondOrderTerm(af->getDegree()), vec(dv), f(af), divFct(divAf), symmetric(symm)
+    : SecondOrderTerm(af->getDegree()), 
+      vec(dv), 
+      f(af), 
+      divFct(divAf),
+      gradAtQPs(NULL),
+      symmetric(symm)
   {
     setSymmetric(symmetric);
 
@@ -1163,13 +1170,12 @@ namespace AMDiS {
     }
   }
 
-  void MatrixVec2_SOT::weakEval(int nPoints,
-			       const WorldVector<double> *grdUhAtQP,
-			       WorldVector<double> *result) const
+  void MatrixVec2_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP)
-      for (int iq = 0; iq < nPoints; iq++)
-	result[iq] += A * grdUhAtQP[iq] * (*fct)(vec1AtQPs[iq], vec2AtQPs[iq]);
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++)
+      result[iq] += A * grdUhAtQP[iq] * (*fct)(vec1AtQPs[iq], vec2AtQPs[iq]);
   }
 
   General_SOT::General_SOT(std::vector<DOFVectorBase<double>*> vecs,
@@ -1302,6 +1308,14 @@ namespace AMDiS {
     gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
   }
 
+  void MatrixGradient_SOT::initElement(const ElInfo* smallElInfo, 
+				       const ElInfo* largeElInfo,
+				       SubAssembler* subAssembler,
+				       Quadrature *quad) 
+  {
+    gradAtQPs = getGradientsAtQPs(vec, smallElInfo, largeElInfo, subAssembler, quad);
+  }
+
   void FctGradient_SOT::initElement(const ElInfo* elInfo, 
 				    SubAssembler* subAssembler,
 				    Quadrature *quad) 
@@ -1944,17 +1958,15 @@ namespace AMDiS {
     }
   }
 
-  void MatrixFct_SOT::weakEval(int nPoints,
-			       const WorldVector<double> *grdUhAtQP,
-			       WorldVector<double> *result) const
+  void MatrixFct_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			       std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	A = (*matrixFct)(vecAtQPs[iq]);
-	result[iq] += A * grdUhAtQP[iq];
-      }
-    }
+    int nPoints = grdUhAtQP.size();
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      A = (*matrixFct)(vecAtQPs[iq]);
+      result[iq] += A * grdUhAtQP[iq];
+    }    
   }
 
 
@@ -1979,13 +1991,12 @@ namespace AMDiS {
     }
   }
 
-  void Matrix_SOT::weakEval(int nPoints,
-			    const WorldVector<double> *grdUhAtQP,
-			    WorldVector<double> *result) const
+  void Matrix_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			    std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP)
-      for (int iq = 0; iq < nPoints; iq++)
-	result[iq] += matrix * grdUhAtQP[iq];
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++)
+      result[iq] += matrix * grdUhAtQP[iq];
   }
 
   void MatrixGradient_SOT::eval(int nPoints,
@@ -2014,19 +2025,24 @@ namespace AMDiS {
     }
   }
 
-  void MatrixGradient_SOT::weakEval(int nPoints,
-				    const WorldVector<double> *grdUhAtQP,
-				    WorldVector<double> *result) const
+
+  void MatrixGradient_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				    std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	A = (*f)(gradAtQPs[iq]);
-	result[iq] += A * grdUhAtQP[iq];
-      }
+    FUNCNAME("MatrixGradient_SOT::weakEval()");
+
+    TEST_EXIT_DBG(f)("No function f!\n");
+    TEST_EXIT_DBG(gradAtQPs)("Operator was not initialized correctly!\n");
+
+    int nPoints = grdUhAtQP.size();
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      A = (*f)(gradAtQPs[iq]);
+      result[iq] += A * grdUhAtQP[iq];    
     }
   }
 
+
   void VecAtQP_SOT::eval(int nPoints,
 			 const double *uhAtQP,
 			 const WorldVector<double> *grdUhAtQP,
@@ -2047,15 +2063,13 @@ namespace AMDiS {
     }
   }
 
-  void VecAtQP_SOT::weakEval(int nPoints,
-			     const WorldVector<double> *grdUhAtQP,
-			     WorldVector<double> *result) const
+  void VecAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			     std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2079,15 +2093,13 @@ namespace AMDiS {
     }
   }
   
-  void Vec2AtQP_SOT::weakEval(int nPoints,
-			      const WorldVector<double> *grdUhAtQP,
-			      WorldVector<double> *result) const
+  void Vec2AtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			      std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs1[iq], vecAtQPs2[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs1[iq], vecAtQPs2[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2111,15 +2123,13 @@ namespace AMDiS {
     }
   }
 
-  void CoordsAtQP_SOT::weakEval(int nPoints,
-				const WorldVector<double> *grdUhAtQP,
-				WorldVector<double> *result) const
+  void CoordsAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*g)(coordsAtQPs[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*g)(coordsAtQPs[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2143,15 +2153,13 @@ namespace AMDiS {
     }
   }
 
-  void FctGradient_SOT::weakEval(int nPoints,
-				 const WorldVector<double> *grdUhAtQP,
-				 WorldVector<double> *result) const
+  void FctGradient_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				 std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {  
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(gradAtQPs[iq]);
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(gradAtQPs[iq]);
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2175,15 +2183,13 @@ namespace AMDiS {
     }
   }
 
-  void VecAndGradientAtQP_SOT::weakEval(int nPoints,
-					const WorldVector<double> *grdUhAtQP,
-					WorldVector<double> *result) const
+  void VecAndGradientAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+					std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {  
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2213,16 +2219,14 @@ namespace AMDiS {
     }
   }
 
-  void VecMatrixGradientAtQP_SOT::weakEval(int nPoints,
-					   const WorldVector<double> *grdUhAtQP,
-					   WorldVector<double> *result) const
+  void VecMatrixGradientAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+					   std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	A = (*f)(vecAtQPs[iq], gradAtQPs[iq]);
-	result[iq] += A * grdUhAtQP[iq];
-      }
+    int nPoints = grdUhAtQP.size();
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      A = (*f)(vecAtQPs[iq], gradAtQPs[iq]);
+      result[iq] += A * grdUhAtQP[iq];      
     }
   }
 
@@ -2246,15 +2250,13 @@ namespace AMDiS {
     }
   }
 
-  void VecAndCoordsAtQP_SOT::weakEval(int nPoints,
-				      const WorldVector<double> *grdUhAtQP,
-				      WorldVector<double> *result) const
+  void VecAndCoordsAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				      std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq], coordsAtQPs[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq], coordsAtQPs[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);    
     }
   }
 
@@ -2284,16 +2286,14 @@ namespace AMDiS {
     }
   }
 
-  void MatrixGradientAndCoords_SOT::weakEval(int nPoints,
-					     const WorldVector<double> *grdUhAtQP,
-					     WorldVector<double> *result) const
+  void MatrixGradientAndCoords_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+					     std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	A = (*f)(gradAtQPs[iq], coordsAtQPs[iq]);
-	result[iq] += A * grdUhAtQP[iq];
-      }
+    int nPoints = grdUhAtQP.size();
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      A = (*f)(gradAtQPs[iq], coordsAtQPs[iq]);
+      result[iq] += A * grdUhAtQP[iq];      
     }
   }
 
@@ -2317,15 +2317,13 @@ namespace AMDiS {
     }
   }
 
-  void VecGradCoordsAtQP_SOT::weakEval(int nPoints,
-				       const WorldVector<double> *grdUhAtQP,
-				       WorldVector<double> *result) const
+  void VecGradCoordsAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				       std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {  
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]);
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]);
+      axpy(factor, grdUhAtQP[iq], result[iq]);    
     }
   }
 
@@ -2489,15 +2487,13 @@ namespace AMDiS {
     }
   }
 
-  void CoordsAtQP_IJ_SOT::weakEval(int nPoints,
-				   const WorldVector<double> *grdUhAtQP,
-				   WorldVector<double> *result) const
+  void CoordsAtQP_IJ_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				   std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*g)(coordsAtQPs[iq]);  
-	result[iq][xi] += grdUhAtQP[iq][xj] * factor;
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*g)(coordsAtQPs[iq]);  
+      result[iq][xi] += grdUhAtQP[iq][xj] * factor;      
     }
   }
 
@@ -2533,15 +2529,13 @@ namespace AMDiS {
     }
   }
 
-  void VecAtQP_IJ_SOT::weakEval(int nPoints,
-				const WorldVector<double> *grdUhAtQP,
-				WorldVector<double> *result) const
+  void VecAtQP_IJ_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq]);  
-	result[iq][xi] += grdUhAtQP[iq][xj] * factor;
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq]);  
+      result[iq][xi] += grdUhAtQP[iq][xj] * factor;      
     }
   }
 
@@ -2688,15 +2682,13 @@ namespace AMDiS {
     }
   }
 
-  void VecAndGradAtQP_SOT::weakEval(int nPoints,
-				    const WorldVector<double> *grdUhAtQP,
-				    WorldVector<double> *result) const
+  void VecAndGradAtQP_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				    std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);      
     }
   }
 
@@ -2791,27 +2783,25 @@ namespace AMDiS {
     }
   }
 
-  void General_SOT::weakEval(int nPoints,
-			     const WorldVector<double> *grdUhAtQP,
-			     WorldVector<double> *result) const
+  void General_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			     std::vector<WorldVector<double> > &result) const
   {
+    int nPoints = grdUhAtQP.size();
     int nVecs = static_cast<int>(vecs_.size());
     int nGrads = static_cast<int>(grads_.size());
 
     std::vector<double> vecsArg(nVecs);
     std::vector<WorldVector<double> > gradsArg(nGrads);
 
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	for (int i = 0; i < nVecs; i++)
-	  vecsArg[i] = vecsAtQPs_[i][iq];	
-	for (int i = 0; i < nGrads; i++)
-	  gradsArg[i] = gradsAtQPs_[i][iq];
-	
-	A = (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg);
-	result[iq] += A * grdUhAtQP[iq];
-      }
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      for (int i = 0; i < nVecs; i++)
+	vecsArg[i] = vecsAtQPs_[i][iq];	
+      for (int i = 0; i < nGrads; i++)
+	gradsArg[i] = gradsAtQPs_[i][iq];
+      
+      A = (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg);
+      result[iq] += A * grdUhAtQP[iq];      
     }
   }
 
@@ -3015,27 +3005,25 @@ namespace AMDiS {
     }
   }
 
-  void GeneralParametric_SOT::weakEval(int nPoints,
-				       const WorldVector<double> *grdUhAtQP,
-				       WorldVector<double> *result) const
+  void GeneralParametric_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+				       std::vector<WorldVector<double> > &result) const
   {
+    int nPoints = grdUhAtQP.size();
     int nVecs = static_cast<int>(vecs_.size());
     int nGrads = static_cast<int>(grads_.size());
 
     std::vector<double> vecsArg(nVecs);
     std::vector<WorldVector<double> > gradsArg(nGrads);
 
-    if (grdUhAtQP) {
-      WorldMatrix<double> A;
-      for (int iq = 0; iq < nPoints; iq++) {
-	for (int i = 0; i < nVecs; i++)
-	  vecsArg[i] = vecsAtQPs_[i][iq];	
-	for (int i = 0; i < nGrads; i++)
-	  gradsArg[i] = gradsAtQPs_[i][iq];
-	
-	A = (*f_)(coordsAtQPs_[iq],  elementNormal_, vecsArg, gradsArg);
-	result[iq] += A * grdUhAtQP[iq];
-      }
+    WorldMatrix<double> A;
+    for (int iq = 0; iq < nPoints; iq++) {
+      for (int i = 0; i < nVecs; i++)
+	vecsArg[i] = vecsAtQPs_[i][iq];	
+      for (int i = 0; i < nGrads; i++)
+	gradsArg[i] = gradsAtQPs_[i][iq];
+      
+      A = (*f_)(coordsAtQPs_[iq],  elementNormal_, vecsArg, gradsArg);
+      result[iq] += A * grdUhAtQP[iq];    
     }
   }
 
@@ -3269,15 +3257,13 @@ namespace AMDiS {
     }
   }
 
-  void VecGrad_SOT::weakEval(int nPoints,
-			     const WorldVector<double> *grdUhAtQP,
-			     WorldVector<double> *result) const
+  void VecGrad_SOT::weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			     std::vector<WorldVector<double> > &result) const
   {
-    if (grdUhAtQP) {
-      for (int iq = 0; iq < nPoints; iq++) {
-	double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);  
-	axpy(factor, grdUhAtQP[iq], result[iq]);
-      }
+    int nPoints = grdUhAtQP.size();
+    for (int iq = 0; iq < nPoints; iq++) {
+      double factor = (*f)(vecAtQPs[iq], gradAtQPs[iq]);  
+      axpy(factor, grdUhAtQP[iq], result[iq]);
     }
   }
 
diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h
index 0c3f4cfcac368d402b1017715a8c2c7f6ab3b258..3ed2aa4cbcbbeeb46316657ed3423286ff4b8ef7 100644
--- a/AMDiS/src/Operator.h
+++ b/AMDiS/src/Operator.h
@@ -68,12 +68,17 @@ namespace AMDiS {
      * and coordinates at quadrature points can be calculated here.
      */
     virtual void initElement(const ElInfo*, SubAssembler*, Quadrature *quad = NULL) 
-    {}
+    {
+      FUNCNAME("OperatorTerm::initElement()");
+      ERROR_EXIT("This function has not been implemented in the operator!\n");
+    }
 
     virtual void initElement(const ElInfo* largeElInfo, const ElInfo* smallElInfo,
-			     SubAssembler*, 
-			     Quadrature *quad = NULL)
-    {}
+			     SubAssembler*, Quadrature *quad = NULL)
+    {
+      FUNCNAME("OperatorTerm::initElement()");
+      ERROR_EXIT("The function initElement has not been implemented for dual mesh traverse!\n");
+    }
 
     /// Returs \auxFESpaces, the list of all aux fe spaces the operator makes use off.
     std::vector<const FiniteElemSpace*>& getAuxFeSpaces() 
@@ -300,9 +305,8 @@ namespace AMDiS {
 			 DimMat<double> **result) const = 0;
 
     /// Evaluation of \f$ A \nabla u(\vec{x}) \f$ at all quadrature points.
-    virtual void weakEval(int nPoints,
-			  const WorldVector<double> *grdUhAtQP,
-			  WorldVector<double> *result) const = 0;
+    virtual void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+			  std::vector<WorldVector<double> > &result) const = 0;
 
   };
 
@@ -352,13 +356,12 @@ namespace AMDiS {
     }
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const
     {
-      if (grdUhAtQP)
-	for (int iq = 0; iq < nPoints; iq++)
-	  result[iq] += grdUhAtQP[iq];
+      int nPoints = grdUhAtQP.size();
+      for (int iq = 0; iq < nPoints; iq++)
+	result[iq] += grdUhAtQP[iq];
     }
   };
 
@@ -420,13 +423,12 @@ namespace AMDiS {
     }
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const
     {
-      if (grdUhAtQP)
-	for (int iq = 0; iq < nPoints; iq++)
-	  axpy(*factor, grdUhAtQP[iq], result[iq]);
+      int nPoints = grdUhAtQP.size();
+      for (int iq = 0; iq < nPoints; iq++)
+	axpy(*factor, grdUhAtQP[iq], result[iq]);
     }
 
   private:
@@ -467,9 +469,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -522,9 +523,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     /// Matrix stroring A.
@@ -584,13 +584,12 @@ namespace AMDiS {
     }
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const
     {
-      if (grdUhAtQP)
-	for (int iq = 0; iq < nPoints; iq++)
-	  result[iq][xi] += (*factor) * grdUhAtQP[iq][xj];
+      int nPoints = grdUhAtQP.size();
+      for (int iq = 0; iq < nPoints; iq++)
+	result[iq][xi] += (*factor) * grdUhAtQP[iq][xj];
     }
 
   private:
@@ -636,9 +635,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -681,9 +679,8 @@ namespace AMDiS {
 	      double factor) const;
     
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
     
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -730,9 +727,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
 
   protected:
@@ -764,6 +760,12 @@ namespace AMDiS {
     void initElement(const ElInfo* elInfo, SubAssembler* subAssembler,
 		     Quadrature *quad = NULL);
 
+    /// Implementation of \ref OperatorTerm::initElement() for multilpe meshes.
+    void initElement(const ElInfo* smallElInfo, 
+		     const ElInfo* largeElInfo,
+		     SubAssembler* subAssembler,
+		     Quadrature *quad = NULL);
+
     /// Implements SecondOrderTerm::getLALt().
     void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const;
 
@@ -776,9 +778,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     DOFVectorBase<double>* vec;
@@ -829,9 +830,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     DOFVectorBase<double>* vec;
@@ -878,9 +878,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     DOFVectorBase<double>* vec;
@@ -929,9 +928,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
     
   protected:
     DOFVectorBase<double>* vec;
@@ -984,9 +982,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     DOFVectorBase<double>* vec;
@@ -1034,9 +1031,8 @@ namespace AMDiS {
 	      double *result,
 	      double factor) const;
 
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -1087,9 +1083,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     DOFVectorBase<double>* vec;
@@ -1137,9 +1132,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -1190,9 +1184,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     std::vector<DOFVectorBase<double>*> vecs_; 
@@ -1248,9 +1241,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implenetation of SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
 
   protected:
     std::vector<DOFVectorBase<double>*> vecs_; 
@@ -2540,9 +2532,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implements SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
   
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -2591,9 +2582,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implements SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
   
   protected:
     /// DOFVectors to be evaluated at quadrature points.
@@ -2684,9 +2674,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implements SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const;
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const;
   
   private:
     /// Stores coordinates at quadrature points. Set in \ref initElement().
@@ -2731,9 +2720,8 @@ namespace AMDiS {
 	      double factor) const;
 
     /// Implements SecondOrderTerm::weakEval().
-    void weakEval(int nPoints,
-		  const WorldVector<double> *grdUhAtQP,
-		  WorldVector<double> *result) const; 
+    void weakEval(const std::vector<WorldVector<double> > &grdUhAtQP,
+		  std::vector<WorldVector<double> > &result) const; 
   
   protected:
     /// DOFVector to be evaluated at quadrature points.
@@ -3373,17 +3361,15 @@ namespace AMDiS {
     }
 
     /// Weak evaluation of all terms in \ref secondOrder. 
-    void weakEvalSecondOrder(int nPoints,
-			     const WorldVector<double> *grdUhAtQP,
-			     WorldVector<double> *result) const
+    void weakEvalSecondOrder(const std::vector<WorldVector<double> > &grdUhAtQP,
+			     std::vector<WorldVector<double> > &result) const
     {
       int myRank = omp_get_thread_num();
 
-      std::vector<OperatorTerm*>::const_iterator termIt;
-      for (termIt = secondOrder[myRank].begin(); 
+      for (std::vector<OperatorTerm*>::const_iterator termIt = secondOrder[myRank].begin(); 
 	   termIt != secondOrder[myRank].end(); 
 	   ++termIt)
-	static_cast<SecondOrderTerm*>(*termIt)->weakEval(nPoints, grdUhAtQP, result);
+	static_cast<SecondOrderTerm*>(*termIt)->weakEval(grdUhAtQP, result);
     }
   
     /// Calls getLALt() for each term in \ref secondOrder and adds the results to LALt.
diff --git a/AMDiS/src/ResidualEstimator.cc b/AMDiS/src/ResidualEstimator.cc
index 13ae3f63f22a80eb1097282b5ab88cc90c0f25cc..e81f334d7ad5b6ec5f1b8298b230ac66f44e9480 100644
--- a/AMDiS/src/ResidualEstimator.cc
+++ b/AMDiS/src/ResidualEstimator.cc
@@ -215,12 +215,24 @@ namespace AMDiS {
 
       for (it = dofMat->getOperatorsBegin(), itfac = dofMat->getOperatorEstFactorBegin();
 	   it != dofMat->getOperatorsEnd(); ++it, ++itfac)
-	if (*itfac == NULL || **itfac != 0.0)
-	  (*it)->getAssembler(omp_get_thread_num())->initElement(elInfo, NULL, quad);
+	if (*itfac == NULL || **itfac != 0.0) {
+	  if (dualElInfo) {
+	    (*it)->getAssembler(omp_get_thread_num())->initElement(dualElInfo->smallElInfo, 
+								   dualElInfo->largeElInfo,
+								   quad);
+	  } else
+	    (*it)->getAssembler(omp_get_thread_num())->initElement(elInfo, NULL, quad);
+	}
 
       if (C0 > 0.0)
-	for (it = dofVec->getOperatorsBegin(); it != dofVec->getOperatorsEnd(); ++it)
-	  (*it)->getAssembler(omp_get_thread_num())->initElement(elInfo, NULL, quad);	
+	for (it = dofVec->getOperatorsBegin(); it != dofVec->getOperatorsEnd(); ++it) {
+	  if (dualElInfo) {
+	    (*it)->getAssembler(omp_get_thread_num())->initElement(dualElInfo->smallElInfo, 
+								   dualElInfo->largeElInfo,
+								   quad);
+	  } else
+	    (*it)->getAssembler(omp_get_thread_num())->initElement(elInfo, NULL, quad);
+	}
     }
 
 
@@ -352,6 +364,10 @@ namespace AMDiS {
     for (int face = 0; face < nNeighbours; face++) {  
       Element *neigh = const_cast<Element*>(elInfo->getNeighbour(face));
 
+      if (dualElInfo) {
+	int smallFace = DualTraverse::getFace(dualElInfo, face);
+      }
+
       if (!(neigh && neigh->getMark()))
 	continue;
 
@@ -445,7 +461,7 @@ namespace AMDiS {
 	    for (int iq = 0; iq < nPointsSurface; iq++)
 	      localJump[iq].set(0.0);
 	    
-	    (*it)->weakEvalSecondOrder(nPointsSurface, &(grdUhEl[0]), &(localJump[0]));
+	    (*it)->weakEvalSecondOrder(grdUhEl, localJump);
 
 	    double factor = *fac ? **fac : 1.0;
 	    if (factor != 1.0)
diff --git a/AMDiS/src/RobinBC.cc b/AMDiS/src/RobinBC.cc
index def19d38f562cc26d2255f903ed6aedf142024df..9df83ac1838735235480daf5b74b8970979b2f93 100644
--- a/AMDiS/src/RobinBC.cc
+++ b/AMDiS/src/RobinBC.cc
@@ -223,25 +223,19 @@ namespace AMDiS {
 	    getZeroOrderAssembler()->getQuadrature()->getNumPoints() > 
 	    (*robinOperators)[0]->getAssembler(omp_get_thread_num())->
 	    getZeroOrderAssembler()->getQuadrature()->getNumPoints()) 
-	  {
-	    neumannQuad = true;
-	  }
+	  neumannQuad = true;
       }
     }
 
-    Quadrature *quadrature = NULL;
-    int face;
-
     std::vector<Operator*>::iterator op;
-    for (op = matrix->getOperatorsBegin(); op != matrix->getOperatorsEnd(); ++op) {
-      (*op)->getAssembler(omp_get_thread_num())->initElement(elInfo);
-    }
+    for (op = matrix->getOperatorsBegin(); op != matrix->getOperatorsEnd(); ++op)
+      (*op)->getAssembler(omp_get_thread_num())->initElement(elInfo);    
 
-    for (face = 0; face < dim + 1; face++) {
+    for (int face = 0; face < dim + 1; face++) {
 
       elInfo->getNormal(face, normal);
 
-      quadrature = 
+      Quadrature *quadrature = 
 	neumannQuad ? 
 	(*neumannOperators)[face]->getAssembler(omp_get_thread_num())->
 	getZeroOrderAssembler()->getQuadrature() :
@@ -269,8 +263,8 @@ namespace AMDiS {
 						 &f[0],
 						 1.0);
 	
-	WorldVector<double> *grdUh = new WorldVector<double>[numPoints];
-	WorldVector<double> *A_grdUh = new WorldVector<double>[numPoints];
+	std::vector<WorldVector<double> > grdUh(numPoints);
+	std::vector<WorldVector<double> > A_grdUh(numPoints);
 
 	for (iq = 0; iq < numPoints; iq++) {
 	  A_grdUh[iq].set(0.0);	
@@ -278,12 +272,8 @@ namespace AMDiS {
 	  basFcts->evalGrdUh(lambda, Lambda, uhEl, &grdUh[iq]);
 	}
 
-	for (op = matrix->getOperatorsBegin(); op != matrix->getOperatorsEnd(); ++op) {
-	  (*op)->weakEvalSecondOrder(numPoints, 
-				     grdUh, 
-				     A_grdUh);
-	}
-
+	for (op = matrix->getOperatorsBegin(); op != matrix->getOperatorsEnd(); ++op)
+	  (*op)->weakEvalSecondOrder(grdUh, A_grdUh);	
 
 	if (neumannOperators)
 	  (*neumannOperators)[face]->getC(elInfo, numPoints, f);
@@ -292,9 +282,6 @@ namespace AMDiS {
 	  n_A_grdUh = (normal*A_grdUh[iq]) - f[iq]; 
 	  val += quadrature->getWeight(iq)*sqr(n_A_grdUh);
 	}
-
-	delete [] grdUh;
-	delete [] A_grdUh;
       }
     }