Index: src/Actions/PotentialAction/FitPotentialAction.cpp
===================================================================
--- src/Actions/PotentialAction/FitPotentialAction.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Actions/PotentialAction/FitPotentialAction.cpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -58,5 +58,4 @@
 #include "Potentials/PotentialFactory.hpp"
 #include "Potentials/PotentialRegistry.hpp"
-#include "Potentials/PotentialSerializer.hpp"
 #include "Potentials/PotentialTrainer.hpp"
 #include "Potentials/SerializablePotential.hpp"
Index: src/Actions/PotentialAction/ParsePotentialsAction.cpp
===================================================================
--- src/Actions/PotentialAction/ParsePotentialsAction.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Actions/PotentialAction/ParsePotentialsAction.cpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -47,6 +47,9 @@
 #include "CodePatterns/Log.hpp"
 
+#include "Potentials/EmpiricalPotential.hpp"
 #include "Potentials/Exceptions.hpp"
-#include "Potentials/PotentialDeserializer.hpp"
+#include "Potentials/PotentialFactory.hpp"
+#include "Potentials/PotentialRegistry.hpp"
+#include "Potentials/RegistryDeserializer.hpp"
 
 using namespace MoleCuilder;
@@ -63,5 +66,9 @@
     if (returnstream.good()) {
       try {
-        PotentialDeserializer deserialize(returnstream);
+        RegistryDeserializer<EmpiricalPotential> deserialize(
+            returnstream,
+            PotentialFactory::getInstance(),
+            PotentialRegistry::getInstance(),
+            std::string("potential"));
         deserialize();
       } catch (SerializerMissingValueException &e) {
Index: src/Actions/PotentialAction/SavePotentialsAction.cpp
===================================================================
--- src/Actions/PotentialAction/SavePotentialsAction.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Actions/PotentialAction/SavePotentialsAction.cpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -47,6 +47,8 @@
 #include "CodePatterns/Log.hpp"
 
+#include "Potentials/EmpiricalPotential.hpp"
 #include "Potentials/Exceptions.hpp"
-#include "Potentials/PotentialSerializer.hpp"
+#include "Potentials/RegistrySerializer.hpp"
+#include "Potentials/PotentialRegistry.hpp"
 
 using namespace MoleCuilder;
@@ -63,5 +65,8 @@
     // print fitted potentials
     std::stringstream potentials;
-    PotentialSerializer serialize(potentials);
+    RegistrySerializer<EmpiricalPotential> serialize(
+        potentials,
+        PotentialRegistry::getInstance(),
+        std::string("potential"));
     serialize();
     LOG(1, "STATUS: Resulting parameters are " << std::endl << potentials.str());
Index: src/Potentials/Makefile.am
===================================================================
--- src/Potentials/Makefile.am	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Potentials/Makefile.am	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -15,9 +15,7 @@
   Potentials/Particles/ParticleFactory.cpp \
   Potentials/Particles/ParticleRegistry.cpp \
-  Potentials/PotentialDeserializer.cpp \
   Potentials/Particles/StreamFactory_Particle.cpp \
   Potentials/PotentialFactory.cpp \
   Potentials/PotentialRegistry.cpp \
-  Potentials/PotentialSerializer.cpp \
   Potentials/SerializablePotential.cpp \
   Potentials/Specifics/ConstantPotential.cpp \
@@ -50,8 +48,10 @@
   Potentials/Particles/ParticleRegistry.hpp \
   Potentials/Particles/StreamFactory_Particle.hpp \
-  Potentials/PotentialDeserializer.hpp \
+  Potentials/RegistryDeserializer_impl.hpp \
+  Potentials/RegistryDeserializer.hpp \
   Potentials/PotentialFactory.hpp \
   Potentials/PotentialRegistry.hpp \
-  Potentials/PotentialSerializer.hpp \
+  Potentials/RegistrySerializer_impl.hpp \
+  Potentials/RegistrySerializer.hpp \
   Potentials/SerializablePotential.hpp \
   Potentials/Specifics/PotentialTypes.hpp \
Index: src/Potentials/PotentialDeserializer.cpp
===================================================================
--- src/Potentials/PotentialDeserializer.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ 	(revision )
@@ -1,74 +1,0 @@
-/*
- * Project: MoleCuilder
- * Description: creates and alters molecular systems
- * Copyright (C)  2013 Frederik Heber. All rights reserved.
- * Please see the COPYING file or "Copyright notice" in builder.cpp for details.
- *
- *
- *   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/>.
- */
-
-/*
- * PotentialDeserializer.cpp
- *
- *  Created on: 09.05.2013
- *      Author: heber
- */
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "CodePatterns/MemDebug.hpp"
-
-#include "PotentialDeserializer.hpp"
-
-#include <iostream>
-#include <sstream>
-#include <string>
-
-#include "CodePatterns/Log.hpp"
-
-#include "Potentials/PotentialFactory.hpp"
-#include "Potentials/PotentialRegistry.hpp"
-
-void PotentialDeserializer::operator()()
-{
-  std::string linestring;
-  while (serialized.good()) {
-    getline(serialized, linestring);
-    const std::string whitespace(" \t");
-    const size_t strBegin = linestring.find_first_not_of(whitespace);
-    const size_t colonpos = linestring.find(":");
-    if ((strBegin != std::string::npos) && (colonpos != std::string::npos)) {
-      // get potential's token
-      const std::string token = linestring.substr(strBegin, colonpos);
-      std::stringstream potentialstream(linestring);
-
-      // instantiate type
-      EmpiricalPotential *potential =
-          static_cast<StreamFactory<EmpiricalPotential>&>(PotentialFactory::getInstance()).
-              createInstance(token, potentialstream);
-
-      // and register
-      PotentialRegistry::getInstance().registerInstance(potential);
-
-    } else {
-      ELOG(2, "Line '" << linestring << "' contains no potential.");
-    }
-  }
-}
Index: src/Potentials/PotentialDeserializer.hpp
===================================================================
--- src/Potentials/PotentialDeserializer.hpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ 	(revision )
@@ -1,43 +1,0 @@
-/*
- * PotentialDeserializer.hpp
- *
- *  Created on: 09.05.2013
- *      Author: heber
- */
-
-#ifndef POTENTIALDESERIALIZER_HPP_
-#define POTENTIALDESERIALIZER_HPP_
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <iosfwd>
-
-class PotentialDeserializer
-{
-public:
-  /** Constructor for class PotentialDeserializer.
-   *
-   */
-  PotentialDeserializer(std::istream &_serialized) :
-    serialized(_serialized)
-  {}
-
-  /** Destructor for class PotentialDeserializer.
-   *
-   */
-  ~PotentialDeserializer()
-  {}
-
-  /** Parses the internally stored input stream for potentials.
-   *
-   */
-  void operator()();
-
-private:
-  std::istream &serialized;
-};
-
-#endif /* POTENTIALDESERIALIZER_HPP_ */
Index: src/Potentials/PotentialSerializer.cpp
===================================================================
--- src/Potentials/PotentialSerializer.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ 	(revision )
@@ -1,59 +1,0 @@
-/*
- * Project: MoleCuilder
- * Description: creates and alters molecular systems
- * Copyright (C)  2013 Frederik Heber. All rights reserved.
- * Please see the COPYING file or "Copyright notice" in builder.cpp for details.
- *
- *
- *   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/>.
- */
-
-/*
- * PotentialSerializer.cpp
- *
- *  Created on: 09.05.2013
- *      Author: heber
- */
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "CodePatterns/MemDebug.hpp"
-
-#include "PotentialSerializer.hpp"
-
-#include <iostream>
-
-#include "CodePatterns/Log.hpp"
-
-#include "Potentials/PotentialRegistry.hpp"
-#include "Potentials/SerializablePotential.hpp"
-
-
-void PotentialSerializer::operator()()
-{
-  PotentialRegistry &instance = PotentialRegistry::getInstance();
-  for (PotentialRegistry::const_iterator iter = instance.getBeginIter();
-      iter != instance.getEndIter(); ++iter)
-  {
-    const SerializablePotential * const potential = iter->second;
-    LOG(1, "INFO: Now serializing potential " << potential->getToken() << ".");
-    potential->stream_to(to_serialize);
-    to_serialize << std::endl;
-  }
-}
Index: src/Potentials/PotentialSerializer.hpp
===================================================================
--- src/Potentials/PotentialSerializer.hpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ 	(revision )
@@ -1,44 +1,0 @@
-/*
- * PotentialSerializer.hpp
- *
- *  Created on: 09.05.2013
- *      Author: heber
- */
-
-#ifndef POTENTIALSERIALIZER_HPP_
-#define POTENTIALSERIALIZER_HPP_
-
-// include config.h
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <iosfwd>
-
-class PotentialSerializer
-{
-public:
-  /** Constructor for class PotentialSerializer.
-   *
-   */
-  PotentialSerializer(std::ostream &_to_serialize) :
-    to_serialize(_to_serialize)
-  {}
-
-  /** Destructor for class PotentialSerializer.
-   *
-   */
-  ~PotentialSerializer()
-  {}
-
-  /** Function to stream all potentials present in PotentialRegistry to
-   * internally stored stream.
-   *
-   */
-  void operator()();
-
-private:
-  std::ostream &to_serialize;
-};
-
-#endif /* POTENTIALSERIALIZER_HPP_ */
Index: src/Potentials/PotentialTrainer.cpp
===================================================================
--- src/Potentials/PotentialTrainer.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Potentials/PotentialTrainer.cpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -58,5 +58,5 @@
 #include "FunctionApproximation/writeDistanceEnergyTable.hpp"
 #include "Potentials/CompoundPotential.hpp"
-#include "Potentials/PotentialSerializer.hpp"
+#include "Potentials/RegistrySerializer.hpp"
 #include "Potentials/SerializablePotential.hpp"
 
Index: src/Potentials/RegistryDeserializer.hpp
===================================================================
--- src/Potentials/RegistryDeserializer.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
+++ src/Potentials/RegistryDeserializer.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -0,0 +1,64 @@
+/*
+ * RegistryDeserializer.hpp
+ *
+ *  Created on: 09.05.2013
+ *      Author: heber
+ */
+
+#ifndef REGISTRYDESERIALIZER_HPP_
+#define REGISTRYDESERIALIZER_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iosfwd>
+#include <string>
+
+#include "CodePatterns/Registry.hpp"
+
+#include "Potentials/StreamFactory.hpp"
+
+template <class T>
+class RegistryDeserializer
+{
+public:
+  /** Constructor for class RegistryDeserializer.
+   *
+   * \param _serialized stream to deseralize from
+   * \param _factory factory class to create instances from stream
+   * \param _registry registry class to register created instances
+   */
+  RegistryDeserializer(
+      std::istream &_serialized,
+      StreamFactory<T> &_factory,
+      Registry<T> &_registry,
+      const std::string _name = std::string("item")) :
+    serialized(_serialized),
+    factory(_factory),
+    registry(_registry),
+    name(_name)
+  {}
+
+  /** Destructor for class RegistryDeserializer.
+   *
+   */
+  ~RegistryDeserializer()
+  {}
+
+  /** Parses the internally stored input stream for potentials.
+   *
+   */
+  void operator()();
+
+private:
+  std::istream &serialized;
+  StreamFactory<T> &factory;
+  Registry<T> &registry;
+  const std::string name;
+};
+
+#include "RegistryDeserializer_impl.hpp"
+
+#endif /* REGISTRYDESERIALIZER_HPP_ */
Index: src/Potentials/RegistryDeserializer_impl.hpp
===================================================================
--- src/Potentials/RegistryDeserializer_impl.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
+++ src/Potentials/RegistryDeserializer_impl.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -0,0 +1,54 @@
+/*
+ * RegistrySerializer_impl.hpp
+ *
+ *  Created on: Feb 27, 2016
+ *      Author: heber
+ */
+
+#ifndef REGISTRYDESERIALIZER_IMPL_HPP_
+#define REGISTRYDESERIALIZER_IMPL_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "RegistryDeserializer.hpp"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include "CodePatterns/Log.hpp"
+
+template <class T>
+void RegistryDeserializer<T>::operator()()
+{
+  std::string linestring;
+  while (serialized.good()) {
+    getline(serialized, linestring);
+    const std::string whitespace(" \t");
+    const size_t strBegin = linestring.find_first_not_of(whitespace);
+    const size_t colonpos = linestring.find(":");
+    if ((strBegin != std::string::npos) && (colonpos != std::string::npos)) {
+      // get potential's token
+      const std::string token = linestring.substr(strBegin, colonpos);
+      std::stringstream itemstream(linestring);
+
+      // instantiate type
+      T * const item = factory.createInstance(
+              token, itemstream);
+
+      // and register
+      registry.registerInstance(item);
+
+    } else {
+      ELOG(2, "Line '" << linestring << "' contains no " << name << ".");
+    }
+  }
+}
+
+
+#endif /* REGISTRYDESERIALIZER_IMPL_HPP_ */
Index: src/Potentials/RegistrySerializer.hpp
===================================================================
--- src/Potentials/RegistrySerializer.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
+++ src/Potentials/RegistrySerializer.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -0,0 +1,62 @@
+/*
+ * RegistrySerializer.hpp
+ *
+ *  Created on: 09.05.2013
+ *      Author: heber
+ */
+
+#ifndef REGISTRYSERIALIZER_HPP_
+#define REGISTRYSERIALIZER_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <iosfwd>
+
+#include "CodePatterns/Registry.hpp"
+
+/** This template class can serialize items contained in a general Registry
+ * that contain function stream_to().
+ */
+template <class T>
+class RegistrySerializer
+{
+public:
+  /** Constructor for class RegistrySerializer.
+   *
+   * \param _to_serialize stream to serialize to
+   * \param _instance registry instance to serialize
+   * \param _name optional name for debugging
+   */
+  RegistrySerializer(
+      std::ostream &_to_serialize,
+      Registry<T> &_instance,
+      const std::string _name = "item") :
+    to_serialize(_to_serialize),
+    instance(_instance),
+    name(_name)
+  {}
+
+  /** Destructor for class RegistrySerializer.
+   *
+   */
+  ~RegistrySerializer()
+  {}
+
+  /** Function to stream all potentials present in PotentialRegistry to
+   * internally stored stream.
+   *
+   */
+  void operator()();
+
+private:
+  std::ostream &to_serialize;
+  const Registry<T> &instance;
+  const std::string name;
+};
+
+#include "RegistrySerializer_impl.hpp"
+
+#endif /* REGISTRYSERIALIZER_HPP_ */
Index: src/Potentials/RegistrySerializer_impl.hpp
===================================================================
--- src/Potentials/RegistrySerializer_impl.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
+++ src/Potentials/RegistrySerializer_impl.hpp	(revision fde8e77718575586ac9f71498a3f445dcb905bb4)
@@ -0,0 +1,37 @@
+/*
+ * RegistrySerializer_impl.hpp
+ *
+ *  Created on: Feb 27, 2016
+ *      Author: heber
+ */
+
+#ifndef REGISTRYSERIALIZER_IMPL_HPP_
+#define REGISTRYSERIALIZER_IMPL_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "RegistrySerializer.hpp"
+
+#include <iostream>
+
+#include "CodePatterns/Log.hpp"
+
+template <class T>
+void RegistrySerializer<T>::operator()()
+{
+  for (typename Registry<T>::const_iterator iter = instance.getBeginIter();
+      iter != instance.getEndIter(); ++iter)
+  {
+    const T * const item = iter->second;
+    LOG(1, "INFO: Now serializing " << name << ".");
+    item->stream_to(to_serialize);
+    to_serialize << std::endl;
+  }
+}
+
+#endif /* REGISTRYSERIALIZER_IMPL_HPP_ */
