Index: src/Potentials/EmpiricalPotential.hpp
===================================================================
--- src/Potentials/EmpiricalPotential.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/EmpiricalPotential.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -66,4 +66,12 @@
    */
   virtual derivative_components_t derivative(const arguments_t &arguments) const=0;
+
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  virtual const std::string getName() const=0;
 };
 
Index: src/Potentials/Makefile.am
===================================================================
--- src/Potentials/Makefile.am	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Makefile.am	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -4,4 +4,5 @@
 POTENTIALSSOURCE = \
   Potentials/Specifics/ManyBodyPotential_Tersoff.cpp \
+  Potentials/PotentialRegistry.cpp \
   Potentials/Specifics/PairPotential_Angle.cpp \
   Potentials/Specifics/PairPotential_Harmonic.cpp \
@@ -12,4 +13,5 @@
   Potentials/EmpiricalPotential.hpp \
   Potentials/helpers.hpp \
+  Potentials/PotentialRegistry.hpp \
   Potentials/Specifics/ManyBodyPotential_Tersoff.hpp \
   Potentials/Specifics/PairPotential_Angle.hpp \
Index: src/Potentials/PotentialRegistry.cpp
===================================================================
--- src/Potentials/PotentialRegistry.cpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
+++ src/Potentials/PotentialRegistry.cpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -0,0 +1,42 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
+ * 
+ *
+ *   This file is part of MoleCuilder.
+ *
+ *    MoleCuilder is free software: you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation, either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    MoleCuilder is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * PotentialRegistry.cpp
+ *
+ *  Created on: Nov 23, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "Potentials/PotentialRegistry.hpp"
+#include "CodePatterns/Singleton_impl.hpp"
+#include "CodePatterns/Registry_impl.hpp"
+
+CONSTRUCT_SINGLETON(PotentialRegistry)
+CONSTRUCT_REGISTRY(EmpiricalPotential)
Index: src/Potentials/PotentialRegistry.hpp
===================================================================
--- src/Potentials/PotentialRegistry.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
+++ src/Potentials/PotentialRegistry.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -0,0 +1,43 @@
+/*
+ * PotentialRegistry.hpp
+ *
+ *  Created on: Nov 23, 2012
+ *      Author: heber
+ */
+
+#ifndef POTENTIALREGISTRY_HPP_
+#define POTENTIALREGISTRY_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/Registry.hpp"
+#include "CodePatterns/Singleton.hpp"
+#include "Potentials/EmpiricalPotential.hpp"
+
+/** Potential Registry.
+ *
+ * The Potential registry is a storage for any EmpiricalPotential instance to
+ * be retrieved by name. It is a singleton and can be called from anywhere.
+ *
+ * This class is meant for convenience when loading and saving potential files.
+ * By the keyword given in the potential file we may look up whether the
+ * potential exists and modify it or create a new one accordingly. When saving
+ * the present potentials to a file, we just have to iterate over all present
+ * ones.
+ */
+class PotentialRegistry : public Singleton<PotentialRegistry>, public Registry<EmpiricalPotential>
+{
+  friend class Singleton<PotentialRegistry>;
+  //friend class Registry<EmpiricalPotential>;
+
+public:
+
+private:
+  PotentialRegistry() {}
+  ~PotentialRegistry() {}
+};
+
+#endif /* POTENTIALREGISTRY_HPP_ */
Index: src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp
===================================================================
--- src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Specifics/ManyBodyPotential_Tersoff.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -119,4 +119,14 @@
    */
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
+
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  const std::string getName() const {
+    return std::string("tersoff");
+  }
 
   /** States whether lower and upper boundaries should be used to constraint
Index: src/Potentials/Specifics/PairPotential_Angle.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Angle.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Specifics/PairPotential_Angle.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -93,4 +93,14 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  const std::string getName() const {
+    return std::string("harmonic_angle");
+  }
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
Index: src/Potentials/Specifics/PairPotential_Harmonic.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Specifics/PairPotential_Harmonic.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -93,4 +93,14 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  const std::string getName() const {
+    return std::string("harmonic_bond");
+  }
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
Index: src/Potentials/Specifics/PairPotential_Morse.hpp
===================================================================
--- src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Specifics/PairPotential_Morse.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -94,4 +94,14 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  const std::string getName() const {
+    return std::string("morse");
+  }
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
Index: src/Potentials/Specifics/SaturationPotential.hpp
===================================================================
--- src/Potentials/Specifics/SaturationPotential.hpp	(revision 201199631aff578d9699e96596d4e77f56009266)
+++ src/Potentials/Specifics/SaturationPotential.hpp	(revision 67cd3abba5d9690e39969a20e1e96f938cfc6574)
@@ -96,4 +96,14 @@
   results_t parameter_derivative(const arguments_t &arguments, const size_t index) const;
 
+  /** Return the name of this specific potential.
+   *
+   * This is required for storage in a Registry.
+   *
+   * \return name of the potential
+   */
+  const std::string getName() const {
+    return std::string("saturation");
+  }
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
