Index: src/Jobs/MPQCCommandJob.cpp
===================================================================
--- src/Jobs/MPQCCommandJob.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/MPQCCommandJob.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,155 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * MPQCCommandJob.cpp
+ *
+ *  Created on: Feb 05, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+// include headers that implement a archive in simple text format
+// otherwise BOOST_CLASS_EXPORT_IMPLEMENT has no effect
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+
+#include "MPQCCommandJob.hpp"
+
+// include headers that implement a archive in simple text format
+#include <boost/archive/text_oarchive.hpp>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/tokenizer.hpp>
+#include <sstream>
+
+#include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
+
+const std::string MPQCCommandJob::keyword_hartreefock_energy("total scf energy");
+const std::string MPQCCommandJob::keyword_moellerplesset_energy("MP2 energy [au]:");
+const std::string MPQCCommandJob::keyword_hartreefock_forces("Total Gradient");
+const std::string MPQCCommandJob::keyword_moellerplesset_forces("Total MP2 gradient [au]:");
+
+/** Default constructor for class MPQCCommandJob.
+ *
+ */
+MPQCCommandJob::MPQCCommandJob()
+{}
+
+/** Constructor for class MPQCCommandJob.
+ *
+ * @param _inputfile string of inputfile contents
+ * @param _JobId id of this job
+ * @param command mpqc command, "mpqc" as default
+ */
+MPQCCommandJob::MPQCCommandJob(
+    const std::string &_inputfile,
+    const JobId_t _JobId,
+    const std::string &command) :
+    SystemCommandJob(command, _inputfile, _JobId)
+{}
+
+/** Destructor for class MPQCCommandJob.
+ *
+ */
+MPQCCommandJob::~MPQCCommandJob()
+{}
+
+/** Extracts energy and forces from the output of the command.
+ *
+ * @param resultstring output of the command to parse
+ * @return FragmentResult with energy and forces
+ */
+FragmentResult::ptr MPQCCommandJob::extractResult(const std::string &resultstring)
+{
+  std::stringstream returnstream;
+  // tokenizers
+  typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+  boost::char_separator<char> keyvalue_separator("=:");
+  boost::char_separator<char> whitespace(" \t");
+
+  // split into lines
+  std::vector<std::string> lines;
+  boost::split(lines, resultstring, boost::is_any_of("\n"));
+
+  // go through each line
+  bool gradient_section = false;
+  for (std::vector<std::string>::const_iterator iter = lines.begin();
+      iter != lines.end();++iter) {
+    LOG(3, "DEBUG: Current line is '" << *iter << "'.");
+    if (gradient_section) {
+      tokenizer tokens(*iter, whitespace);
+      if (*iter != std::string("")) {
+        tokenizer::iterator tok_iter = tokens.begin();
+        tok_iter++;
+        tok_iter++;
+        MPQCData::vector_type forcevector(NDIM);
+        try { // first col is index, second is element
+          for (size_t index = 0;index < NDIM; ++index)
+            forcevector[index] = boost::lexical_cast<double>(*(tok_iter++));
+          LOG(2, "INFO: Recognized force vector in '"+*iter+"'.");
+          data.forces.push_back( forcevector );
+        } catch(boost::bad_lexical_cast){
+          LOG(2, "INFO: Did not recognize a force vector, hence ending section at '"+*iter+"'.");
+          gradient_section = false;
+        }
+      } else {
+        LOG(2, "INFO: Recognized gradient section end in '"+*iter+"'.");
+        gradient_section = false;
+      }
+    }
+    // extract energy ("total scf energy") ...
+    if (((*iter).find(keyword_hartreefock_energy) != std::string::npos)
+        || ((*iter).find(keyword_moellerplesset_energy) != std::string::npos))
+    {
+      LOG(2, "INFO: Recognized energy in '"+*iter+"'.");
+      tokenizer tokens(*iter, keyvalue_separator);
+      tokenizer::iterator tok_iter = tokens.begin();
+      tok_iter++;
+      std::stringstream energystring(*tok_iter);
+      energystring >> data.energy;
+    }
+    // ... and forces ("Total Gradient") from resultstring
+    if (((*iter).find(keyword_hartreefock_forces) != std::string::npos)
+        || ((*iter).find(keyword_moellerplesset_forces) != std::string::npos))
+    {
+      LOG(2, "INFO: Recognized gradient section init in '"+*iter+"'.");
+      gradient_section=true;
+      data.forces.clear();
+    }
+  }
+
+  // place into returnstream
+  boost::archive::text_oarchive oa(returnstream);
+  oa << data;
+
+  FragmentResult::ptr s( new FragmentResult(getId(), returnstream.str()) );
+  return s;
+}
+
+bool MPQCCommandJob::operator==(const MPQCCommandJob &other) const
+{
+  if (data != other.data) {
+    LOG(2, "INFO: data's of both MPQCCommandJob don't match.");
+    return false;
+  }
+  return (static_cast<const SystemCommandJob &>(*this)
+      == static_cast<const SystemCommandJob &>(other));
+}
+
+
+// we need to explicitly instantiate the serialization functions as
+// its is only serialized through its base class FragmentJob
+BOOST_CLASS_EXPORT_IMPLEMENT(MPQCCommandJob)
Index: src/Jobs/MPQCCommandJob.hpp
===================================================================
--- src/Jobs/MPQCCommandJob.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/MPQCCommandJob.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,72 @@
+/*
+ * MPQCJob.hpp
+ *
+ *  Created on: Feb 05, 2012
+ *      Author: heber
+ */
+
+#ifndef MPQCCOMMANDJOB_HPP_
+#define MPQCCOMMANDJOB_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <boost/serialization/export.hpp>
+
+#include <string>
+
+#include "Results/FragmentResult.hpp"
+#include "Jobs/SystemCommandJob.hpp"
+
+#include "Jobs/MPQCCommandJob_MPQCData.hpp"
+
+class MPQCCommandJobTest;
+
+/** This class calls mpqc for solving a specific Hartree Fock problem.
+ *
+ */
+class MPQCCommandJob : public SystemCommandJob
+{
+  //!> grant unit test access
+  friend class MPQCCommandJobTest;
+public:
+  MPQCCommandJob(const std::string &_inputfile, const JobId_t _JobId, const std::string &_command = std::string("mpqc"));
+  ~MPQCCommandJob();
+
+  bool operator==(const MPQCCommandJob &other) const;
+
+  bool operator!=(const MPQCCommandJob &other) const {
+    return !(*this == other);
+  }
+
+private:
+  //!> private default cstor only for serializatio
+  MPQCCommandJob();
+
+  friend class boost::serialization::access;
+  // serialization
+  template <typename Archive>
+  void serialize(Archive& ar, const unsigned int version)
+  {
+    ar & boost::serialization::base_object<SystemCommandJob>(*this);
+    ar & data;
+  }
+
+private:
+  //!> class that contains energy and forces and serialization capabilities
+  MPQCData data;
+
+  FragmentResult::ptr extractResult(const std::string &resultstring);
+  static const std::string keyword_hartreefock_energy;
+  static const std::string keyword_hartreefock_forces;
+  static const std::string keyword_moellerplesset_energy;
+  static const std::string keyword_moellerplesset_forces;
+};
+
+// we need to give this class a unique key for serialization
+// its is only serialized through its base class FragmentJob
+BOOST_CLASS_EXPORT_KEY(MPQCCommandJob)
+
+#endif /* MPQCCOMMANDJOB_HPP_ */
Index: src/Jobs/MPQCCommandJob_MPQCData.cpp
===================================================================
--- src/Jobs/MPQCCommandJob_MPQCData.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/MPQCCommandJob_MPQCData.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,73 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * MPQCCommandJob_MPQCData.cpp
+ *
+ *  Created on: Feb 08, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "MPQCCommandJob_MPQCData.hpp"
+
+#include <iostream>
+#include <limits>
+
+#include "CodePatterns/Log.hpp"
+
+/** Constructor for class MPQCData.
+ *
+ */
+MPQCData::MPQCData() :
+    energy(0.)
+{}
+
+/** Destructor for class MPQCData.
+ *
+ */
+MPQCData::~MPQCData()
+{}
+
+/** Comparator for class MPQCData.
+ *
+ */
+bool MPQCData::operator==(const MPQCData &other) const
+{
+  if (fabs(energy - other.energy) > std::numeric_limits<double>::epsilon()) {
+    LOG(1, "INFO: Energy's in MPQCData differ: "
+        << energy << " != " << other.energy << ".");
+    return false;
+  }
+  if (forces.size() != other.forces.size()) {
+    LOG(1, "INFO: Forces's in MPQCData differ in size: "
+        << forces.size() << " != " << other.forces.size() << ".");
+    return false;
+  }
+  for (size_t i = 0; i < forces.size(); ++i)
+    for (size_t index = 0; index < NDIM; ++index)
+      if (fabs(forces[i][index] - other.forces[i][index]) > std::numeric_limits<double>::epsilon()) {
+        LOG(1, "INFO: " << index << "th component of force of particle "
+            << i << " in MPQCData differ: " << forces[i][index]
+            << " != " << other.forces[i][index] << ".");
+        return false;
+      }
+  return true;
+}
+
+std::ostream & operator<<(std::ostream &ost, const MPQCData &data)
+{
+  ost << "Energy: " << data.energy << "\t";
+  ost << "Forces: " << data.forces;
+  return ost;
+}
Index: src/Jobs/MPQCCommandJob_MPQCData.hpp
===================================================================
--- src/Jobs/MPQCCommandJob_MPQCData.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/MPQCCommandJob_MPQCData.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,68 @@
+/*
+ * MPQCCommandJob_MPQCData.hpp
+ *
+ *  Created on: Feb 08, 2012
+ *      Author: heber
+ */
+
+#ifndef MPQCCOMMANDJOB_MPQCDATA_HPP_
+#define MPQCCOMMANDJOB_MPQCDATA_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/vector.hpp>
+
+#include <iosfwd>
+#include <vector>
+
+#include "LinearAlgebra/defs.hpp"
+
+class MPQCCommandJob;
+class MPQCCommandJobTest;
+class MPQCDataTest;
+
+/** Internal class that holds the data and can be serialized.
+ *
+ */
+class MPQCData {
+  //!> allow MPQCCommandJob access to member variables directly
+  friend class MPQCCommandJob;
+  //!> grant MPQCCommandJob's unit test access
+  friend class MPQCCommandJobTest;
+  //!> grant unit test access
+  friend class MPQCDataTest;
+  //!> grant access to output stream operator
+  friend std::ostream & operator<<(std::ostream &ost, const MPQCData &data);
+public:
+  MPQCData();
+  ~MPQCData();
+
+  bool operator==(const MPQCData &other) const;
+
+  bool operator!=(const MPQCData &other) const {
+    return !(*this == other);
+  }
+
+  typedef std::vector<double> vector_type;
+
+  double energy;
+  std::vector< vector_type  > forces;
+
+private:
+  friend class boost::serialization::access;
+  // serialization
+  template <typename Archive>
+  void serialize(Archive& ar, const unsigned int version)
+  {
+    ar & energy;
+    ar & forces;
+  }
+};
+
+std::ostream & operator<<(std::ostream &ost, const MPQCData &data);
+
+#endif /* MPQCCOMMANDJOB_MPQCDATA_HPP_ */
Index: src/Jobs/Makefile.am
===================================================================
--- src/Jobs/Makefile.am	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/Makefile.am	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,24 @@
+# PLEASE adhere to the alphabetical ordering in this Makefile!
+# Also indentation by a single tab
+
+JOBSSOURCE = \
+        Jobs/MPQCCommandJob.cpp \
+        Jobs/MPQCCommandJob_MPQCData.cpp
+
+JOBSHEADER = \
+        Jobs/MPQCCommandJob.hpp \
+        Jobs/MPQCCommandJob_MPQCData.hpp
+
+lib_LTLIBRARIES += libMolecuilderJobs.la
+libMolecuilderJobs_la_includedir = $(includedir)/MoleCuilder/JobMarket/
+nobase_libMolecuilderJobs_la_include_HEADERS = $(JOBSHEADER)
+libMolecuilderJobs_la_CPPFLAGS = ${BOOST_CPPFLAGS} ${CodePatterns_CFLAGS}
+libMolecuilderJobs_la_LDFLAGS = $(AM_LDFLAGS) \
+  $(BOOST_SERIALIZATION_LDFLAGS) \
+  $(CodePatterns_LDFLAGS)
+libMolecuilderJobs_la_SOURCES = $(JOBSSOURCE)
+libMolecuilderJobs_la_LIBADD = \
+  $(top_builddir)/src/Fragmentation/Automation/libMolecuilderFragmentJobs.la \
+  $(BOOST_SERIALIZATION_LIBS) \
+  $(CodePatterns_LIBS)
+
Index: src/Jobs/unittests/MPQCCommandJobUnitTest.cpp
===================================================================
--- src/Jobs/unittests/MPQCCommandJobUnitTest.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/unittests/MPQCCommandJobUnitTest.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,167 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * MPQCCommandJobUnitTest.cpp
+ *
+ *  Created on: Feb 08, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+
+// include headers that implement a archive in simple text format
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+
+#include <vector>
+
+#include "MPQCCommandJobUnitTest.hpp"
+
+#include "Jobs/MPQCCommandJob.hpp"
+
+#include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
+
+#ifdef HAVE_TESTRUNNER
+#include "UnitTestMain.hpp"
+#endif /*HAVE_TESTRUNNER*/
+
+/********************************************** Test classes **************************************/
+
+const std::string resultstring="\
+\n\
+  HOMO is     5   A =  -0.498625\n\
+  LUMO is     6   A =   0.251360\n\
+\n\
+  total scf energy =  -75.5133625967\n\
+\n\
+  Memory used for integral intermediates: 56628 Bytes\n\
+\n\
+    10  -0.02171957  3   A  3   A ->  6   A  6   A (+-+-)\n\
+\n\
+  RHF energy [au]:                    -75.513362596662\n\
+  MP2 correlation energy [au]:         -0.124136686358\n\
+  MP2 energy [au]:                    -75.637499283020\n\
+\n\
+  D1(MP2)                =   0.01063314\n\
+\n\
+  CPHF: iter =  7 rms(P) = 0.0000000011 eps = 0.0000000100\n\
+\n\
+  Total MP2 gradient [au]:\n\
+       1   O   0.1100072224   0.0000000000  -0.0000000000\n\
+       2   H  -0.0550036112  -0.0000000000  -0.1562140155\n\
+       3   H  -0.0550036112  -0.0000000000   0.1562140155\n\
+\n\
+  Value of the MolecularEnergy:  -75.6374992830\n\
+\n\
+";
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( MPQCCommandJobTest );
+
+
+void MPQCCommandJobTest::setUp()
+{
+  // Throw assertions
+  ASSERT_DO(Assert::Throw);
+
+  setVerbosity(4);
+
+  job = new MPQCCommandJob(std::string("empty"), 1);
+}
+
+
+void MPQCCommandJobTest::tearDown()
+{
+  delete job;
+}
+
+/** UnitTest for extractString()
+ */
+void MPQCCommandJobTest::extractStringTest()
+{
+  // prepare result container
+  MPQCData data;
+  data.energy = -75.637499283020;
+  std::vector<double> force;
+  std::vector< std::vector<double> > forces;
+  //  1   O   0.1100072224   0.0000000000  -0.0000000000
+  force.push_back(0.1100072224);
+  force.push_back(0.0000000000);
+  force.push_back(-0.0000000000);
+  data.forces.push_back( force );
+  //  2   H  -0.0550036112  -0.0000000000  -0.1562140155
+  force.clear();
+  force.push_back(-0.0550036112);
+  force.push_back(-0.0000000000);
+  force.push_back(-0.1562140155);
+  data.forces.push_back( force );
+  //  3   H  -0.0550036112  -0.0000000000   0.1562140155
+  force.clear();
+  force.push_back(-0.0550036112);
+  force.push_back(-0.0000000000);
+  force.push_back(0.1562140155);
+  data.forces.push_back( force );
+
+  // extract and check
+  FragmentResult::ptr result = job->extractResult(resultstring);
+  std::stringstream returnstream(result->result);
+
+  // deserialize
+  MPQCData extractedData;
+  boost::archive::text_iarchive ia(returnstream);
+  ia >> extractedData;
+
+  CPPUNIT_ASSERT( data == extractedData );
+}
+
+/** UnitTest for operator==()
+ */
+void MPQCCommandJobTest::operatorTest()
+{
+  MPQCCommandJob otherJob(std::string("empty"), 1);
+
+  // ascertain equality
+  CPPUNIT_ASSERT( *job == otherJob );
+
+  // parse results
+  FragmentResult::ptr result = job->extractResult(resultstring);
+
+  // ascertain unequality as now data should differ
+  CPPUNIT_ASSERT( *job != otherJob );
+}
+
+/** UnitTest for serialization
+ */
+void MPQCCommandJobTest::serializationTest()
+{
+  // parse results
+  FragmentResult::ptr result = job->extractResult(resultstring);
+
+  // serialize
+  std::stringstream outputstream;
+  boost::archive::text_oarchive oa(outputstream);
+  oa << job;
+
+  // deserialize
+  MPQCCommandJob *extractedJob;
+  std::stringstream returnstream(outputstream.str());
+  boost::archive::text_iarchive ia(returnstream);
+  ia >> extractedJob;
+
+  CPPUNIT_ASSERT( *job == *extractedJob );
+
+  delete extractedJob;
+}
Index: src/Jobs/unittests/MPQCCommandJobUnitTest.hpp
===================================================================
--- src/Jobs/unittests/MPQCCommandJobUnitTest.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/unittests/MPQCCommandJobUnitTest.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,44 @@
+/*
+ * MPQCCommandJobUnitTest.hpp
+ *
+ *  Created on: Oct 23, 2011
+ *      Author: heber
+ */
+
+#ifndef MPQCCOMMANDJOBUNITTEST_HPP_
+#define MPQCCOMMANDJOBUNITTEST_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class MPQCCommandJob;
+
+
+/********************************************** Test classes **************************************/
+
+class MPQCCommandJobTest : public CppUnit::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MPQCCommandJobTest) ;
+    CPPUNIT_TEST ( extractStringTest );
+    CPPUNIT_TEST ( operatorTest );
+    CPPUNIT_TEST ( serializationTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+      void setUp();
+      void tearDown();
+      void extractStringTest();
+      void operatorTest();
+      void serializationTest();
+
+private:
+      MPQCCommandJob *job;
+};
+
+#endif /* MPQCCOMMANDJOBUNITTEST_HPP_ */
Index: src/Jobs/unittests/MPQCDataUnitTest.cpp
===================================================================
--- src/Jobs/unittests/MPQCDataUnitTest.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/unittests/MPQCDataUnitTest.cpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,140 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2012 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * MPQCDataUnitTest.cpp
+ *
+ *  Created on: Feb 09, 2012
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+
+// include headers that implement a archive in simple text format
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+
+#include <limits>
+#include <vector>
+
+#include "MPQCDataUnitTest.hpp"
+
+#include "Jobs/MPQCCommandJob_MPQCData.hpp"
+
+#include "CodePatterns/Assert.hpp"
+
+#ifdef HAVE_TESTRUNNER
+#include "UnitTestMain.hpp"
+#endif /*HAVE_TESTRUNNER*/
+
+/********************************************** Test classes **************************************/
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( MPQCDataTest );
+
+
+void MPQCDataTest::setUp()
+{
+  // Throw assertions
+  ASSERT_DO(Assert::Throw);
+
+  data = new MPQCData;
+
+  data->energy = -37.3479855;
+  std::vector<double> force;
+  std::vector< std::vector<double> > forces;
+  force.push_back(-2.35);
+  force.push_back(-0.54);
+  force.push_back(0.345);
+  data->forces.push_back(force);
+  force.clear();
+  force.push_back(-2.35);
+  force.push_back(-0.54);
+  force.push_back(0.345);
+  data->forces.push_back( force );
+
+  CPPUNIT_ASSERT_EQUAL( (size_t)2, data->forces.size() );
+}
+
+
+void MPQCDataTest::tearDown()
+{
+  delete data;
+}
+
+/** UnitTest for operator==()
+ */
+void MPQCDataTest::operatorTest()
+{
+  MPQCData otherData;
+
+  // ascertain unequality
+  CPPUNIT_ASSERT( !(*data == otherData) );
+  CPPUNIT_ASSERT( *data != otherData );
+
+  // construct closer and closer pendant
+  otherData.energy = -37.3479855;
+  CPPUNIT_ASSERT( *data != otherData );
+  std::vector<double> force;
+  std::vector< std::vector<double> > forces;
+  force.push_back(-2.35);
+  force.push_back(-0.54);
+  force.push_back(0.345);
+  otherData.forces.push_back(force);
+  CPPUNIT_ASSERT( *data != otherData );
+  force.clear();
+  force.push_back(-2.35);
+  force.push_back(-0.54);
+  force.push_back(0.345);
+  otherData.forces.push_back( force );
+  CPPUNIT_ASSERT( *data == otherData );
+
+  // change energy
+  otherData.energy = -4;
+  CPPUNIT_ASSERT( *data != otherData );
+  otherData.energy = -37.3479855;
+  CPPUNIT_ASSERT( *data == otherData );
+
+  // change force component
+  otherData.forces[0][2] = -4;
+  CPPUNIT_ASSERT( *data != otherData );
+  otherData.forces[0][2] = 0.345;
+  CPPUNIT_ASSERT( *data == otherData );
+
+  // check sensibility
+  otherData.energy -= 1e-1*std::numeric_limits<double>::epsilon();
+  CPPUNIT_ASSERT( *data == otherData );
+  otherData.forces[1][0] -= 1e-1*std::numeric_limits<double>::epsilon();
+  CPPUNIT_ASSERT( *data == otherData );
+}
+
+/** UnitTest for serialization
+ */
+void MPQCDataTest::serializationTest()
+{
+  // serialize
+  std::stringstream outputstream;
+  boost::archive::text_oarchive oa(outputstream);
+  oa << data;
+
+  // deserialize
+  MPQCData *extractedData;
+  std::stringstream returnstream(outputstream.str());
+  boost::archive::text_iarchive ia(returnstream);
+  ia >> extractedData;
+
+  CPPUNIT_ASSERT( *data == *extractedData );
+
+  delete extractedData;
+}
Index: src/Jobs/unittests/MPQCDataUnitTest.hpp
===================================================================
--- src/Jobs/unittests/MPQCDataUnitTest.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/unittests/MPQCDataUnitTest.hpp	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,42 @@
+/*
+ * MPQCDataUnitTest.hpp
+ *
+ *  Created on: Feb 9, 2012
+ *      Author: heber
+ */
+
+#ifndef MPQCDATAUNITTEST_HPP_
+#define MPQCDATAUNITTEST_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+class MPQCData;
+
+
+/********************************************** Test classes **************************************/
+
+class MPQCDataTest : public CppUnit::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MPQCDataTest) ;
+    CPPUNIT_TEST ( operatorTest );
+    CPPUNIT_TEST ( serializationTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+      void setUp();
+      void tearDown();
+      void operatorTest();
+      void serializationTest();
+
+private:
+      MPQCData *data;
+};
+
+#endif /* MPQCDATAUNITTEST_HPP_ */
Index: src/Jobs/unittests/Makefile.am
===================================================================
--- src/Jobs/unittests/Makefile.am	(revision cc5db582dad56745fce8f970d96f7197f1842609)
+++ src/Jobs/unittests/Makefile.am	(revision cc5db582dad56745fce8f970d96f7197f1842609)
@@ -0,0 +1,51 @@
+# PLEASE adhere to the alphabetical ordering in this Makefile!
+# Also indentation by a single tab
+
+JOBSTESTSSOURCES = \
+  ../Jobs/unittests/MPQCCommandJobUnitTest.cpp \
+  ../Jobs/unittests/MPQCDataUnitTest.cpp
+  
+JOBSTESTSHEADERS = \
+  ../Jobs/unittests/MPQCCommandJobUnitTest.hpp \
+  ../Jobs/unittests/MPQCDataUnitTest.hpp
+
+JOBSTESTS = \
+  MPQCCommandJobUnitTest \
+  MPQCDataUnitTest
+
+
+TESTS += $(JOBSTESTS)
+check_PROGRAMS += $(JOBSTESTS) 
+noinst_PROGRAMS += $(JOBSTESTS)
+
+JOBSLIBS = \
+  ../libMolecuilderJobs.la \
+  $(BOOST_SERIALIZATION_LDFLAGS) $(BOOST_SERIALIZATION_LIBS) \
+  $(BOOST_THREAD_LDFLAGS) $(BOOST_THREAD_LIBS) \
+  $(BOOST_SYSTEM_LDFLAGS) $(BOOST_SYSTEM_LIBS) \
+  ${CodePatterns_LIBS}
+
+MPQCCommandJobUnitTest_LDFLAGS = ${CodePatterns_LIBS} $(CPPUNIT_LIBS) -ldl
+MPQCCommandJobUnitTest_CPPFLAGS = ${BOOST_CPPFLAGS} $(CPPUNIT_CFLAGS) ${CodePatterns_CFLAGS}
+MPQCCommandJobUnitTest_SOURCES = $(top_srcdir)/src/unittests/UnitTestMain.cpp \
+  ../Jobs/unittests/MPQCCommandJobUnitTest.cpp \
+  ../Jobs/unittests/MPQCCommandJobUnitTest.hpp
+MPQCCommandJobUnitTest_LDADD = \
+  ../libMolecuilderJobs.la \
+  $(top_builddir)/src/Fragmentation/Automation/libMolecuilderFragmentJobs.la \
+  $(BOOST_SERIALIZATION_LDFLAGS) $(BOOST_SERIALIZATION_LIBS) \
+  $(BOOST_SYSTEM_LDFLAGS) $(BOOST_SYSTEM_LIBS) \
+  ${CodePatterns_LIBS}
+
+MPQCDataUnitTest_LDFLAGS = ${CodePatterns_LIBS} $(CPPUNIT_LIBS) -ldl
+MPQCDataUnitTest_CPPFLAGS = ${BOOST_CPPFLAGS} $(CPPUNIT_CFLAGS) ${CodePatterns_CFLAGS}
+MPQCDataUnitTest_SOURCES = $(top_srcdir)/src/unittests/UnitTestMain.cpp \
+  ../Jobs/unittests/MPQCDataUnitTest.cpp \
+  ../Jobs/unittests/MPQCDataUnitTest.hpp
+MPQCDataUnitTest_LDADD = \
+  ../libMolecuilderJobs.la \
+  $(BOOST_SERIALIZATION_LDFLAGS) $(BOOST_SERIALIZATION_LIBS) \
+  $(BOOST_SYSTEM_LDFLAGS) $(BOOST_SYSTEM_LIBS) \
+  ${CodePatterns_LIBS}
+
+#AUTOMAKE_OPTIONS = parallel-test
