Index: src/Potentials/Makefile.am
===================================================================
--- src/Potentials/Makefile.am	(revision 086e307a911bc23c417e17f2a429cb55a17d6b5e)
+++ src/Potentials/Makefile.am	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -29,5 +29,6 @@
   Potentials/Specifics/PairPotential_Morse.cpp \
   Potentials/Specifics/PotentialTypes.cpp \
-  Potentials/Specifics/ThreeBodyPotential_Angle.cpp
+  Potentials/Specifics/ThreeBodyPotential_Angle.cpp \
+  Potentials/StreamFactory_EmpiricalPotential.cpp
 
 POTENTIALSHEADER = \
@@ -57,5 +58,6 @@
   Potentials/Specifics/PotentialTypes.def \
   Potentials/Specifics/PotentialTypes.undef \
-  Potentials/StreamFactory.hpp
+  Potentials/StreamFactory.hpp \
+  Potentials/StreamFactory_EmpiricalPotential.hpp
 
 if CONDLEVMAR
Index: src/Potentials/PotentialDeserializer.cpp
===================================================================
--- src/Potentials/PotentialDeserializer.cpp	(revision 086e307a911bc23c417e17f2a429cb55a17d6b5e)
+++ src/Potentials/PotentialDeserializer.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -62,6 +62,6 @@
       // instantiate type
       EmpiricalPotential *potential =
-          PotentialFactory::getInstance().createInstance(
-              token, potentialstream);
+          static_cast<StreamFactory<EmpiricalPotential>&>(PotentialFactory::getInstance()).
+              createInstance(token, potentialstream);
 
       // and register
Index: src/Potentials/PotentialFactory.cpp
===================================================================
--- src/Potentials/PotentialFactory.cpp	(revision 086e307a911bc23c417e17f2a429cb55a17d6b5e)
+++ src/Potentials/PotentialFactory.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -96,11 +96,23 @@
 #include "Potentials/Specifics/PotentialTypes.undef"
 
+enum PotentialTypes PotentialFactory::getTypeForName(const std::string &_name)
+{
+  ASSERT (NameToType.count(_name),
+      "PotentialFactory::getTypeForName() - cannot find potential of name "+_name);
+  return NameToType[_name];
+}
+
+const std::string & PotentialFactory::getNameForType(enum PotentialTypes _type)
+{
+  ASSERT (TypeToName.count(_type),
+      "PotentialFactory::getNameForType() - cannot find potential of name "+_type);
+  return TypeToName[_type];
+}
+
 EmpiricalPotential *PotentialFactory::createInstance(
     const std::string &potentialtype,
     const SerializablePotential::ParticleTypes_t &types) const
 {
-  ASSERT (NameToType.count(potentialtype),
-      "PotentialFactory::createInstance() - cannot find potential of name "+potentialtype);
-  switch (NameToType[potentialtype]) {
+  switch (getTypeForName(potentialtype)) {
   case constant:
       return new ConstantPotential(types);
@@ -125,12 +137,8 @@
 }
 
-EmpiricalPotential *PotentialFactory::createInstance(
-    const std::string &potentialtype,
-    std::istream &serialized) const
+EmpiricalPotential* PotentialFactory::getDefaultPotential(const std::string &_name) const
 {
   EmpiricalPotential *potential = NULL;
-  ASSERT (NameToType.count(potentialtype),
-      "PotentialFactory::createInstance() - cannot find potential of name "+potentialtype);
-  switch (NameToType[potentialtype]) {
+  switch (getTypeForName(_name)) {
   case constant:
     potential = new ConstantPotential();
@@ -161,7 +169,4 @@
     break;
   }
-  // now stream in types and parameters
-  potential->stream_from(serialized);
-
   return potential;
 }
Index: src/Potentials/PotentialFactory.hpp
===================================================================
--- src/Potentials/PotentialFactory.hpp	(revision 086e307a911bc23c417e17f2a429cb55a17d6b5e)
+++ src/Potentials/PotentialFactory.hpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -21,4 +21,5 @@
 #include "Potentials/EmpiricalPotential.hpp"
 #include "Potentials/Specifics/PotentialTypes.hpp"
+#include "Potentials/StreamFactory_EmpiricalPotential.hpp"
 
 /** Class that creates instances of potentials.
@@ -27,10 +28,20 @@
  *
  */
-class PotentialFactory : public Singleton<PotentialFactory>
+class PotentialFactory :
+    public Singleton<PotentialFactory>,
+    public StreamFactory<EmpiricalPotential>
 {
   //!> make Singleton template friend
   friend class Singleton<PotentialFactory>;
 
+protected:
+
+  /** Returns a default potential to which only we have access.
+   *
+   */
+  EmpiricalPotential* getDefaultPotential(const std::string &_name) const;
+
 public:
+
   /** Creates an instance of the requested potential.
    *
@@ -41,13 +52,4 @@
       const std::string &potentialtype,
       const SerializablePotential::ParticleTypes_t &charges) const;
-
-  /** Creates an instance of the requested potential.
-   *
-   * \param potentialtype key of potential to create
-   * \param serialized stream to parser SerializablePotential from
-   */
-  EmpiricalPotential *createInstance(
-      const std::string &potentialtype,
-      std::istream &serialized) const;
 
   //!> typedef for map to lookup type for a given name
@@ -63,4 +65,8 @@
   static TypeToName_t TypeToName;
 
+  static enum PotentialTypes getTypeForName(const std::string &_name);
+
+  static const std::string & getNameForType(enum PotentialTypes _type);
+
 private:
   PotentialFactory() {}
Index: src/Potentials/StreamFactory_EmpiricalPotential.cpp
===================================================================
--- src/Potentials/StreamFactory_EmpiricalPotential.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Potentials/StreamFactory_EmpiricalPotential.cpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -0,0 +1,60 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2013 Frederik Heber. 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/>.
+ */
+
+/*
+ * StreamFactory_EmpiricalPotential.cpp
+ *
+ *  Created on: Feb 28, 2016
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
+
+#include "Potentials/Exceptions.hpp"
+#include "StreamFactory_EmpiricalPotential.hpp"
+
+StreamFactory<EmpiricalPotential>::~StreamFactory<EmpiricalPotential>()
+{}
+
+EmpiricalPotential *
+StreamFactory<EmpiricalPotential>::createInstance(
+    const std::string &potentialtype,
+    std::istream &serialized) const
+{
+  EmpiricalPotential * const potential = getDefaultPotential(potentialtype);
+  // now stream in types and parameters
+  try {
+    potential->stream_from(serialized);
+  } catch (SerializerMissingValueException &e) {
+    ELOG(1, "Missing value for potential in line " << e.what());
+  }
+
+  return potential;
+}
Index: src/Potentials/StreamFactory_EmpiricalPotential.hpp
===================================================================
--- src/Potentials/StreamFactory_EmpiricalPotential.hpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
+++ src/Potentials/StreamFactory_EmpiricalPotential.hpp	(revision f6abb1c455edcabd469fcb040d09509ec48a8138)
@@ -0,0 +1,52 @@
+/*
+ * StreamFactory_EmpiricalPotential.hpp
+ *
+ *  Created on: Feb 28, 2016
+ *      Author: heber
+ */
+
+
+#ifndef STREAMFACTORY_EMPIRICALPOTENTIAL_HPP_
+#define STREAMFACTORY_EMPIRICALPOTENTIAL_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "StreamFactory.hpp"
+
+#include "Potentials/EmpiricalPotential.hpp"
+
+/** This implements the StreamFactory (template) interface for EmpiricalPotentials.
+ *
+ * This has to be inherited by a higher class that may actually instantiate
+ * default constructed potentials, i.e. who is friend with EmpiricalPotential.
+ */
+template <>
+struct StreamFactory<EmpiricalPotential>
+{
+  /** Destructor of class StreamFactory<EmpiricalPotential>.
+   *
+   */
+  virtual ~StreamFactory<EmpiricalPotential>();
+
+  /** Creates an instance of the requested potential.
+   *
+   * \param potentialtype key of potential to create
+   * \param serialized stream to parser SerializablePotential from
+   */
+  EmpiricalPotential *createInstance(
+      const std::string &potentialtype,
+      std::istream &serialized) const;
+
+private:
+
+  /** Getter for a default constructed potential.
+   *
+   * This has to be implemented in inheriting factory class.
+   */
+  virtual EmpiricalPotential* getDefaultPotential(const std::string &_name) const=0;
+};
+
+#endif /* STREAMFACTORY_EMPIRICALPOTENTIAL_HPP_ */
