diff --git a/AMDiS/src/DOFMatrix.cc b/AMDiS/src/DOFMatrix.cc
index 64d4b384424558877e9cc93e3c8e7616d3efab94..eeaad94287e0d4292a3d9f15b82104a4293e07aa 100644
--- a/AMDiS/src/DOFMatrix.cc
+++ b/AMDiS/src/DOFMatrix.cc
@@ -254,17 +254,20 @@ namespace AMDiS {
   {
     set_to_zero(elementMatrix);
 
+    bool addMatrix = false;
     std::vector<Operator*>::iterator it = operators.begin();
     std::vector<double*>::iterator factorIt = operatorFactor.begin();
     for (; it != operators.end(); ++it, ++factorIt)
       if ((*it)->getNeedDualTraverse() == false && 
-	  (*factorIt == NULL || **factorIt != 0.0))
+	  (*factorIt == NULL || **factorIt != 0.0)) {
 	(*it)->getElementMatrix(elInfo,	elementMatrix, *factorIt ? **factorIt : 1.0);
+	addMatrix = true;
+      }
 
     if (factor != 1.0)
       elementMatrix *= factor;
 
-    if (operators.size())
+    if (operators.size() && addMatrix)
       addElementMatrix(elementMatrix, bound, elInfo, NULL); 
   }
 
diff --git a/AMDiS/src/ProblemStat.cc b/AMDiS/src/ProblemStat.cc
index bbb0540d72d349bf79fc7fb14dc67b46296a51c2..741025d4411a73dfdf955ca6f40d1cf9f0b6c29f 100644
--- a/AMDiS/src/ProblemStat.cc
+++ b/AMDiS/src/ProblemStat.cc
@@ -1194,8 +1194,9 @@ namespace AMDiS {
  	      matrix->assemble2(1.0, mainElInfo, auxElInfo,
  				dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
 
-	    if (matrix && matrix->getBoundaryManager())
-	      matrix->getBoundaryManager()->fillBoundaryConditions(mainElInfo, matrix);	
+	    if (componentMeshes[i] == meshes[0] && newEl0 || componentMeshes[i] == meshes[1] && newEl1)
+	      if (matrix && matrix->getBoundaryManager())
+		matrix->getBoundaryManager()->fillBoundaryConditions(mainElInfo, matrix);	
 
 	  } else {
 
@@ -1219,8 +1220,9 @@ namespace AMDiS {
  	      matrix->assemble(1.0, rowElInfo, colElInfo, 
  			       dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound);
 	      
-	      if (matrix->getBoundaryManager())
-		matrix->getBoundaryManager()->fillBoundaryConditions(rowElInfo, matrix);
+	      if (componentMeshes[i] == meshes[0] && newEl0 || componentMeshes[i] == meshes[1] && newEl1)
+		if (matrix->getBoundaryManager())
+		  matrix->getBoundaryManager()->fillBoundaryConditions(rowElInfo, matrix);
 	    }
 	    
  	    if (i == j) {
diff --git a/AMDiS/src/Tetrahedron.cc b/AMDiS/src/Tetrahedron.cc
index 25f0d711c50a3f7c1ec0d7cf5cb52d0b77d7f2e2..4e89ba35a3a5a8b4c1779b405e220fe916e6a7e5 100644
--- a/AMDiS/src/Tetrahedron.cc
+++ b/AMDiS/src/Tetrahedron.cc
@@ -279,14 +279,16 @@ namespace AMDiS {
 	  child[1]->getNodeDofs(feSpace, nextBound1, dofs, baseDofPtr);
 	  
 	  if (addDof)
-	    dofs.push_back(&(child[0]->getDof()[3][n0]));
+            if (std::find(dofs.begin(), dofs.end(), &(child[0]->getDof()[3][n0])) == dofs.end())
+              dofs.push_back(&(child[0]->getDof()[3][n0]));
 	  
 	  child[0]->getNodeDofs(feSpace, nextBound0, dofs, baseDofPtr);
 	} else {
 	  child[0]->getNodeDofs(feSpace, nextBound0, dofs, baseDofPtr);
 	  
 	  if (addDof)
-	    dofs.push_back(&(child[0]->getDof()[3][n0]));
+            if (std::find(dofs.begin(), dofs.end(), &(child[0]->getDof()[3][n0])) == dofs.end())
+              dofs.push_back(&(child[0]->getDof()[3][n0]));
 	  
 	  child[1]->getNodeDofs(feSpace, nextBound1, dofs, baseDofPtr);
 	}