Index: src/Actions/Action.hpp
===================================================================
--- src/Actions/Action.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/Action.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -111,4 +111,11 @@
   enum QueryOptions {Interactive, NonInteractive};
 
+  /** Destructor for class Action.
+   *
+   * Needs to be public as clone() is a public function.
+   *
+   */
+  virtual ~Action();
+
 protected:
   /**
@@ -125,5 +132,4 @@
    */
   Action(const ActionTrait &_Traits);
-  virtual ~Action();
 
   /**
Index: src/Actions/ActionQueue.cpp
===================================================================
--- src/Actions/ActionQueue.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionQueue.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -94,6 +94,6 @@
 void ActionQueue::queueAction(const std::string &name, enum Action::QueryOptions state)
 {
-  const Action * const registryaction = AR->getActionByName(name);
-  queueAction(registryaction, state);
+  const Action & registryaction = AR->getActionByName(name);
+  queueAction(&registryaction, state);
 }
 
@@ -263,5 +263,5 @@
 #endif
 
-Action* ActionQueue::getActionByName(const std::string &name)
+const Action& ActionQueue::getActionByName(const std::string &name)
 {
   return AR->getActionByName(name);
@@ -313,6 +313,6 @@
 {
   // this const_cast is just required as long as we have a non-const getActionByName
-  const Action * const action = const_cast<ActionQueue *>(this)->getActionByName(name);
-  return action->Traits;
+  const Action & action = const_cast<ActionQueue *>(this)->getActionByName(name);
+  return action.Traits;
 }
 
Index: src/Actions/ActionQueue.hpp
===================================================================
--- src/Actions/ActionQueue.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionQueue.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -79,18 +79,11 @@
   void queueAction(const std::string &name, enum Action::QueryOptions state = Action::Interactive);
 
-  /** Queues the Action with \a name to be called.
-   *
-   * \param _action action to add
-   * \param state whether Actions needs to be filled via a Dialog or not
-   */
-  void queueAction(const Action * const _action, enum Action::QueryOptions state = Action::Interactive);
-
   /** Returns the spawned action by token \a name.
    *
    * Action is checked into internal actionqueue.
    *
-   * \return pointer to newly spawned action
-   */
-  Action* getActionByName(const std::string &name);
+   * \return ref to newly spawned action
+   */
+  const Action& getActionByName(const std::string &name);
 
   /** Checks whether the Action is known by the given \a name.
@@ -164,9 +157,4 @@
   bool getLastActionOk() const
   {  return lastActionOk; }
-
-#ifdef HAVE_ACTION_THREAD
-  boost::thread &getRunThread()
-  { return run_thread; }
-#endif
 
   /** Getter to ref to list of status messages.
@@ -200,4 +188,11 @@
   friend class DryRunAdvocate;
 
+  /** Queues the Action with \a name to be called.
+   *
+   * \param _action action to add
+   * \param state whether Actions needs to be filled via a Dialog or not
+   */
+  void queueAction(const Action * const _action, enum Action::QueryOptions state = Action::Interactive);
+
   /** Wrapper function to add state to ActionHistory.
    *
@@ -225,4 +220,6 @@
 
 #ifdef HAVE_ACTION_THREAD
+  boost::thread &getRunThread()
+  { return run_thread; }
 
   /** Clears the temporary queue.
Index: src/Actions/ActionRegistry.cpp
===================================================================
--- src/Actions/ActionRegistry.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionRegistry.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -62,4 +62,5 @@
   //std::cout << "ActionRegistry::ActionRegistry() called, instance is " << this << "." << std::endl;
   fillRegistry();
+  prepareAllMakroActions();
   fillOptionRegistry();
   completely_instatiated = true;
@@ -75,30 +76,26 @@
   // add all MakroActions: PLEASE adhere to the alphabetical ordering
   {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("molecular-dynamics"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->unprepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("optimize-structure"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->unprepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("subgraph-dissection"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->unprepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("translate-molecules"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->unprepare(*this);
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("molecular-dynamics")));
+    presentAction.unprepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("optimize-structure")));
+    presentAction.unprepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("subgraph-dissection")));
+    presentAction.unprepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("translate-molecules")));
+    presentAction.unprepare(*this);
   }
 
@@ -124,33 +121,32 @@
 #include BOOST_PP_LOCAL_ITERATE()
 #undef instance_print  
-
+}
+
+void ActionRegistry::prepareAllMakroActions()
+{
   // now prepare each macro action that require presence of all primitive ones
   {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("subgraph-dissection"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->prepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("molecular-dynamics"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->prepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("optimize-structure"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->prepare(*this);
-  }
-  {
-    MakroAction * presentAction =
-        dynamic_cast<MakroAction *>(getActionByName("translate-molecules"));
-    ASSERT( presentAction != NULL,
-        "ActionRegistry::fillRegistry() - makro action has not been registered.");
-    presentAction->prepare(*this);
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("subgraph-dissection")));
+    presentAction.prepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("molecular-dynamics")));
+    presentAction.prepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("optimize-structure")));
+    presentAction.prepare(*this);
+  }
+  {
+    MakroAction & presentAction =
+        const_cast<MakroAction &>(
+        dynamic_cast<const MakroAction &>(getActionByName("translate-molecules")));
+    presentAction.prepare(*this);
   }
 }
@@ -227,9 +223,12 @@
 /** Just passes on call to Registry<Action>::getByName().
  * \param name name of Action
- * \return pointer to Action
- */
-Action* ActionRegistry::getActionByName(const std::string &name)
-{
-  return getByName(name);
+ * \return const ref to Action
+ */
+const Action& ActionRegistry::getActionByName(const std::string &name)
+{
+  Action * const action = getByName(name);
+  ASSERT( action != NULL,
+      "ActionRegistry::getActionByName() - action "+name+" not present!");
+  return *action;
 }
 
Index: src/Actions/ActionRegistry.hpp
===================================================================
--- src/Actions/ActionRegistry.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionRegistry.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -42,5 +42,5 @@
 
 public:
-  Action* getActionByName(const std::string &name);
+  const Action& getActionByName(const std::string &name);
   bool isActionPresentByName(const std::string &name) const;
 
@@ -59,4 +59,5 @@
   void fillOptionRegistry() const;
   void clearOptionRegistry() const;
+  void prepareAllMakroActions();
 
   //!> this tells whether ActionRegistry has been completed instantiated.
Index: src/Actions/ActionSequence.cpp
===================================================================
--- src/Actions/ActionSequence.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionSequence.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -22,5 +22,5 @@
 
 /*
- * ActionSequenze.cpp
+ * ActionSequence.cpp
  *
  *  Created on: Dec 17, 2009
@@ -60,15 +60,24 @@
 
 ActionSequence::~ActionSequence()
-{}
-
-
-void ActionSequence::addAction(Action* _action){
+{
+  for (actionSet::iterator iter = actions.begin(); !actions.empty(); iter = actions.begin()) {
+    delete *iter;
+    actions.erase(iter);
+  }
+}
+
+
+void ActionSequence::addAction(Action* _action)
+{
+  // actions are already clone on push as ActionRegistry hands out const refs only
   actions.push_back(_action);
 }
 
-bool ActionSequence::removeAction(const std::string &name){
+bool ActionSequence::removeAction(const std::string &name)
+{
   actionSet::iterator it=actions.begin();
   for(; it!=actions.end(); it++){
     if ((*it)->getName() == name) {
+      delete *it;
       actions.erase(it);
       break;
@@ -78,5 +87,6 @@
 }
 
-Action* ActionSequence::removeLastAction(){
+Action* ActionSequence::removeLastAction()
+{
   if(actions.empty()) {
     return 0;
@@ -92,5 +102,6 @@
 // this method is used outside the ActionModule
 // Each action registers itself with the history
-Dialog* ActionSequence::fillAllDialogs(Dialog *dialog){
+Dialog* ActionSequence::fillAllDialogs(Dialog *dialog)
+{
   for(actionSet::iterator it=actions.begin(); it!=actions.end(); it++){
     dialog = (*it)->fillDialog(dialog);
@@ -101,5 +112,6 @@
 // this method is used outside the ActionModule
 // Each action registers itself with the history
-void ActionSequence::callAll(){
+void ActionSequence::callAll()
+{
   for (size_t i=0;i<loop;++i)
     for(actionSet::iterator it=actions.begin(); it!=actions.end(); it++){
@@ -113,5 +125,6 @@
 // In this case only the makro Action should be registered and
 // handle the states
-ActionSequence::stateSet ActionSequence::callAll(bool){
+ActionSequence::stateSet ActionSequence::callAll(bool)
+{
   stateSet states;
   for (size_t i=0;i<loop;++i)
@@ -127,5 +140,6 @@
 }
 
-ActionSequence::stateSet ActionSequence::undoAll(stateSet states){
+ActionSequence::stateSet ActionSequence::undoAll(stateSet states)
+{
   ASSERT(canUndo(),"Trying to undo a sequence that contains methods that can't be undone");
   stateSet res;
@@ -147,5 +161,6 @@
 }
 
-ActionSequence::stateSet ActionSequence::redoAll(stateSet states){
+ActionSequence::stateSet ActionSequence::redoAll(stateSet states)
+{
   stateSet res;
   actionSet::iterator actionIt = actions.begin();
@@ -164,5 +179,6 @@
 }
 
-bool ActionSequence::canUndo(){
+bool ActionSequence::canUndo()
+{
   bool canUndo=true;
   for(std::deque<Action*>::iterator it=actions.begin(); it!=actions.end(); ++it){
@@ -174,5 +190,6 @@
 }
 
-bool ActionSequence::shouldUndo(){
+bool ActionSequence::shouldUndo()
+{
   bool shouldUndo = false;
   for(std::deque<Action*>::iterator it=actions.begin();it!=actions.end();++it){
Index: src/Actions/ActionSequence.hpp
===================================================================
--- src/Actions/ActionSequence.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/ActionSequence.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -1,4 +1,4 @@
 /*
- * ActionSequenze.hpp
+ * ActionSequence.hpp
  *
  *  Created on: Dec 17, 2009
Index: src/Actions/Action_impl_pre.hpp
===================================================================
--- src/Actions/Action_impl_pre.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/Action_impl_pre.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -394,5 +394,5 @@
 )
 {
-  ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
+  ACTION * const ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN ).clone());
   //ACTION::PARAMS params;
 #if defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
@@ -411,5 +411,5 @@
 #endif
 	) {
-  ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
+  ACTION * const ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN ).clone());
   //ACTION::PARAMS params;
 #if defined paramtypes && defined paramtypes && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
Index: src/Actions/CommandAction/HelpAction.cpp
===================================================================
--- src/Actions/CommandAction/HelpAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/CommandAction/HelpAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -92,7 +92,7 @@
     // retrieve command from Registry and print its help
     if (AQ.isActionKnownByName(params.actionname.get())) {
-      const Action *instance = AQ.getActionByName(params.actionname.get());
+      const Action &instance = AQ.getActionByName(params.actionname.get());
       // else give description of Action and its option value if present
-      std::cout << instance->help();
+      std::cout << instance.help();
       std::cout << std::endl;
       std::cout << std::endl;
Index: src/Actions/FragmentationAction/MolecularDynamicsAction.cpp
===================================================================
--- src/Actions/FragmentationAction/MolecularDynamicsAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/FragmentationAction/MolecularDynamicsAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -62,14 +62,14 @@
   // present. If not, we still copy the position cleanly into a new step where then
   // forces are set according to summed fragmentary contributions. This is much cleaner.
-  prototype_actions.addAction(AR.getActionByName(std::string("verlet-integration")));
-  prototype_actions.addAction(AR.getActionByName(std::string("output")));
-  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
-  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("correct-bonddegree")));
-  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
-  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
-  prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")));
-  prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
+  prototype_actions.addAction(AR.getActionByName(std::string("verlet-integration")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("output")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("correct-bonddegree")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")).clone());
   isPrepared = true;
 }
@@ -78,5 +78,7 @@
 {
   // empty sequence
-  while (prototype_actions.removeLastAction() != NULL);
+  Action *actionremove = NULL;
+  while ((actionremove = prototype_actions.removeLastAction()) != NULL)
+    delete actionremove;
   isPrepared = false;
 }
Index: src/Actions/FragmentationAction/StructuralOptimizationAction.cpp
===================================================================
--- src/Actions/FragmentationAction/StructuralOptimizationAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/FragmentationAction/StructuralOptimizationAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -62,14 +62,14 @@
   // present. If not, we still copy the position cleanly into a new step where then
   // forces are set according to summed fragmentary contributions. This is much cleaner.
-  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("correct-bonddegree")));
-  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
-  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
-  prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")));
-  prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
-  prototype_actions.addAction(AR.getActionByName(std::string("force-annealing")));
-  prototype_actions.addAction(AR.getActionByName(std::string("output")));
-  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
+  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("correct-bonddegree")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")).clone());
+  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("force-annealing")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("output")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")).clone());
   isPrepared = true;
 }
@@ -78,5 +78,7 @@
 {
   // empty sequence
-  while (prototype_actions.removeLastAction() != NULL);
+  Action *actionremove = NULL;
+  while ((actionremove = prototype_actions.removeLastAction()) != NULL)
+    delete actionremove;
   isPrepared = false;
 }
Index: src/Actions/GraphAction/SubgraphDissectionAction.cpp
===================================================================
--- src/Actions/GraphAction/SubgraphDissectionAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/GraphAction/SubgraphDissectionAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -63,10 +63,10 @@
 void GraphSubgraphDissectionAction::prepare(ActionRegistry &AR)
 {
-  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
-  prototype_actions.addAction(AR.getActionByName(std::string("select-all-atoms")));
-  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
-  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
-  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
+  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("select-all-atoms")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")).clone());
   isPrepared = true;
 }
@@ -75,5 +75,7 @@
 {
   // empty sequence
-  while (prototype_actions.removeLastAction() != NULL);
+  Action *actionremove = NULL;
+  while ((actionremove = prototype_actions.removeLastAction()) != NULL)
+    delete actionremove;
   isPrepared = false;
 }
Index: src/Actions/MakroAction.cpp
===================================================================
--- src/Actions/MakroAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/MakroAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -74,9 +74,5 @@
 MakroAction::~MakroAction()
 {
-  // emptying the sequence is someone else responsibility
-//  Action* action;
-//  while((action=actions.removeLastAction())){
-//    delete action;
-//  }
+  // emptying the sequence is done in ActionSequence
 }
 
Index: src/Actions/MakroAction.hpp
===================================================================
--- src/Actions/MakroAction.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/MakroAction.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -37,5 +37,4 @@
   MakroAction(const MakroAction &_instance);
   MakroAction(const ActionTrait &_trait,ActionSequence& _actions);
-  virtual ~MakroAction();
 
   bool canUndo();
@@ -56,4 +55,6 @@
 
 protected:
+  virtual ~MakroAction();
+
   /**
    * MakroAction requires an own dialog for global options such as number of loop
Index: src/Actions/MakroAction_impl_pre.hpp
===================================================================
--- src/Actions/MakroAction_impl_pre.hpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/MakroAction_impl_pre.hpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -362,5 +362,5 @@
 )
 {
-  ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
+  ACTION * const ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN ).clone());
   //ACTION::PARAMS params;
 #if defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
@@ -379,5 +379,5 @@
 #endif
 	) {
-  ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
+  ACTION * const ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN ).clone());
   //ACTION::PARAMS params;
 #if defined paramtypes && defined paramtypes && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
Index: src/Actions/MoleculeAction/TranslateAction.cpp
===================================================================
--- src/Actions/MoleculeAction/TranslateAction.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/MoleculeAction/TranslateAction.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -63,8 +63,8 @@
   // we simply have to select all the molecule's atoms and use the respective
   // translate Action
-  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
-  prototype_actions.addAction(AR.getActionByName(std::string("select-molecules-atoms")));
-  prototype_actions.addAction(AR.getActionByName(std::string("translate-atoms")));
-  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
+  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("select-molecules-atoms")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("translate-atoms")).clone());
+  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")).clone());
   isPrepared = true;
 }
@@ -73,5 +73,7 @@
 {
   // empty sequence
-  while (prototype_actions.removeLastAction() != NULL);
+  Action *actionremove = NULL;
+  while ((actionremove = prototype_actions.removeLastAction()) != NULL)
+    delete actionremove;
   isPrepared = false;
 }
Index: src/Actions/unittests/ActionSequenceUnitTest.cpp
===================================================================
--- src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -239,6 +239,6 @@
     {
       ActionSequence *sequence = new ActionSequence();
-      sequence->addAction(positive1);
-      sequence->addAction(positive2);
+      sequence->addAction(positive1->clone());
+      sequence->addAction(positive2->clone());
       CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
       delete sequence;
@@ -246,6 +246,6 @@
     {
       ActionSequence *sequence = new ActionSequence();
-      sequence->addAction(positive1);
-      sequence->addAction(negative2);
+      sequence->addAction(positive1->clone());
+      sequence->addAction(negative2->clone());
       CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
       delete sequence;
@@ -253,6 +253,6 @@
     {
       ActionSequence *sequence = new ActionSequence();
-      sequence->addAction(negative1);
-      sequence->addAction(positive2);
+      sequence->addAction(negative1->clone());
+      sequence->addAction(positive2->clone());
       CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
       delete sequence;
@@ -260,6 +260,6 @@
     {
       ActionSequence *sequence = new ActionSequence();
-      sequence->addAction(negative1);
-      sequence->addAction(negative2);
+      sequence->addAction(negative1->clone());
+      sequence->addAction(negative2->clone());
       CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
       delete sequence;
@@ -273,11 +273,11 @@
     CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
     // if only a positive action is contained it can be undone
-    sequence->addAction(positive1);
+    sequence->addAction(positive1->clone());
     CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
     // the single negative action should block the process
-    sequence->addAction(negative1);
+    sequence->addAction(negative1->clone());
     CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
     // after removing the negative action all is well again
-    sequence->removeLastAction();
+    delete sequence->removeLastAction();
     CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
     delete sequence;
@@ -287,17 +287,17 @@
 void ActionSequenceTest::doesCallTest(){
   ActionSequence *sequence = new ActionSequence();
-  sequence->addAction(shouldCall1);
-  sequence->addAction(shouldCall2);
-  sequence->addAction(shouldNotCall1);
-  sequence->addAction(shouldNotCall2);
-  sequence->removeLastAction();
-  sequence->removeLastAction();
+  sequence->addAction(shouldCall1->clone());
+  sequence->addAction(shouldCall2->clone());
+  sequence->addAction(shouldNotCall1->clone());
+  sequence->addAction(shouldNotCall2->clone());
+  delete sequence->removeLastAction();
+  delete sequence->removeLastAction();
 
   sequence->callAll();
 
-  CPPUNIT_ASSERT_EQUAL(true,shouldCall1->wasCalled());
-  CPPUNIT_ASSERT_EQUAL(true,shouldCall2->wasCalled());
-  CPPUNIT_ASSERT_EQUAL(false,shouldNotCall1->wasCalled());
-  CPPUNIT_ASSERT_EQUAL(false,shouldNotCall2->wasCalled());
+  ActionSequence::actionSet::const_iterator iter = sequence->actions.begin();
+  CPPUNIT_ASSERT_EQUAL(true,dynamic_cast<wasCalledActionStub *>(*iter++)->wasCalled());
+  CPPUNIT_ASSERT_EQUAL(true,dynamic_cast<wasCalledActionStub *>(*iter++)->wasCalled());
+  CPPUNIT_ASSERT( iter == sequence->actions.end() );
 
   delete sequence;
Index: src/UIElements/Menu/TextMenu/ActionMenuItem.cpp
===================================================================
--- src/UIElements/Menu/TextMenu/ActionMenuItem.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/UIElements/Menu/TextMenu/ActionMenuItem.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -57,5 +57,5 @@
 
 bool ActionMenuItem::isActive() const {
-  Action* action = ActionQueue::getInstance().getActionByName(ActionName);
-  return action->isActive();
+  const Action& action = ActionQueue::getInstance().getActionByName(ActionName);
+  return action.isActive();
 }
Index: src/UIElements/TextUI/TextWindow.cpp
===================================================================
--- src/UIElements/TextUI/TextWindow.cpp	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/UIElements/TextUI/TextWindow.cpp	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -86,5 +86,5 @@
 
   // save has reserved key 's'
-//  Action *saveConfigAction = ActionQueue::getInstance().getActionByName("output");
+//  const Action &saveConfigAction = ActionQueue::getInstance().getActionByName("output");
   new ActionMenuItem('s',"save current setup to config files",main_menu->getMenuInstance(),"output");
 
Index: src/documentation/constructs/actions.dox
===================================================================
--- src/documentation/constructs/actions.dox	(revision 94232b82bf9b20300fb870881f38c94ce0857bdd)
+++ src/documentation/constructs/actions.dox	(revision 10aee4386f0c1b8e07b3a74e7d97d99ef2622bc8)
@@ -34,5 +34,8 @@
  *  If an Action is requested via its known token from the ActionQueue 
  *  (that contains the ActionRegistry), this prototype is cloned and added to the 
- *  queue.
+ *  queue. Action::clone() is a public function but only certain classes are
+ *  allowed to directly add Action instances to the ActionQueue. Normally, an
+ *  Action first has to be registered with the ActionRegistry and afterwards it
+ *  may be added to the queue via its specific and unique token.
  *
  *  Each Action can contain multiple \ref parameters in its specific 
@@ -56,4 +59,46 @@
  *    such that the ActionRegistry knows about it and can instantiate a
  *    prototype.
+ *
+ *  Most of the magic that fills in the remaining gaps of the Action's
+ *  declaration and definition is done by boost::preprocessor magic in the
+ *  files Action_impl_pre.hpp and Action_impl_header.hpp. There is a pendant
+ *  for MakroActions.
+ *
+ * \section actions-types Specific types of actions
+ *
+ *  There are some special types of Actions:
+ *  -# Calculation: A process with a final result that can be requested
+ *  -# MakroAction: A chain of other Actions to be executed various times
+ *  -# MethodAction: An action that basically calls a certain bound method
+ *  -# Process: An action that takes some time to complete and informs about
+ *     how much work remains
+ *
+ * \section actions-types-add Add a specific types of action ...
+ *
+ *  Instantiating the MakroAction is simple, only two functions, prepare()
+ *  and unprepare(), are required that fill und empty the chain of Actions
+ *  from Actions from the ActionRegistry.
+ *
+ *  Adding a Process is much the same as adding a normal Action. There is a
+ *  keyword BASECLASS in the associated \b .def file which should say Process
+ *  and one needs to use Process::setCurrStep(int) to tell the Process and
+ *  all listening Observers what the current stage of execution is. Also,
+ *  initially a total number of steps must be stated via Process::setMaxSteps()
+ *  When the job executes, this is initiated with Process::start() and when
+ *  it stops, this is told via Process::stop().
+ *
+ *  A Calculation must be derived by hand and is not supported via the
+ *  boost::preprocessor magic but behaves very similar to the Process itself
+ *  with respect to informing about the current stage of execution. What's
+ *  more is essentially the Calculation::doCalc() function that performs the
+ *  actual calculation (must not changed the state of the World and hence
+ *  there is not need for undo). The Calculation implementation takes care
+ *  of the rest.
+ *
+ *  A MethodAction is simply implemented by filling an ActionTraits structure
+ *  with the desired values and bind a method that should get executed.
+ *  Instantating the MethodAction with these parameters and executing
+ *  ActionRegistry()::registerAction() then allows for using it in the context
+ *  of the ActionQueue.
  *
  * \section actions-undo-redo Undoing and Redoing actions ...
@@ -81,5 +126,5 @@
  *
  *
- *  \date 2014-03-10
+ *  \date 2015-08-03
  *
  */
