Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision c084cc2e958b451246dd895b6538361c1917b4e4)
+++ src/World.cpp	(revision 90c4280af5b046af47159f7008b4dc774fe44e6c)
@@ -9,5 +9,6 @@
 
 #include "World.hpp"
-#include "Patterns/ObservedContainer_impl.hpp"
+
+#include <functional>
 
 #include "atom.hpp"
@@ -28,4 +29,5 @@
 
 #include "Patterns/Singleton_impl.hpp"
+#include "Patterns/ObservedContainer_impl.hpp"
 
 using namespace std;
@@ -485,4 +487,79 @@
 }
 
+/************************** Selection of Atoms and molecules ******************/
+
+// Atoms
+
+void World::clearAtomSelection(){
+  selectedAtoms.clear();
+}
+
+void World::selectAtom(atom *atom){
+  ASSERT(atom,"Invalid pointer in selection of atom");
+  selectedAtoms[atom->getId()]=atom;
+}
+
+void World::selectAtom(atomId_t id){
+  ASSERT(atoms.count(id),"Atom Id selected that was not in the world");
+  selectedAtoms[id]=atoms[id];
+}
+
+void World::selectAllAtoms(AtomDescriptor descr){
+  internal_AtomIterator begin = getAtomIter_internal(descr);
+  internal_AtomIterator end = atomEnd_internal();
+  void (World::*func)(atom*) = &World::selectAtom; // needed for type resolution of overloaded function
+  for_each(begin,end,bind1st(mem_fun(func),this)); // func is select... see above
+}
+
+void World::selectAtomsOfMolecule(molecule *_mol){
+  ASSERT(_mol,"Invalid pointer to molecule in selection of Atoms of Molecule");
+  // need to make it const to get the fast iterators
+  const molecule *mol = _mol;
+  void (World::*func)(atom*) = &World::selectAtom; // needed for type resolution of overloaded function
+  for_each(mol->begin(),mol->end(),bind1st(mem_fun(func),this)); // func is select... see above
+}
+
+void World::selectAtomsOfMolecule(moleculeId_t id){
+  ASSERT(molecules.count(id),"No molecule with the given id upon Selection of atoms from molecule");
+  selectAtomsOfMolecule(molecules[id]);
+}
+
+// Molecules
+
+void World::clearMoleculeSelection(){
+  selectedMolecules.clear();
+}
+
+void World::selectMolecule(molecule *mol){
+  ASSERT(mol,"Invalid pointer to molecule in selection");
+  selectedMolecules[mol->getId()]=mol;
+}
+
+void World::selectMolecule(moleculeId_t id){
+  ASSERT(molecules.count(id),"Molecule Id selected that was not in the world");
+  selectedMolecules[id]=molecules[id];
+}
+
+void World::selectAllMoleculess(MoleculeDescriptor descr){
+  internal_MoleculeIterator begin = getMoleculeIter_internal(descr);
+  internal_MoleculeIterator end = moleculeEnd_internal();
+  void (World::*func)(molecule*) = &World::selectMolecule; // needed for type resolution of overloaded function
+  for_each(begin,end,bind1st(mem_fun(func),this)); // func is select... see above
+}
+
+void World::selectMoleculeOfAtom(atom *atom){
+  ASSERT(atom,"Invalid atom pointer in selection of MoleculeOfAtom");
+  molecule *mol=atom->getMolecule();
+  // the atom might not be part of a molecule
+  if(mol){
+    selectMolecule(mol);
+  }
+}
+
+void World::selectMoleculeOfAtom(atomId_t id){
+  ASSERT(atoms.count(id),"No such atom with given ID in selection of Molecules of Atom");\
+  selectMoleculeOfAtom(atoms[id]);
+}
+
 /******************************* Singleton Stuff **************************/
 
@@ -494,8 +571,10 @@
     ExitFlag(0),
     atoms(this),
+    selectedAtoms(this),
     currAtomId(0),
     lastAtomPoolSize(0),
     numAtomDefragSkips(0),
     molecules(this),
+    selectedMolecules(this),
     currMoleculeId(0),
     molecules_deprecated(new MoleculeListClass(this))
Index: src/World.hpp
===================================================================
--- src/World.hpp	(revision c084cc2e958b451246dd895b6538361c1917b4e4)
+++ src/World.hpp	(revision 90c4280af5b046af47159f7008b4dc774fe44e6c)
@@ -222,5 +222,5 @@
    * All these iterators are observed to track changes.
    * There is a corresponding protected section with unobserved iterators,
-   * which ca be used internally when the extra speed is needed
+   * which can be used internally when the extra speed is needed
    */
 
@@ -239,8 +239,28 @@
   typedef SelectiveIterator<molecule*,MoleculeSet,MoleculeDescriptor>   MoleculeIterator;
 
+  /**
+   * returns an iterator over all Molecules matching a given descriptor.
+   * This iterator is observed, so don't keep it around unnecessary to
+   * avoid unintended blocking.
+   */
   MoleculeIterator getMoleculeIter(MoleculeDescriptor descr);
   MoleculeIterator getMoleculeIter();
 
   MoleculeIterator moleculeEnd();
+
+  /******** Selections of molecules and Atoms *************/
+  void clearAtomSelection();
+  void selectAtom(atom*);
+  void selectAtom(atomId_t);
+  void selectAllAtoms(AtomDescriptor);
+  void selectAtomsOfMolecule(molecule*);
+  void selectAtomsOfMolecule(moleculeId_t);
+
+  void clearMoleculeSelection();
+  void selectMolecule(molecule*);
+  void selectMolecule(moleculeId_t);
+  void selectAllMoleculess(MoleculeDescriptor);
+  void selectMoleculeOfAtom(atom*);
+  void selectMoleculeOfAtom(atomId_t);
 
 protected:
@@ -311,4 +331,5 @@
 
   AtomSet atoms;
+  AtomSet selectedAtoms;
   typedef std::set<std::pair<atomId_t, atomId_t> > atomIdPool_t;
   /**
@@ -323,4 +344,5 @@
 
   MoleculeSet molecules;
+  MoleculeSet selectedMolecules;
   typedef std::set<std::pair<moleculeId_t, moleculeId_t> > moleculeIdPool_t;
   /**
