Index: doc/userguide/userguide.xml
===================================================================
--- doc/userguide/userguide.xml	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ doc/userguide/userguide.xml	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -1177,4 +1177,15 @@
         <link linkend='geometry'>Geometry</link>.</para>
         </section>
+        <section xml:id="molecule.rotate-around-bond">
+          <title xml:id="molecule.rotate-around-bond.title">Rotate around bond </title>
+          <para>This rotates parts of a molecule around a given bond, i.e. the
+          bond vector becomes the rotation axis but only atoms on the side of
+          second atom get rotated. This naturally does not work for bonds in a
+          cycle.</para>
+          <programlisting>
+  ... --rotate-around-bond &quot;90&quot; \
+      --bond-side 0\
+   </programlisting>
+        </section>
         <section xml:id="molecule.rotate-around-self">
           <title xml:id="molecule.rotate-around-self.title">Rotate around self </title>
@@ -2658,4 +2669,22 @@
       under the command-line interface and look up the function name via
       help.</para>
+      <para>You can freely mix calls to the pymolecuilder module and other python commands.</para>
+      <note>However, be aware that all Actions are executed in another thread,
+      i.e. run in parallel. That means that a pymolecuilder command is not 
+      necessarily finished when python steps on to the next line!</note>
+      <para>In order to make python wait for the Actions to finish before
+      stepping, there is the special wait() command.</para>
+      <programlisting>
+         mol.MoleculeLoad("...")
+         mol.wait()
+      </programlisting>
+      <para>This will continue first after the molecule has been fully loaded.
+      </para>
+      <warning>These wait()s will have no effect if the python script is loaded
+      via the "load-session" command inside a User Interface (command-line,
+      GUI, ...) as this would cause the queue to wait indefinitely, namely till
+      the load-session itself would have finished.</warning>
+      <para>Therefore, more complex python scripts need to be called with
+      python and a set PYTHONPATH as described above.</para>
     </section>
   </chapter>
Index: src/Actions/Action.hpp
===================================================================
--- src/Actions/Action.hpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/Action.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -29,5 +29,7 @@
  */
 #ifndef STATUS
-#define STATUS(msg) pushStatus(msg)
+#define STATUS(msg) \
+  pushStatus(msg); \
+  LOG(0, "STATUS: " << msg)
 #endif
 
Index: src/Actions/GlobalListOfActions.hpp
===================================================================
--- src/Actions/GlobalListOfActions.hpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/GlobalListOfActions.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -88,4 +88,5 @@
   (MoleculeLoad) \
   (MoleculeRemove) \
+  (MoleculeRotateAroundBond) \
   (MoleculeRotateAroundSelfByAngle) \
   (MoleculeRotateToPrincipalAxisSystem) \
Index: src/Actions/Makefile.am
===================================================================
--- src/Actions/Makefile.am	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/Makefile.am	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -339,4 +339,5 @@
   Actions/MoleculeAction/LoadAction.cpp \
   Actions/MoleculeAction/RemoveAction.cpp \
+  Actions/MoleculeAction/RotateAroundBondAction.cpp \
   Actions/MoleculeAction/RotateAroundSelfByAngleAction.cpp \
   Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp \
@@ -357,4 +358,5 @@
   Actions/MoleculeAction/LoadAction.hpp \
   Actions/MoleculeAction/RemoveAction.hpp \
+  Actions/MoleculeAction/RotateAroundBondAction.hpp \
   Actions/MoleculeAction/RotateAroundSelfByAngleAction.hpp \
   Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.hpp \
@@ -375,4 +377,5 @@
   Actions/MoleculeAction/LoadAction.def \
   Actions/MoleculeAction/RemoveAction.def \
+  Actions/MoleculeAction/RotateAroundBondAction.def \
   Actions/MoleculeAction/RotateAroundSelfByAngleAction.def \
   Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.def \
Index: src/Actions/MoleculeAction/RotateAroundBondAction.cpp
===================================================================
--- src/Actions/MoleculeAction/RotateAroundBondAction.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ src/Actions/MoleculeAction/RotateAroundBondAction.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,177 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2017 Frederik Heber. All rights reserved.
+ * 
+ *
+ *   This file is part of MoleCuilder.
+ *
+ *    MoleCuilder is free software: you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation, either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    MoleCuilder is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * RotateAroundBondAction.cpp
+ *
+ *  Created on: Mar 22, 2017
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+//#include "CodePatterns/MemDebug.hpp"
+
+#include "Actions/MoleculeAction/RotateAroundBondAction.hpp"
+
+#include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
+
+#include "LinearAlgebra/Line.hpp"
+#include "LinearAlgebra/Plane.hpp"
+
+#include "Actions/UndoRedoHelpers.hpp"
+#include "Graph/CyclicStructureAnalysis.hpp"
+#include "Graph/DepthFirstSearchAnalysis.hpp"
+
+#include "Atom/atom.hpp"
+#include "Atom/AtomicInfo.hpp"
+#include "Bond/bond.hpp"
+#include "molecule.hpp"
+#include "World.hpp"
+#include "WorldTime.hpp"
+
+using namespace MoleCuilder;
+
+// and construct the stuff
+#include "RotateAroundBondAction.def"
+#include "Action_impl_pre.hpp"
+
+/** =========== define the function ====================== */
+static bool IsBondContainedInCycle(const bond::ptr &_bond)
+{
+  // get the BackEdgeStack from somewhere
+  DepthFirstSearchAnalysis DFS;
+  DFS();
+  DFS.CyclicBondAnalysis();
+//  std::deque<bond::ptr> BackEdgeStack = DFS.getBackEdgeStack();
+//  // then we analyse the cycles and get them
+//  CyclicStructureAnalysis CycleAnalysis(ExcludeHydrogen); // hydrogens never contained in cycles
+//  CycleAnalysis(&BackEdgeStack);
+  return _bond->Cyclic;
+}
+
+ActionState::ptr MoleculeRotateAroundBondAction::performCall()
+{
+  // check preconditions
+  const std::vector< atom *> atoms = World::getInstance().getSelectedAtoms();
+  if (atoms.size() != 2) {
+    STATUS("Exactly two atoms must be selected to specify a bond.");
+    return Action::failure;
+  }
+  if (!atoms[0]->IsBondedTo(WorldTime::getTime(), atoms[1])) {
+    STATUS("Two given atoms are not bonded.");
+    return Action::failure;
+  }
+  molecule *mol = World::getInstance().
+      getMolecule(MoleculeById(atoms[0]->getMolecule()->getId()));
+  if (mol != atoms[1]->getMolecule()) {
+    STATUS("The two selected atoms must belong to the same molecule.");
+    return Action::failure;
+  }
+  if (IsBondContainedInCycle(atoms[0]->getBond(atoms[1]))) {
+    STATUS("The given bond is contained in a cycle, cannot rotate!");
+    return Action::failure;
+  }
+
+  // gather undo information: store position of all atoms of molecule
+  std::vector<AtomicInfo> UndoInfo;
+  UndoInfo.reserve(mol->size());
+  {
+    for (molecule::const_iterator iter = const_cast<molecule const *>(mol)->begin();
+        iter != const_cast<molecule const *>(mol)->end();
+        ++iter) {
+      const atom * const Walker = *iter;
+      UndoInfo.push_back(AtomicInfo(*Walker));
+    }
+  }
+
+  // convert from degrees to radian
+  const double angle_radian = params.angle.get() * M_PI/180.;
+
+  // create the bond plane and mid-distance
+  Vector NormalVector = (atoms[0]->getPosition() - atoms[1]->getPosition());
+  NormalVector.Normalize();
+  const Vector OffsetVector = 0.5*(atoms[0]->getPosition() + atoms[1]->getPosition());
+  Plane bondplane(NormalVector, OffsetVector);
+  Line RotationAxis(OffsetVector, NormalVector);
+  // go through the molecule and rotate each atom relative two plane
+  for (molecule::iterator iter = mol->begin(); iter != mol->end(); ++iter) {
+    const Vector &position = (*iter)->getPosition();
+    const double signed_distance = bondplane.SignedDistance(position);
+    LOG(3, "DEBUG: Inspecting atom " << **iter << " at " << position);
+    if ((params.bondside.get() && (signed_distance > 0)) ||
+        (!params.bondside.get() && (signed_distance < 0))) {
+      LOG(4, "DEBUG: Rotating atom " << **iter << " by " << angle_radian
+          << " rad around " << RotationAxis);
+      (*iter)->setPosition(RotationAxis.rotateVector((*iter)->getPosition(), angle_radian));
+      LOG(4, "DEBUG: New position of atom " << **iter);
+      ASSERT( fabs(signed_distance - bondplane.SignedDistance(position)) < MYEPSILON,
+          "MoleculeRotateAroundBondAction::performCall() - signed distance was "
+          +toString(signed_distance)+" and is now "+toString(bondplane.SignedDistance(position)));
+    }
+  }
+
+  MoleculeRotateAroundBondState *UndoState =
+      new MoleculeRotateAroundBondState(UndoInfo, OffsetVector, NormalVector, mol, params);
+  return ActionState::ptr(UndoState);
+}
+
+ActionState::ptr MoleculeRotateAroundBondAction::performUndo(ActionState::ptr _state) {
+  MoleculeRotateAroundBondState *state = assert_cast<MoleculeRotateAroundBondState*>(_state.get());
+
+  // set stored old state
+  SetAtomsFromAtomicInfo(state->UndoInfo);
+
+  return ActionState::ptr(_state);
+}
+
+ActionState::ptr MoleculeRotateAroundBondAction::performRedo(ActionState::ptr _state){
+  MoleculeRotateAroundBondState *state = assert_cast<MoleculeRotateAroundBondState*>(_state.get());
+
+  // create the bond plane and mid-distance
+  Plane bondplane(state->NormalVector, state->OffsetVector);
+  Line RotationAxis(state->OffsetVector, state->NormalVector);
+  const double angle_radian = params.angle.get() * M_PI/180.;
+  // go through the molecule and rotate each atom relative two plane
+  for (molecule::iterator iter = state->mol->begin(); iter != state->mol->end(); ++iter) {
+    const Vector &position = (*iter)->getPosition();
+    if ((params.bondside.get() && (bondplane.SignedDistance(position) > 0)) ||
+        (!params.bondside.get() && (bondplane.SignedDistance(position) < 0))) {
+      (*iter)->setPosition(RotationAxis.rotateVector((*iter)->getPosition(), angle_radian));
+    }
+  }
+
+  return ActionState::ptr(_state);
+}
+
+bool MoleculeRotateAroundBondAction::canUndo() {
+  return true;
+}
+
+bool MoleculeRotateAroundBondAction::shouldUndo() {
+  return true;
+}
+/** =========== end of function ====================== */
Index: src/Actions/MoleculeAction/RotateAroundBondAction.def
===================================================================
--- src/Actions/MoleculeAction/RotateAroundBondAction.def	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ src/Actions/MoleculeAction/RotateAroundBondAction.def	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,38 @@
+/*
+ * StretchBondAction.def
+ *
+ *  Created on: Mar 22, 2017
+ *      Author: heber
+ */
+
+// all includes and forward declarations necessary for non-integral types below
+
+#include "Parameters/Validators/DummyValidator.hpp"
+#include "Parameters/Validators/Specific/RotationAngleValidator.hpp"
+
+// i.e. there is an integer with variable name Z that can be found in
+// ValueStorage by the token "Z" -> first column: int, Z, "Z"
+// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
+#define paramtypes (double)(bool)
+#define paramtokens ("rotate-around-bond")("bondside")
+#define paramdescriptions ("relative angle to rotate about")("which side of the bond to rotate")
+#define paramdefaults (NOPARAM_DEFAULT)(PARAM_DEFAULT(1))
+#define paramreferences (angle)(bondside)
+#define paramvalids \
+(RotationAngleValidator()) \
+(DummyValidator<bool>())
+
+#define statetypes (std::vector<AtomicInfo>)(const Vector)(const Vector)(molecule *)
+#define statereferences (UndoInfo)(OffsetVector)(NormalVector)(mol)
+
+// some defines for all the names, you may use ACTION, STATE and PARAMS
+#define CATEGORY Molecule
+#define MENUNAME "molecule"
+#define MENUPOSITION 11
+#define ACTIONNAME RotateAroundBond
+#define TOKEN "rotate-around-bond"
+
+
+// finally the information stored in the ActionTrait specialization
+#define DESCRIPTION "rotate a part of a molecule around a specified bond by a given relative angle"
+#undef SHORTFORM
Index: src/Actions/MoleculeAction/RotateAroundBondAction.hpp
===================================================================
--- src/Actions/MoleculeAction/RotateAroundBondAction.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ src/Actions/MoleculeAction/RotateAroundBondAction.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,22 @@
+/*
+ * RotateAroundBondAction.hpp
+ *
+ *  Created on: Mar 22, 2017
+ *      Author: heber
+ */
+
+#ifndef ROTATEAROUNDBONDACTION_HPP
+#define ROTATEAROUNDBONDACTION_HPP
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "Actions/Action.hpp"
+
+#include "RotateAroundBondAction.def"
+#include "Action_impl_header.hpp"
+
+#endif // ROTATEAROUNDBONDACTION_HPP
Index: src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp
===================================================================
--- src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -35,6 +35,9 @@
 //#include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
-#include "CodePatterns/Verbose.hpp"
+
+#include "Actions/UndoRedoHelpers.hpp"
+#include "Atom/AtomicInfo.hpp"
 #include "LinearAlgebra/Line.hpp"
 #include "LinearAlgebra/RealSpaceMatrix.hpp"
@@ -58,31 +61,54 @@
   molecule *mol = NULL;
 
+  std::vector<AtomicInfo> UndoInfo;
   for (World::MoleculeSelectionIterator iter = World::getInstance().beginMoleculeSelection(); iter != World::getInstance().endMoleculeSelection(); ++iter) {
     mol = iter->second;
     LOG(0, "Converting to prinicipal axis system.");
 
-    RealSpaceMatrix InertiaTensor = mol->getInertiaTensor();
+    // gather undo information: store position of all atoms of molecule
+    UndoInfo.reserve(UndoInfo.size()+mol->size());
+    {
+      for (molecule::const_iterator iter = const_cast<molecule const *>(mol)->begin();
+          iter != const_cast<molecule const *>(mol)->end();
+          ++iter) {
+        const atom * const Walker = *iter;
+        UndoInfo.push_back(AtomicInfo(*Walker));
+      }
+    }
 
+    // rotate
+//    RealSpaceMatrix InertiaTensor = mol->getInertiaTensor();
     mol->RotateToPrincipalAxisSystem(params.Axis.get());
 
     // summing anew for debugging (resulting matrix has to be diagonal!)
-    InertiaTensor = mol->getInertiaTensor();
+    RealSpaceMatrix InertiaTensor = mol->getInertiaTensor();
   }
-  return Action::success;
+
+  MoleculeRotateToPrincipalAxisSystemState *UndoState =
+      new MoleculeRotateToPrincipalAxisSystemState(UndoInfo, params);
+  return ActionState::ptr(UndoState);
 }
 
 ActionState::ptr MoleculeRotateToPrincipalAxisSystemAction::performUndo(ActionState::ptr _state) {
-//  MoleculeRotateToPrincipalAxisSystemState *state = assert_cast<MoleculeRotateToPrincipalAxisSystemState*>(_state.get());
+  MoleculeRotateToPrincipalAxisSystemState *state =
+      assert_cast<MoleculeRotateToPrincipalAxisSystemState*>(_state.get());
 
-//  string newName = state->mol->getName();
-//  state->mol->setName(state->lastName);
+  // set stored old state
+  SetAtomsFromAtomicInfo(state->undoinfo);
 
-  STATUS("Undo of MoleculeRotateToPrincipalAxisSystemAction not implemented.");
-  return Action::failure;
+  return ActionState::ptr(_state);
 }
 
 ActionState::ptr MoleculeRotateToPrincipalAxisSystemAction::performRedo(ActionState::ptr _state){
-  STATUS("Redo of MoleculeRotateToPrincipalAxisSystemAction not implemented.");
-  return Action::failure;
+  MoleculeRotateToPrincipalAxisSystemState *state =
+      assert_cast<MoleculeRotateToPrincipalAxisSystemState*>(_state.get());
+
+  for (World::MoleculeSelectionIterator iter = World::getInstance().beginMoleculeSelection();
+      iter != World::getInstance().endMoleculeSelection(); ++iter) {
+    molecule * const mol = iter->second;
+    mol->RotateToPrincipalAxisSystem(state->params.Axis.get());
+  }
+
+  return ActionState::ptr(_state);
 }
 
Index: src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.def
===================================================================
--- src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.def	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.def	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -7,5 +7,8 @@
 
 // all includes and forward declarations necessary for non-integral types below
+#include <vector>
+
 #include "Actions/Values.hpp"
+#include "Atom/AtomicInfo.hpp"
 #include "LinearAlgebra/Vector.hpp"
 
@@ -23,6 +26,6 @@
 (VectorNotZeroValidator())
 
-#undef statetypes
-#undef statereferences
+#define statetypes (std::vector<AtomicInfo>)
+#define statereferences (undoinfo)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
Index: src/Actions/PotentialAction/ParsePotentialsAction.cpp
===================================================================
--- src/Actions/PotentialAction/ParsePotentialsAction.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/PotentialAction/ParsePotentialsAction.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -73,14 +73,15 @@
         deserialize();
       } catch (SerializerMissingValueException &e) {
-        if (const std::string *key = boost::get_error_info<SerializerKey>(e))
+        if (const std::string *key = boost::get_error_info<SerializerKey>(e)) {
           STATUS("Missing value when parsing information for potential "+*key+".");
-        else
+        } else
           STATUS("Missing value parsing information for potential with unknown key.");
         return Action::failure;
       } catch (SerializerIllegalKeyException &e) {
-        if (const std::string *key = boost::get_error_info<SerializerKey>(e))
+        if (const std::string *key = boost::get_error_info<SerializerKey>(e)) {
           STATUS("Illegal key parsing information for potential "+*key+".");
-        else
+        } else {
           STATUS("Illegal key parsing information for potential with unknown key.");
+        }
         return Action::failure;
       }
Index: src/Actions/WorldAction/StepWorldTimeAction.cpp
===================================================================
--- src/Actions/WorldAction/StepWorldTimeAction.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/WorldAction/StepWorldTimeAction.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -47,16 +47,4 @@
 using namespace MoleCuilder;
 
-// if both are given, we use backwards
-static int getSteps(const unsigned int _forward, const unsigned int _backward)
-{
-  int steps = 0;
-  if (_backward > 0)
-    steps = -_backward;
-  else
-    steps = _forward;
-
-  return steps;
-}
-
 // and construct the stuff
 #include "StepWorldTimeAction.def"
@@ -69,12 +57,10 @@
   WorldStepWorldTimeState *UndoState = new WorldStepWorldTimeState(oldtime, params);
 
-  const int steps = getSteps(params.steps_forward.get(), params.steps_backward.get());
-
-  if ((oldtime + steps) < 0) {
+  if ((oldtime + params.steps.get()) < 0) {
     ELOG(1, "Cannot step back before time step #0.");
     delete UndoState;
     return Action::failure;
   }
-  World::getInstance().setTime(oldtime+steps);
+  World::getInstance().setTime(oldtime+params.steps.get());
   LOG(0, "Current time step is now: " << WorldTime::getTime() << ".");
   return ActionState::ptr(UndoState);
@@ -93,9 +79,5 @@
   WorldStepWorldTimeState *state = assert_cast<WorldStepWorldTimeState*>(_state.get());
 
-  const int steps = getSteps(
-      state->params.steps_forward.get(),
-      state->params.steps_backward.get());
-
-  World::getInstance().setTime(state->oldtime+steps);
+  World::getInstance().setTime(state->oldtime+state->params.steps.get());
   LOG(0, "Current time step is now: " << WorldTime::getTime() << ".");
 
Index: src/Actions/WorldAction/StepWorldTimeAction.def
===================================================================
--- src/Actions/WorldAction/StepWorldTimeAction.def	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Actions/WorldAction/StepWorldTimeAction.def	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -14,12 +14,11 @@
 // ValueStorage by the token "Z" -> first column: int, Z, "Z"
 // "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
-#define paramtypes (unsigned int)(unsigned int)
-#define paramtokens ("steps-forward")("steps-backward")
-#define paramdescriptions ("how many steps to take forward or backward")("how many steps to take forward or backward")
-#define paramdefaults (PARAM_DEFAULT(1))(PARAM_DEFAULT(0))
-#define paramreferences (steps_forward)(steps_backward)
+#define paramtypes (int)
+#define paramtokens ("step-world-time")
+#define paramdescriptions ("how many steps to take forward (positive) or backward (negative)")
+#define paramdefaults (PARAM_DEFAULT(1))
+#define paramreferences (steps)
 #define paramvalids \
-(DummyValidator< unsigned int >()) \
-(DummyValidator< unsigned int >())
+(DummyValidator< int >())
 
 #define statetypes (unsigned int)
Index: src/Atom/atom.cpp
===================================================================
--- src/Atom/atom.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Atom/atom.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -103,7 +103,7 @@
   LOG(4,"atom::UpdateStep() called.");
   // append to position, velocity and force vector
-  AtomInfo::AppendTrajectoryStep(WorldTime::getTime()+1);
+  AtomInfo::AppendTrajectoryStep(WorldTime::getTime());
   // append to ListOfBonds vector
-  BondedParticleInfo::AppendTrajectoryStep(WorldTime::getTime()+1);
+  BondedParticleInfo::AppendTrajectoryStep(WorldTime::getTime());
 }
 
Index: src/Atom/atom_atominfo.cpp
===================================================================
--- src/Atom/atom_atominfo.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Atom/atom_atominfo.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -91,6 +91,4 @@
 void AtomInfo::AppendTrajectoryStep(const unsigned int _step)
 {
-  ASSERT (WorldTime::getTime() != _step,
-      "AtomInfo::AppendTrajectoryStep() - cannot append current time step.");
   NOTIFY(TrajectoryChanged);
   AtomicPosition.insert( std::make_pair(_step, zeroVec) );
@@ -105,6 +103,4 @@
 void AtomInfo::removeTrajectoryStep(const unsigned int _step)
 {
-  ASSERT (WorldTime::getTime() != _step,
-      "AtomInfo::removeTrajectoryStep() - cannot remove current time step.");
   NOTIFY(TrajectoryChanged);
   AtomicPosition.erase(_step);
Index: src/Fragmentation/Exporters/HydrogenPool.cpp
===================================================================
--- src/Fragmentation/Exporters/HydrogenPool.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Fragmentation/Exporters/HydrogenPool.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -91,17 +91,8 @@
       +" from pool is already in use.");
   LOG(3, "DEBUG: Leasing " << *Walker << ".");
-  UpdateSteps(Walker);
   HydrogenInUse.insert( std::make_pair( Walker->getId(), Walker) );
   HydrogenQueue.pop_front();
 
   return Walker;
-}
-
-void HydrogenPool::UpdateSteps(atom * _atom) const
-{
-  // make sure we are up to current time step
-  const size_t CurrentTime = WorldTime::getTime();
-  for (size_t step = _atom->getTrajectorySize(); step <= CurrentTime; ++step)
-    _atom->UpdateStep(step);
 }
 
Index: src/Fragmentation/Exporters/HydrogenPool.hpp
===================================================================
--- src/Fragmentation/Exporters/HydrogenPool.hpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/Fragmentation/Exporters/HydrogenPool.hpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -73,11 +73,4 @@
   void cleanup();
 
-  /** Helper function to make sure \a _atom is up to current time step.
-   *
-   * \param _atom atom to bring trajectory size up to speed
-   */
-  void UpdateSteps(atom * _atom) const;
-
-
 private:
   //!> typedef for the deque of available hydrogens.
Index: src/UIElements/CommandLineUI/CommandLineParser.cpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineParser.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/UIElements/CommandLineUI/CommandLineParser.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -36,4 +36,7 @@
 
 #include <boost/filesystem.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/program_options/option.hpp>
+#include <boost/program_options/value_semantic.hpp>
 #include <boost/program_options.hpp>
 #include <fstream>
@@ -463,4 +466,37 @@
 }
 
+/** This is due to the answer by Aleksey Vitebskiy
+ * in http://stackoverflow.com/questions/4107087/accepting-negative-doubles-with-boostprogram-options
+ *
+ */
+std::vector<po::option> ignore_numbers(std::vector<std::string>& args)
+{
+    std::vector<po::option> result;
+    int pos = 0;
+    while(!args.empty()) {
+        const std::string& arg = args[0];
+        bool isNumber = true;
+        try {
+          boost::lexical_cast<double>(arg);
+        } catch(boost::bad_lexical_cast) {
+          isNumber = false;
+        }
+        if (isNumber) {
+            result.push_back(po::option());
+            po::option& opt = result.back();
+
+            opt.position_key = pos++;
+            opt.value.push_back(arg);
+            opt.original_tokens.push_back(arg);
+
+            args.erase(args.begin());
+        } else {
+            break;
+        }
+    }
+
+    return result;
+}
+
 /** Parses the command line arguments.
  * Calls program_options::store() and program_options::notify()
@@ -473,5 +509,5 @@
   bool status = true;
   try {
-    po::store(po::command_line_parser(argc,argv).options(cmdline_options).run(), vm);
+    po::store(po::command_line_parser(argc,argv).extra_style_parser(&ignore_numbers).options(cmdline_options).run(), vm);
   } catch (std::exception &e) {
     std::cerr << "Something went wrong with parsing the command-line arguments: " 
Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ src/World.cpp	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -221,5 +221,5 @@
 }
 
-bool areBondsPresent(const unsigned int _step)
+static bool areBondsPresent(const unsigned int _step)
 {
   bool status = false;
@@ -234,5 +234,18 @@
 }
 
-void copyBondgraph(const unsigned int _srcstep, const unsigned int _deststep)
+static bool areAtomsPresent(const unsigned int _step)
+{
+  bool status = false;
+
+  for (World::AtomConstIterator iter = const_cast<const World &>(World::getInstance()).getAtomIter();
+      (!status) && (iter != const_cast<const World &>(World::getInstance()).atomEnd()); ++iter) {
+    const atom * const Walker = *iter;
+    status |= (Walker->getTrajectorySize() >= _step);
+  }
+
+  return status;
+}
+
+static void copyBondgraph(const unsigned int _srcstep, const unsigned int _deststep)
 {
   // gather all bonds from _srcstep
@@ -259,8 +272,23 @@
 }
 
+//static void copyAtoms(const unsigned int _srcstep, const unsigned int _deststep)
+//{
+//  for (World::AtomIterator iter = World::getInstance().getAtomIter();
+//      iter != World::getInstance().atomEnd(); ++iter) {
+//    atom * const Walker = *iter;
+//    Walker->UpdateStep(_deststep);
+//    Walker->setPositionAtStep(_deststep, Walker->getPositionAtStep(_srcstep));
+//    Walker->setAtomicVelocityAtStep(_deststep, Walker->getAtomicVelocityAtStep(_srcstep));
+//    Walker->setAtomicForceAtStep(_deststep, Walker->getAtomicForceAtStep(_srcstep));
+//  }
+//}
+
 void World::setTime(const unsigned int _step)
 {
   if (_step != WorldTime::getTime()) {
     const unsigned int oldstep = WorldTime::getTime();
+
+//    if (!areAtomsPresent(_step))
+//      copyAtoms(oldstep, _step);
 
     // 1. copy bond graph (such not each addBond causes GUI update)
Index: tests/Python/AllActions/options.dat
===================================================================
--- tests/Python/AllActions/options.dat	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ tests/Python/AllActions/options.dat	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -33,4 +33,5 @@
 bond-degree	"1"
 bond-file	"bond.dat"
+bondside	"1"
 bond-table	"table.dat"
 calculate-bounding-box	""
@@ -166,4 +167,5 @@
 reset	1
 reverse	"0"
+rotate-around-bond	"90."
 rotate-around-origin	"180."
 rotate-around-origin	"20."
@@ -233,7 +235,6 @@
 skiplines	"2"
 start-step	"0"
-steps-forward	"1"
-steps-backward	"0"
 steps	"5"
+step-world-time	"1"
 store-grids	"0"
 store-saturated-fragment	"BondFragment"
Index: tests/regression/Makefile.am
===================================================================
--- tests/regression/Makefile.am	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ tests/regression/Makefile.am	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -140,4 +140,5 @@
 	$(srcdir)/Molecules/LinearInterpolationofTrajectories/testsuite-molecules-linear-interpolation-of-trajectories.at \
 	$(srcdir)/Molecules/Remove/testsuite-molecules-remove.at \
+	$(srcdir)/Molecules/RotateAroundBond/testsuite-molecules-rotate-around-bond.at \
 	$(srcdir)/Molecules/RotateAroundOrigin/testsuite-molecules-rotate-around-origin.at \
 	$(srcdir)/Molecules/RotateAroundSelf/testsuite-molecules-rotate-around-self.at \
Index: tests/regression/Molecules/RotateAroundBond/post/test-195-true.pdb
===================================================================
--- tests/regression/Molecules/RotateAroundBond/post/test-195-true.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/post/test-195-true.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,18 @@
+REMARK created by molecuilder on Wed Mar 22 16:38:34 2017, time step 0
+ATOM      1 C01 0non 01          9.300  10.000  10.000  0.00  0.00           C 0
+ATOM      2 C02 0non 01         10.700  10.000  10.000  0.00  0.00           C 0
+ATOM      3 H01 0non 01          8.902   8.913   9.709  0.00  0.00           H 0
+ATOM      4 H02 0non 01          8.902  10.795   9.205  0.00  0.00           H 0
+ATOM      5 H03 0non 01          8.902  10.291  11.086  0.00  0.00           H 0
+ATOM      6 H04 0non 01         11.098  11.125  10.000  0.00  0.00           H 0
+ATOM      7 H05 0non 01         11.098   9.438   9.026  0.00  0.00           H 0
+ATOM      8 H06 0non 01         11.098   9.438  10.974  0.00  0.00           H 0
+CONECT    1    3    2    5    4                                                 
+CONECT    2    1    6    8    7                                                 
+CONECT    3    1                                                                
+CONECT    4    1                                                                
+CONECT    5    1                                                                
+CONECT    6    2                                                                
+CONECT    7    2                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Molecules/RotateAroundBond/post/test-90-true.pdb
===================================================================
--- tests/regression/Molecules/RotateAroundBond/post/test-90-true.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/post/test-90-true.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,18 @@
+REMARK created by molecuilder on Wed Mar 22 16:37:10 2017, time step 0
+ATOM      1 C01 0non 01          9.300  10.000  10.000  0.00  0.00           C 0
+ATOM      2 C02 0non 01         10.700  10.000  10.000  0.00  0.00           C 0
+ATOM      3 H01 0non 01          8.902  10.000  11.125  0.00  0.00           H 0
+ATOM      4 H02 0non 01          8.902   9.026   9.438  0.00  0.00           H 0
+ATOM      5 H03 0non 01          8.902  10.974   9.438  0.00  0.00           H 0
+ATOM      6 H04 0non 01         11.098  11.125  10.000  0.00  0.00           H 0
+ATOM      7 H05 0non 01         11.098   9.438   9.026  0.00  0.00           H 0
+ATOM      8 H06 0non 01         11.098   9.438  10.974  0.00  0.00           H 0
+CONECT    1    3    2    5    4                                                 
+CONECT    2    1    6    8    7                                                 
+CONECT    3    1                                                                
+CONECT    4    1                                                                
+CONECT    5    1                                                                
+CONECT    6    2                                                                
+CONECT    7    2                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Molecules/RotateAroundBond/post/test-95-false.pdb
===================================================================
--- tests/regression/Molecules/RotateAroundBond/post/test-95-false.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/post/test-95-false.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,18 @@
+REMARK created by molecuilder on Wed Mar 22 16:38:48 2017, time step 0
+ATOM      1 C01 0non 01          9.300  10.000  10.000  0.00  0.00           C 0
+ATOM      2 C02 0non 01         10.700  10.000  10.000  0.00  0.00           C 0
+ATOM      3 H01 0non 01          8.902  11.125  10.000  0.00  0.00           H 0
+ATOM      4 H02 0non 01          8.902   9.438  10.974  0.00  0.00           H 0
+ATOM      5 H03 0non 01          8.902   9.438   9.026  0.00  0.00           H 0
+ATOM      6 H04 0non 01         11.098   9.902  11.121  0.00  0.00           H 0
+ATOM      7 H05 0non 01         11.098  11.019   9.525  0.00  0.00           H 0
+ATOM      8 H06 0non 01         11.098   9.079   9.355  0.00  0.00           H 0
+CONECT    1    3    2    5    4                                                 
+CONECT    2    1    6    8    7                                                 
+CONECT    3    1                                                                
+CONECT    4    1                                                                
+CONECT    5    1                                                                
+CONECT    6    2                                                                
+CONECT    7    2                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Molecules/RotateAroundBond/pre/test.pdb
===================================================================
--- tests/regression/Molecules/RotateAroundBond/pre/test.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/pre/test.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,18 @@
+REMARK created by molecuilder on Wed Mar 22 16:02:29 2017, time step 0
+ATOM      1 C01 0non 01          9.300  10.000  10.000  0.00  0.00           C 0
+ATOM      2 C02 0non 01         10.700  10.000  10.000  0.00  0.00           C 0
+ATOM      3 H01 0non 01          8.902  11.125  10.000  0.00  0.00           H 0
+ATOM      4 H02 0non 01          8.902   9.438  10.974  0.00  0.00           H 0
+ATOM      5 H03 0non 01          8.902   9.438   9.026  0.00  0.00           H 0
+ATOM      6 H04 0non 01         11.098  11.125  10.000  0.00  0.00           H 0
+ATOM      7 H05 0non 01         11.098   9.438   9.026  0.00  0.00           H 0
+ATOM      8 H06 0non 01         11.098   9.438  10.974  0.00  0.00           H 0
+CONECT    1    3    2    5    4                                                 
+CONECT    2    6    8    7    1                                                 
+CONECT    3    1                                                                
+CONECT    4    1                                                                
+CONECT    5    1                                                                
+CONECT    6    2                                                                
+CONECT    7    2                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Molecules/RotateAroundBond/pre/test_cycle.pdb
===================================================================
--- tests/regression/Molecules/RotateAroundBond/pre/test_cycle.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/pre/test_cycle.pdb	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,38 @@
+REMARK created by molecuilder on Tue Feb 19 10:09:37 2013, time step 0
+ATOM      1 C01 0non 01          1.816  -1.445   0.001  0.00  0.00           C 0
+ATOM      2 C02 0non 01          0.511  -0.691   0.002  0.00  0.00           C 0
+ATOM      3 C03 0non 01          0.511   0.691   0.000  0.00  0.00           C 0
+ATOM      4 C04 0non 01         -0.686  -1.382  -0.002  0.00  0.00           C 0
+ATOM      5 C05 0non 01          1.816   1.445  -0.002  0.00  0.00           C 0
+ATOM      6 C06 0non 01         -0.686   1.382   0.000  0.00  0.00           C 0
+ATOM      7 C07 0non 01         -1.883  -0.691  -0.001  0.00  0.00           C 0
+ATOM      8 C08 0non 01         -1.883   0.691   0.002  0.00  0.00           C 0
+ATOM      9 H01 0non 01          2.132  -1.625   1.029  0.00  0.00           H 0
+ATOM     10 H02 0non 01          1.685  -2.398  -0.511  0.00  0.00           H 0
+ATOM     11 H03 0non 01          2.575  -0.856  -0.514  0.00  0.00           H 0
+ATOM     12 H04 0non 01         -0.686  -2.462  -0.005  0.00  0.00           H 0
+ATOM     13 H05 0non 01          2.130   1.625  -1.030  0.00  0.00           H 0
+ATOM     14 H06 0non 01          1.686   2.398   0.511  0.00  0.00           H 0
+ATOM     15 H07 0non 01          2.576   0.856   0.512  0.00  0.00           H 0
+ATOM     16 H08 0non 01         -0.686   2.462  -0.001  0.00  0.00           H 0
+ATOM     17 H09 0non 01         -2.819  -1.231  -0.005  0.00  0.00           H 0
+ATOM     18 H10 0non 01         -2.819   1.231   0.003  0.00  0.00           H 0
+CONECT    1    2    9   10   11                                                 
+CONECT    2    1    3    4                                                      
+CONECT    3    2    5    6                                                      
+CONECT    4    2    7   12                                                      
+CONECT    5    3   13   14   15                                                 
+CONECT    6    3    8   16                                                      
+CONECT    7    4    8   17                                                      
+CONECT    8    6    7   18                                                      
+CONECT    9    1                                                                
+CONECT   10    1                                                                
+CONECT   11    1                                                                
+CONECT   12    4                                                                
+CONECT   13    5                                                                
+CONECT   14    5                                                                
+CONECT   15    5                                                                
+CONECT   16    6                                                                
+CONECT   17    7                                                                
+CONECT   18    8                                                                
+END
Index: tests/regression/Molecules/RotateAroundBond/testsuite-molecules-rotate-around-bond.at
===================================================================
--- tests/regression/Molecules/RotateAroundBond/testsuite-molecules-rotate-around-bond.at	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
+++ tests/regression/Molecules/RotateAroundBond/testsuite-molecules-rotate-around-bond.at	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -0,0 +1,87 @@
+#
+#    MoleCuilder - creates and alters molecular systems
+#    Copyright (C) 2017 Frederik Heber
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+### Rotate around bond
+
+AT_SETUP([Molecules - Rotate around bond])
+AT_KEYWORDS([molecules rotate-around-bond])
+
+file=test-90-true.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 90.], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/post/$file], 0, [ignore], [ignore])
+
+file=test-195-true.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 195.], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/post/$file], 0, [ignore], [ignore])
+
+file=test-95-false.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 95. --bondside 0], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/post/$file], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Molecules - Rotate around bond with Undo])
+AT_KEYWORDS([molecules rotate-around-bond undo])
+
+file=test.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 90. --undo], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' -I 'CONECT.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb], 0, [ignore], [ignore])
+
+file=test-95-false.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 95. --bondside 0 --undo], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' -I 'CONECT.*'  $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Molecules - Rotate around bond with Redo])
+AT_KEYWORDS([molecules rotate-around-bond redo])
+
+file=test-90-true.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 90. --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/post/$file], 0, [ignore], [ignore])
+
+file=test-95-false.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-element C --rotate-around-bond 95. --bondside 0 --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([diff -I '.*reated by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/post/$file], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([Molecules - Rotate around bond fails for cycles])
+AT_KEYWORDS([molecules rotate-around-bond cycle])
+
+file=test_cycle.pdb
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/RotateAroundBond/pre/test_cycle.pdb $file], 0)
+AT_CHECK([chmod u+w $file], 0)
+AT_CHECK([../../molecuilder -i $file --select-atom-by-id 1 2 --rotate-around-bond 90.], 5, [stdout], [stderr])
+
+AT_CLEANUP
Index: tests/regression/Molecules/RotateToPrincipalAxisSystem/testsuite-molecules-rotate-to-principal-axis-system.at
===================================================================
--- tests/regression/Molecules/RotateToPrincipalAxisSystem/testsuite-molecules-rotate-to-principal-axis-system.at	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ tests/regression/Molecules/RotateToPrincipalAxisSystem/testsuite-molecules-rotate-to-principal-axis-system.at	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -49,5 +49,4 @@
 
 AT_SETUP([Molecules - Rotate to PAS with Undo])
-AT_XFAIL_IF([/bin/true])
 AT_KEYWORDS([molecules rotate-to-principal-axis-system undo])
 
@@ -80,5 +79,4 @@
 
 AT_SETUP([Molecules - Rotate to PAS with Redo])
-AT_XFAIL_IF([/bin/true])
 AT_KEYWORDS([molecules rotate-to-principal-axis-system redo])
 
Index: tests/regression/Molecules/testsuite-molecules.at
===================================================================
--- tests/regression/Molecules/testsuite-molecules.at	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ tests/regression/Molecules/testsuite-molecules.at	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -60,4 +60,7 @@
 m4_include([Molecules/RotateToPrincipalAxisSystem/testsuite-molecules-rotate-to-principal-axis-system.at])
 
+# rotate around one of its bond
+m4_include([Molecules/RotateAroundBond/testsuite-molecules-rotate-around-bond.at])
+
 # Rotate around origin
 m4_include([Molecules/RotateAroundOrigin/testsuite-molecules-rotate-around-origin.at])
Index: tests/regression/WorldTime/StepWorldTime/testsuite-worldtime-step-world-time.at
===================================================================
--- tests/regression/WorldTime/StepWorldTime/testsuite-worldtime-step-world-time.at	(revision be848d71640013c506c3be23cdcdac487454ef1d)
+++ tests/regression/WorldTime/StepWorldTime/testsuite-worldtime-step-world-time.at	(revision 78ea3cd9ca6cec043a55baf5de54c1feeb6b7609)
@@ -21,10 +21,10 @@
 AT_KEYWORDS([worldtime step-world-time set-world-time])
 
-AT_CHECK([../../molecuilder --step-world-time --steps-forward 1], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --step-world-time 1], 0, [stdout], [stderr])
 AT_CHECK([fgrep "Current time step is now: 1" stdout], 0, [ignore], [ignore])
-AT_CHECK([../../molecuilder --set-world-time 4 --step-world-time --steps-backward 2], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --set-world-time 4 --step-world-time -2], 0, [stdout], [stderr])
 AT_CHECK([fgrep "Current time step is now: 2" stdout], 0, [ignore], [ignore])
 # stepping back too far fails
-AT_CHECK([../../molecuilder --set-world-time 1 --step-world-time --steps-backward 2], 5, [stdout], [stderr])
+AT_CHECK([../../molecuilder --set-world-time 1 --step-world-time -2], 5, [stdout], [stderr])
 
 AT_CLEANUP
@@ -34,5 +34,5 @@
 AT_KEYWORDS([worldtime step-world-time set-world-time undo])
 
-AT_CHECK([../../molecuilder --set-world-time 2 --step-world-time --steps-backward  1 --undo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --set-world-time 2 --step-world-time -1 --undo], 0, [stdout], [stderr])
 AT_CHECK([fgrep "Current time step is now again: 2" stdout], 0, [ignore], [ignore])
 
@@ -42,5 +42,5 @@
 AT_KEYWORDS([worldtime step-world-time set-world-time undo redo])
 
-AT_CHECK([../../molecuilder --set-world-time 2 --step-world-time --steps-backward 1 --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --set-world-time 2 --step-world-time -1 --undo --redo], 0, [stdout], [stderr])
 AT_CHECK([fgrep "Current time step is now: 1" stdout], 0, [ignore], [ignore])
 
