Index: src/Thermostats/Berendsen.cpp
===================================================================
--- src/Thermostats/Berendsen.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Berendsen.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -12,7 +12,8 @@
 #include "Helpers/Log.hpp"
 #include "ThermoStatContainer.hpp"
+#include "World.hpp"
 
-Berendsen::Berendsen(double _ActualTemp) :
-  ActualTemp(_ActualTemp)
+Berendsen::Berendsen(double _TempFrequency) :
+  TempFrequency(_TempFrequency)
 {}
 
@@ -20,25 +21,30 @@
 {}
 
-double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+ThermostatTraits<class Berendsen>::ThermostatTraits() :
+  name("Berendsen")
+{}
+
+
+double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Berendsen::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Berendsen::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
 template <class ForwardIterator>
-double Berendsen::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
+double Berendsen::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
   DoLog(2) && (Log() << Verbose(2) <<  "Applying Berendsen-VanGunsteren thermostat..." << endl);
   double ekin;
-  double ScaleTempFactor = configuration.Thermostats->TargetTemp/ActualTemp;
+  double ScaleTempFactor = getContainer().TargetTemp/ActualTemp;
   for(ForwardIterator iter=begin;iter!=end;++iter){
     Vector &U = (*iter)->Trajectory.U.at(step);
     if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
-      U *= sqrt(1+(configuration.Deltat/configuration.Thermostats->TempFrequency)*(ScaleTempFactor-1));
+      U *= sqrt(1+(World::getInstance().getConfig()->Deltat/TempFrequency)*(ScaleTempFactor-1));
       ekin += 0.5*(*iter)->getType()->mass * U.NormSquared();
     }
@@ -46,2 +52,12 @@
   return ekin;
 }
+
+std::string Berendsen::name(){
+  return ThermostatTraits<Berendsen>().name;
+}
+
+std::string Berendsen::writeParam(){
+  stringstream sstr;
+  sstr << TempFrequency;
+  return sstr.str();
+}
Index: src/Thermostats/Berendsen.hpp
===================================================================
--- src/Thermostats/Berendsen.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Berendsen.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -17,14 +17,23 @@
   virtual ~Berendsen();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name() { return "Berendsen";}
+  virtual std::string name();
+
+  virtual std::string writeParam();
+
 private:
   template <class ForwardIterator>
-  double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
+  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
 
-  double ActualTemp;
+  double TempFrequency;
+};
+
+template <>
+struct ThermostatTraits<class Berendsen>{
+  ThermostatTraits();
+  const char* name;
 };
 
Index: src/Thermostats/GaussianThermostat.cpp
===================================================================
--- src/Thermostats/GaussianThermostat.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/GaussianThermostat.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -13,7 +13,11 @@
 #include "element.hpp"
 #include "config.hpp"
+#include "World.hpp"
+
 #include <set>
 
-GaussianThermostat::GaussianThermostat() : E(0),G(0)
+GaussianThermostat::GaussianThermostat(int _ScaleTempStep) :
+  E(0),G(0),
+  ScaleTempStep(_ScaleTempStep)
 {}
 
@@ -21,18 +25,22 @@
 {}
 
-double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+ThermostatTraits<GaussianThermostat>::ThermostatTraits() :
+  name("Gaussian")
+{}
+
+double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double GaussianThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double GaussianThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
 template <class ForwardIterator>
-double GaussianThermostat::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
+double GaussianThermostat::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
   DoLog(2) && (Log() << Verbose(2) <<  "Applying Gaussian thermostat..." << endl);
   init(step,begin,end);
@@ -43,5 +51,5 @@
     Vector &U = (*iter)->Trajectory.U.at(step);
     if ((*iter)->FixedIon == 0) {// even FixedIon moves, only not by other's forces
-      U += configuration.Deltat * G_over_E * U;
+      U += World::getInstance().getConfig()->Deltat * G_over_E * U;
       ekin += (*iter)->getType()->mass * U.NormSquared();
     }
@@ -71,2 +79,12 @@
   return G;
 }
+
+std::string GaussianThermostat::name(){
+  return ThermostatTraits<GaussianThermostat>().name;
+}
+
+std::string GaussianThermostat::writeParams(){
+  std::stringstream sstr;
+  sstr << ScaleTempStep;
+  return sstr.str();
+}
Index: src/Thermostats/GaussianThermostat.hpp
===================================================================
--- src/Thermostats/GaussianThermostat.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/GaussianThermostat.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -16,20 +16,29 @@
 {
 public:
-  GaussianThermostat();
+  GaussianThermostat(int ScaleTempStep);
   virtual ~GaussianThermostat();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name() { return "Gaussian";}
   double getE() const;
   double getG() const;
+
+  virtual std::string name();
+  virtual std::string writeParams();
 private:
   template <class ForwardIterator>
   void init(unsigned int step,ForwardIterator begin, ForwardIterator end);
   template <class ForwardIterator>
-  double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
+  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
   double E,G;
+  int ScaleTempStep;
+};
+
+template <>
+struct ThermostatTraits<GaussianThermostat>{
+  ThermostatTraits();
+  const char* name;
 };
 
Index: src/Thermostats/Langevin.cpp
===================================================================
--- src/Thermostats/Langevin.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Langevin.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -25,26 +25,30 @@
 }
 
-double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+ThermostatTraits<class Langevin>::ThermostatTraits() :
+  name("Langevin")
+{}
+
+double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Langevin::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Langevin::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
 template <class ForwardIterator>
-double Langevin::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
+double Langevin::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
   DoLog(2) && (Log() << Verbose(2) <<  "Applying Langevin thermostat..." << endl);
   double ekin=0;
   for(ForwardIterator iter=begin;iter!=end;++iter){
-    double sigma  = sqrt(configuration.Thermostats->TargetTemp/(*iter)->getType()->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime)
+    double sigma  = sqrt(getContainer().TargetTemp/(*iter)->getType()->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime)
     Vector &U = (*iter)->Trajectory.U.at(step);
     if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
       // throw a dice to determine whether it gets hit by a heat bath particle
-      if (((((rand()/(double)RAND_MAX))*configuration.Thermostats->TempFrequency) < 1.)) {
+      if (((((rand()/(double)RAND_MAX))*TempFrequency) < 1.)) {
         DoLog(3) && (Log() << Verbose(3) << "Particle " << (**iter) << " was hit (sigma " << sigma << "): " << sqrt(U[0]*U[0]+U[1]*U[1]+U[2]*U[2]) << " -> ");
         // pick three random numbers from a Boltzmann distribution around the desired temperature T for each momenta axis
@@ -59,2 +63,12 @@
   return ekin;
 }
+
+std::string Langevin::name(){
+  return ThermostatTraits<Langevin>().name;
+}
+
+std::string Langevin::writeParams(){
+  stringstream sstr;
+  sstr << TempFrequency << "\t" << alpha;
+  return sstr.str();
+}
Index: src/Thermostats/Langevin.hpp
===================================================================
--- src/Thermostats/Langevin.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Langevin.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -17,17 +17,27 @@
   virtual ~Langevin();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list))=0;
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector))=0;
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set))=0;
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name(){return "Langevin";}
+  virtual std::string name();
+  virtual std::string writeParams();
 
 private:
   template <class ForwardIterator>
-  double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
+  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
 
+
+  double TempFrequency;
+  double alpha;
   gsl_rng * r;
   const gsl_rng_type * T;
 };
 
+template <>
+struct ThermostatTraits<class Langevin>{
+  ThermostatTraits();
+  const char* name;
+};
+
 #endif /* LANGEVIN_HPP_ */
Index: src/Thermostats/NoThermostat.cpp
===================================================================
--- src/Thermostats/NoThermostat.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/NoThermostat.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -14,13 +14,25 @@
 {}
 
-double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
+ThermostatTraits<class NoThermostat>::ThermostatTraits() :
+  name("None")
+{}
+
+double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
   return 0;
 }
 
-double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
+double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
   return 0;
 }
 
-double NoThermostat::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
+double NoThermostat::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
   return 0;
 }
+
+std::string NoThermostat::name(){
+  return ThermostatTraits<NoThermostat>().name;
+}
+
+std::string NoThermostat::writeParams(){
+  return "";
+}
Index: src/Thermostats/NoThermostat.hpp
===================================================================
--- src/Thermostats/NoThermostat.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/NoThermostat.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -17,9 +17,16 @@
   virtual ~NoThermostat();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name() { return "None";}
+  virtual std::string name();
+  virtual std::string writeParams();
+};
+
+template <>
+struct ThermostatTraits<class NoThermostat>{
+  ThermostatTraits();
+  const char* name;
 };
 
Index: src/Thermostats/NoseHoover.cpp
===================================================================
--- src/Thermostats/NoseHoover.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/NoseHoover.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -13,6 +13,8 @@
 #include "Helpers/Log.hpp"
 #include "ThermoStatContainer.hpp"
+#include "World.hpp"
 
-NoseHoover::NoseHoover()
+NoseHoover::NoseHoover(double _HooverMass) :
+  HooverMass(_HooverMass)
 {}
 
@@ -20,29 +22,33 @@
 {}
 
+ThermostatTraits<class NoseHoover>::ThermostatTraits() :
+  name("NoseHoover")
+{}
 
-double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+
+double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double NoseHoover::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double NoseHoover::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
 template <class ForwardIterator>
-double NoseHoover::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end){
+double NoseHoover::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end){
   DoLog(2) && (Log() << Verbose(2) <<  "Applying Nose-Hoover thermostat..." << endl);
   init(step,begin,end);
-  delta_alpha = (delta_alpha - (3.*count+1.) * configuration.Thermostats->TargetTemp)/(configuration.Thermostats->HooverMass*Units2Electronmass);
-  configuration.Thermostats->alpha += delta_alpha*configuration.Deltat;
-  DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << configuration.Deltat << " = " << configuration.Thermostats->alpha << "." << endl);
+  delta_alpha = (delta_alpha - (3.*count+1.) * getContainer().TargetTemp)/(HooverMass*Units2Electronmass);
+  getContainer().alpha += delta_alpha*World::getInstance().getConfig()->Deltat;
+  DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << World::getInstance().getConfig()->Deltat << " = " << getContainer().alpha << "." << endl);
   double ekin =0;
   for(ForwardIterator iter=begin;iter!=end;++iter){
     Vector &U = (*iter)->Trajectory.U.at(step);
     if ((*iter)->FixedIon == 0) { // even FixedIon moves, only not by other's forces
-      U += configuration.Deltat/(*iter)->getType()->mass * (configuration.Thermostats->alpha * (U * (*iter)->getType()->mass));
+      U += World::getInstance().getConfig()->Deltat/(*iter)->getType()->mass * (getContainer().alpha * (U * (*iter)->getType()->mass));
       ekin += (0.5*(*iter)->getType()->mass) * U.NormSquared();
     }
@@ -63,2 +69,12 @@
   }
 }
+
+std::string NoseHoover::name(){
+  return ThermostatTraits<NoseHoover>().name;
+}
+
+std::string NoseHoover::writeParams(){
+  std::stringstream sstr;
+  sstr << HooverMass;
+  return sstr.str();
+}
Index: src/Thermostats/NoseHoover.hpp
===================================================================
--- src/Thermostats/NoseHoover.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/NoseHoover.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -14,12 +14,13 @@
 {
 public:
-  NoseHoover();
+  NoseHoover(double _HooverMass);
   virtual ~NoseHoover();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name() { return "Nose-Hoover";}
+  virtual std::string name();
+  virtual std::string writeParams();
 
 private:
@@ -27,9 +28,17 @@
   void init(unsigned int step,ForwardIterator begin, ForwardIterator end);
   template <class ForwardIterator>
-  double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin, ForwardIterator end);
+  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin, ForwardIterator end);
 
+  double HooverMass;
   double delta_alpha;
   int count;
 };
 
+template <>
+struct ThermostatTraits<class NoseHoover>{
+  ThermostatTraits();
+  const char* name;
+};
+
+
 #endif /* NOSEHOOVER_HPP_ */
Index: src/Thermostats/Thermostat.cpp
===================================================================
--- src/Thermostats/Thermostat.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Thermostat.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -8,7 +8,23 @@
 #include "Thermostat.hpp"
 
-Thermostat::Thermostat()
+#include "Helpers/Assert.hpp"
+
+Thermostat::Thermostat() :
+  container(0)
 {}
 
 Thermostat::~Thermostat()
 {}
+
+ThermostatTraits<Thermostat>::ThermostatTraits() :
+  name("Base")
+{}
+
+void Thermostat::addToContainer(ThermoStatContainer &_container){
+  container = &_container;
+}
+
+ThermoStatContainer &Thermostat::getContainer(){
+  ASSERT(container,"No container used for this Thermostat");
+  return *container;
+}
Index: src/Thermostats/Thermostat.hpp
===================================================================
--- src/Thermostats/Thermostat.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Thermostat.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -17,16 +17,34 @@
 #include "AtomSet.hpp"
 
+class ThermoStatContainer;
+
 class Thermostat
 {
 public:
   Thermostat();
-  virtual  ~Thermostat();
+  virtual ~Thermostat();
 
   // cannot template this, because we need virtual functions
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list))=0;
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector))=0;
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set))=0;
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms)=0;
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms)=0;
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms)=0;
 
   virtual std::string name()=0;
+
+  virtual std::string writeParams()=0;
+protected:
+  void addToContainer(ThermoStatContainer &);
+  ThermoStatContainer &getContainer();
+private:
+  ThermoStatContainer* container;
+};
+
+template <class Thermostat>
+struct ThermostatTraits;
+
+template <>
+struct ThermostatTraits<Thermostat>{
+  ThermostatTraits();
+  const char* name;
 };
 
Index: src/Thermostats/Woodcock.cpp
===================================================================
--- src/Thermostats/Woodcock.cpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Woodcock.cpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -14,7 +14,8 @@
 #include "ThermoStatContainer.hpp"
 
-Woodcock::Woodcock(int _MDSteps, double _ActualTemp) :
-  MDSteps(_MDSteps),
-  ActualTemp(_ActualTemp)
+#include <sstream>
+
+Woodcock::Woodcock(int _ScaleTempStep) :
+  ScaleTempStep(_ScaleTempStep)
 {}
 
@@ -22,21 +23,25 @@
 {}
 
-double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+ThermostatTraits<class Woodcock>::ThermostatTraits() :
+  name("Woodcock")
+{}
+
+double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
-double Woodcock::scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set) atoms){
-  return doScaleAtoms(configuration,step,atoms.begin(),atoms.end());
+double Woodcock::scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms){
+  return doScaleAtoms(step,ActualTemp,atoms.begin(),atoms.end());
 }
 
 template <class ForwardIterator>
-double Woodcock::doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin,ForwardIterator end){
+double Woodcock::doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin,ForwardIterator end){
   double ekin=0;
-  if ((configuration.Thermostats->ScaleTempStep > 0) && ((MDSteps-1) % configuration.Thermostats->ScaleTempStep == 0)) {
-    double ScaleTempFactor = sqrt(configuration.Thermostats->TargetTemp/ActualTemp);
+  if ((ScaleTempStep > 0) && ((step-1) % ScaleTempStep == 0)) {
+    double ScaleTempFactor = sqrt(getContainer().TargetTemp/ActualTemp);
     DoLog(2) && (Log() << Verbose(2) <<  "Applying Woodcock thermostat..." << endl);
     double ekin;
@@ -51,2 +56,12 @@
   return ekin;
 }
+
+std::string Woodcock::name(){
+  return ThermostatTraits<Woodcock>().name;
+}
+
+std::string Woodcock::writeParams(){
+  std::stringstream sstr;
+  sstr << ScaleTempStep;
+  return sstr.str();
+}
Index: src/Thermostats/Woodcock.hpp
===================================================================
--- src/Thermostats/Woodcock.hpp	(revision 194649564d0311bec3d5d03acaa519a7a24a5611)
+++ src/Thermostats/Woodcock.hpp	(revision 579a8164cf780e621cb4e727d195e84fdcd5698a)
@@ -14,19 +14,26 @@
 {
 public:
-  Woodcock(int,double);
+  Woodcock(int);
   virtual ~Woodcock();
 
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::list));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::vector));
-  virtual double scaleAtoms(config &configuration,unsigned int step,ATOMSET(std::set));
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::list) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::vector) atoms);
+  virtual double scaleAtoms(unsigned int step,double ActualTemp,ATOMSET(std::set) atoms);
 
-  virtual std::string name(){return "Woodcock";}
+  virtual std::string name();
+
+  virtual std::string writeParams();
 
 private:
   template <class ForwardIterator>
-  double doScaleAtoms(config &configuration,unsigned int step,ForwardIterator begin,ForwardIterator end);
+  double doScaleAtoms(unsigned int step,double ActualTemp,ForwardIterator begin,ForwardIterator end);
 
-  int MDSteps;
-  double ActualTemp;
+  int ScaleTempStep;
+};
+
+template <>
+struct ThermostatTraits<class Woodcock>{
+  ThermostatTraits();
+  const char* name;
 };
 
