Index: src/Actions/SelectionAction/Atoms/AtomByIdAction.cpp
===================================================================
--- src/Actions/SelectionAction/Atoms/AtomByIdAction.cpp	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Actions/SelectionAction/Atoms/AtomByIdAction.cpp	(revision f7c7cf132d69c7077ffd2cc11e7348c672217c01)
@@ -52,17 +52,48 @@
 #include "Action_impl_pre.hpp"
 /** =========== define the function ====================== */
-Action::state_ptr SelectionAtomByIdAction::performCall() {
-  const atom *Walker = World::getInstance().getAtom(AtomById(params.WalkerId.get()));
-  if (Walker != NULL) {
-    if (!World::getInstance().isSelected(Walker)) {
-      LOG(1, "Selecting atom " << *Walker);
-      World::getInstance().selectAtom(Walker);
-      LOG(0, World::getInstance().countSelectedAtoms() << " atoms selected.");
-      return Action::state_ptr(new SelectionAtomByIdState(params));
+Action::state_ptr SelectionAtomByIdAction::performCall()
+{
+  enum Sucess {
+    NoStatus,
+    AllAtomsUnselected,
+    AtomsSelected,
+    AtomMissing
+  } status = NoStatus;
+  const atomids_t atomids = params.atomids.get();
+  atomids_t undoatomids;
+  undoatomids.reserve(atomids.size());
+  for (atomids_t::const_iterator iter = atomids.begin(); iter != atomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    if (Walker != NULL) {
+      if (!World::getInstance().isSelected(Walker)) {
+        LOG(1, "Selecting atom " << *Walker);
+        World::getInstance().selectAtom(Walker);
+        undoatomids.push_back(*iter);
+        if (status < AtomMissing)
+          status = AtomsSelected;
+      } else {
+        if (status == NoStatus)
+          status = AllAtomsUnselected;
+      }
     } else {
+      status = AtomMissing;
+    }
+  }
+  LOG(0, World::getInstance().countSelectedAtoms() << " atoms selected.");
+
+  switch (status) {
+    case AtomMissing:
+      return Action::failure;
+      break;
+    case AllAtomsUnselected:
       return Action::success;
-    }
-  } else {
-    return Action::failure;
+      break;
+    case AtomsSelected:
+      return Action::state_ptr(new SelectionAtomByIdState(undoatomids, params));
+      break;
+    default:
+      ASSERT(0, "SelectionAtomByIdAction::performCall() - this must not happen.");
+      return Action::failure;
+      break;
   }
 }
@@ -71,6 +102,9 @@
   SelectionAtomByIdState *state = assert_cast<SelectionAtomByIdState*>(_state.get());
 
-  const atom *Walker = World::getInstance().getAtom(AtomById(state->params.WalkerId.get()));
-  World::getInstance().unselectAtom(Walker);
+  for (atomids_t::const_iterator iter = state->undoatomids.begin();
+      iter != state->undoatomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    World::getInstance().unselectAtom(Walker);
+  }
 
   return Action::state_ptr(_state);
@@ -80,6 +114,9 @@
   SelectionAtomByIdState *state = assert_cast<SelectionAtomByIdState*>(_state.get());
 
-  const atom *Walker = World::getInstance().getAtom(AtomById(state->params.WalkerId.get()));
-  World::getInstance().selectAtom(Walker);
+  for (atomids_t::const_iterator iter = state->undoatomids.begin();
+      iter != state->undoatomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    World::getInstance().selectAtom(Walker);
+  }
 
   return Action::state_ptr(_state);
Index: src/Actions/SelectionAction/Atoms/AtomByIdAction.def
===================================================================
--- src/Actions/SelectionAction/Atoms/AtomByIdAction.def	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Actions/SelectionAction/Atoms/AtomByIdAction.def	(revision f7c7cf132d69c7077ffd2cc11e7348c672217c01)
@@ -7,6 +7,10 @@
 
 // all includes and forward declarations necessary for non-integral types below
-class atom;
+#include <vector>
+#include "types.hpp"
 
+typedef std::vector<atomId_t> atomids_t;
+
+#include "Parameters/Validators/STLVectorValidator.hpp"
 #include "Parameters/Validators/Specific/AtomIdValidator.hpp"
 
@@ -14,14 +18,15 @@
 // ValueStorage by the token "Z" -> first column: int, Z, "Z"
 // "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
-#define paramtypes (atomId_t)
+#define paramtypes (atomids_t)
 #define paramtokens ("select-atom-by-id")
-#define paramdescriptions ("atom index")
+#define paramdescriptions ("atom indices to select")
 #undef paramdefaults
-#define paramreferences (WalkerId)
+#define paramreferences (atomids)
 #define paramvalids \
-(AtomIdValidator())
+(STLVectorValidator< std::vector<atomId_t> >(AtomIdValidator()))
 
-#undef statetypes
-#undef statereferences
+
+#define statetypes (atomids_t)
+#define statereferences (undoatomids)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
@@ -34,4 +39,4 @@
 
 // finally the information stored in the ActionTrait specialization
-#define DESCRIPTION "select an atom by index"
+#define DESCRIPTION "select atom(s) by index"
 #undef SHORTFORM
Index: src/Actions/SelectionAction/Atoms/NotAtomByIdAction.cpp
===================================================================
--- src/Actions/SelectionAction/Atoms/NotAtomByIdAction.cpp	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Actions/SelectionAction/Atoms/NotAtomByIdAction.cpp	(revision f7c7cf132d69c7077ffd2cc11e7348c672217c01)
@@ -52,17 +52,48 @@
 #include "Action_impl_pre.hpp"
 /** =========== define the function ====================== */
-Action::state_ptr SelectionNotAtomByIdAction::performCall() {
-  const atom * Walker = World::getInstance().getAtom(AtomById(params.WalkerId.get()));
-  if (Walker != NULL) {
-    if (World::getInstance().isSelected(Walker)) {
-      LOG(1, "Unselecting atom " << *Walker);
-      World::getInstance().unselectAtom(Walker);
-      LOG(0, World::getInstance().countSelectedAtoms() << " atoms remain selected.");
-      return Action::state_ptr(new SelectionNotAtomByIdState(params));
+Action::state_ptr SelectionNotAtomByIdAction::performCall()
+{
+  enum Sucess {
+    NoStatus,
+    AllAtomsSelected,
+    AtomsUnselected,
+    AtomMissing
+  } status = NoStatus;
+  const atomids_t atomids = params.atomids.get();
+  atomids_t undoatomids;
+  undoatomids.reserve(atomids.size());
+  for (atomids_t::const_iterator iter = atomids.begin(); iter != atomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    if (Walker != NULL) {
+      if (World::getInstance().isSelected(Walker)) {
+        LOG(1, "Unselecting atom " << *Walker);
+        World::getInstance().unselectAtom(Walker);
+        undoatomids.push_back(*iter);
+        if (status < AtomMissing)
+          status = AtomsUnselected;
+      } else {
+        if (status == NoStatus)
+          status = AllAtomsSelected;
+      }
     } else {
+      status = AtomMissing;
+    }
+  }
+  LOG(0, World::getInstance().countSelectedAtoms() << " atoms remain selected.");
+
+  switch (status) {
+    case AtomMissing:
+      return Action::failure;
+      break;
+    case AllAtomsSelected:
       return Action::success;
-    }
-  } else {
-    return Action::failure;
+      break;
+    case AtomsUnselected:
+      return Action::state_ptr(new SelectionNotAtomByIdState(undoatomids, params));
+      break;
+    default:
+      ASSERT(0, "SelectionAtomByIdAction::performCall() - this must not happen.");
+      return Action::failure;
+      break;
   }
 }
@@ -71,6 +102,9 @@
   SelectionNotAtomByIdState *state = assert_cast<SelectionNotAtomByIdState*>(_state.get());
 
-  const atom * Walker = World::getInstance().getAtom(AtomById(state->params.WalkerId.get()));
-  World::getInstance().selectAtom(Walker);
+  for (atomids_t::const_iterator iter = state->undoatomids.begin();
+      iter != state->undoatomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    World::getInstance().selectAtom(Walker);
+  }
 
   return Action::state_ptr(_state);
@@ -80,6 +114,9 @@
   SelectionNotAtomByIdState *state = assert_cast<SelectionNotAtomByIdState*>(_state.get());
 
-  const atom * Walker = World::getInstance().getAtom(AtomById(state->params.WalkerId.get()));
-  World::getInstance().unselectAtom(Walker);
+  for (atomids_t::const_iterator iter = state->undoatomids.begin();
+      iter != state->undoatomids.end(); ++iter) {
+    const atom *Walker = World::getInstance().getAtom(AtomById(*iter));
+    World::getInstance().unselectAtom(Walker);
+  }
 
   return Action::state_ptr(_state);
Index: src/Actions/SelectionAction/Atoms/NotAtomByIdAction.def
===================================================================
--- src/Actions/SelectionAction/Atoms/NotAtomByIdAction.def	(revision 94d5ac60852caf3933c959f8314ca0be3d3a7c51)
+++ src/Actions/SelectionAction/Atoms/NotAtomByIdAction.def	(revision f7c7cf132d69c7077ffd2cc11e7348c672217c01)
@@ -7,6 +7,10 @@
 
 // all includes and forward declarations necessary for non-integral types below
-class atom;
+#include <vector>
+#include "types.hpp"
 
+typedef std::vector<atomId_t> atomids_t;
+
+#include "Parameters/Validators/STLVectorValidator.hpp"
 #include "Parameters/Validators/Specific/AtomIdValidator.hpp"
 
@@ -14,14 +18,15 @@
 // ValueStorage by the token "Z" -> first column: int, Z, "Z"
 // "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
-#define paramtypes (atomId_t)
+#define paramtypes (atomids_t)
 #define paramtokens ("unselect-atom-by-id")
-#define paramdescriptions ("atom index")
+#define paramdescriptions ("atom indices to unselect")
 #undef paramdefaults
-#define paramreferences (WalkerId)
+#define paramreferences (atomids)
 #define paramvalids \
-(AtomIdValidator())
+(STLVectorValidator< std::vector<atomId_t> >(AtomIdValidator()))
 
-#undef statetypes
-#undef statereferences
+
+#define statetypes (atomids_t)
+#define statereferences (undoatomids)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
