diff --git a/src/PlumedMain.cpp b/src/PlumedMain.cpp
index 02ce20ffe25f5a9d688549be6b07fa7a3160dfe4..3b7bcd4bedb3a7bfc1fb78b99979cdba74781c22 100644
--- a/src/PlumedMain.cpp
+++ b/src/PlumedMain.cpp
@@ -401,11 +401,19 @@ void PlumedMain::shareData(){
   atoms.share();
 }
 
-
 void PlumedMain::performCalc(){
+  waitData();
+  justCalculate();
+  justApply();
+}
 
+void PlumedMain::waitData(){
   if(!active)return;
   atoms.wait();
+}
+
+
+void PlumedMain::justCalculate(){
 
 // calculate the active actions in order (assuming *backward* dependence)
   for(ActionSet::iterator p=actionSet.begin();p!=actionSet.end();++p){
@@ -424,6 +432,9 @@ void PlumedMain::performCalc(){
       else (*p)->calculate();
     }
   }
+}
+
+void PlumedMain::justApply(){
   
 // apply them in reverse order
   for(ActionSet::reverse_iterator p=actionSet.rbegin();p!=actionSet.rend();++p){
diff --git a/src/PlumedMain.h b/src/PlumedMain.h
index 1f32fa7859bcd0e2f40b5c590f22e55151d6c990..0b4a3835aa33ccf25321fddcf8ac90719a7b8fec 100644
--- a/src/PlumedMain.h
+++ b/src/PlumedMain.h
@@ -107,6 +107,10 @@ public:
   void performCalc();
 /// Shortcut for prepareCalc() + performCalc()
   void calc();
+
+  void waitData();
+  void justCalculate();
+  void justApply();
 /// Reference to atoms object
   Atoms& getAtoms();
 /// Reference to the list of Action's