Index: src/Descriptors/AtomDescriptor.hpp
===================================================================
--- src/Descriptors/AtomDescriptor.hpp	(revision 7dad108da502aed41b703eec7a4b7305cc930a90)
+++ src/Descriptors/AtomDescriptor.hpp	(revision 865a945a9d2eacb1afa6069866839972485957de)
@@ -15,4 +15,5 @@
 #include "World.hpp"
 
+class World;
 class atom;
 
@@ -21,6 +22,8 @@
 
 class AtomDescriptor {
+  // close coupling to the world to allow access
   friend atom* World::getAtom(AtomDescriptor descriptor);
   friend std::vector<atom*> World::getAllAtoms(AtomDescriptor descriptor);
+  friend class World::AtomIterator;
 
   friend AtomDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs);
Index: src/Descriptors/AtomDescriptor_impl.hpp
===================================================================
--- src/Descriptors/AtomDescriptor_impl.hpp	(revision 7dad108da502aed41b703eec7a4b7305cc930a90)
+++ src/Descriptors/AtomDescriptor_impl.hpp	(revision 865a945a9d2eacb1afa6069866839972485957de)
@@ -1,4 +1,2 @@
-#include "Descriptors/AtomDescriptor.hpp"
-
 /************************ Declarations of implementation Objects ************************/
 
Index: src/Descriptors/AtomIdDescriptor_impl.hpp
===================================================================
--- src/Descriptors/AtomIdDescriptor_impl.hpp	(revision 7dad108da502aed41b703eec7a4b7305cc930a90)
+++ src/Descriptors/AtomIdDescriptor_impl.hpp	(revision 865a945a9d2eacb1afa6069866839972485957de)
@@ -1,3 +1,2 @@
-#include "Descriptors/AtomIdDescriptor.hpp"
 #include "Descriptors/AtomDescriptor_impl.hpp"
 
Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision 7dad108da502aed41b703eec7a4b7305cc930a90)
+++ src/World.cpp	(revision 865a945a9d2eacb1afa6069866839972485957de)
@@ -12,4 +12,5 @@
 #include "periodentafel.hpp"
 #include "Descriptors/AtomDescriptor.hpp"
+#include "Descriptors/AtomDescriptor_impl.hpp"
 
 using namespace std;
@@ -46,4 +47,43 @@
 }
 
+/******************************* Iterators ********************************/
+
+World::AtomIterator::AtomIterator(AtomDescriptor _descr, World* _world) :
+    descr(_descr.get_impl()),
+    world(_world)
+{
+  state = world->atoms.begin();
+  advanceState();
+}
+
+World::AtomIterator::AtomIterator(const AtomIterator& rhs) :
+    state(rhs.state),
+    descr(rhs.descr)
+  {}
+
+World::AtomIterator& World::AtomIterator::operator++(){
+  advanceState();
+}
+
+bool World::AtomIterator::operator==(const AtomIterator& rhs){
+  return state==rhs.state;
+}
+
+bool World::AtomIterator::operator!=(const AtomIterator& rhs){
+  return state!=rhs.state;
+}
+
+atom* World::AtomIterator::operator*(){
+  return (*state).second;
+}
+
+void World::AtomIterator::advanceState(){
+  while(state!=world->atoms.end() && !descr->predicate(*state))
+    state++;
+}
+
+World::AtomIterator World::getAtomIter(AtomDescriptor descr){
+  return AtomIterator(descr,this);
+}
 
 /******************************* Singleton Stuff **************************/
Index: src/World.hpp
===================================================================
--- src/World.hpp	(revision 7dad108da502aed41b703eec7a4b7305cc930a90)
+++ src/World.hpp	(revision 865a945a9d2eacb1afa6069866839972485957de)
@@ -13,4 +13,5 @@
 #include <vector>
 #include <set>
+#include <boost/shared_ptr.hpp>
 
 #include "Patterns/Observer.hpp"
@@ -28,4 +29,7 @@
 {
 friend class AtomDescriptor_impl;
+friend class AtomDescriptor;
+
+typedef std::map<int,atom*> AtomList;
 public:
 
@@ -40,7 +44,27 @@
   /***** Methods to work with the World *****/
   molecule *createMolecule();
+
+protected:
+  /**** Iterators to use internal data structures */
+  class AtomIterator {
+  public:
+    AtomIterator(AtomDescriptor, World*);
+    AtomIterator(const AtomIterator&);
+    AtomIterator& operator++();
+    bool operator==(const AtomIterator&);
+    bool operator!=(const AtomIterator&);
+    atom* operator*();
+  protected:
+    void advanceState();
+    World* world;
+    AtomList::iterator state;
+    boost::shared_ptr<AtomDescriptor_impl>  descr;
+  };
+
+  AtomIterator getAtomIter(AtomDescriptor descr);
+
 private:
   periodentafel *periode;
-  std::map<int,atom*> atoms;
+  AtomList atoms;
   std::set<molecule*> molecules;
 
