Index: src/Descriptors/AtomOfMoleculeSelectionDescriptor.cpp
===================================================================
--- src/Descriptors/AtomOfMoleculeSelectionDescriptor.cpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/AtomOfMoleculeSelectionDescriptor.cpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -37,7 +37,7 @@
 
 atom* AtomOfMoleculeSelectionDescriptor_impl::find(){
-  World &instance = World::getInstance();
-  for (World::MoleculeSelectionIterator iter = instance.beginMoleculeSelection();
-      iter != instance.endMoleculeSelection();
+  World::MoleculeSet &set = getSelectedMolecules();
+  for (World::MoleculeSet::internal_iterator iter = set.begin_internal();
+      iter != set.end_internal();
       ++iter) {
     if (iter->second->begin() != iter->second->end())
@@ -49,7 +49,7 @@
 std::vector<atom*> AtomOfMoleculeSelectionDescriptor_impl::findAll(){
   std::vector<atom*> res;
-  World &instance = World::getInstance();
-  for (World::MoleculeSelectionIterator iter = instance.beginMoleculeSelection();
-      iter != instance.endMoleculeSelection();
+  World::MoleculeSet &set = getSelectedMolecules();
+  for (World::MoleculeSet::internal_iterator iter = set.begin_internal();
+      iter != set.end_internal();
       ++iter) {
     std::copy(iter->second->begin(), iter->second->end(), res.begin());
@@ -58,4 +58,8 @@
 }
 
+World::MoleculeSet& AtomOfMoleculeSelectionDescriptor_impl::getSelectedMolecules(){
+  return World::getInstance().selectedMolecules;
+}
+
 AtomDescriptor AtomsByMoleculeSelection(){
   return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomOfMoleculeSelectionDescriptor_impl()));
Index: src/Descriptors/AtomOfMoleculeSelectionDescriptor_impl.hpp
===================================================================
--- src/Descriptors/AtomOfMoleculeSelectionDescriptor_impl.hpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/AtomOfMoleculeSelectionDescriptor_impl.hpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -26,4 +26,6 @@
   virtual atom* find();
   virtual std::vector<atom*> findAll();
+
+  World::MoleculeSet& getSelectedMolecules();
 };
 
Index: src/Descriptors/MoleculeNameDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeNameDescriptor.cpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeNameDescriptor.cpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -42,21 +42,2 @@
   return MoleculeDescriptor(MoleculeDescriptor::impl_ptr(new MoleculeNameDescriptor_impl(name)));
 }
-
-molecule *MoleculeNameDescriptor_impl::find(){
-  World::MoleculeSet &molecules = getMolecules();
-  World::MoleculeSet::iterator res = molecules.begin();
-  for (; res != molecules.end(); res++)
-    if (res->second->name == name)
-      break;
-  return (res!=molecules.end())?((*res).second):0;
-}
-
-vector<molecule*> MoleculeNameDescriptor_impl::findAll(){
-  vector<molecule *> foundMolecules;
-  World::MoleculeSet &molecules = getMolecules();
-  World::MoleculeSet::iterator res = molecules.begin();
-  for (; res != molecules.end(); res++)
-    if (res->second->name == name)
-      foundMolecules.push_back(res->second);
-  return foundMolecules;
-}
Index: src/Descriptors/MoleculeNameDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeNameDescriptor_impl.hpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeNameDescriptor_impl.hpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -18,7 +18,4 @@
   bool predicate(std::pair<moleculeId_t,molecule*> molecule);
 
-protected:
-  virtual molecule *find();
-  virtual std::vector<molecule*> findAll();
 private:
   std::string name;
Index: src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeOfAtomSelectionDescriptor.cpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -43,9 +43,9 @@
 
 molecule* MoleculeOfAtomSelectionDescriptor_impl::find(){
-  World &instance = World::getInstance();
-  for (World::AtomSelectionIterator iter = instance.beginAtomSelection();
-      iter != instance.endAtomSelection();
+  World::AtomSet &set = getSelectedAtoms();
+  for (World::AtomSet::internal_iterator iter = set.begin_internal();
+      iter != set.end_internal();
       ++iter) {
-    if (iter->second->getMolecule() != NULL)
+    if (iter->second->getMolecule())
       return iter->second->getMolecule();
   }
@@ -57,9 +57,9 @@
   std::set<molecule*> temp;
   std::pair< std::set<molecule*>::iterator, bool> inserter;
-  World &instance = World::getInstance();
-  for (World::AtomSelectionIterator iter = instance.beginAtomSelection();
-      iter != instance.endAtomSelection();
+  World::AtomSet &set = getSelectedAtoms();
+  for (World::AtomSet::internal_iterator iter = set.begin_internal();
+      iter != set.end_internal();
       ++iter) {
-    if (iter->second->getMolecule() != NULL) {
+    if (iter->second->getMolecule()) {
       inserter = temp.insert( iter->second->getMolecule() );
       if (inserter.second)
@@ -70,4 +70,8 @@
 }
 
+World::AtomSet& MoleculeOfAtomSelectionDescriptor_impl::getSelectedAtoms(){
+  return World::getInstance().selectedAtoms;
+}
+
 MoleculeDescriptor MoleculesByAtomSelection(){
   return MoleculeDescriptor(MoleculeDescriptor::impl_ptr(new MoleculeOfAtomSelectionDescriptor_impl()));
Index: src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -26,4 +26,6 @@
   virtual molecule* find();
   virtual std::vector<molecule*> findAll();
+
+  World::AtomSet& getSelectedAtoms();
 };
 
Index: src/Descriptors/MoleculeOrderDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculeOrderDescriptor.cpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeOrderDescriptor.cpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -45,5 +45,10 @@
 }
 
-molecule *MoleculeOrderDescriptor_impl::find(){
+World::MoleculeSet& MoleculeOrderDescriptor_impl::getMolecules()
+{
+  return World::getInstance().molecules;
+}
+
+molecule* MoleculeOrderDescriptor_impl::find() {
   World::MoleculeSet &molecules = getMolecules();
 
@@ -53,6 +58,6 @@
     return NULL;
   } else if (id > 0) {
-    World::MoleculeSet::const_iterator res = molecules.begin();
-    for (; res != molecules.end(); ++res) { // when iterator is normal, ++ goes forward!
+    World::MoleculeSet::internal_iterator res = molecules.begin_internal();
+    for (; res != molecules.end_internal(); ++res) { // when iterator is normal, ++ goes forward!
       ++i;
       if (id == i)
@@ -61,6 +66,6 @@
     mol = res->second;
   } else {
-    World::MoleculeSet::const_reverse_iterator res = molecules.rbegin();
-    for (; res != molecules.rend(); --res) {  // when iterator is reverse, ++ goes backward!
+    World::MoleculeSet::reverse_internal_iterator res = molecules.rbegin_internal();
+    for (; res != molecules.rend_internal(); --res) {  // when iterator is reverse, ++ goes backward!
       --i;
       if (id == i)
Index: src/Descriptors/MoleculeOrderDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculeOrderDescriptor_impl.hpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculeOrderDescriptor_impl.hpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -21,4 +21,7 @@
   virtual molecule *find();
   virtual std::vector<molecule*> findAll();
+
+  World::MoleculeSet& getMolecules();
+
 private:
   int id;
Index: src/Descriptors/MoleculePtrDescriptor.cpp
===================================================================
--- src/Descriptors/MoleculePtrDescriptor.cpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculePtrDescriptor.cpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -44,13 +44,2 @@
   return MoleculeDescriptor(MoleculeDescriptor::impl_ptr(new MoleculePtrDescriptor_impl(ptr)));
 }
-
-molecule *MoleculePtrDescriptor_impl::find(){
-  World::MoleculeSet &molecules = getMolecules();
-  World::MoleculeSet::iterator res = molecules.find(ptr->getId());
-  return (res!=molecules.end())?((*res).second):0;
-}
-
-vector<molecule*> MoleculePtrDescriptor_impl::findAll(){
-  molecule *res = find();
-  return (res)?(vector<molecule*>(1,res)):(vector<molecule*>());
-}
Index: src/Descriptors/MoleculePtrDescriptor_impl.hpp
===================================================================
--- src/Descriptors/MoleculePtrDescriptor_impl.hpp	(revision 0aa122d5f3137de21e283fdaa583b526d33a6540)
+++ src/Descriptors/MoleculePtrDescriptor_impl.hpp	(revision ea7a509ec47cbadf7eaf2c826d1b74447ab8b25d)
@@ -20,7 +20,4 @@
   bool predicate(std::pair<moleculeId_t,molecule*> molecule);
 
-protected:
-  virtual molecule *find();
-  virtual std::vector<molecule*> findAll();
 private:
   molecule * ptr;
