Index: src/Element/periodentafel.cpp
===================================================================
--- src/Element/periodentafel.cpp	(revision 31bd9c87bb06e45f77fe0e6e5b0d8ca6a9751ae7)
+++ src/Element/periodentafel.cpp	(revision 37ef6d9c81dd05d5433115e175bac28b62275986)
@@ -45,4 +45,5 @@
 #include "elements_db.hpp"
 #include "Helpers/defs.hpp"
+#include "ion.hpp"
 #include "periodentafel.hpp"
 
@@ -120,4 +121,54 @@
   return res!=elements.end()?((*res).second):0;
 };
+
+/** Returns the desired ion to a specific element.
+ *
+ * If the respective element is not in the list, we return
+ * NULL.
+ * \return pointer to an element or NULL if not found
+ */
+const element * periodentafel::FindElement(atomicNumber_t Z, const int ionization)
+{
+  // if not ionization given, fall back to other function
+  if (ionization == 0) {
+    return FindElement(Z);
+  }
+  // element present?
+  const_iterator elementiter = elements.find(Z);
+  if (elementiter == elements.end())
+    return NULL;
+  const element & element_base = *(elementiter->second);
+	
+  // element has already got ions?
+  IonsPerElement::iterator setiter =
+      ions.find(Z);
+  if (setiter != ions.end()) {
+    // yes, found ion list
+    ionSet::const_iterator res = setiter->second.find(ionization);
+	
+	if (res != setiter->second.end()) {
+	  // ion present already
+	  element * const _ion = res->second;
+	  return _ion;
+	} else {
+	  // ion not present yet
+	  ion * const _ion = new ion(element_base, ionization);
+	  // insert ion
+	  setiter->second.insert( std::make_pair( ionization, _ion) );
+	  return _ion;
+	}
+  } else {
+    // no ions yet, create map
+    ion * const _ion = new ion(element_base, ionization);
+    std::pair<IonsPerElement::iterator,bool> inserter =
+        ions.insert( std::make_pair(Z, ionSet()) );
+    // insert ion
+    ASSERT( inserter.second,
+        "periodentafel::FindElement() - could not insert new ionSet to element.");
+    inserter.first->second.insert( std::make_pair( ionization, _ion) );
+    return _ion;
+  }
+  return NULL;
+}
 
 /** Finds an element by its atomic number.
Index: src/Element/periodentafel.hpp
===================================================================
--- src/Element/periodentafel.hpp	(revision 31bd9c87bb06e45f77fe0e6e5b0d8ca6a9751ae7)
+++ src/Element/periodentafel.hpp	(revision 37ef6d9c81dd05d5433115e175bac28b62275986)
@@ -22,4 +22,5 @@
 
 class element;
+class ion;
 
 /********************************************** declarations *******************************/
@@ -33,4 +34,6 @@
 private:
   typedef std::map<atomicNumber_t,element*> elementSet;
+  typedef std::map<int,ion*> ionSet;
+  typedef std::map<atomicNumber_t,ionSet> IonsPerElement;
 public:
   typedef elementSet::iterator iterator;
@@ -48,4 +51,5 @@
   void CleanupPeriodtable();
   const element * FindElement(atomicNumber_t) const;
+  const element * FindElement(atomicNumber_t, const int);
   const element * FindElement(const std::string &shorthand) const;
   const element * AskElement() const;
@@ -76,4 +80,5 @@
     ar & boost::serialization::make_array<char>(header2, MAXSTRINGSIZE);
     ar & elements;
+    ar & ions;
   }
 
@@ -93,4 +98,5 @@
 
   elementSet elements;
+  IonsPerElement ions;
 };
 
Index: src/Element/unittests/ElementUnitTest.cpp
===================================================================
--- src/Element/unittests/ElementUnitTest.cpp	(revision 31bd9c87bb06e45f77fe0e6e5b0d8ca6a9751ae7)
+++ src/Element/unittests/ElementUnitTest.cpp	(revision 37ef6d9c81dd05d5433115e175bac28b62275986)
@@ -105,4 +105,5 @@
   CPPUNIT_ASSERT_EQUAL( 0., testelement->getElectronegativity() );
   CPPUNIT_ASSERT_EQUAL( 0., testelement->getVanDerWaalsRadius() );
+  CPPUNIT_ASSERT_EQUAL( 0., testelement->getCharge() );
   CPPUNIT_ASSERT_EQUAL( 0., testelement->getValence() );
   CPPUNIT_ASSERT_EQUAL( 0, testelement->getNoValenceOrbitals() );
@@ -172,5 +173,5 @@
   boost::archive::text_iarchive ia(stream);
   // read class state from archive
-  element * newelement;
+  element * newelement = NULL;
 
   ia >> newelement;
Index: src/Element/unittests/PeriodentafelUnitTest.cpp
===================================================================
--- src/Element/unittests/PeriodentafelUnitTest.cpp	(revision 31bd9c87bb06e45f77fe0e6e5b0d8ca6a9751ae7)
+++ src/Element/unittests/PeriodentafelUnitTest.cpp	(revision 37ef6d9c81dd05d5433115e175bac28b62275986)
@@ -45,4 +45,5 @@
 
 #include "Element/element.hpp"
+#include "Element/ion.hpp"
 #include "Element/elements_db.hpp"
 #include "Element/periodentafel.hpp"
