diff --git a/demo/src/ball.cc b/demo/src/ball.cc
index fc02450219d8a471ba3afdfa77d924597e640dea..516337f90cd812f937ddcf6d3f3edfeb0f6ac46d 100644
--- a/demo/src/ball.cc
+++ b/demo/src/ball.cc
@@ -69,9 +69,6 @@ int main(int argc, char* argv[])
 					       &ball,
 					       adaptInfo);
   
-  // ===== add boundary conditions =====
-  ball.addDirichletBC(1, new G);
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR, ball.getFESpace());
   matrixOperator.addSecondOrderTerm(new Laplace_SOT);
@@ -83,6 +80,9 @@ int main(int argc, char* argv[])
   rhsOperator.addZeroOrderTerm(new CoordsAtQP_ZOT(new F(degree)));
   ball.addVectorOperator(&rhsOperator);
 
+  // ===== add boundary conditions =====
+  ball.addDirichletBC(1, new G);
+
   // ===== start adaption loop =====
   adapt->adapt();
 
diff --git a/demo/src/bunny.cc b/demo/src/bunny.cc
index f52ea411c29382cb7e128f4becc24395901bc2be..50733f3560bb9ea97b69dcda48ab8bf0a470ca54 100644
--- a/demo/src/bunny.cc
+++ b/demo/src/bunny.cc
@@ -66,9 +66,6 @@ int main(int argc, char* argv[])
 					       &bunny,
 					       adaptInfo);
   
-  // ===== add boundary conditions =====
-  //bunny.addDirichletBC(1111, new G);
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR,
 			  bunny.getFESpace());
diff --git a/demo/src/couple.cc b/demo/src/couple.cc
index 68be9f3c73e32194a32d0f1298969d37e17bc4fa..f1af8da1d3828553e9818d65623e78e68d5a1d90 100644
--- a/demo/src/couple.cc
+++ b/demo/src/couple.cc
@@ -141,12 +141,6 @@ int main(int argc, char* argv[])
 		      &problem1,
 		      adoptFlag);
 
-  // ===== add boundary conditions for problem1 =====
-  problem1.addDirichletBC(1, new G);
-
-  // ===== add boundary conditions for problem1 =====
-  //problem2.addDirichletBC(1, new G);
-
   // ===== create operators for problem1 =====
   Operator matrixOperator1(Operator::MATRIX_OPERATOR, problem1.getFESpace());
   matrixOperator1.addSecondOrderTerm(new Laplace_SOT);
@@ -167,6 +161,12 @@ int main(int argc, char* argv[])
 						new Identity(degree)));
   problem2.addVectorOperator(&rhsOperator2);
 
+  // ===== add boundary conditions for problem1 =====
+  problem1.addDirichletBC(1, new G);
+
+  // ===== add boundary conditions for problem1 =====
+  //problem2.addDirichletBC(1, new G);
+
   // ===== create adaptation loop and iteration interface =====
   AdaptInfo *adaptInfo = new AdaptInfo("couple->adapt", 1);
   MyCoupledIteration coupledIteration(&problem1, &problem2);
diff --git a/demo/src/ellipt.cc b/demo/src/ellipt.cc
index 1ba61c89c8e595c122fa2d66d881e1f5d0e624c3..1eaf426ce411234ea8f5a74f8bdae11fb7beb075 100644
--- a/demo/src/ellipt.cc
+++ b/demo/src/ellipt.cc
@@ -65,10 +65,6 @@ int main(int argc, char* argv[])
   AdaptStationary adapt("ellipt->adapt", ellipt, adaptInfo);
 
   
-  // ===== add boundary conditions =====
-  ellipt.addDirichletBC(1, new G);
-
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR, ellipt.getFESpace());
   matrixOperator.addSecondOrderTerm(new Laplace_SOT);
@@ -82,6 +78,10 @@ int main(int argc, char* argv[])
   ellipt.addVectorOperator(rhsOperator);
 
 
+  // ===== add boundary conditions =====
+  ellipt.addDirichletBC(1, new G);
+
+
   // ===== start adaption loop =====
   adapt.adapt();
 
diff --git a/demo/src/heat.cc b/demo/src/heat.cc
index 595f0c09f8ed097f59c5ab9bfe14967408dfa021..bb414fee1bc18db79bbf2074caa1d502e06749e4 100644
--- a/demo/src/heat.cc
+++ b/demo/src/heat.cc
@@ -193,14 +193,6 @@ int main(int argc, char** argv)
 				adaptInfoInitial);
 
 
-  // ===== create boundary functions =====
-  G *boundaryFct = new G;
-  boundaryFct->setTimePtr(heat.getBoundaryTimePtr());
-  heat.setExactSolution(boundaryFct);
-
-  heatSpace.addDirichletBC(DIRICHLET, boundaryFct);
-
-
   // ===== create rhs functions =====
   int degree = heatSpace.getFESpace()->getBasisFcts()->getDegree();
   F *rhsFct = new F(degree);
@@ -235,6 +227,14 @@ int main(int argc, char** argv)
   heatSpace.addVectorOperator(F);
 
 
+  // ===== create boundary functions =====
+  G *boundaryFct = new G;
+  boundaryFct->setTimePtr(heat.getBoundaryTimePtr());
+  heat.setExactSolution(boundaryFct);
+
+  heatSpace.addDirichletBC(DIRICHLET, boundaryFct);
+
+
   // ===== start adaption loop =====
   int errorCode = adaptInstat.adapt();
 
diff --git a/demo/src/neumann.cc b/demo/src/neumann.cc
index 8de2f500b558bda4a757f8b7b2c413513589915c..cd825be11a386c99e42185abb82950a3fb9744fe 100644
--- a/demo/src/neumann.cc
+++ b/demo/src/neumann.cc
@@ -62,10 +62,6 @@ int main(int argc, char* argv[])
 					       &neumann,
 					       adaptInfo);
   
-  // ===== add boundary conditions =====
-  neumann.addNeumannBC(1, new N);
-  neumann.addDirichletBC(2, new G);
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR, neumann.getFESpace());
   matrixOperator.addSecondOrderTerm(new Laplace_SOT);
@@ -77,6 +73,10 @@ int main(int argc, char* argv[])
   rhsOperator.addZeroOrderTerm(new CoordsAtQP_ZOT(new F(degree)));
   neumann.addVectorOperator(&rhsOperator);
 
+  // ===== add boundary conditions =====
+  neumann.addNeumannBC(1, new N);
+  neumann.addDirichletBC(2, new G);
+
   // ===== start adaption loop =====
   adapt->adapt();
 
diff --git a/demo/src/parallelellipt.cc b/demo/src/parallelellipt.cc
index bbe369e4366b127362331992c22079efeb88d753..fe06109906d09c5b18159af3b6e85a0cccc2101a 100644
--- a/demo/src/parallelellipt.cc
+++ b/demo/src/parallelellipt.cc
@@ -71,9 +71,6 @@ int main(int argc, char* argv[])
 					       &parallelellipt,
 					       adaptInfo);
   
-  // ===== add boundary conditions =====
-  ellipt.addDirichletBC(1, new G);
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR, ellipt.getFESpace());
   matrixOperator.addSecondOrderTerm(new Laplace_SOT);
@@ -85,6 +82,9 @@ int main(int argc, char* argv[])
   rhsOperator.addZeroOrderTerm(new CoordsAtQP_ZOT(new F(degree)));
   ellipt.addVectorOperator(&rhsOperator);
 
+  // ===== add boundary conditions =====
+  ellipt.addDirichletBC(1, new G);
+
   parallelellipt.initParallelization(adaptInfo);
   adapt->adapt();
   parallelellipt.exitParallelization(adaptInfo);
diff --git a/demo/src/parallelheat.cc b/demo/src/parallelheat.cc
index 868337f67817f980159dfad81100ef13cb41ab8c..6c774dcee46ad3b0c5d4746d3145519fac33bf3a 100644
--- a/demo/src/parallelheat.cc
+++ b/demo/src/parallelheat.cc
@@ -174,13 +174,6 @@ int main(int argc, char** argv)
 			  &parallelheat,
 			  adaptInfoInitial);
 
-  // ===== create boundary functions =====
-  G *boundaryFct = new G;
-  boundaryFct->setTimePtr(heat->getTimePtr());
-  heat->setBoundaryFct(boundaryFct);
-
-  heatSpace->addDirichletBC(DIRICHLET, boundaryFct);
-
   // ===== create rhs functions =====
   int degree = heatSpace->getFESpace()->getBasisFcts()->getDegree();
   F *rhsFct = new F(degree);
@@ -221,20 +214,21 @@ int main(int argc, char** argv)
 
   heatSpace->addVectorOperator(F);
 
-//   // ===== start adaption loop =====
-//   if(MPI::COMM_WORLD.Get_rank() == 0) {
-//     bool wait=true; 
-//     while(wait) {}
-//   }
+  // ===== create boundary functions =====
+  G *boundaryFct = new G;
+  boundaryFct->setTimePtr(heat->getTimePtr());
+  heat->setBoundaryFct(boundaryFct);
+
+  heatSpace->addDirichletBC(DIRICHLET, boundaryFct);
 
+
+
+//   // ===== start adaption loop =====
   parallelheat.initParallelization(adaptInfo);
 
   adaptInstat->adapt();
 
   parallelheat.exitParallelization(adaptInfo);
 
-//   if(MPI::COMM_WORLD.Get_rank() == 0)
-//     heatSpace->writeFiles(adaptInfo, true);
-
   MPI::Finalize();
 }
diff --git a/demo/src/periodic.cc b/demo/src/periodic.cc
index 99a1f164168e321abd4c15801e91a21a6e6a857e..628a4568696889b4309fa8fb95c5ed6d313b73b4 100644
--- a/demo/src/periodic.cc
+++ b/demo/src/periodic.cc
@@ -52,12 +52,6 @@ int main(int argc, char* argv[])
 					       &periodic,
 					       adaptInfo);
   
-  // ===== add boundary conditions =====
-  periodic.addDirichletBC(1, new G);
-
-  // ===== add periodic conditions =====
-  periodic.addPeriodicBC(-1);
-
   // ===== create matrix operator =====
   Operator matrixOperator(Operator::MATRIX_OPERATOR, periodic.getFESpace());
   matrixOperator.addSecondOrderTerm(new Laplace_SOT);
@@ -69,6 +63,12 @@ int main(int argc, char* argv[])
   rhsOperator.addZeroOrderTerm(new CoordsAtQP_ZOT(new F(degree)));
   periodic.addVectorOperator(&rhsOperator);
 
+  // ===== add boundary conditions =====
+  periodic.addDirichletBC(1, new G);
+
+  // ===== add periodic conditions =====
+  periodic.addPeriodicBC(-1);
+
   // ===== start adaption loop =====
   adapt->adapt();
 
diff --git a/demo/src/vecellipt.cc b/demo/src/vecellipt.cc
index 8b2e5e2d29c5a8e19b5008b95bdb8db84342d22c..36c2f3fe46f9c908bd04de15b21003133a1ace52 100644
--- a/demo/src/vecellipt.cc
+++ b/demo/src/vecellipt.cc
@@ -63,10 +63,6 @@ int main(int argc, char* argv[])
   AdaptStationary adapt("vecellipt->adapt", vecellipt, adaptInfo);
 
   
-  // ===== add boundary conditions =====
-  vecellipt.addDirichletBC(1, 0, 0, new G);
-
-
   // ===== create matrix operators =====
   Operator matrixOperator00(Operator::MATRIX_OPERATOR, 
 			    vecellipt.getFESpace(0), vecellipt.getFESpace(0));
@@ -90,6 +86,9 @@ int main(int argc, char* argv[])
   rhsOperator0.addZeroOrderTerm(new CoordsAtQP_ZOT(new F(degree)));
   vecellipt.addVectorOperator(rhsOperator0, 0);
 
+  // ===== add boundary conditions =====
+  vecellipt.addDirichletBC(1, 0, 0, new G);
+
 
   // ===== start adaption loop =====
   adapt.adapt();
diff --git a/demo/src/vecheat.cc b/demo/src/vecheat.cc
index b19d2a05a3470d1be6c8f0a3b8e14db721644e01..a2dfddaa4f7fea3f3d35dfdd177291a04fcdf3de 100644
--- a/demo/src/vecheat.cc
+++ b/demo/src/vecheat.cc
@@ -248,14 +248,6 @@ int main(int argc, char** argv)
     *(adaptInfo.getTimestepPtr()) *= fac * pow(2.0, -nRefine);
   
 
-  // ===== create boundary functions =====
-  G *boundaryFct = new G;
-  boundaryFct->setTimePtr(vecheat.getBoundaryTimePtr());
-  vecheat.setBoundaryFct(boundaryFct);
-
-  vecheatSpace.addDirichletBC(DIRICHLET, 0, 0, boundaryFct);
-  vecheatSpace.addDirichletBC(DIRICHLET, 1, 1, boundaryFct);
-
   // ===== create rhs functions =====
   F *rhsFct0 = new F(vecheatSpace.getFESpace(0)->getBasisFcts()->getDegree());
   rhsFct0->setTimePtr(vecheat.getRHSTimePtr());
@@ -315,6 +307,14 @@ int main(int argc, char** argv)
   F1.addZeroOrderTerm(new CoordsAtQP_ZOT(rhsFct1));
   vecheatSpace.addVectorOperator(F1, 1);
 
+  // ===== create boundary functions =====
+  G *boundaryFct = new G;
+  boundaryFct->setTimePtr(vecheat.getBoundaryTimePtr());
+  vecheat.setBoundaryFct(boundaryFct);
+
+  vecheatSpace.addDirichletBC(DIRICHLET, 0, 0, boundaryFct);
+  vecheatSpace.addDirichletBC(DIRICHLET, 1, 1, boundaryFct);
+
   // ===== start adaption loop =====
   int errorCode = adaptInstat.adapt();