Index: src/Actions/AtomAction/AddAction.cpp
===================================================================
--- src/Actions/AtomAction/AddAction.cpp	(revision 5cf34106ca5c1b4a21a25e3e9adb431e3c4d9404)
+++ src/Actions/AtomAction/AddAction.cpp	(revision 8ad68b373314b5f34d43573103b2586c095bf875)
@@ -65,4 +65,13 @@
 }
 
+atom * regetNewAtom(const AtomAddAction::AtomAddParameters &_params, const atomId_t _id)
+{
+  atom * first = World::getInstance().recreateAtom(_id);
+  first->setType(_params.elemental.get());
+  first->setPosition(_params.position.get());
+
+  return first;
+}
+
 std::vector<atomId_t> createAtoms(
     const AtomAddAction::AtomAddParameters &_params,
@@ -91,4 +100,36 @@
 
   return ids;
+}
+
+std::vector<atomId_t> recreateAtoms(
+    const AtomAddAction::AtomAddParameters &_params,
+    const std::vector<atomId_t> &_ids,
+    std::vector<molecule *> &_molecules)
+{
+  molecule *mol = NULL;
+  if (!_molecules.empty()) {
+    ASSERT (_molecules.size() == 1,
+        "recreateAtoms() - more than one molecules given.");
+    mol = *_molecules.begin();
+  } else {
+    mol = World::getInstance().createMolecule();
+    mol->setName("none");
+  }
+  std::vector<atomId_t> newids;
+  for (std::vector<atomId_t>::const_iterator iter = _ids.begin();
+      iter != _ids.end(); ++iter) {
+    atom *first = regetNewAtom(_params, *iter);
+    if (first != NULL) {
+      newids.push_back(first->getId());
+      mol->AddAtom(first);
+      LOG(1, "Adding new atom with element " << first->getType()->getName()
+          << " at " << (first->getPosition()) << " to new molecule.");
+    } else {
+      ELOG(1, "Could not recreate atom with id " << *iter);
+      break;
+    }
+  }
+
+  return newids;
 }
 
@@ -120,6 +161,5 @@
 
   std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules();
-  std::vector<atomId_t> newids = createAtoms(params, molecules);
-
+  std::vector<atomId_t> newids = recreateAtoms(state->params, state->ids, molecules);
   if (newids.size() != state->ids.size()) {
     STATUS("Could not recreate all atoms after undo.");
@@ -128,32 +168,5 @@
     return Action::failure;
   }
-
-  std::vector<atomId_t>::const_iterator newiter = newids.begin();
-  std::vector<atomId_t>::const_iterator olditer = state->ids.begin();
-  bool status=true;
-  for (; newiter != newids.end(); ++newiter, ++olditer) {
-    atom * first = World::getInstance().getAtom(AtomById(*newiter));
-    ASSERT( first != NULL,
-        "AtomAddAction::performRedo() - re-created atom not present?");
-    if (first->getId() != *olditer)
-      if (!first->changeId(*olditer)) {
-        STATUS("Could not change atom id "+toString(first->getId())+"->"+toString(*olditer)+".");
-        // remove all created atoms
-        for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); iter != olditer;++iter)
-          World::getInstance().destroyAtom(*iter);
-        olditer = state->ids.end();
-        for (std::vector<atomId_t>::const_iterator iter = newiter; iter != newids.end();++iter)
-          World::getInstance().destroyAtom(*iter);
-        status = false;
-        break;
-      }
-  }
-  ASSERT( olditer == state->ids.end(),
-      "AtomAddAction::performRedo() - after all unequal amount of ids in new and old?");
-
-  if (!status) {
-    return Action::failure;
-  } else
-    return ActionState::ptr(_state);
+  return ActionState::ptr(_state);
 }
 
Index: src/Actions/UndoRedoHelpers.cpp
===================================================================
--- src/Actions/UndoRedoHelpers.cpp	(revision 5cf34106ca5c1b4a21a25e3e9adb431e3c4d9404)
+++ src/Actions/UndoRedoHelpers.cpp	(revision 8ad68b373314b5f34d43573103b2586c095bf875)
@@ -58,8 +58,9 @@
     // re-create the atom
     LOG(3, "DEBUG: Re-adding atom " << atoms[i].getId() << ".");
-    atom *Walker = World::getInstance().createAtom();
-    if (!atoms[i].setAtom(*Walker)) {
+    atom *Walker = World::getInstance().recreateAtom(atoms[i].getId());
+    if ((Walker != NULL) && (!atoms[i].setAtom(*Walker))) {
       ELOG(1, "Failed to set id.");
-      World::getInstance().destroyAtom(Walker);
+      if (Walker != NULL)
+        World::getInstance().destroyAtom(Walker);
       break;
     }
@@ -82,10 +83,6 @@
     // re-create the atom
     LOG(3, "DEBUG: Re-adding molecule " << iter->first << ".");
-    molecule *mol_Walker = World::getInstance().createMolecule();
-
-    // reset the mol id
-    bool status = true;
-    if (mol_Walker->getId() != iter->first)
-      status &= mol_Walker->changeId(iter->first);
+    molecule *mol_Walker = World::getInstance().recreateMolecule(iter->first);
+    status &= (mol_Walker != NULL);
 
     // add all its atoms
