Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/Makefile.am	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -11,6 +11,6 @@
 ACTIONSHEADER = Actions/Action.hpp Actions/Process.hpp Actions/Calculation.hpp Actions/Calculation_impl.hpp Actions/MethodAction.hpp Actions/ActionSequence.hpp Actions/MakroAction.hpp Actions/ErrorAction.hpp Actions/small_actions.hpp Actions/ManipulateAtomsProcess.hpp Actions/ActionRegistry.hpp
 
-PARSERSOURCE = Parser/ChangeTracker.cpp Parser/FormatParser.cpp Parser/XyzParser.cpp
-PARSERHEADER = Parser/ChangeTracker.hpp Parser/FormatParser.hpp Parser/XyzParser.hpp
+PARSERSOURCE = Parser/ChangeTracker.cpp Parser/FormatParser.cpp Parser/TremoloParser.cpp Parser/XyzParser.cpp
+PARSERHEADER = Parser/ChangeTracker.hpp Parser/FormatParser.hpp Parser/TremoloParser.hpp Parser/XyzParser.hpp
 
 PATTERNSOURCE = Patterns/Observer.cpp
Index: src/Parser/FormatParser.cpp
===================================================================
--- src/Parser/FormatParser.cpp	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/Parser/FormatParser.cpp	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -7,4 +7,5 @@
 
 #include "FormatParser.hpp"
+#include <iostream>
 
 using namespace std;
@@ -31,5 +32,6 @@
 void FormatParser::update(Observable *publisher) {
   if (!saveStream) {
-//    throw new Exception("Please invoke setOfstream() so the parser knows where to save the World's data.");
+    cerr << "Please invoke setOstream() so the parser knows where to save the World's data." << endl;
+    return;
   }
 
Index: src/Parser/TremoloParser.cpp
===================================================================
--- src/Parser/TremoloParser.cpp	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/Parser/TremoloParser.cpp	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -6,16 +6,140 @@
  */
 
-void TremoloParser::load(char* fileName) {
-MatrixContainer* data = readData(fileName, getHeaderSize('#'), 0);
-store additional data
-for (each line in matrix) {
-  add atom to the world
-}
+#include "TremoloParser.hpp"
+#include "World.hpp"
+#include "atom.hpp"
+#include "element.hpp"
+#include "periodentafel.hpp"
+#include <map>
+#include <vector>
+
+using namespace std;
+
+/**
+ * Constructor.
+ */
+TremoloParser::TremoloParser() {
+  knownKeys["x"] = x;
+  knownKeys["u"] = u;
+  knownKeys["F"] = F;
+  knownKeys["stress"] = stress;
+  knownKeys["Id"] = Id;
+  knownKeys["neighbors"] = neighbors;
+  knownKeys["imprData"] = imprData;
+  knownKeys["GroupMeasureTypeNo"] = GroupMeasureTypeNo;
+  knownKeys["Type"] = Type;
+  knownKeys["extType"] = extType;
+  knownKeys["name"] = name;
+  knownKeys["resName"] = resName;
+  knownKeys["chainID"] = chainID;
+  knownKeys["resSeq"] = resSeq;
+  knownKeys["occupancy"] = occupancy;
+  knownKeys["tempFactor"] = tempFactor;
+  knownKeys["segID"] = segID;
+  knownKeys["Charge"] = Charge;
+  knownKeys["charge"] = charge;
+  knownKeys["GrpTypeNo"] = GrpTypeNo;
 }
 
-void TremoloParser::save(char* fileName) {
+/**
+ * Destructor.
+ */
+TremoloParser::~TremoloParser() {
+}
+
+/**
+ * Stores keys from the ATOMDATA line.
+ *
+ * \param line to parse the keys from
+ * \param with which offset the keys begin within the line
+ */
+void TremoloParser::parseAtomDataKeysLine(string line, int offset) {
+  string keyword;
+  stringstream lineStream;
+
+  lineStream << line.substr(offset);
+  while (lineStream.good()) {
+    lineStream >> keyword;
+    usedFields.push_back(keyword);
+  }
+}
+
+/**
+ * Reads one data line of a tremolo file and interprets it according to the keys
+ * obtained from the ATOMDATA line.
+ *
+ * \param line to parse as an atom
+ */
+void TremoloParser::readAtomDataLine(string line) {
+  vector<string>::iterator it;
+  stringstream lineStream;
+  string word;
+
+  lineStream << line;
+  for (it=usedFields.begin(); it < usedFields.end(); it++) {
+    cout << *it << " -- " << it->substr(0, it->find("=")) << " -- " << knownKeys[it->substr(0, it->find("="))] << endl;
+    switch (knownKeys[it->substr(0, it->find("="))]) {
+      case x :
+        lineStream >> word;
+        cout<< "Found an x: word: " << word << endl;
+        break;
+      default :
+        lineStream >> word;
+        cout << "Unknown key: " << *it << ", word: " << word << endl;
+        break;
+    }
+  }
+}
+
+
+/**
+ * Loads atoms from a tremolo-formatted file.
+ *
+ * \param tremolo file
+ */
+void TremoloParser::load(istream* file) {
+  string line;
+  string::size_type location;
+
+  usedFields.clear();
+  while (file->good()) {
+    std::getline(*file, line, '\n');
+    if (usedFields.empty()) {
+      location = line.find("ATOMDATA", 0);
+      if (location != string::npos) {
+       parseAtomDataKeysLine(line, location + 8);
+      }
+    }
+    if (line.length() > 0 && line.at(0) != '#') {
+      readAtomDataLine(line);
+    }
+  }
+}
+
+/*
+#ATOMDATA  <record_entry_1> ... <record_entry_n>
+# <record_entry>: <dataname>[=<n>]
+# <dataname>    : x | u | F | stress | Id | neighbors | imprData
+#               | GroupMeasureTypeNo | Type | extType
+#               | name | resName | chainID | resSeq
+#               | occupancy | tempFactor | segID | Charge
+#               | charge
+ATOMDATA name Id x=3 mass charge epsilon sigma eps14 sig14 name type protein protno neighbors=4
+*/
+
+//MatrixContainer* data = readData(fileName, getHeaderSize('#'), 0);
+
+
+/**
+ * Saves the World's current state into as a tremolo file.
+ *
+ * \param file where to save the state
+ */
+void TremoloParser::save(ostream* file) {
+/*
 write header
 for (each atom in world) {
   write coordinates and additional data
 }
+*/
 }
Index: src/Parser/TremoloParser.hpp
===================================================================
--- src/Parser/TremoloParser.hpp	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/Parser/TremoloParser.hpp	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -9,14 +9,60 @@
 #define TREMOLOPARSER_HPP_
 
+#include <string>
 #include "FormatParser.hpp"
-#include "World.hpp"
 
-class TremoloParser : public FormatParser {
+class TremoloParser:public FormatParser
+{
 public:
-  void load(char* fileName);
-  void save(char* fileName);
+  TremoloParser();
+  ~TremoloParser();
+  void load(std::istream* file);
+  void save(std::ostream* file);
 
 private:
-  map<std::string, std::string> moreData;
+  void readAtomDataLine(string line);
+  void parseAtomDataKeysLine(string line, int offset);
+
+  /**
+   * Known keys for the ATOMDATA line.
+   */
+  enum StringValue {
+    x,
+    u,
+    F,
+    stress,
+    Id,
+    neighbors,
+    imprData,
+    GroupMeasureTypeNo,
+    Type,
+    extType,
+    name,
+    resName,
+    chainID,
+    resSeq,
+    occupancy,
+    tempFactor,
+    segID,
+    Charge,
+    charge,
+    GrpTypeNo
+  };
+
+  /**
+   * Map to associate the known keys with numbers.
+   */
+  std::map<std::string, StringValue> knownKeys;
+
+  /**
+   * Fields used in the tremolo file.
+   */
+  std::vector<std::string> usedFields;
+
+  /**
+   * Data which is currently not stored in atoms but was provided by the input
+   * file.
+   */
+  std::map<std::string, std::string> moreData;
 };
 
Index: src/unittests/Makefile.am
===================================================================
--- src/unittests/Makefile.am	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/unittests/Makefile.am	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -55,5 +55,4 @@
   bondgraphunittest.cpp \
   CacheableTest.cpp \
-  DescriptorUnittest.cpp \
   gslmatrixsymmetricunittest.cpp \
   gslmatrixunittest.cpp \
Index: src/unittests/ParserUnitTest.cpp
===================================================================
--- src/unittests/ParserUnitTest.cpp	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/unittests/ParserUnitTest.cpp	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -13,4 +13,5 @@
 
 #include "Parser/XyzParser.hpp"
+#include "Parser/TremoloParser.hpp"
 #include "World.hpp"
 #include "element.hpp"
@@ -45,4 +46,5 @@
 
 void ParserUnitTest::rewriteAnXyzTest() {
+  cout << "Testing the XYZ parser." << endl;
   XyzParser* testParser = new XyzParser();
   string waterXyz = "3\nH2O: water molecule\nO\t0.000000\t0.000000\t0.000000\nH\t0.758602\t0.000000\t0.504284\nH\t0.758602\t0.000000\t-0.504284\n";
@@ -61,2 +63,15 @@
 }
 
+void ParserUnitTest::rewriteTremoloTest() {
+  cout << "Testing the tremolo parser." << endl;
+  TremoloParser* testParser = new TremoloParser();
+  string waterTremolo = "#\n# ATOMDATA Id name Type x=3\n\n\n";
+  stringstream input;
+  input << waterTremolo;
+  testParser->load(&input);
+  waterTremolo = "#\n#ATOMDATA Id name Type x=3\n1 H hydrogen 3.0 4.5 0.1\n\n";
+  input.clear();
+  input << waterTremolo;
+  testParser->load(&input);
+  cout << "testing the tremolo parser is done" << endl;
+}
Index: src/unittests/ParserUnitTest.hpp
===================================================================
--- src/unittests/ParserUnitTest.hpp	(revision cb2146212f0e6343f8c302f924a2e8bfb3401b6e)
+++ src/unittests/ParserUnitTest.hpp	(revision 9131f3237e4267925646cb453f950b49e3540f7f)
@@ -15,4 +15,5 @@
   CPPUNIT_TEST_SUITE( ParserUnitTest ) ;
   CPPUNIT_TEST ( rewriteAnXyzTest );
+  CPPUNIT_TEST ( rewriteTremoloTest );
   CPPUNIT_TEST_SUITE_END();
 
@@ -22,4 +23,5 @@
 
   void rewriteAnXyzTest();
+  void rewriteTremoloTest();
 };
 
