diff --git a/AMDiS/src/AdaptInfo.h b/AMDiS/src/AdaptInfo.h
index 3db5cba2a4e87de2725db6b9e74003e769c325c9..d4be7b40ec64c6bfa3424c084985ce1a99a279cc 100644
--- a/AMDiS/src/AdaptInfo.h
+++ b/AMDiS/src/AdaptInfo.h
@@ -511,12 +511,15 @@ namespace AMDiS {
      */
     inline double setTimestep(double t) { 
       timestep = t; 
-      if (timestep > maxTimestep) 
+      if (timestep > maxTimestep) {
 	timestep = maxTimestep;
-      if (timestep < minTimestep) 
+      }
+      if (timestep < minTimestep) {
 	timestep = minTimestep;
-      if (time + timestep > endTime) 
+      }
+      if (time + timestep > endTime) {
 	timestep = endTime - time;
+      }
       
       return timestep;
     };
@@ -692,6 +695,21 @@ namespace AMDiS {
      */
     void setScalContents(int newSize);
 
+    /** \brief
+     * Resets timestep, current time and time boundaries without
+     * any check. Is used by the parareal algorithm.
+     */
+    void resetTimeValues(double newTimeStep,
+			 double newStartTime,
+			 double newEndTime)
+    {
+      time = newStartTime;
+      startTime = newStartTime;
+      endTime = newEndTime;
+      timestep = newTimeStep;
+      timestepNumber = 0;
+    }
+
     // ===== Serialiazable implementation =====
     void serialize(::std::ostream& out);
 
diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc
index f47ea75f980b8340d9cb7af9b02f07345d9cbbb3..044632a02c2052cab572c6846197f3b652e4eae9 100644
--- a/AMDiS/src/Assembler.cc
+++ b/AMDiS/src/Assembler.cc
@@ -1401,19 +1401,17 @@ namespace AMDiS {
       rememberElVec = true;
     }
 
-    if (rememberElVec && !elementVector)
+    if (rememberElVec && !elementVector) {
       elementVector = NEW ElementVector(nRow);
+    }
 
     Element *el = elInfo->getElement();
-
     checkForNewTraverse();
-
     checkQuadratures();
 
     if ((el != lastMatEl && el != lastVecEl) || !operat->isOptimized()) {
       initElement(elInfo);
     }
-
     
     if (el != lastVecEl || !operat->isOptimized()) {
       if (rememberElVec) {
@@ -1426,9 +1424,7 @@ namespace AMDiS {
 	return;
       }
     }
-    
     ElementVector *vec = rememberElVec ? elementVector : userVec;
-
     if (operat->uhOld && remember) {
       matVecAssemble(elInfo, vec);
       if (rememberElVec) {
@@ -1436,12 +1432,12 @@ namespace AMDiS {
       }
       return;
     } 
-    
-    if (firstOrderAssemblerGrdPsi)
+    if (firstOrderAssemblerGrdPsi) {
       firstOrderAssemblerGrdPsi->calculateElementVector(elInfo, vec);
-    if (zeroOrderAssembler)
+    }
+    if (zeroOrderAssembler) {
       zeroOrderAssembler->calculateElementVector(elInfo, vec);
-        
+    }
     if (rememberElVec) {
       axpy(factor, *elementVector, *userVec);
     }      
diff --git a/AMDiS/src/DOFAdmin.cc b/AMDiS/src/DOFAdmin.cc
index e2f9a884009cf214800970fd5b4045ae43cd6439..af82150f6706dc94f8348bccf744f71565c5d620 100755
--- a/AMDiS/src/DOFAdmin.cc
+++ b/AMDiS/src/DOFAdmin.cc
@@ -28,7 +28,7 @@ namespace AMDiS {
       nr0DOF(mesh->getDim(), NO_INIT)
   { init(); }
 
-  DOFAdmin::DOFAdmin(Mesh* m,::std::string aName) 
+  DOFAdmin::DOFAdmin(Mesh* m,std::string aName) 
     : name(aName), 
       mesh(m), 
       nrDOF(mesh->getDim(), NO_INIT),
@@ -81,15 +81,15 @@ namespace AMDiS {
     TEST_EXIT_DBG(usedCount > 0)("no dofs in use\n");
     TEST_EXIT_DBG((dof >= 0) && (dof < size))("invalid dof index %d\n",dof);
 
-    ::std::list<DOFIndexedBase*>::iterator di;
-    ::std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
+    std::list<DOFIndexedBase*>::iterator di;
+    std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
 
     for(di = dofIndexedList.begin(); di != end; ++di) {
       (*di)->freeDOFContent(dof);
     }
 
-    ::std::list<DOFContainer*>::iterator dc;
-    ::std::list<DOFContainer*>::iterator dcend = dofContainerList.end();
+    std::list<DOFContainer*>::iterator dc;
+    std::list<DOFContainer*>::iterator dcend = dofContainerList.end();
 
     for(dc = dofContainerList.begin(); dc != dcend; ++dc) {
       (*dc)->freeDOFIndex(dof);
@@ -151,14 +151,13 @@ namespace AMDiS {
   void DOFAdmin::enlargeDOFLists(int minsize)
   {
     FUNCNAME("DOFAdmin::enlargeDOFLists");
-    int              old, newval; //, i, j;
   
-    old = size;
+    int old = size;
     if (minsize > 0) {
       if (old > minsize) return;
     }
   
-    newval = max(minsize, static_cast<int>((dofFree.size() + sizeIncrement)));
+    int newval = max(minsize, static_cast<int>((dofFree.size() + sizeIncrement)));
 
     size = newval;
   
@@ -170,8 +169,8 @@ namespace AMDiS {
     // enlarge all vectors and matrices
     // but DOFVectors<int> don't have to be changed
   
-    ::std::list<DOFIndexedBase*>::iterator di;
-    ::std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
+    std::list<DOFIndexedBase*>::iterator di;
+    std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
 
     for (di = dofIndexedList.begin(); di != end; ++di) {
       if ((*di)->getSize() < newval) {
@@ -195,8 +194,8 @@ namespace AMDiS {
   {
     FUNCNAME("DOFAdmin::removeDOFIndexed()");
 
-    ::std::list<DOFIndexedBase*>::iterator it;
-    ::std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
+    std::list<DOFIndexedBase*>::iterator it;
+    std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
     for (it = dofIndexedList.begin(); it != end; ++it) {
       if (*it == dofIndexed) {
 	dofIndexedList.erase(it);
@@ -218,8 +217,8 @@ namespace AMDiS {
   {
     FUNCNAME("DOFAdmin::removeDOFContainer()");
 
-    ::std::list<DOFContainer*>::iterator it;
-    ::std::list<DOFContainer*>::iterator end = dofContainerList.end();
+    std::list<DOFContainer*>::iterator it;
+    std::list<DOFContainer*>::iterator end = dofContainerList.end();
     for (it = dofContainerList.begin(); it != end; ++it) {
       if (*it == cont) {
 	dofContainerList.erase(it);
@@ -232,10 +231,9 @@ namespace AMDiS {
 
   /****************************************************************************/
 
-  void DOFAdmin::compress(::std::vector<DegreeOfFreedom> &new_dof)
+  void DOFAdmin::compress(std::vector<DegreeOfFreedom> &new_dof)
   {
     FUNCNAME("DOFAdmin::compress()");
-    int i,n,first,last=0;
 
     // nothing to do ?
     if (size < 1) return;
@@ -243,16 +241,18 @@ namespace AMDiS {
     if (holeCount < 1) return;
 
     // vector to mark used dofs
-    for(i=0; i < size; i++) {
+    for (int i = 0; i < size; i++) {
       new_dof[i] = -1;
     }
 
     // mark used dofs
     DOFIteratorBase it(this, USED_DOFS);
-    for (it.reset(); !it.end(); ++it) new_dof[it.getDOFIndex()] = 1;
+    for (it.reset(); !it.end(); ++it) {
+      new_dof[it.getDOFIndex()] = 1;
+    }
   
-    n = 0;
-    for (i = 0; i < size; i++) {             /* create a MONOTONE compress */
+    int n = 0, last = 0;
+    for (int i = 0; i < size; i++) {             /* create a MONOTONE compress */
       if (new_dof[i] == 1) {
 	new_dof[i] = n++;
 	last = i;
@@ -262,11 +262,11 @@ namespace AMDiS {
     TEST_EXIT_DBG(n == usedCount)("count %d != usedCount %d\n", n, usedCount);
   
     // mark used dofs in compressed dofFree
-    for(i=0; i < n; i++) {
+    for (int i = 0; i < n; i++) {
       dofFree[i] = false;
     }
     // mark unused dofs in compressed dofFree
-    for(i=n; i < size; i++) {
+    for (int i = n; i < size; i++) {
       dofFree[i] = true;
     }
 
@@ -275,24 +275,24 @@ namespace AMDiS {
     sizeUsed  = n;
   
     // get index of first changed dof
-    first = last;
-    for (i=0; i<size; i++) {
+    int first = last;
+    for (int i = 0; i<size; i++) {
       if ((new_dof[i] < i) && (new_dof[i] >= 0)) {
 	first = i;
 	break;
       }
     }
 
-    ::std::list<DOFIndexedBase*>::iterator di;
-    ::std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
-    for(di = dofIndexedList.begin(); di != end; ++di) {
+    std::list<DOFIndexedBase*>::iterator di;
+    std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
+    for (di = dofIndexedList.begin(); di != end; ++di) {
       (*di)->compressDOFIndexed(first, last, new_dof);
     };
 
   
-    ::std::list<DOFContainer*>::iterator dc;
-    ::std::list<DOFContainer*>::iterator endc = dofContainerList.end();
-    for(dc = dofContainerList.begin(); dc != endc; dc++) {
+    std::list<DOFContainer*>::iterator dc;
+    std::list<DOFContainer*>::iterator endc = dofContainerList.end();
+    for (dc = dofContainerList.begin(); dc != endc; dc++) {
       (*dc)->compressDOFContainer(n, new_dof);
     };  
 
@@ -312,19 +312,17 @@ namespace AMDiS {
   }
 
   DOFAdmin::~DOFAdmin()
-  {
-  }
+  {}
 
-  void DOFAdmin::serialize(::std::ostream &out) 
+  void DOFAdmin::serialize(std::ostream &out) 
   {
     // write name
-    out << name << ::std::endl;
+    out << name << std::endl;
 
     // write dofFree
-    int i;
     int s = static_cast<int>(dofFree.size());
     out.write(reinterpret_cast<const char*>(&s), sizeof(int));
-    for (i = 0; i < s; i++) {
+    for (int i = 0; i < s; i++) {
       bool free = dofFree[i];
       out.write(reinterpret_cast<const char*>(&free), sizeof(bool));
     }
@@ -351,18 +349,17 @@ namespace AMDiS {
     nr0DOF.serialize(out);
 }
 
-  void DOFAdmin::deserialize(::std::istream &in)
+  void DOFAdmin::deserialize(std::istream &in)
   {
     // read name
     in >> name;
     in.get();
 
     // read dofFree
-    int i;
     int s;
     in.read(reinterpret_cast<char*>(&s), sizeof(int));
     dofFree.resize(s);
-    for (i = 0; i < s; i++) {
+    for (int i = 0; i < s; i++) {
       bool free;
       in.read(reinterpret_cast<char*>(&free), sizeof(bool));
       dofFree[i] = free;
@@ -389,10 +386,10 @@ namespace AMDiS {
     // read nr0DOF
     nr0DOF.deserialize(in);
 
-    ::std::list<DOFIndexedBase*>::iterator di;
-    ::std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
+    std::list<DOFIndexedBase*>::iterator di;
+    std::list<DOFIndexedBase*>::iterator end = dofIndexedList.end();
 
-    for(di = dofIndexedList.begin(); di != end; ++di) {
+    for (di = dofIndexedList.begin(); di != end; ++di) {
       (*di)->resize(size);
     }
   }
diff --git a/AMDiS/src/DOFVector.hh b/AMDiS/src/DOFVector.hh
index fb1e841098bf61ee9de10640e0d86b4aaaecf30a..bb09516283aa3d5990e126917bd21aee995311b6 100644
--- a/AMDiS/src/DOFVector.hh
+++ b/AMDiS/src/DOFVector.hh
@@ -756,14 +756,13 @@ namespace AMDiS {
     } else {
       ::std::vector<Operator*>::iterator it;
       ::std::vector<double*>::iterator factorIt;
-      for(it = this->operators.begin(), factorIt = this->operatorFactor.begin();	
-	  it != this->operators.end(); 
-	  ++it, ++factorIt) 
-	{
-	  (*it)->getElementVector(elInfo, 
-				  this->elementVector, 
-				  *factorIt ? **factorIt : 1.0);
-	}
+      for (it = this->operators.begin(), factorIt = this->operatorFactor.begin();	
+	   it != this->operators.end(); 
+	   ++it, ++factorIt) {
+	(*it)->getElementVector(elInfo, 
+				this->elementVector, 
+				*factorIt ? **factorIt : 1.0);
+      }
     }
 
     addElementVector(factor,
diff --git a/AMDiS/src/ProblemInstat.cc b/AMDiS/src/ProblemInstat.cc
index 376a8f9223a3cb5dc6935bf4365c4badd843ab4e..ffda85ef1dde6a996903b85617db4ad7fb071908 100644
--- a/AMDiS/src/ProblemInstat.cc
+++ b/AMDiS/src/ProblemInstat.cc
@@ -51,7 +51,8 @@ namespace AMDiS {
 				       ProblemScal *prob,
 				       ProblemStatBase *initialProb)
     : ProblemInstat(name_, initialProb), 
-      problemStat(prob),oldSolution(NULL)
+      problemStat(prob),
+      oldSolution(NULL)
   {};
 
 
@@ -119,7 +120,8 @@ namespace AMDiS {
 				     ProblemVec *prob,
 				     ProblemStatBase *initialProb)
     : ProblemInstat(name_, initialProb), 
-      problemStat(prob),oldSolution(NULL)
+      problemStat(prob),
+      oldSolution(NULL)
   {};
 
   ProblemInstatVec::~ProblemInstatVec()
@@ -150,8 +152,8 @@ namespace AMDiS {
       }
     }
 
-    if(!oldSolution) WARNING("no oldSolution created\n");
-
+    if (!oldSolution) 
+      WARNING("no oldSolution created\n");
   }
 
   void ProblemInstatVec::createUhOld() {
diff --git a/AMDiS/src/ProblemScal.cc b/AMDiS/src/ProblemScal.cc
index a040ef5d06bd3f400874e46ff07fffbf8e313932..9ae4a1d19b5d355dd03547e3d5c29ac41c9eaa18 100644
--- a/AMDiS/src/ProblemScal.cc
+++ b/AMDiS/src/ProblemScal.cc
@@ -585,7 +585,6 @@ namespace AMDiS {
     rhs_->set(0.0);
 
     traversePtr_ = this;
-
     mesh_->traverse(-1, assembleFlag, &buildAfterCoarsenFct);
 
     // fill boundary conditions
@@ -633,10 +632,11 @@ namespace AMDiS {
   {
     const BoundaryType *bound;
 
-    if (traversePtr_->getBoundUsed())
+    if (traversePtr_->getBoundUsed()) {
       bound = traversePtr_->getFESpace()->getBasisFcts()->getBound(elInfo, NULL);
-    else
+    } else {
       bound = NULL;
+    }
   
     traversePtr_->getSystemMatrix()->assemble(1.0, elInfo, bound);
     traversePtr_->getRHS()->assemble(1.0, elInfo, bound);
diff --git a/AMDiS/src/parareal/AdaptInfo.cc b/AMDiS/src/parareal/AdaptInfo.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/AMDiS/src/parareal/AdaptInfo.h b/AMDiS/src/parareal/AdaptInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/AMDiS/src/parareal/ProblemBase.cc b/AMDiS/src/parareal/ProblemBase.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/AMDiS/src/parareal/ProblemBase.h b/AMDiS/src/parareal/ProblemBase.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391