Index: src/Actions/MoleculeAction/CopyAction.cpp
===================================================================
--- src/Actions/MoleculeAction/CopyAction.cpp	(revision 2382d72bc0cc499741c93764b5eb9ecfa0eff0e4)
+++ src/Actions/MoleculeAction/CopyAction.cpp	(revision 8ea3e7e2a013eab7a8936c65a52870438ee1859b)
@@ -20,4 +20,5 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include "Actions/UndoRedoHelpers.hpp"
 #include "CodePatterns/Log.hpp"
 #include "CodePatterns/Verbose.hpp"
@@ -31,4 +32,5 @@
 #include <fstream>
 #include <string>
+#include <vector>
 
 #include "Actions/MoleculeAction/CopyAction.hpp"
@@ -40,15 +42,19 @@
 #include "Action_impl_pre.hpp"
 /** =========== define the function ====================== */
-Action::state_ptr MoleculeCopyAction::performCall() {
-  molecule *copy = NULL;
+Action::state_ptr MoleculeCopyAction::performCall()
+{
+  std::vector<moleculeId_t> molecules;
+  for (World::MoleculeSelectionConstIterator iter = World::getInstance().beginMoleculeSelection();
+      iter != World::getInstance().endMoleculeSelection(); ++iter) {
+    molecule * const copy = (iter->second)->CopyMolecule();
+    Vector *Center = (iter->second)->DetermineCenterOfAll();
+    *Center *= -1.;
+    *Center += params.position.get();
+    copy->Translate(Center);
+    delete(Center);
+    molecules.push_back(copy->getId());
+  }
 
-  copy = params.mol.get()->CopyMolecule();
-  Vector *Center = params.mol.get()->DetermineCenterOfAll();
-  *Center *= -1.;
-  *Center += params.position.get();
-  copy->Translate(Center);
-  delete(Center);
-
-  return Action::state_ptr(new MoleculeCopyState(copy,params));
+  return Action::state_ptr(new MoleculeCopyState(molecules,params));
 }
 
@@ -56,6 +62,5 @@
   MoleculeCopyState *state = assert_cast<MoleculeCopyState*>(_state.get());
 
-  state->copy->removeAtomsinMolecule();
-  World::getInstance().destroyMolecule(state->copy);
+  RemoveMoleculesWithAtomsByIds(state->copies);
 
   return Action::state_ptr(_state);
@@ -63,14 +68,5 @@
 
 Action::state_ptr MoleculeCopyAction::performRedo(Action::state_ptr _state){
-  MoleculeCopyState *state = assert_cast<MoleculeCopyState*>(_state.get());
-
-  molecule *copy = state->params.mol.get()->CopyMolecule();
-  Vector *Center = state->params.mol.get()->DetermineCenterOfAll();
-  *Center *= -1.;
-  *Center += state->params.position.get();
-  copy->Translate(Center);
-  delete(Center);
-
-  return Action::state_ptr(new MoleculeCopyState(copy,state->params));
+  return performCall();
 }
 
Index: src/Actions/MoleculeAction/CopyAction.def
===================================================================
--- src/Actions/MoleculeAction/CopyAction.def	(revision 2382d72bc0cc499741c93764b5eb9ecfa0eff0e4)
+++ src/Actions/MoleculeAction/CopyAction.def	(revision 8ea3e7e2a013eab7a8936c65a52870438ee1859b)
@@ -7,17 +7,17 @@
 
 // all includes and forward declarations necessary for non-integral types below
-class MoleculeListClass;
+#include <vector>
 
 // 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 (NODEFAULT) for each (undefined) default value
-#define paramtypes (const molecule *)(Vector)
-#define paramtokens ("copy-molecule")("position")
-#define paramdescriptions ("molecule to copy")("position in R^3 space")
+#define paramtypes (Vector)
+#define paramtokens ("position")
+#define paramdescriptions ("position in R^3 space")
 #undef paramdefaults
-#define paramreferences (mol)(position)
+#define paramreferences (position)
 
-#define statetypes (molecule *)
-#define statereferences (copy)
+#define statetypes (const std::vector<moleculeId_t>)
+#define statereferences (copies)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
Index: src/Actions/UndoRedoHelpers.cpp
===================================================================
--- src/Actions/UndoRedoHelpers.cpp	(revision 2382d72bc0cc499741c93764b5eb9ecfa0eff0e4)
+++ src/Actions/UndoRedoHelpers.cpp	(revision 8ea3e7e2a013eab7a8936c65a52870438ee1859b)
@@ -26,5 +26,7 @@
 
 #include "Atom/atom.hpp"
+#include "molecule.hpp"
 #include "Descriptors/AtomIdDescriptor.hpp"
+#include "Descriptors/MoleculeIdDescriptor.hpp"
 #include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
@@ -123,2 +125,14 @@
   }
 }
+
+void MoleCuilder::RemoveMoleculesWithAtomsByIds(const std::vector<moleculeId_t> &ids)
+{
+  for (std::vector<moleculeId_t>::const_iterator iter = ids.begin();
+      iter != ids.end(); ++iter) {
+    molecule * const mol = World::getInstance().getMolecule(MoleculeById(*iter));
+    if (mol != NULL) {
+      mol->removeAtomsinMolecule();
+      World::getInstance().destroyMolecule(mol);
+    }
+  }
+}
Index: src/Actions/UndoRedoHelpers.hpp
===================================================================
--- src/Actions/UndoRedoHelpers.hpp	(revision 2382d72bc0cc499741c93764b5eb9ecfa0eff0e4)
+++ src/Actions/UndoRedoHelpers.hpp	(revision 8ea3e7e2a013eab7a8936c65a52870438ee1859b)
@@ -70,4 +70,10 @@
    */
   void ResetAtomPosition(const std::vector<AtomicInfo> &movedatoms, const std::vector<Vector> &MovedToVector);
+
+  /** Remove all molecules identified by their ids given in \a ids.
+   *
+   * @param ids vector of molecular ids to remove
+   */
+  void RemoveMoleculesWithAtomsByIds(const std::vector<moleculeId_t> &ids);
 }
 
Index: tests/regression/Molecules/Copy/testsuite-molecules-copy-molecule.at
===================================================================
--- tests/regression/Molecules/Copy/testsuite-molecules-copy-molecule.at	(revision 2382d72bc0cc499741c93764b5eb9ecfa0eff0e4)
+++ tests/regression/Molecules/Copy/testsuite-molecules-copy-molecule.at	(revision 8ea3e7e2a013eab7a8936c65a52870438ee1859b)
@@ -7,5 +7,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/test.xyz $file], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file  --copy-molecule 0 --position "0,0,10"], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10"], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/post/test-copy.xyz], 0, [ignore], [ignore])
 
@@ -14,5 +14,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/tensid.potentials .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --copy-molecule 0 --position "0,0,10"], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10"], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/post/tensid.data], 0, [ignore], [ignore])
 
@@ -26,5 +26,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/test.xyz $file], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file  --copy-molecule 0 --position "0,0,10" --undo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10" --undo], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/post/test-undo.xyz], 0, [ignore], [ignore])
 
@@ -33,5 +33,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/tensid.potentials .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --copy-molecule 0 --position "0,0,10" --undo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10" --undo], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/tensid.data], 0, [ignore], [ignore])
 
@@ -45,5 +45,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/test.xyz $file], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder -i $file  --copy-molecule 0 --position "0,0,10" --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10" --undo --redo], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/post/test-copy.xyz], 0, [ignore], [ignore])
 
@@ -52,5 +52,5 @@
 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Copy/pre/tensid.potentials .], 0)
 AT_CHECK([chmod u+w $file], 0)
-AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --copy-molecule 0 --position "0,0,10" --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([../../molecuilder --parse-tremolo-potentials tensid.potentials -i $file --select-molecule-by-id 0 --copy-molecule --position "0,0,10" --undo --redo], 0, [stdout], [stderr])
 AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Molecules/Copy/post/tensid.data], 0, [ignore], [ignore])
 
