Index: src/Parser/unittests/ParserMpqcUnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserMpqcUnitTest.cpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserMpqcUnitTest.cpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -32,4 +32,6 @@
 #include "Descriptors/AtomTypeDescriptor.hpp"
 #include "CodePatterns/Assert.hpp"
+#include "Parser/ChangeTracker.hpp"
+#include "Parser/MpqcParser.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -157,5 +159,5 @@
 
 void ParserMpqcUnitTest::setUp() {
-  mpqc = new MpqcParser();
+  parser = new FormatParser<mpqc>();
 
   World::getInstance();
@@ -169,5 +171,5 @@
 
 void ParserMpqcUnitTest::tearDown() {
-  delete mpqc;
+  delete parser;
   ChangeTracker::purgeInstance();
   World::purgeInstance();
@@ -178,54 +180,54 @@
 void ParserMpqcUnitTest::ParameterTypeTest() {
   // check types in boost::any map
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::hessianParam].type() == typeid(bool));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::hessianParam].type() != typeid(int));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::savestateParam].type() == typeid(bool));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::do_gradientParam].type() == typeid(bool));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::maxiterParam].type() == typeid(int));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::memoryParam].type() == typeid(int));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::stdapproxParam].type() == typeid(std::string));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::nfzcParam].type() == typeid(int));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::basisParam].type() == typeid(std::string));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::aux_basisParam].type() == typeid(std::string));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::integrationParam].type() == typeid(MpqcParser_Parameters::IntegralCints));
-  CPPUNIT_ASSERT(mpqc->getParams().params[MpqcParser_Parameters::theoryParam].type() == typeid(MpqcParser_Parameters::MBPT2));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::hessianParam].type() == typeid(bool));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::hessianParam].type() != typeid(int));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::savestateParam].type() == typeid(bool));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::do_gradientParam].type() == typeid(bool));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::maxiterParam].type() == typeid(int));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::memoryParam].type() == typeid(int));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::stdapproxParam].type() == typeid(std::string));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::nfzcParam].type() == typeid(int));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::basisParam].type() == typeid(std::string));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::aux_basisParam].type() == typeid(std::string));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::integrationParam].type() == typeid(MpqcParser_Parameters::IntegralCints));
+  CPPUNIT_ASSERT(parser->getParams().params[MpqcParser_Parameters::theoryParam].type() == typeid(MpqcParser_Parameters::MBPT2));
 }
 
 void ParserMpqcUnitTest::ParameterDefaultTest() {
   // check default values
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::hessianParam) == "no");
-  CPPUNIT_ASSERT(!mpqc->getParams().getBool(MpqcParser_Parameters::hessianParam));
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::savestateParam) == "no");
-  CPPUNIT_ASSERT(!mpqc->getParams().getBool(MpqcParser_Parameters::savestateParam));
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::do_gradientParam) == "yes");
-  CPPUNIT_ASSERT(mpqc->getParams().getBool(MpqcParser_Parameters::do_gradientParam));
-  CPPUNIT_ASSERT(mpqc->getParams().getInt(MpqcParser_Parameters::maxiterParam) == 1000);
-  CPPUNIT_ASSERT(mpqc->getParams().getInt(MpqcParser_Parameters::memoryParam) == 16000000);
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::stdapproxParam) == "A'");
-  CPPUNIT_ASSERT(mpqc->getParams().getInt(MpqcParser_Parameters::nfzcParam) == 1);
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::basisParam) == "3-21G");
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::aux_basisParam) == "aug-cc-pVDZ");
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::integrationParam) == "IntegralCints");
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
-  CPPUNIT_ASSERT(mpqc->getParams().getTheory() == MpqcParser_Parameters::MBPT2);
-  CPPUNIT_ASSERT(mpqc->getParams().getIntegration() == MpqcParser_Parameters::IntegralCints);
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::hessianParam) == "no");
+  CPPUNIT_ASSERT(!parser->getParams().getBool(MpqcParser_Parameters::hessianParam));
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::savestateParam) == "no");
+  CPPUNIT_ASSERT(!parser->getParams().getBool(MpqcParser_Parameters::savestateParam));
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::do_gradientParam) == "yes");
+  CPPUNIT_ASSERT(parser->getParams().getBool(MpqcParser_Parameters::do_gradientParam));
+  CPPUNIT_ASSERT(parser->getParams().getInt(MpqcParser_Parameters::maxiterParam) == 1000);
+  CPPUNIT_ASSERT(parser->getParams().getInt(MpqcParser_Parameters::memoryParam) == 16000000);
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::stdapproxParam) == "A'");
+  CPPUNIT_ASSERT(parser->getParams().getInt(MpqcParser_Parameters::nfzcParam) == 1);
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::basisParam) == "3-21G");
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::aux_basisParam) == "aug-cc-pVDZ");
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::integrationParam) == "IntegralCints");
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
+  CPPUNIT_ASSERT(parser->getParams().getTheory() == MpqcParser_Parameters::MBPT2);
+  CPPUNIT_ASSERT(parser->getParams().getIntegration() == MpqcParser_Parameters::IntegralCints);
 
   // check that values are not removed
-  CPPUNIT_ASSERT(!mpqc->getParams().params[MpqcParser_Parameters::theoryParam].empty());
+  CPPUNIT_ASSERT(!parser->getParams().params[MpqcParser_Parameters::theoryParam].empty());
 
   // check throw, for the moment aren't, are caught in getInt()
-  CPPUNIT_ASSERT_THROW(mpqc->getParams().getInt(MpqcParser_Parameters::integrationParam), boost::bad_any_cast);
-  CPPUNIT_ASSERT_THROW(mpqc->getParams().getInt(MpqcParser_Parameters::theoryParam), boost::bad_any_cast);
+  CPPUNIT_ASSERT_THROW(parser->getParams().getInt(MpqcParser_Parameters::integrationParam), boost::bad_any_cast);
+  CPPUNIT_ASSERT_THROW(parser->getParams().getInt(MpqcParser_Parameters::theoryParam), boost::bad_any_cast);
 
 }
 
 void ParserMpqcUnitTest::ParameterCloneTest() {
-  FormatParser_Parameters *clone = mpqc->getParams().clone();
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
+  FormatParser_Parameters *clone = parser->getParams().clone();
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
   std::stringstream setvalue("theory = CLHF");
-  setvalue >> mpqc->getParams();
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) == "CLHF");
-  mpqc->getParams().makeClone(*clone);
-  CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
+  setvalue >> parser->getParams();
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::theoryParam) == "CLHF");
+  parser->getParams().makeClone(*clone);
+  CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::theoryParam) == "MBPT2");
 }
 
@@ -234,24 +236,24 @@
   {
     std::stringstream setvalue("theory = CLHF");
-    setvalue >> mpqc->getParams();
+    setvalue >> parser->getParams();
 //    std::cout << "integration method is "
-//        << mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) << std::endl;
-    CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::theoryParam) == "CLHF");
+//        << parser->getParams().getString(MpqcParser_Parameters::theoryParam) << std::endl;
+    CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::theoryParam) == "CLHF");
   }
   // test a bool
   {
     std::stringstream setvalue("Hessian = yes");
-    setvalue >> mpqc->getParams();
+    setvalue >> parser->getParams();
 //    std::cout << "Hessian is "
-//        << mpqc->getParams().getString(MpqcParser_Parameters::hessianParam) << std::endl;
-    CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::hessianParam) == "yes");
+//        << parser->getParams().getString(MpqcParser_Parameters::hessianParam) << std::endl;
+    CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::hessianParam) == "yes");
   }
   // test int
   {
     std::stringstream setvalue("maxiter = 500");
-    setvalue >> mpqc->getParams();
+    setvalue >> parser->getParams();
 //    std::cout << "maxiter is "
-//        << mpqc->getParams().getString(MpqcParser_Parameters::maxiterParam) << std::endl;
-    CPPUNIT_ASSERT(mpqc->getParams().getInt(MpqcParser_Parameters::maxiterParam) == 500);
+//        << parser->getParams().getString(MpqcParser_Parameters::maxiterParam) << std::endl;
+    CPPUNIT_ASSERT(parser->getParams().getInt(MpqcParser_Parameters::maxiterParam) == 500);
   }
   // test whether unknown key fails
@@ -261,11 +263,11 @@
 #ifndef NDEBUG
     ASSERT_DO(Assert::Throw);
-    CPPUNIT_ASSERT_THROW(setvalue >> mpqc->getParams(), Assert::AssertionFailure);
+    CPPUNIT_ASSERT_THROW(setvalue >> parser->getParams(), Assert::AssertionFailure);
 #else
-    setvalue >> mpqc->getParams();
+    setvalue >> parser->getParams();
 #endif
 //    std::cout << "Hessian is still "
-//        << mpqc->getParams().getString(MpqcParser_Parameters::hessianParam) << std::endl;
-    CPPUNIT_ASSERT(mpqc->getParams().getString(MpqcParser_Parameters::hessianParam) == "yes");
+//        << parser->getParams().getString(MpqcParser_Parameters::hessianParam) << std::endl;
+    CPPUNIT_ASSERT(parser->getParams().getString(MpqcParser_Parameters::hessianParam) == "yes");
   }
 }
@@ -273,6 +275,6 @@
 void ParserMpqcUnitTest::readMpqcTest() {
   stringstream input(waterMpqc_CLHF);
-  mpqc->getParams().setTheory(MpqcParser_Parameters::CLHF);
-  mpqc->load(&input);
+  parser->getParams().setTheory(MpqcParser_Parameters::CLHF);
+  parser->load(&input);
 
   CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms());
@@ -301,6 +303,6 @@
     // compare both configs for CLHF
     stringstream output;
-    mpqc->getParams().setTheory(MpqcParser_Parameters::CLHF);
-    mpqc->save(&output, atoms);
+    parser->getParams().setTheory(MpqcParser_Parameters::CLHF);
+    parser->save(&output, atoms);
     stringstream input(waterMpqc_CLHF);
     for (; std::getline(input, first) && std::getline(output, second); ) {
@@ -312,6 +314,6 @@
     // compare both configs for CLKS
     stringstream output;
-    mpqc->getParams().setTheory(MpqcParser_Parameters::CLKS);
-    mpqc->save(&output, atoms);
+    parser->getParams().setTheory(MpqcParser_Parameters::CLKS);
+    parser->save(&output, atoms);
     stringstream input(waterMpqc_CLKS);
     for (; std::getline(input, first) && std::getline(output, second); ) {
@@ -323,6 +325,6 @@
     // compare both configs for MBPT2
     stringstream output;
-    mpqc->getParams().setTheory(MpqcParser_Parameters::MBPT2);
-    mpqc->save(&output, atoms);
+    parser->getParams().setTheory(MpqcParser_Parameters::MBPT2);
+    parser->save(&output, atoms);
     stringstream input(waterMpqc_MBPT2);
     for (; std::getline(input, first) && std::getline(output, second); ) {
@@ -334,6 +336,6 @@
     // compare both configs for MBPT2_R12
     stringstream output;
-    mpqc->getParams().setTheory(MpqcParser_Parameters::MBPT2_R12);
-    mpqc->save(&output, atoms);
+    parser->getParams().setTheory(MpqcParser_Parameters::MBPT2_R12);
+    parser->save(&output, atoms);
     stringstream input(waterMpqc_MBPT2_R12);
     for (; std::getline(input, first) && std::getline(output, second); ) {
Index: src/Parser/unittests/ParserMpqcUnitTest.hpp
===================================================================
--- src/Parser/unittests/ParserMpqcUnitTest.hpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserMpqcUnitTest.hpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -41,5 +41,5 @@
 
 private:
-  MpqcParser *mpqc;
+  FormatParser<mpqc> *parser;
 };
 
Index: src/Parser/unittests/ParserPcpUnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserPcpUnitTest.cpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserPcpUnitTest.cpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -24,5 +24,4 @@
 #include <cppunit/ui/text/TestRunner.h>
 
-#include "Parser/PcpParser.hpp"
 #include "World.hpp"
 #include "atom.hpp"
@@ -31,4 +30,6 @@
 #include "CodePatterns/Log.hpp"
 #include "Descriptors/AtomTypeDescriptor.hpp"
+#include "Parser/ChangeTracker.hpp"
+#include "Parser/PcpParser.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -119,4 +120,6 @@
   World::getInstance();
 
+  parser = new FormatParser<pcp>();
+
   setVerbosity(2);
 
@@ -126,5 +129,7 @@
 }
 
-void ParserPcpUnitTest::tearDown() {
+void ParserPcpUnitTest::tearDown() 
+{
+  delete parser;
   ChangeTracker::purgeInstance();
   World::purgeInstance();
@@ -135,6 +140,5 @@
 void ParserPcpUnitTest::readwritePcpTest() {
   stringstream input(waterPcp);
-  PcpParser* testParser = new PcpParser();
-  testParser->load(&input);
+  parser->load(&input);
   input.clear();
 
@@ -142,16 +146,18 @@
 
   // check that equality function is ok
-  CPPUNIT_ASSERT(*testParser == *testParser);
+  CPPUNIT_ASSERT(*parser == *parser);
 
   stringstream output;
   std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-  testParser->save(&output, atoms);
+  parser->save(&output, atoms);
 
   input << output.str();
-  PcpParser* testParser2 = new PcpParser();
-  testParser2->load(&input);
+  FormatParser<pcp>* parser2 = new FormatParser<pcp>();
+  parser2->load(&input);
 
   CPPUNIT_ASSERT_EQUAL(6, World::getInstance().numAtoms());
 
-  CPPUNIT_ASSERT(*testParser == *testParser2);
+  CPPUNIT_ASSERT(*parser == *parser2);
+
+  delete parser2;
 }
Index: src/Parser/unittests/ParserPcpUnitTest.hpp
===================================================================
--- src/Parser/unittests/ParserPcpUnitTest.hpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserPcpUnitTest.hpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -13,4 +13,5 @@
 #endif
 
+#include "Parser/PcpParser.hpp"
 
 #include <cppunit/extensions/HelperMacros.h>
@@ -28,4 +29,7 @@
 
   void readwritePcpTest();
+
+private:
+  FormatParser<pcp> *parser;
 };
 
Index: src/Parser/unittests/ParserPdbUnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserPdbUnitTest.cpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserPdbUnitTest.cpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -24,5 +24,4 @@
 #include <cppunit/ui/text/TestRunner.h>
 
-#include "Parser/PdbParser.hpp"
 #include "World.hpp"
 #include "atom.hpp"
@@ -31,4 +30,6 @@
 #include "CodePatterns/Log.hpp"
 #include "Descriptors/AtomTypeDescriptor.hpp"
+#include "Parser/ChangeTracker.hpp"
+#include "Parser/PdbParser.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -63,4 +64,6 @@
   World::getInstance();
 
+  parser = new FormatParser<pdb>();
+
   setVerbosity(2);
 
@@ -70,5 +73,7 @@
 }
 
-void ParserPdbUnitTest::tearDown() {
+void ParserPdbUnitTest::tearDown() 
+{
+  delete parser;
   ChangeTracker::purgeInstance();
   World::purgeInstance();
@@ -80,6 +85,5 @@
   stringstream input;
   input << waterPdb;
-  PdbParser* testParser = new PdbParser();
-  testParser->load(&input);
+  parser->load(&input);
   input.clear();
 
@@ -88,5 +92,5 @@
   stringstream output;
   std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-  testParser->save(&output, atoms);
+  parser->save(&output, atoms);
 
 //  std::cout << "Save PDB is:" << std::endl;
@@ -94,7 +98,9 @@
 
   input << output.str();
-  PdbParser* testParser2 = new PdbParser();
-  testParser2->load(&input);
+  FormatParser<pdb>* parser2 = new FormatParser<pdb>();
+  parser2->load(&input);
 
   CPPUNIT_ASSERT_EQUAL(12, World::getInstance().numAtoms());
+
+  delete parser2;
 }
Index: src/Parser/unittests/ParserPdbUnitTest.hpp
===================================================================
--- src/Parser/unittests/ParserPdbUnitTest.hpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserPdbUnitTest.hpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -13,4 +13,5 @@
 #endif
 
+#include "Parser/PdbParser.hpp"
 
 #include <cppunit/extensions/HelperMacros.h>
@@ -28,4 +29,7 @@
 
   void readwritePdbTest();
+
+private:
+  FormatParser<pdb> *parser;
 };
 
Index: src/Parser/unittests/ParserTremoloUnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserTremoloUnitTest.cpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserTremoloUnitTest.cpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -27,9 +27,6 @@
 #include "Descriptors/AtomTypeDescriptor.hpp"
 #include "element.hpp"
-#include "Parser/MpqcParser.hpp"
-#include "Parser/PdbParser.hpp"
-#include "Parser/PcpParser.hpp"
 #include "Parser/TremoloParser.hpp"
-#include "Parser/XyzParser.hpp"
+#include "Parser/ChangeTracker.hpp"
 #include "periodentafel.hpp"
 #include "World.hpp"
@@ -85,4 +82,6 @@
   World::getInstance();
 
+  parser = new FormatParser<tremolo>();
+
   // we need hydrogens and oxygens in the following tests
   CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(1) != NULL);
@@ -90,5 +89,7 @@
 }
 
-void ParserTremoloUnitTest::tearDown() {
+void ParserTremoloUnitTest::tearDown() 
+{
+  delete parser;
   ChangeTracker::purgeInstance();
   World::purgeInstance();
@@ -99,5 +100,4 @@
 void ParserTremoloUnitTest::readTremoloPreliminaryCommentsTest() {
   cout << "Testing the tremolo parser." << endl;
-  TremoloParser* testParser = new TremoloParser();
   stringstream input, output;
 
@@ -105,7 +105,7 @@
   {
     input << Tremolo_Atomdata1;
-    testParser->load(&input);
-    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->load(&input);
+    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+    parser->save(&output, atoms);
 //    std::cout << output.str() << std::endl;
 //    std::cout << Tremolo_Atomdata1 << std::endl;
@@ -118,7 +118,7 @@
   {
     input << Tremolo_Atomdata2;
-    testParser->load(&input);
-    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->load(&input);
+    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+    parser->save(&output, atoms);
     std::cout << output.str() << std::endl;
     CPPUNIT_ASSERT(output.str().find("hydrogen") != string::npos);
@@ -129,5 +129,5 @@
   // Invalid key in Atomdata line
   input << Tremolo_invalidkey;
-  testParser->load(&input);
+  parser->load(&input);
   //TODO: prove invalidity
   input.clear();
@@ -135,10 +135,9 @@
 
 void ParserTremoloUnitTest::readTremoloCoordinatesTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream input;
 
   // One simple data line
   input << Tremolo_Atomdata2;
-  testParser->load(&input);
+  parser->load(&input);
   CPPUNIT_ASSERT(World::getInstance().getAtom(AtomByType(1))->at(0) == 3.0);
   input.clear();
@@ -146,10 +145,9 @@
 
 void ParserTremoloUnitTest::readTremoloVelocityTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream input;
 
   // One simple data line
   input << Tremolo_velocity;
-  testParser->load(&input);
+  parser->load(&input);
   CPPUNIT_ASSERT(World::getInstance().getAtom(AtomByType(1))->getAtomicVelocity()[0] == 3.0);
   input.clear();
@@ -157,10 +155,9 @@
 
 void ParserTremoloUnitTest::readTremoloNeighborInformationTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream input;
 
   // Neighbor data
   input << Tremolo_neighbours;
-  testParser->load(&input);
+  parser->load(&input);
 
   CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms());
@@ -171,5 +168,4 @@
 
 void ParserTremoloUnitTest::readAndWriteTremoloImprDataInformationTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream input, output;
 
@@ -177,7 +173,7 @@
   {
     input << Tremolo_improper;
-    testParser->load(&input);
-    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->load(&input);
+    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+    parser->save(&output, atoms);
     CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms());
     std::cout << output.str() << std::endl;
@@ -189,5 +185,4 @@
 
 void ParserTremoloUnitTest::readAndWriteTremoloTorsionInformationTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream input, output;
 
@@ -195,7 +190,7 @@
   {
     input << Tremolo_torsion;
-    testParser->load(&input);
-    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->load(&input);
+    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+    parser->save(&output, atoms);
     CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms());
     std::cout << output.str() << std::endl;
@@ -207,5 +202,4 @@
 
 void ParserTremoloUnitTest::writeTremoloTest() {
-  TremoloParser* testParser = new TremoloParser();
   stringstream output;
 
@@ -214,7 +208,7 @@
     atom* newAtom = World::getInstance().createAtom();
     newAtom->setType(1);
-    testParser->setFieldsForSave("x=3 u=3 F stress Id neighbors=5 imprData GroupMeasureTypeNo type extType name resName chainID resSeq occupancy tempFactor segID Charge charge GrpTypeNo torsion");
-    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->setFieldsForSave("x=3 u=3 F stress Id neighbors=5 imprData GroupMeasureTypeNo type extType name resName chainID resSeq occupancy tempFactor segID Charge charge GrpTypeNo torsion");
+    std::vector<atom *> atoms = World::getInstance().getAllAtoms();
+    parser->save(&output, atoms);
     CPPUNIT_ASSERT(output.str() == Tremolo_full);
   }
@@ -222,2 +216,3 @@
   cout << "testing the tremolo parser is done" << endl;
 }
+
Index: src/Parser/unittests/ParserTremoloUnitTest.hpp
===================================================================
--- src/Parser/unittests/ParserTremoloUnitTest.hpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserTremoloUnitTest.hpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -13,4 +13,5 @@
 #endif
 
+#include "Parser/TremoloParser.hpp"
 
 #include <cppunit/extensions/HelperMacros.h>
@@ -40,4 +41,7 @@
   void readAndWriteTremoloTorsionInformationTest();
   void writeTremoloTest();
+
+private:
+  FormatParser<tremolo> *parser;
 };
 
Index: src/Parser/unittests/ParserXyzUnitTest.cpp
===================================================================
--- src/Parser/unittests/ParserXyzUnitTest.cpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserXyzUnitTest.cpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -24,5 +24,4 @@
 #include <cppunit/ui/text/TestRunner.h>
 
-#include "Parser/XyzParser.hpp"
 #include "World.hpp"
 #include "atom.hpp"
@@ -31,4 +30,6 @@
 #include "CodePatterns/Log.hpp"
 #include "Descriptors/AtomTypeDescriptor.hpp"
+#include "Parser/ChangeTracker.hpp"
+#include "Parser/XyzParser.hpp"
 
 #ifdef HAVE_TESTRUNNER
@@ -62,4 +63,6 @@
   World::getInstance();
 
+  parser = new FormatParser<xyz>();
+
   setVerbosity(2);
 
@@ -69,5 +72,7 @@
 }
 
-void ParserXyzUnitTest::tearDown() {
+void ParserXyzUnitTest::tearDown() 
+{
+  delete parser;
   ChangeTracker::purgeInstance();
   World::purgeInstance();
@@ -78,8 +83,7 @@
 void ParserXyzUnitTest::rewriteAnXyzTest() {
   cout << "Testing the XYZ parser." << endl;
-  XyzParser* testParser = new XyzParser();
   stringstream input;
   input << waterXyz;
-  testParser->load(&input);
+  parser->load(&input);
   input.clear();
 
@@ -90,7 +94,7 @@
     stringstream output;
     std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->save(&output, atoms);
     input << output.str();
-    testParser->load(&input);
+    parser->load(&input);
   }
 
@@ -115,8 +119,7 @@
 void ParserXyzUnitTest::readMultiXyzTest() {
   cout << "Testing the multi time step XYZ parser." << endl;
-  XyzParser* testParser = new XyzParser();
   stringstream input;
   input << waterMultiXyz;
-  testParser->load(&input);
+  parser->load(&input);
   input.clear();
 
@@ -130,8 +133,7 @@
 
 void ParserXyzUnitTest::writeMultiXyzTest() {
-  XyzParser* testParser = new XyzParser();
   stringstream input;
   input << waterMultiXyz;
-  testParser->load(&input);
+  parser->load(&input);
   input.clear();
 
@@ -143,7 +145,7 @@
     stringstream output;
     std::vector<atom *> atoms = World::getInstance().getAllAtoms();
-    testParser->save(&output, atoms);
+    parser->save(&output, atoms);
     input << output.str();
-    testParser->load(&input);
+    parser->load(&input);
   }
 
Index: src/Parser/unittests/ParserXyzUnitTest.hpp
===================================================================
--- src/Parser/unittests/ParserXyzUnitTest.hpp	(revision c1db05903a75be5fb69205e949bced95e69b4a1c)
+++ src/Parser/unittests/ParserXyzUnitTest.hpp	(revision d3d6c66c9874b31665d602a9fb2803e8c7fabdb3)
@@ -13,4 +13,5 @@
 #endif
 
+#include "Parser/XyzParser.hpp"
 
 #include <cppunit/extensions/HelperMacros.h>
@@ -32,4 +33,7 @@
   void readMultiXyzTest();
   void writeMultiXyzTest();
+
+private:
+  FormatParser<xyz> *parser;
 };
 
