Index: src/Actions/ActionSequence.hpp
===================================================================
--- src/Actions/ActionSequence.hpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/ActionSequence.hpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -19,4 +19,6 @@
 #include <deque>
 
+class ActionSequenceTest;
+
 namespace MoleCuilder {
 
@@ -27,4 +29,6 @@
 {
   friend class MakroAction;
+  //!> grant unit test access to private sequence
+  friend class ::ActionSequenceTest;
 public:
   typedef std::deque<Action*> actionSet;
Index: src/Actions/MakroAction.hpp
===================================================================
--- src/Actions/MakroAction.hpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/MakroAction.hpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -19,4 +19,6 @@
 #include "Actions/Action.hpp"
 
+class ActionSequenceTest;
+
 namespace MoleCuilder {
   class ActionRegistry;
@@ -30,4 +32,6 @@
 class MakroAction : public Action
 {
+  //!> grant unit test access to sequence
+  friend class ::ActionSequenceTest;
 public:
   MakroAction(const ActionTrait &_trait,ActionSequence& _actions);
Index: src/Actions/SelectionAction/Atoms/PopAtomsAction.cpp
===================================================================
--- src/Actions/SelectionAction/Atoms/PopAtomsAction.cpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/SelectionAction/Atoms/PopAtomsAction.cpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -63,5 +63,5 @@
 ActionState::ptr SelectionPopAtomsAction::performUndo(ActionState::ptr _state) {
   SelectionPopAtomsState *state = static_cast<SelectionPopAtomsState *>(_state.get());
-  LOG(1, "Popping atom selection.");
+  LOG(1, "Pushing atom selection.");
   World::getInstance().pushAtomSelection();
 
Index: src/Actions/SelectionAction/Atoms/PushAtomsAction.cpp
===================================================================
--- src/Actions/SelectionAction/Atoms/PushAtomsAction.cpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/SelectionAction/Atoms/PushAtomsAction.cpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -54,5 +54,5 @@
 
 ActionState::ptr SelectionPushAtomsAction::performUndo(ActionState::ptr _state) {
-  LOG(1, "Pushing atom selection.");
+  LOG(1, "Popping atom selection.");
   World::getInstance().popAtomSelection();
 
Index: src/Actions/SelectionAction/Molecules/MoleculeOfAtomAction.cpp
===================================================================
--- src/Actions/SelectionAction/Molecules/MoleculeOfAtomAction.cpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/SelectionAction/Molecules/MoleculeOfAtomAction.cpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -55,5 +55,5 @@
 ActionState::ptr SelectionMoleculeOfAtomAction::performCall() {
   std::vector<molecule *> selectedMolecules = World::getInstance().getSelectedMolecules();
-  LOG(1, "Selecting molecule to currently selected atoms.");
+  LOG(1, "Selecting molecule to currently selected atoms: " << World::getInstance().countSelectedAtoms());
   World::getInstance().selectAllMolecules(MoleculesByAtomSelection());
   LOG(0, World::getInstance().countSelectedMolecules() << " molecules selected.");
Index: src/Actions/unittests/ActionSequenceUnitTest.cpp
===================================================================
--- src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/Actions/unittests/ActionSequenceUnitTest.cpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -301,11 +301,13 @@
   ActionSequence *sequence = new ActionSequence();
   ActionTrait wasCalledTrait("wasCalledActionStub");
-  wasCalledActionStub *wasCalled1 = new wasCalledActionStub(wasCalledTrait);
-  wasCalledActionStub *wasCalled2 = new wasCalledActionStub(wasCalledTrait);
-  sequence->addAction(wasCalled1);
-  sequence->addAction(wasCalled2);
+  sequence->addAction(new wasCalledActionStub(wasCalledTrait));
+  sequence->addAction(new wasCalledActionStub(wasCalledTrait));
 
   ActionTrait MakroTrait("Test MakroAction");
   MakroAction act(MakroTrait,*sequence);
+  wasCalledActionStub *wasCalled1 =
+      static_cast<wasCalledActionStub *>(act.actions.actions.front());
+  wasCalledActionStub *wasCalled2 =
+      static_cast<wasCalledActionStub *>(act.actions.actions.back());
 
   act.call();
Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/World.cpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -48,7 +48,9 @@
 #include "Descriptors/AtomDescriptor.hpp"
 #include "Descriptors/AtomDescriptor_impl.hpp"
+#include "Descriptors/AtomIdDescriptor.hpp"
 #include "Descriptors/AtomSelectionDescriptor.hpp"
 #include "Descriptors/MoleculeDescriptor.hpp"
 #include "Descriptors/MoleculeDescriptor_impl.hpp"
+#include "Descriptors/MoleculeIdDescriptor.hpp"
 #include "Descriptors/MoleculeSelectionDescriptor.hpp"
 #include "Descriptors/SelectiveConstIterator_impl.hpp"
@@ -559,5 +561,9 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
-  selectedAtoms = selectedAtoms_Stack.top();
+  const atomIdsVector_t atomids = selectedAtoms_Stack.top();
+  boost::function<void (const atomId_t)> IdSelector =
+      boost::bind(static_cast<void (World::*)(const atomId_t)>(&World::selectAtom), this, _1);
+  selectedAtoms.clear();
+  std::for_each(atomids.begin(),atomids.end(), IdSelector);
   selectedAtoms_Stack.pop();
 }
@@ -566,5 +572,10 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
-  selectedAtoms_Stack.push( selectedAtoms );
+  atomIdsVector_t atomids(countSelectedAtoms(), (atomId_t)-1);
+  std::copy(
+      MapKeyIterator<AtomSelectionConstIterator>(beginAtomSelection()),
+      MapKeyIterator<AtomSelectionConstIterator>(endAtomSelection()),
+      atomids.begin());
+  selectedAtoms_Stack.push( atomids );
   selectedAtoms.clear();
 }
@@ -703,5 +714,9 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
-  selectedMolecules = selectedMolecules_Stack.top();
+  const moleculeIdsVector_t moleculeids = selectedMolecules_Stack.top();
+  boost::function<void (const moleculeId_t)> IdSelector =
+      boost::bind(static_cast<void (World::*)(const moleculeId_t)>(&World::selectMolecule), this, _1);
+  selectedMolecules.clear();
+  std::for_each(moleculeids.begin(),moleculeids.end(), IdSelector);
   selectedMolecules_Stack.pop();
 }
@@ -710,5 +725,12 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
-  selectedMolecules_Stack.push( selectedMolecules );
+  moleculeIdsVector_t moleculeids(countSelectedMolecules(), (moleculeId_t)-1);
+  boost::function<moleculeId_t (const molecule*)> IdRetriever =
+      boost::bind(&molecule::getId, _1);
+  std::copy(
+      MapKeyIterator<MoleculeSelectionConstIterator>(beginMoleculeSelection()),
+      MapKeyIterator<MoleculeSelectionConstIterator>(endMoleculeSelection()),
+      moleculeids.begin());
+  selectedMolecules_Stack.push( moleculeids );
   selectedMolecules.clear();
 }
Index: src/World.hpp
===================================================================
--- src/World.hpp	(revision c2661740e680214aedbfd198a49ab05ae0eedc43)
+++ src/World.hpp	(revision c1d8370d3b839d18339477ec374e2e99aa98c3b7)
@@ -491,5 +491,6 @@
   AtomSet atoms;
   AtomSet selectedAtoms;
-  std::stack<AtomSet> selectedAtoms_Stack;
+  typedef std::vector<atomId_t> atomIdsVector_t;
+  std::stack<atomIdsVector_t> selectedAtoms_Stack;
   /**
    * stores the pool for all available AtomIds below currAtomId
@@ -501,5 +502,6 @@
   MoleculeSet molecules;
   MoleculeSet selectedMolecules;
-  std::stack<MoleculeSet> selectedMolecules_Stack;
+  typedef std::vector<moleculeId_t> moleculeIdsVector_t;
+  std::stack<moleculeIdsVector_t> selectedMolecules_Stack;
   /**
    * stores the pool for all available AtomIds below currAtomId
