Index: src/Actions/FragmentationAction/StructuralOptimizationAction.cpp
===================================================================
--- src/Actions/FragmentationAction/StructuralOptimizationAction.cpp	(revision 645bede6c215edceee28e4db530afa2093b71113)
+++ src/Actions/FragmentationAction/StructuralOptimizationAction.cpp	(revision 5a289ca56183d056db372a06609cdb55af109b71)
@@ -69,4 +69,5 @@
   prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")).clone());
   prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("step-world-time")).clone());
   prototype_actions.addAction(AR.getActionByName(std::string("force-annealing")).clone());
   prototype_actions.addAction(AR.getActionByName(std::string("output")).clone());
Index: src/Actions/MoleculeAction/ForceAnnealingAction.cpp
===================================================================
--- src/Actions/MoleculeAction/ForceAnnealingAction.cpp	(revision 645bede6c215edceee28e4db530afa2093b71113)
+++ src/Actions/MoleculeAction/ForceAnnealingAction.cpp	(revision 5a289ca56183d056db372a06609cdb55af109b71)
@@ -94,9 +94,13 @@
       params.DampingFactor.get());
   size_t CurrentStep = WorldTime::getInstance().getTime();
+  if (CurrentStep == 0) {
+    ELOG(1, "WorldTime must be at least at step 1 already, use step-world-time if necessary.");
+    return Action::failure;
+  }
 
-  // parse forces into current step
+  // parse forces into last step (assuming we stepped on already)
   if (!params.forcesfile.get().string().empty()) {
     LOG(1, "Parsing forces file.");
-    if (!optimizer.parseForcesFile(params.forcesfile.get().string().c_str(), CurrentStep))
+    if (!optimizer.parseForcesFile(params.forcesfile.get().string().c_str(), CurrentStep-1))
       LOG(2, "File " << params.forcesfile.get() << " not found.");
     else
@@ -104,26 +108,7 @@
   }
 
-  // copy current time step to new one and and proceed on this one
-  {
-    for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection();
-        iter != World::getInstance().endAtomSelection();
-        ++iter) {
-      atom * const Walker = iter->second;
-      Walker->setPositionAtStep(CurrentStep+1,
-          Walker->getPositionAtStep(CurrentStep));
-      // force have already been calculated, hence copy them
-      Walker->setAtomicVelocityAtStep(CurrentStep+1,
-          Walker->getAtomicVelocityAtStep(CurrentStep));
-      Walker->setAtomicForceAtStep(CurrentStep+1,
-          Walker->getAtomicForceAtStep(CurrentStep));
-    }
-    // increment to next time step: re-creates bond graph
-    ++CurrentStep;
-    World::getInstance().setTime(CurrentStep);
-  }
-
   // perform optimization step
   LOG(1, "Structural optimization.");
-  optimizer(CurrentStep, 1, params.UseBondGraph.get());
+  optimizer(CurrentStep-1, 1, params.UseBondGraph.get());
   STATUS("Successfully optimized structure by one step.");
 
Index: src/Dynamics/ForceAnnealing.hpp
===================================================================
--- src/Dynamics/ForceAnnealing.hpp	(revision 645bede6c215edceee28e4db530afa2093b71113)
+++ src/Dynamics/ForceAnnealing.hpp	(revision 5a289ca56183d056db372a06609cdb55af109b71)
@@ -139,8 +139,8 @@
         iter != AtomicForceManipulator<T>::atoms.end(); ++iter) {
       // atom's force vector gives steepest descent direction
-      const Vector oldPosition = (*iter)->getPositionAtStep(CurrentTimeStep-2 >= 0 ? CurrentTimeStep - 2 : 0);
-      const Vector currentPosition = (*iter)->getPosition();
-      const Vector oldGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep-2 >= 0 ? CurrentTimeStep - 2 : 0);
-      const Vector currentGradient = (*iter)->getAtomicForce();
+      const Vector oldPosition = (*iter)->getPositionAtStep(CurrentTimeStep-1 >= 0 ? CurrentTimeStep - 1 : 0);
+      const Vector currentPosition = (*iter)->getPositionAtStep(CurrentTimeStep);
+      const Vector oldGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep-1 >= 0 ? CurrentTimeStep - 1 : 0);
+      const Vector currentGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep);
       LOG(4, "DEBUG: oldPosition for atom " << **iter << " is " << oldPosition);
       LOG(4, "DEBUG: currentPosition for atom " << **iter << " is " << currentPosition);
@@ -197,5 +197,5 @@
    *
    *
-   * \param CurrentTimeStep current time step (i.e. \f$ t + \Delta t \f$ in the sense of the velocity verlet)
+   * \param CurrentTimeStep current time step (i.e. t where \f$ t + \Delta t \f$ is in the sense of the velocity verlet)
    * \param offset offset in matrix file to the first force component
    * \param maxComponents to be filled with maximum force component over all atoms
@@ -226,8 +226,8 @@
         iter != AtomicForceManipulator<T>::atoms.end(); ++iter) {
       // atom's force vector gives steepest descent direction
-      const Vector oldPosition = (*iter)->getPositionAtStep(CurrentTimeStep-2 >= 0 ? CurrentTimeStep - 2 : 0);
-      const Vector currentPosition = (*iter)->getPosition();
-      const Vector oldGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep-2 >= 0 ? CurrentTimeStep - 2 : 0);
-      const Vector currentGradient = (*iter)->getAtomicForce();
+      const Vector oldPosition = (*iter)->getPositionAtStep(CurrentTimeStep-1 >= 0 ? CurrentTimeStep - 1 : 0);
+      const Vector currentPosition = (*iter)->getPositionAtStep(CurrentTimeStep);
+      const Vector oldGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep-1 >= 0 ? CurrentTimeStep - 1 : 0);
+      const Vector currentGradient = (*iter)->getAtomicForceAtStep(CurrentTimeStep);
       LOG(4, "DEBUG: Force for atom " << **iter << " is " << currentGradient);
 
@@ -269,7 +269,7 @@
         const bond &current_bond = *(*bonditer);
         LOG(2, "DEBUG: Looking at bond " << current_bond);
-        Vector BondVector = (*iter)->getPosition();
+        Vector BondVector = (*iter)->getPositionAtStep(CurrentTimeStep);
         BondVector -= ((*iter)->getId() == current_bond.rightatom->getId())
-            ? current_bond.rightatom->getPosition() : current_bond.leftatom->getPosition();
+            ? current_bond.rightatom->getPositionAtStep(CurrentTimeStep) : current_bond.leftatom->getPositionAtStep(CurrentTimeStep);
         BondVector.Normalize();
         if (BondVector.ScalarProduct(currentGradient) < 0) {
Index: tests/regression/Molecules/ForceAnnealing/testsuite-molecules-force-annealing.at
===================================================================
--- tests/regression/Molecules/ForceAnnealing/testsuite-molecules-force-annealing.at	(revision 645bede6c215edceee28e4db530afa2093b71113)
+++ tests/regression/Molecules/ForceAnnealing/testsuite-molecules-force-annealing.at	(revision 5a289ca56183d056db372a06609cdb55af109b71)
@@ -25,5 +25,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/pre/test.forces .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file -I --select-all-atoms --force-annealing --forces-file test.forces --steps 1], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file -I --select-all-atoms --step-world-time 1 --force-annealing --forces-file test.forces --steps 1], 0, [stdout], [stderr])
 AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/post/test.conf], 0, [ignore], [ignore])
 
@@ -39,5 +39,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/pre/test.forces .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file --select-all-atoms --force-annealing --forces-file test.forces --steps 1 --undo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file --select-all-atoms --step-world-time 1 --force-annealing --forces-file test.forces --steps 1 --undo], 0, [stdout], [stderr])
 AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/post/test-undo.conf], 0, [ignore], [ignore])
 
@@ -52,5 +52,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/pre/test.forces .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file --select-all-atoms --force-annealing --forces-file test.forces --steps 1 --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file --select-all-atoms --step-world-time 1 --force-annealing --forces-file test.forces --steps 1 --undo --redo], 0, [stdout], [stderr])
 AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/ForceAnnealing/post/test.conf], 0, [ignore], [ignore])
 
