Index: src/Potentials/SerializablePotential.cpp
===================================================================
--- src/Potentials/SerializablePotential.cpp	(revision dbcc47a93c50f23857b217d00154054ae9fa7a31)
+++ src/Potentials/SerializablePotential.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
@@ -51,4 +51,10 @@
 std::ostream& operator<<(std::ostream &ost, const SerializablePotential &potential)
 {
+  potential.stream_to(ost);
+  return ost;
+}
+
+void SerializablePotential::stream_to(std::ostream &ost) const
+{
   // check stream
   if (ost.bad())
@@ -56,7 +62,7 @@
 
   /// print parameter key
-  ost << potential.getToken() << ":";
+  ost << getToken() << ":";
   /// print associated particles
-  const SerializablePotential::ParticleTypes_t &types = potential.getParticleTypes();
+  const SerializablePotential::ParticleTypes_t &types = getParticleTypes();
   for (size_t index=0; index < types.size(); ++index) {
     ost << "\tparticle_type" << index+1 << "=" << types[index];
@@ -64,6 +70,6 @@
   }
   /// print coefficients
-  const SerializablePotential::ParameterNames_t &paramNames = potential.getParameterNames();
-  const SerializablePotential::parameters_t &params = potential.getParameters();
+  const SerializablePotential::ParameterNames_t &paramNames = getParameterNames();
+  const SerializablePotential::parameters_t &params = getParameters();
   SerializablePotential::ParameterNames_t::const_iterator nameiter = paramNames.begin();
   SerializablePotential::parameters_t::const_iterator valueiter = params.begin();
@@ -76,8 +82,13 @@
   /// print terminating semi-colon
   ost << ";";
-  return ost;
 }
 
 std::istream& operator>>(std::istream &ist, SerializablePotential &potential)
+{
+  potential.stream_from(ist);
+  return ist;
+}
+
+void SerializablePotential::stream_from(std::istream &ist)
 {
   // check stream
@@ -86,5 +97,5 @@
 
   // create copy of current parameters, hence line may contain not all required
-  SerializablePotential::parameters_t params(potential.getParameters());
+  SerializablePotential::parameters_t params(getParameters());
 
   // read in full line
@@ -95,7 +106,7 @@
   const size_t colonpos = linestring.find(":");
   if ((strBegin == std::string::npos) || (colonpos == std::string::npos) ||
-      (linestring.substr(strBegin, colonpos-1) != potential.getToken()))
+      (linestring.substr(strBegin, colonpos-1) != getToken()))
     throw SerializablePotentialMissingValueException()
-        << SerializablePotentialKey(potential.getName());
+        << SerializablePotentialKey(getName());
 
   // tokenize by ","
@@ -130,7 +141,7 @@
         throw SerializablePotentialMissingValueException() << SerializablePotentialKey(key);
       const std::string &value = *keyvalue_iter;
-      potential.setParticleType(index, ConvertToParticleType(value));
+      setParticleType(index, ConvertToParticleType(value));
     } else {
-      const size_t index = potential.getParameterIndex(key);
+      const size_t index = getParameterIndex(key);
       // parse the coefficients
       if (index != (size_t)-1) {
@@ -146,6 +157,5 @@
 
   /// set the new paremeters
-  potential.setParameters(params);
-  return ist;
+  setParameters(params);
 }
 
Index: src/Potentials/SerializablePotential.hpp
===================================================================
--- src/Potentials/SerializablePotential.hpp	(revision dbcc47a93c50f23857b217d00154054ae9fa7a31)
+++ src/Potentials/SerializablePotential.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
@@ -37,9 +37,4 @@
 class SerializablePotential
 {
-  //!> grant operator access to private functions
-  friend std::ostream& operator<<(std::ostream &ost, const SerializablePotential &potential);
-  //!> grant operator access to private functions
-  friend std::istream& operator>>(std::istream &ost, SerializablePotential &potential);
-
 public:
   //!> typedef for particle designation
@@ -113,4 +108,22 @@
   const size_t getParameterIndex(const std::string &_name) const;
 
+  /** Print parameters to given stream \a ost.
+   *
+   * These are virtual functions to allow for overriding and hence
+   * changing the default behavior.
+   *
+   * @param ost stream to print to
+   */
+  virtual void stream_to(std::ostream &ost) const;
+
+  /** Parse parameters from given stream \a ist.
+   *
+   * These are virtual functions to allow for overriding and hence
+   * changing the default behavior.
+   *
+   * @param ist stream to parse from
+   */
+  virtual void stream_from(std::istream &ist);
+
 protected:
 
Index: src/Potentials/Specifics/SaturationPotential.cpp
===================================================================
--- src/Potentials/Specifics/SaturationPotential.cpp	(revision dbcc47a93c50f23857b217d00154054ae9fa7a31)
+++ src/Potentials/Specifics/SaturationPotential.cpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
@@ -174,4 +174,18 @@
   params[angle_equilibrium_distance] = angle_params[PairPotential_Angle::equilibrium_distance];
   return params;
+}
+
+void SaturationPotential::stream_to(std::ostream &ost) const
+{
+  morse.stream_to(ost);
+  ost << std::endl;
+  angle.stream_to(ost);
+}
+
+void SaturationPotential::stream_from(std::istream &ist)
+{
+  morse.stream_from(ist);
+  ist >> ws;
+  angle.stream_from(ist);
 }
 
@@ -379,18 +393,4 @@
       "SaturationPotential::symmetrizeTypes() - failed to generate three types for angle.");
   return types;
-}
-
-std::ostream& operator<<(std::ostream &ost, const SaturationPotential &potential)
-{
-  ost << potential.morse;
-  ost << potential.angle;
-  return ost;
-}
-
-std::istream& operator>>(std::istream &ist, SaturationPotential &potential)
-{
-  ist >> potential.morse;
-  ist >> potential.angle;
-  return ist;
 }
 
Index: src/Potentials/Specifics/SaturationPotential.hpp
===================================================================
--- src/Potentials/Specifics/SaturationPotential.hpp	(revision dbcc47a93c50f23857b217d00154054ae9fa7a31)
+++ src/Potentials/Specifics/SaturationPotential.hpp	(revision 3d255915b7f2233d996e6bf9358789e4d408da65)
@@ -128,4 +128,22 @@
   { return ParameterNames; }
 
+  /** Print parameters for both Morse and Angle potential.
+   *
+   * We override default parameter printing of SeralizablePotential
+   * to print both parameters
+   *
+   * @param ost stream to print to
+   */
+  virtual void stream_to(std::ostream &ost) const;
+
+  /** Parse parameters for both Morse and Angle potential.
+   *
+   * We override default parameter parsing of SeralizablePotential
+   * to parse both parameters
+   *
+   * @param ist stream to parse from
+   */
+  virtual void stream_from(std::istream &ist);
+
   /** States whether lower and upper boundaries should be used to constraint
    * the parameter search for this function model.
@@ -198,27 +216,4 @@
 };
 
-/** Output operations stores .potentials line containing these parameters
- * coefficients and designations.
- *
- * \note We have to overrride this function in order to print both potentials
- * separately.
- *
- * \param ost output stream to print to
- * \param potential potential whose coefficients to print
- * \return output stream for concatenation
- */
-std::ostream& operator<<(std::ostream &ost, const SaturationPotential &potential);
-
-/** Input operation parses coefficients from a given line of a .potentials
- * file.
- *
- * \note We have to override this function in order to parse both potentials
- * separately.
- *
- * \param ist input stream to parse from
- * \param potential potential to set
- * \return input stream for concatenation
- */
-std::istream& operator>>(std::istream &ist, SaturationPotential &potential);
 
 #endif /* SATURATIONPOTENTIAL_HPP_ */
