Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision b71881221de8cd8ae1667781df5037eb270b146e)
+++ src/World.cpp	(revision 7f1865dc7e5a73a96f5e2c5a9661cb6ee25690f7)
@@ -601,4 +601,22 @@
 /************************** Selection of Atoms and molecules ******************/
 
+// translate type's selection member functions to overloaded with specific type
+
+template <class T>
+void World::selectVectorOfInstances(const typename T::iterator _begin, const typename T::iterator _end)
+{
+  std::for_each(_begin,_end,
+      boost::bind(&World::selectInstance<typename T::value_type::second_type>,
+          boost::bind(_take<typename T::value_type::second_type,typename T::value_type>::get, _1)));
+}
+
+template <class T>
+void World::unselectVectorOfInstances(const typename  T::iterator _begin, const typename T::iterator _end)
+{
+  std::for_each(_begin,_end,
+      boost::bind(&World::unselectInstance<typename T::value_type::second_type>,
+          boost::bind(_take<typename T::value_type::second_type,typename T::value_type>::get, _1)));
+}
+
 // Atoms
 
@@ -606,4 +624,5 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
+  unselectVectorOfInstances<AtomSet>(selectedAtoms.begin(), selectedAtoms.end());
   selectedAtoms.clear();
 }
@@ -618,4 +637,5 @@
   invertedSelection.erase(iter, invertedSelection.end());
   // apply new selection
+  unselectVectorOfInstances<AtomSet>(selectedAtoms.begin(), selectedAtoms.end());
   selectedAtoms.clear();
   void (World::*selector)(const atom*) = &World::selectAtom; // needed for type resolution of overloaded function
@@ -630,4 +650,5 @@
   boost::function<void (const atomId_t)> IdSelector =
       boost::bind(static_cast<void (World::*)(const atomId_t)>(&World::selectAtom), this, _1);
+  unselectVectorOfInstances<AtomSet>(selectedAtoms.begin(), selectedAtoms.end());
   selectedAtoms.clear();
   std::for_each(atomids.begin(),atomids.end(), IdSelector);
@@ -644,4 +665,5 @@
       atomids.begin());
   selectedAtoms_Stack.push( atomids );
+  unselectVectorOfInstances<AtomSet>(selectedAtoms.begin(), selectedAtoms.end());
   selectedAtoms.clear();
 }
@@ -652,5 +674,5 @@
   // atom * is unchanged in this function, but we do store entity as changeable
   ASSERT(_atom,"Invalid pointer in selection of atom");
-  selectedAtoms[_atom->getId()]=const_cast<atom *>(_atom);
+  selectAtom(_atom->getId());
 }
 
@@ -660,4 +682,5 @@
   ASSERT(atoms.count(id),"Atom Id selected that was not in the world");
   selectedAtoms[id]=atoms[id];
+  atoms[id]->select();
 }
 
@@ -699,4 +722,5 @@
   NOTIFY(SelectionChanged);
   ASSERT(atoms.count(id),"Atom Id unselected that was not in the world");
+  atoms[id]->unselect();
   selectedAtoms.erase(id);
 }
@@ -736,5 +760,9 @@
 
 bool World::isSelected(const atom *_atom) const {
-  return isAtomSelected(_atom->getId());
+  const bool status = isAtomSelected(_atom->getId());
+   ASSERT( status == _atom->selected,
+      "World::isSelected() - mismatch between selection state in atom "+
+      toString(_atom->getId())+" and World.");
+  return status;
 }
 
@@ -778,4 +806,5 @@
   OBSERVE;
   NOTIFY(SelectionChanged);
+  unselectVectorOfInstances<MoleculeSet>(selectedMolecules.begin(), selectedMolecules.end());
   selectedMolecules.clear();
 }
@@ -791,4 +820,5 @@
   invertedSelection.erase(iter, invertedSelection.end());
   // apply new selection
+  unselectVectorOfInstances<MoleculeSet>(selectedMolecules.begin(), selectedMolecules.end());
   selectedMolecules.clear();
   void (World::*selector)(const molecule*) = &World::selectMolecule; // needed for type resolution of overloaded function
@@ -803,4 +833,5 @@
   boost::function<void (const moleculeId_t)> IdSelector =
       boost::bind(static_cast<void (World::*)(const moleculeId_t)>(&World::selectMolecule), this, _1);
+  unselectVectorOfInstances<MoleculeSet>(selectedMolecules.begin(), selectedMolecules.end());
   selectedMolecules.clear();
   std::for_each(moleculeids.begin(),moleculeids.end(), IdSelector);
@@ -819,4 +850,5 @@
       moleculeids.begin());
   selectedMolecules_Stack.push( moleculeids );
+  unselectVectorOfInstances<MoleculeSet>(selectedMolecules.begin(), selectedMolecules.end());
   selectedMolecules.clear();
 }
@@ -827,5 +859,5 @@
   // molecule * is unchanged in this function, but we do store entity as changeable
   ASSERT(_mol,"Invalid pointer to molecule in selection");
-  selectedMolecules[_mol->getId()]=const_cast<molecule *>(_mol);
+  selectMolecule(_mol->getId());
 }
 
@@ -834,4 +866,5 @@
   NOTIFY(SelectionChanged);
   ASSERT(molecules.count(id),"Molecule Id selected that was not in the world");
+  molecules[id]->select();
   selectedMolecules[id]=molecules[id];
 }
@@ -875,4 +908,5 @@
   NOTIFY(SelectionChanged);
   ASSERT(molecules.count(id),"No such molecule with ID in unselection");
+  molecules[id]->unselect();
   selectedMolecules.erase(id);
 }
@@ -913,5 +947,9 @@
 
 bool World::isSelected(const molecule *_mol) const {
-  return isMoleculeSelected(_mol->getId());
+  const bool status = isMoleculeSelected(_mol->getId());
+  ASSERT( status == _mol->selected,
+      "World::isSelected() - mismatch in selection status between mol "+
+      toString(_mol->getId())+" and World.");
+  return status;
 }
 
Index: src/World.hpp
===================================================================
--- src/World.hpp	(revision b71881221de8cd8ae1667781df5037eb270b146e)
+++ src/World.hpp	(revision 7f1865dc7e5a73a96f5e2c5a9661cb6ee25690f7)
@@ -536,4 +536,35 @@
 
 private:
+  /** Helper to access atom::select() and molecule::select() only by type.
+   *
+   */
+  template <class T>
+  static void selectInstance(T _instance)
+  { _instance->select(); }
+
+  /** Helper to access atom::unselect() and molecule::unselect() only by type.
+   *
+   */
+  template <class T>
+  static void unselectInstance(T _instance)
+  { _instance->unselect(); }
+
+  /** Forward declaration of a helper function for selecting a vector of instances.
+   *
+   * \note only implemented inside World.
+   *
+   */
+  template <class T>
+  void selectVectorOfInstances(const typename T::iterator _begin, const typename T::iterator _end);
+
+  /** Forward declaration of a helper function for unselecting a vector of instances.
+   *
+   * \note only implemented inside World.
+   *
+   */
+  template <class T>
+  void unselectVectorOfInstances(const typename T::iterator _begin, const typename T::iterator _end);
+
+private:
 
   friend const atom *detail::lastChanged<atom>();
