Index: src/Descriptors/AtomOfMoleculeDescriptor.cpp
===================================================================
--- src/Descriptors/AtomOfMoleculeDescriptor.cpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
+++ src/Descriptors/AtomOfMoleculeDescriptor.cpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -0,0 +1,50 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2011 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * AtomOfMoleculeDescriptor.cpp
+ *
+ *  Created on: Dec 19, 2011
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "AtomOfMoleculeDescriptor.hpp"
+#include "AtomOfMoleculeDescriptor_impl.hpp"
+
+#include "Atom/atom.hpp"
+#include "molecule.hpp"
+#include "CodePatterns/Observer/ObservedContainer_impl.hpp"
+
+using namespace std;
+
+
+AtomOfMoleculeDescriptor_impl::AtomOfMoleculeDescriptor_impl(moleculeId_t _id) :
+  id(_id)
+{}
+
+AtomOfMoleculeDescriptor_impl::~AtomOfMoleculeDescriptor_impl()
+{}
+
+bool AtomOfMoleculeDescriptor_impl::predicate(std::pair<atomId_t,atom*> atom)
+{
+  if (atom.second->getMolecule() == NULL)
+    return false;
+  else
+    return atom.second->getMolecule()->getId() == id;
+}
+
+AtomDescriptor AtomOfMolecule(moleculeId_t id)
+{
+  return AtomDescriptor(AtomDescriptor::impl_ptr(new AtomOfMoleculeDescriptor_impl(id)));
+}
Index: src/Descriptors/AtomOfMoleculeDescriptor.hpp
===================================================================
--- src/Descriptors/AtomOfMoleculeDescriptor.hpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
+++ src/Descriptors/AtomOfMoleculeDescriptor.hpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -0,0 +1,22 @@
+/*
+ * AtomOfMoleculeDescriptor.hpp
+ *
+ *  Created on: Dec 19, 2011
+ *      Author: heber
+ */
+
+#ifndef ATOMOFMOLECULEDESCRIPTOR_HPP_
+#define ATOMOFMOLECULEDESCRIPTOR_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "types.hpp"
+#include "Descriptors/AtomDescriptor.hpp"
+
+AtomDescriptor AtomOfMolecule(moleculeId_t id);
+
+#endif /* ATOMOFMOLECULEDESCRIPTOR_HPP_ */
Index: src/Descriptors/AtomOfMoleculeDescriptor_impl.hpp
===================================================================
--- src/Descriptors/AtomOfMoleculeDescriptor_impl.hpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
+++ src/Descriptors/AtomOfMoleculeDescriptor_impl.hpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -0,0 +1,24 @@
+#ifndef ATOMOFMOLECULEDESCRIPTOR_IMPL_HPP
+#define ATOMOFMOLECULEDESCRIPTOR_IMPL_HPP
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "Descriptors/AtomDescriptor_impl.hpp"
+
+class AtomOfMoleculeDescriptor_impl : public AtomDescriptor_impl
+{
+public:
+  AtomOfMoleculeDescriptor_impl(moleculeId_t _id);
+  virtual ~AtomOfMoleculeDescriptor_impl();
+
+  bool predicate(std::pair<atomId_t,atom*> atom);
+
+private:
+  moleculeId_t id;
+};
+
+#endif //ATOMOFMOLECULEDESCRIPTOR_IMPL_HPP
Index: src/Descriptors/unittests/AtomDescriptorUnitTest.cpp
===================================================================
--- src/Descriptors/unittests/AtomDescriptorUnitTest.cpp	(revision d7853188762dba95151f1e69c42148748e218394)
+++ src/Descriptors/unittests/AtomDescriptorUnitTest.cpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -27,7 +27,9 @@
 #include <Descriptors/AtomDescriptor.hpp>
 #include <Descriptors/AtomIdDescriptor.hpp>
+#include <Descriptors/AtomOfMoleculeDescriptor.hpp>
 
 #include "World.hpp"
 #include "Atom/atom.hpp"
+#include "molecule.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -118,4 +120,25 @@
   CPPUNIT_ASSERT(!testAtom);
 }
+void AtomDescriptorTest::AtomOfMoleculeTest(){
+  // test Atoms from boundaries and middle of the set
+  atom* testAtom;
+  testAtom = World::getInstance().getAtom(AtomById(atomIds[0]));
+  CPPUNIT_ASSERT(testAtom);
+  CPPUNIT_ASSERT_EQUAL( atomIds[0], testAtom->getId());
+
+  // create some molecule and associate atom to it
+  testAtom->setType(1);
+  molecule * newmol = World::getInstance().createMolecule();
+  newmol->AddAtom(testAtom);
+  CPPUNIT_ASSERT_EQUAL(newmol->getId(), testAtom->getMolecule()->getId());
+
+  // get atom by descriptor
+  World::AtomComposite atoms = World::getInstance().getAllAtoms(AtomOfMolecule(newmol->getId()));
+  CPPUNIT_ASSERT_EQUAL( (size_t)1, atoms.size() );
+  CPPUNIT_ASSERT_EQUAL( (*atoms.begin())->getId(), testAtom->getId() );
+
+  // remove molecule again
+  World::getInstance().destroyMolecule(newmol);
+}
 void AtomDescriptorTest::AtomCalcTest(){
   // test some elementary set operations
Index: src/Descriptors/unittests/AtomDescriptorUnitTest.hpp
===================================================================
--- src/Descriptors/unittests/AtomDescriptorUnitTest.hpp	(revision d7853188762dba95151f1e69c42148748e218394)
+++ src/Descriptors/unittests/AtomDescriptorUnitTest.hpp	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -29,4 +29,5 @@
   CPPUNIT_TEST ( AtomBaseSetsTest );
   CPPUNIT_TEST ( AtomIdTest );
+  CPPUNIT_TEST ( AtomOfMoleculeTest );
   CPPUNIT_TEST ( AtomCalcTest );
   CPPUNIT_TEST_SUITE_END();
@@ -37,4 +38,5 @@
 
   void AtomBaseSetsTest();
+  void AtomOfMoleculeTest();
   void AtomIdTest();
   void AtomCalcTest();
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision d7853188762dba95151f1e69c42148748e218394)
+++ src/Makefile.am	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -36,4 +36,5 @@
 	Descriptors/AtomDescriptor.cpp \
   Descriptors/AtomIdDescriptor.cpp \
+  Descriptors/AtomOfMoleculeDescriptor.cpp \
   Descriptors/AtomOfMoleculeSelectionDescriptor.cpp \
   Descriptors/AtomSelectionDescriptor.cpp \
@@ -53,4 +54,5 @@
 	Descriptors/AtomDescriptor.hpp \
   Descriptors/AtomIdDescriptor.hpp \
+  Descriptors/AtomOfMoleculeDescriptor.hpp \
   Descriptors/AtomOfMoleculeSelectionDescriptor.hpp \
   Descriptors/AtomSelectionDescriptor.hpp \
@@ -71,4 +73,5 @@
 	Descriptors/AtomDescriptor_impl.hpp \
   Descriptors/AtomIdDescriptor_impl.hpp \
+  Descriptors/AtomOfMoleculeDescriptor_impl.hpp \
   Descriptors/AtomOfMoleculeSelectionDescriptor_impl.hpp \
   Descriptors/AtomSelectionDescriptor_impl.hpp \
Index: src/documentation/constructs/descriptors.dox
===================================================================
--- src/documentation/constructs/descriptors.dox	(revision d7853188762dba95151f1e69c42148748e218394)
+++ src/documentation/constructs/descriptors.dox	(revision b49568059bb63eb10a31cce9ac87e75d9a32c8e6)
@@ -55,4 +55,5 @@
  *  - by id: AtomById()
  *  - of currently selected molecule(s): AtomsByMoleculeSelection()
+ *  - of molecule: AtomOfMolecule()
  *  - currently selected atoms: AtomsBySelection()
  *  - within a Shape: AtomByShape()
