Index: src/Actions/Action.cpp
===================================================================
--- src/Actions/Action.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Action.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -112,14 +112,7 @@
 }
 
-Dialog * Action::createDialog(){
-  Dialog *dialog = UIFactory::getInstance().makeDialog();
-  return fillDialog(dialog);
-}
-
-void Action::call(enum QueryOptions flag){
-  if(!isActive()){
-    return;
-  }
-  // forward to private virtual
+void Action::prepare(enum QueryOptions flag)
+{
+  // fill with
   if (flag == Interactive) {
     Dialog* dialog = createDialog();
@@ -130,4 +123,15 @@
     }
     delete(dialog);
+  }
+}
+
+Dialog * Action::createDialog(){
+  Dialog *dialog = UIFactory::getInstance().makeDialog();
+  return fillDialog(dialog);
+}
+
+void Action::call(){
+  if(!isActive()){
+    return;
   }
   ActionState::ptr state = Action::failure;
Index: src/Actions/Action.hpp
===================================================================
--- src/Actions/Action.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Action.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -133,5 +133,5 @@
    * is thrown)
    */
-  void call(enum QueryOptions state = Interactive);
+  void call();
 
 public:
@@ -167,4 +167,14 @@
    */
   const std::string help() const;
+
+  /** Clones the Action.
+   *
+   */
+  virtual Action* clone(enum QueryOptions flag = Interactive) const=0;
+
+  /** Prepares the Action's parameters.
+   *
+   */
+  virtual void prepare(enum QueryOptions flag = Interactive);
 
   /** Prints what would be necessary to add the Action from the Command Line Interface.
Index: src/Actions/ActionQueue.cpp
===================================================================
--- src/Actions/ActionQueue.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ActionQueue.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -53,10 +53,16 @@
 ActionQueue::ActionQueue() :
     AR(new ActionRegistry()),
-    history(new ActionHistory)
+    history(new ActionHistory),
+    CurrentAction(0)
 {}
 
 ActionQueue::~ActionQueue()
 {
-  queue.clear();
+  // free all actions contained in queue
+  for (ActionQueue_t::iterator iter = queue.begin(); !queue.empty(); iter = queue.begin()) {
+    delete *iter;
+    queue.erase(iter);
+  }
+
   delete history;
   delete AR;
@@ -65,13 +71,13 @@
 void ActionQueue::queueAction(const std::string &name, enum Action::QueryOptions state)
 {
-  Action* _action = AR->getActionByName(name);
-  queue.push_back(_action);
-  _action->call(state);
+  queueAction(AR->getActionByName(name), state);
 }
 
 void ActionQueue::queueAction(Action *_action, enum Action::QueryOptions state)
 {
-  queue.push_back(_action);
-  _action->call(state);
+  Action *newaction = _action->clone(state);
+  newaction->prepare(state);
+  queue.push_back( newaction );
+  newaction->call();
 }
 
Index: src/Actions/ActionQueue.hpp
===================================================================
--- src/Actions/ActionQueue.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ActionQueue.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -16,5 +16,4 @@
 #include "CodePatterns/Singleton.hpp"
 
-#include <list>
 #include <vector>
 
@@ -38,5 +37,5 @@
 public:
   typedef std::vector<std::string> ActionTokens_t;
-  typedef std::list<Action *> ActionQueue_t;
+  typedef std::vector< Action * > ActionQueue_t;
 
   /** Queues the Action with \a name to be called.
@@ -104,5 +103,5 @@
   void outputAsPython(std::ostream &output) const;
 
-  /** Undoes last called Action.
+  /** Undoes last called Acfriend void ::cleanUp();tion.
    *
    */
@@ -113,4 +112,15 @@
    */
   void redoLast();
+
+  /** Getter for the last executed action.
+   *
+   * \note this is necessary for Reactions to actually have a chance of getting
+   * the calculated value as Action's are always cloned.
+   *
+   * \return const ref to last action
+   */
+  const Action &getLastAction() const {
+    return *(queue.back());
+  }
 
 private:
@@ -151,4 +161,7 @@
   //!> internal queue of actions
   ActionQueue_t queue;
+
+  //!> point to current action in queue
+  size_t CurrentAction;
 };
 
Index: src/Actions/ActionSequence.cpp
===================================================================
--- src/Actions/ActionSequence.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ActionSequence.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -48,4 +48,13 @@
     loop(1)
 {}
+
+ActionSequence::ActionSequence(const ActionSequence &_other) :
+    loop(1)
+{
+  // we need to override copy cstor as we have pointer referenced objects
+  for(actionSet::iterator it=actions.begin(); it!=actions.end(); it++){
+    actions.push_back((*it)->clone());
+  }
+}
 
 ActionSequence::~ActionSequence()
Index: src/Actions/ActionSequence.hpp
===================================================================
--- src/Actions/ActionSequence.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ActionSequence.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -32,4 +32,5 @@
 
   ActionSequence();
+  ActionSequence(const ActionSequence &_other);
   virtual ~ActionSequence();
 
Index: src/Actions/Action_impl_header.hpp
===================================================================
--- src/Actions/Action_impl_header.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Action_impl_header.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -212,4 +212,6 @@
   bool shouldUndo();
 
+  Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
Index: src/Actions/Action_impl_pre.hpp
===================================================================
--- src/Actions/Action_impl_pre.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Action_impl_pre.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -292,4 +292,13 @@
     {}
 
+// =========== clone Action ===========
+Action* ACTION::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new ACTION();
+  else
+    return new ACTION(*this);
+}
+
 // =========== fill a dialog ===========
 Dialog* ACTION::fillDialog(Dialog *dialog) {
Index: src/Actions/AtomsCalculation.hpp
===================================================================
--- src/Actions/AtomsCalculation.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/AtomsCalculation.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -28,4 +28,6 @@
   virtual ~AtomsCalculation();
 
+  Action* clone(enum Action::QueryOptions flag = Action::Interactive) const;
+
 protected:
   virtual std::vector<T>* doCalc();
Index: src/Actions/AtomsCalculation_impl.hpp
===================================================================
--- src/Actions/AtomsCalculation_impl.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/AtomsCalculation_impl.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -52,4 +52,13 @@
 
 template<typename T>
+Action* AtomsCalculation<T>::clone(enum Action::QueryOptions flag) const
+{
+  if (flag == Action::Interactive)
+    return new AtomsCalculation<T>(op, Action::Traits, descr);
+  else
+    return new AtomsCalculation<T>(*this);
+}
+
+template<typename T>
 Dialog *AtomsCalculation<T>::fillDialog(Dialog *dialog){
   ASSERT(dialog,"No Dialog given when filling action dialog");
Index: src/Actions/Calculation.hpp
===================================================================
--- src/Actions/Calculation.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Calculation.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -42,4 +42,6 @@
   virtual bool shouldUndo();
 
+  virtual Action* clone(enum QueryOptions flag = Interactive) const=0;
+
   virtual void outputAsCLI(std::ostream &ost) const;
   virtual void outputAsPython(std::ostream &ost, const std::string &prefix) const;
@@ -55,5 +57,5 @@
    * Check if a cached result is available.
    */
-  virtual bool hasResult();
+  virtual bool hasResult() const;
 
   /**
@@ -61,5 +63,5 @@
    * Fails if there is no cached result.
    */
-  virtual T getResult();
+  virtual T getResult() const;
 
   /**
Index: src/Actions/Calculation_impl.hpp
===================================================================
--- src/Actions/Calculation_impl.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Calculation_impl.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -88,10 +88,10 @@
 
 template<typename T>
-bool Calculation<T>::hasResult(){
+bool Calculation<T>::hasResult() const {
   return done;
 }
 
 template<typename T>
-T Calculation<T>::getResult(){
+T Calculation<T>::getResult() const {
   assert(done && "No result calculated");
   return *result;
Index: src/Actions/MakroAction.cpp
===================================================================
--- src/Actions/MakroAction.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MakroAction.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -102,14 +102,4 @@
 
 ActionState::ptr MakroAction::performCall(){
-//  {
-//    // create and run our dialog and also of all members of the sequence
-//    Dialog* dialog = actions.fillAllDialogs(createDialog());
-//    if (dialog->hasQueries()) {
-//      if (!dialog->display())
-//        // dialog error or aborted -> throw exception
-//        throw ActionFailureException() << ActionNameString(getName());
-//    }
-//    delete(dialog);
-//  }
   ActionSequence::stateSet states = actions.callAll(true);
   return ActionState::ptr(new MakroActionState(states));
@@ -138,4 +128,26 @@
 }
 
+Action* MakroAction::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new MakroAction(Traits, actions);
+  else
+    return new MakroAction(*this);
+}
+
+void MakroAction::prepare(enum QueryOptions flag)
+{
+  if (flag == Interactive) {
+    // create and run our dialog and also of all members of the sequence
+    Dialog* dialog = createDialog();
+    if (dialog->hasQueries()) {
+      if (!dialog->display())
+        // dialog error or aborted -> throw exception
+        throw ActionFailureException() << ActionNameString(getName());
+    }
+    delete(dialog);
+  }
+}
+
 void MakroAction::outputAsCLI(std::ostream &ost) const
 {
Index: src/Actions/MakroAction.hpp
===================================================================
--- src/Actions/MakroAction.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MakroAction.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -36,4 +36,7 @@
   bool canUndo();
   bool shouldUndo();
+
+  virtual Action* clone(enum QueryOptions flag = Interactive) const;
+  void prepare(enum QueryOptions flag = Interactive);
 
   virtual void outputAsCLI(std::ostream &ost) const;
Index: src/Actions/MakroAction_impl_header.hpp
===================================================================
--- src/Actions/MakroAction_impl_header.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MakroAction_impl_header.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -218,4 +218,6 @@
   bool shouldUndo();
 
+  virtual Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
Index: src/Actions/MakroAction_impl_pre.hpp
===================================================================
--- src/Actions/MakroAction_impl_pre.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MakroAction_impl_pre.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -291,4 +291,13 @@
     {}
 
+// =========== clone Action ===========
+Action* ACTION::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new ACTION();
+  else
+    return new ACTION(*this);
+}
+
 // =========== fill a dialog ===========
 Dialog* ACTION::fillOwnDialog(Dialog *dialog) {
Index: src/Actions/ManipulateAtomsProcess.cpp
===================================================================
--- src/Actions/ManipulateAtomsProcess.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ManipulateAtomsProcess.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -103,2 +103,10 @@
   stop();
 }
+
+Action* ManipulateAtomsProcess::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new ManipulateAtomsProcess(operation, descr, Traits);
+  else
+    return new ManipulateAtomsProcess(*this);
+}
Index: src/Actions/ManipulateAtomsProcess.hpp
===================================================================
--- src/Actions/ManipulateAtomsProcess.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/ManipulateAtomsProcess.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -38,4 +38,6 @@
   virtual bool shouldUndo();
 
+  Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
@@ -47,6 +49,6 @@
    *
    */
-  void call(enum QueryOptions state = Interactive)
-  { Process::call(state); }
+  void call()
+  { Process::call(); }
 
 protected:
Index: src/Actions/MethodAction.cpp
===================================================================
--- src/Actions/MethodAction.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MethodAction.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -83,4 +83,12 @@
 }
 
+Action* MethodAction::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new MethodAction(Traits, executeMethod);
+  else
+    return new MethodAction(*this);
+}
+
 void MethodAction::outputAsCLI(std::ostream &ost) const
 {}
Index: src/Actions/MethodAction.hpp
===================================================================
--- src/Actions/MethodAction.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/MethodAction.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -34,4 +34,6 @@
   virtual bool shouldUndo();
 
+  virtual Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
Index: src/Actions/Reaction.hpp
===================================================================
--- src/Actions/Reaction.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Reaction.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -39,6 +39,7 @@
    */
   virtual bool canUndo();
+  virtual bool shouldUndo();
 
-  virtual bool shouldUndo();
+  virtual Action* clone(enum QueryOptions flag = Interactive) const=0;
 
   virtual void outputAsCLI(std::ostream &ost) const;
Index: src/Actions/Reaction_impl_header.hpp
===================================================================
--- src/Actions/Reaction_impl_header.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Reaction_impl_header.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -206,4 +206,6 @@
   virtual ~REACTION();
 
+  Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
Index: src/Actions/Reaction_impl_pre.hpp
===================================================================
--- src/Actions/Reaction_impl_pre.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/Reaction_impl_pre.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -200,4 +200,13 @@
 }
 
+// =========== clone Action ===========
+Action* REACTION::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new REACTION();
+  else
+    return new REACTION(*this);
+}
+
 // =========== fill a dialog ===========
 Dialog* REACTION::fillDialog(Dialog *dialog) {
@@ -267,10 +276,13 @@
 #endif
   ActionQueue::getInstance().queueAction( ToCall, Action::NonInteractive);
-  Reaction< RETURNTYPE > * resultaction = static_cast<Reaction< RETURNTYPE > *>(ToCall);
-  ASSERT( resultaction != NULL,
-      "  COMMAND - static cast to Reaction type failed.");
-  ASSERT( resultaction->hasResult (),
-      " _COMMAND - result is not done yet?");
-  return resultaction->getResult();
+  RETURNTYPE result;
+  try {
+    const Reaction< RETURNTYPE > & resultaction =
+        static_cast<const Reaction< RETURNTYPE > &>(ActionQueue::getInstance().getLastAction());
+    ASSERT( resultaction.hasResult (),
+        " _COMMAND - result is not done yet?");
+    result = resultaction.getResult();
+  } ASSERT_NOCATCH("  COMMAND - static cast to Reaction type failed.");
+  return result;
 };
 
@@ -290,10 +302,13 @@
 #endif
   ActionQueue::getInstance().queueAction( ToCall, Action::NonInteractive);
-  Reaction< RETURNTYPE > * resultaction = static_cast<Reaction< RETURNTYPE > *>(ToCall);
-  ASSERT( resultaction != NULL,
-      "  COMMAND - static cast to Reaction type failed.");
-  ASSERT( resultaction->hasResult (),
-      " _COMMAND - result is not done yet?");
-  return resultaction->getResult();
+  RETURNTYPE result;
+  try {
+    const Reaction< RETURNTYPE > & resultaction =
+        static_cast<const Reaction< RETURNTYPE > &>(ActionQueue::getInstance().getLastAction());
+    ASSERT( resultaction.hasResult (),
+        " _COMMAND - result is not done yet?");
+    result = resultaction.getResult();
+  } ASSERT_NOCATCH("  COMMAND - static cast to Reaction type failed.");
+  return result;
 };
 
Index: src/Actions/unittests/ActionSequenceUnitTest.cpp
===================================================================
--- src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -85,4 +85,10 @@
     return true;
   }
+  Action* clone(enum QueryOptions flag = Interactive) const
+  {
+    return new canUndoActionStub(Traits);
+  }
+  void prepare(enum QueryOptions flag = Interactive)
+  {}
   void outputAsCLI(std::ostream &ost) const
   {}
@@ -118,4 +124,10 @@
    return true;
   }
+  Action* clone(enum QueryOptions flag = Interactive) const
+  {
+    return new cannotUndoActionStub(Traits);
+  }
+  void prepare(enum QueryOptions flag = Interactive)
+  {}
   void outputAsCLI(std::ostream &ost) const
   {}
@@ -154,4 +166,10 @@
     return true;
   }
+  Action* clone(enum QueryOptions flag = Interactive) const
+  {
+    return new wasCalledActionStub(Traits);
+  }
+  void prepare(enum QueryOptions flag = Interactive)
+  {}
   void outputAsCLI(std::ostream &ost) const
   {}
Index: src/UIElements/CommandLineUI/CommandLineWindow.cpp
===================================================================
--- src/UIElements/CommandLineUI/CommandLineWindow.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/UIElements/CommandLineUI/CommandLineWindow.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -69,9 +69,7 @@
 
   // go through all possible actions
-  LOG(0, "Calling Actions ... ");
   for (std::list<std::string>::iterator CommandRunner = CommandLineParser::getInstance().SequenceOfActions.begin(); CommandRunner != CommandLineParser::getInstance().SequenceOfActions.end(); ++CommandRunner) {
     if (AQ.isActionKnownByName(*CommandRunner)) {
 //      LOG1, "INFO: Checking presence of " << *CommandRunner << ": " << "queuing.");
-      LOG(1, "INFO: Queueing " << *CommandRunner << "...");
       AQ.queueAction(*CommandRunner);
     } else {
Index: src/UIElements/Menu/TextMenu/TxMenuLeaveAction.cpp
===================================================================
--- src/UIElements/Menu/TextMenu/TxMenuLeaveAction.cpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/UIElements/Menu/TextMenu/TxMenuLeaveAction.cpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -71,4 +71,12 @@
 }
 
+Action* TxMenu::LeaveAction::clone(enum QueryOptions flag) const
+{
+  if (flag == Interactive)
+    return new TxMenu::LeaveAction(menu, Traits);
+  else
+    return new TxMenu::LeaveAction(*this);
+}
+
 void TxMenu::LeaveAction::outputAsCLI(std::ostream &ost) const
 {}
Index: src/UIElements/Menu/TextMenu/TxMenuLeaveAction.hpp
===================================================================
--- src/UIElements/Menu/TextMenu/TxMenuLeaveAction.hpp	(revision 36053cf50efb19714f34f33fe6fe7ef9b53476d0)
+++ src/UIElements/Menu/TextMenu/TxMenuLeaveAction.hpp	(revision af53848739f011c706c567deb35d90e7f2dab281)
@@ -33,4 +33,6 @@
   bool shouldUndo();
 
+  Action* clone(enum QueryOptions flag = Interactive) const;
+
   void outputAsCLI(std::ostream &ost) const;
   void outputAsPython(std::ostream &ost, const std::string &prefix) const;
