Index: src/Parser/TremoloParser.cpp
===================================================================
--- src/Parser/TremoloParser.cpp	(revision 95b64f4ce04fbedb2a6ac15f3c6399990141f2fa)
+++ src/Parser/TremoloParser.cpp	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -143,18 +143,47 @@
   molecule *newmol = World::getInstance().createMolecule();
   newmol->ActiveFlag = true;
+  usedFields_t usedFields_temp;
+  size_t timestep = 0;
+  atom *addedatom = NULL;
+  std::vector<atom *> addedatoms;
+  std::vector<atom *>::iterator atomiter = addedatoms.begin();
   while (file->good()) {
     std::getline(*file, line, '\n');
     // we only parse in the first ATOMDATA line
-    if (usedFields_load.empty()) {
-      location = line.find("ATOMDATA", 0);
-      if (location != string::npos) {
-       parseAtomDataKeysLine(line, location + 8, usedFields_load);
+    location = line.find("ATOMDATA", 0);
+    if (location != string::npos) {
+      parseAtomDataKeysLine(line, location + 8, usedFields_temp);
+      if (usedFields_load.empty()) {
+        // first ATOMDATA: use this line
+        usedFields_load.insert(usedFields_load.end(), usedFields_temp.begin(), usedFields_temp.end());
+        usedFields_temp.clear();
+        LOG(3, "DEBUG: Local usedFields is: " << usedFields_load);
+      } else {
+        // following ATOMDATA: check against present
+        LOG(3, "DEBUG: Parsed check usedFields is: " << usedFields_temp);
+        if (usedFields_load != usedFields_temp) {
+          ELOG(1, "File contains multiple time steps with differing ATOMDATA line, parsing only first time step.");
+          break;
+        } else {
+          // update time step
+          ++timestep;
+          atomiter = addedatoms.begin();
+        }
+      }
+    } else {
+      if (line.length() > 0 && line.at(0) != '#') {
+        if (timestep != 0) {
+          ASSERT( atomiter != addedatoms.end(),
+              "FormatParser< tremolo >::load() - timesteps contains more atoms than first one.");
+          addedatom = *atomiter++;
+        }
+        readAtomDataLine(line, newmol, timestep, addedatom);
+        if (timestep == 0)
+          addedatoms.push_back(addedatom);
       }
     }
-    if (line.length() > 0 && line.at(0) != '#') {
-      readAtomDataLine(line, newmol);
-    }
-  }
-  LOG(3, "DEBUG: Local usedFields is: " << usedFields_load);
+  }
+  ASSERT( addedatoms.size() == newmol->size(),
+      "FormatParser< tremolo >::load() - number of atoms in mol and addedatoms differ.");
 
   // refresh atom::nr and atom::name
@@ -692,10 +721,25 @@
  * \param line to parse as an atom
  * \param *newmol molecule to add atom to
- */
-void FormatParser< tremolo >::readAtomDataLine(const std::string &line, molecule *newmol) {
+ * \param _timestep time step to parse to
+ * \param _addedatom ref to added atom
+ */
+void FormatParser< tremolo >::readAtomDataLine(
+    const std::string &line,
+    molecule *newmol,
+    const size_t _timestep,
+    atom *&_addedatoms)
+{
   std::stringstream lineStream;
-  atom* newAtom = World::getInstance().createAtom();
-  const atomId_t atomid = newAtom->getId();
-  additionalAtomData[atomid] = TremoloAtomInfoContainer(); // fill with default values
+  atom* newAtom = NULL;
+  atomId_t atomid = -1;
+  if (_timestep == 0) {
+    newAtom = World::getInstance().createAtom();
+    _addedatoms = newAtom;
+    atomid = newAtom->getId();
+    additionalAtomData[atomid] = TremoloAtomInfoContainer(); // fill with default values
+  } else {
+    newAtom = _addedatoms;
+    atomid = newAtom->getId();
+  }
   TremoloAtomInfoContainer *atomInfo = &additionalAtomData[atomid];
   TremoloKey::atomDataKey currentField;
@@ -727,6 +771,6 @@
         for (int i=0;i<NDIM;i++) {
           ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for x["+toString(i)+"]!");
-          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
-          newAtom->set(i, toDouble(word));
+          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
+          newAtom->setAtStep(i, _timestep, toDouble(word));
           tok_iter++;
         }
@@ -736,9 +780,9 @@
         for (int i=0;i<NDIM;i++) {
           ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for u["+toString(i)+"]!");
-          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
+          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
           tempVector[i] = toDouble(word);
           tok_iter++;
         }
-        newAtom->setAtomicVelocity(tempVector);
+        newAtom->setAtomicVelocityAtStep(_timestep, tempVector);
         break;
       case TremoloKey::F :
@@ -746,14 +790,14 @@
         for (int i=0;i<NDIM;i++) {
           ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for F["+toString(i)+"]!");
-          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
+          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
           tempVector[i] = toDouble(word);
           tok_iter++;
         }
-        newAtom->setAtomicForce(tempVector);
+        newAtom->setAtomicForceAtStep(_timestep, tempVector);
         break;
       case TremoloKey::type :
       {
         ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
-        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
+        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
         std::string elementname;
         const element * elem = NULL;
@@ -787,29 +831,47 @@
       case TremoloKey::Id :
         ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
-        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
-        associateLocaltoGlobalId(toInt(word), atomid);
+        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
+        if (_timestep == 0) {
+          associateLocaltoGlobalId(toInt(word), atomid);
+        } else {
+          // check association is the same
+          ASSERT( (atomId_t)getGlobalId(toInt(word)) == atomid,
+              "FormatParser< tremolo >::readAtomDataLine() - differing global id "+toString(atomid)
+              +" on timestep "+toString(_timestep));
+          ASSERT( getLocalId(atomid) == toInt(word),
+              "FormatParser< tremolo >::readAtomDataLine() - differing local id "+toString(toInt(word))
+              +" on timestep "+toString(_timestep));
+        }
         tok_iter++;
         break;
       case TremoloKey::neighbors :
         for (int i=0;i<atoi(it->substr(it->find("=") + 1, 1).c_str());i++) {
-          ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
-          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
+          ASSERT(tok_iter != tokens.end(),
+              "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
+          if (_timestep == 0)
+            LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
           lineStream << word << "\t";
           tok_iter++;
         }
-        readNeighbors(&lineStream,
-            atoi(it->substr(it->find("=") + 1, 1).c_str()), atomid);
+        if (_timestep == 0) {
+          readNeighbors(&lineStream,
+              atoi(it->substr(it->find("=") + 1, 1).c_str()), atomid);
+        }
         break;
       case TremoloKey::charge :
         ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
-        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
-        atomInfo->set(currentField, word);
-        newAtom->setCharge(boost::lexical_cast<double>(word));
+        if (_timestep == 0) {
+          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
+          atomInfo->set(currentField, word);
+          newAtom->setCharge(boost::lexical_cast<double>(word));
+        }
         tok_iter++;
         break;
       default :
         ASSERT(tok_iter != tokens.end(), "FormatParser< tremolo >::readAtomDataLine() - no value for "+keyName+"!");
-        LOG(4, "INFO: Parsing key " << keyName << " with next token " << word);
-        atomInfo->set(currentField, word);
+        if (_timestep == 0) {
+          LOG(4, "INFO: Parsing key " << keyName << " with next token " << word << " on step " << _timestep);
+          atomInfo->set(currentField, word);
+        }
         tok_iter++;
         break;
Index: src/Parser/TremoloParser.hpp
===================================================================
--- src/Parser/TremoloParser.hpp	(revision 95b64f4ce04fbedb2a6ac15f3c6399990141f2fa)
+++ src/Parser/TremoloParser.hpp	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -80,5 +80,9 @@
   typedef std::vector<std::string> usedFields_t;
 
-  void readAtomDataLine(const std::string &line, molecule *newmol);
+  void readAtomDataLine(
+      const std::string &line,
+      molecule *newmol,
+      const size_t _timestep,
+      atom *&_addedatoms);
   void parseAtomDataKeysLine(const std::string &line, const int offset, usedFields_t &fields);
   static bool testParseAtomDataKeysLine(const std::string &line);
Index: tests/regression/Makefile.am
===================================================================
--- tests/regression/Makefile.am	(revision 95b64f4ce04fbedb2a6ac15f3c6399990141f2fa)
+++ tests/regression/Makefile.am	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -203,4 +203,5 @@
 	$(srcdir)/Parser/Tremolo/testsuite-parser-tremolo-improper.at \
 	$(srcdir)/Parser/Tremolo/testsuite-parser-tremolo-load.at \
+	$(srcdir)/Parser/Tremolo/testsuite-parser-tremolo-load-multiple-timesteps.at \
 	$(srcdir)/Parser/Tremolo/testsuite-parser-tremolo-load-multiply.at \
 	$(srcdir)/Parser/Tremolo/testsuite-parser-tremolo-save.at \
Index: tests/regression/Parser/Tremolo/post/water_multipletimesteps.data
===================================================================
--- tests/regression/Parser/Tremolo/post/water_multipletimesteps.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
+++ tests/regression/Parser/Tremolo/post/water_multipletimesteps.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -0,0 +1,9 @@
+# ATOMDATA	Id	type	x=3	neighbors=4
+# Box	20	0	0	0	20	0	0	0	20
+1	O	0	0	0	2	3	0	0	
+2	H	0.759	0	0.504	1	0	0	0	
+3	H	0.759	0	-0.504	1	0	0	0	
+# ATOMDATA	Id	type	x=3	neighbors=4
+1	O	0.001	0	0	2	3	0	0	
+2	H	0.761	0	0.504	1	0	0	0	
+3	H	0.761	0	-0.504	1	0	0	0	
Index: tests/regression/Parser/Tremolo/post/water_multipletimesteps_fail.data
===================================================================
--- tests/regression/Parser/Tremolo/post/water_multipletimesteps_fail.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
+++ tests/regression/Parser/Tremolo/post/water_multipletimesteps_fail.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -0,0 +1,4 @@
+# ATOMDATA	Id	type	x=3	neighbors=4
+1	O	0	0	0	2	3	0	0	
+2	H	0.759	0	0.504	1	0	0	0	
+3	H	0.759	0	-0.504	1	0	0	0	
Index: tests/regression/Parser/Tremolo/pre/water_multipletimesteps.data
===================================================================
--- tests/regression/Parser/Tremolo/pre/water_multipletimesteps.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
+++ tests/regression/Parser/Tremolo/pre/water_multipletimesteps.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -0,0 +1,8 @@
+# ATOMDATA	Id	type	x=3	neighbors=4
+1	O	0	0	0	2	3	0	0	
+2	H	0.759	0	0.504	1	0	0	0	
+3	H	0.759	0	-0.504	1	0	0	0	
+# ATOMDATA	Id	type	x=3	neighbors=4
+1	O	0.001	0	0	2	3	0	0	
+2	H	0.761	0	0.504	1	0	0	0	
+3	H	0.761	0	-0.504	1	0	0	0	
Index: tests/regression/Parser/Tremolo/pre/water_multipletimesteps_fail.data
===================================================================
--- tests/regression/Parser/Tremolo/pre/water_multipletimesteps_fail.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
+++ tests/regression/Parser/Tremolo/pre/water_multipletimesteps_fail.data	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -0,0 +1,8 @@
+# ATOMDATA	Id	type	x=3	neighbors=4
+1	O	0	0	0	2	3	0	0	
+2	H	0.759	0	0.504	1	0	0	0	
+3	H	0.759	0	-0.504	1	0	0	0	
+# ATOMDATA	Id	type	x=3	u=3	neighbors=4
+1	O	0.001	0	0	0	0	0	2	3	0	0	
+2	H	0.761	0	0.504	0	0	0	1	0	0	0	
+3	H	0.761	0	-0.504	0	0	0	1	0	0	0	
Index: tests/regression/Parser/Tremolo/testsuite-parser-tremolo-load-multiple-timesteps.at
===================================================================
--- tests/regression/Parser/Tremolo/testsuite-parser-tremolo-load-multiple-timesteps.at	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
+++ tests/regression/Parser/Tremolo/testsuite-parser-tremolo-load-multiple-timesteps.at	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -0,0 +1,65 @@
+#
+#    MoleCuilder - creates and alters molecular systems
+#    Copyright (C) 2017 Frederik Heber
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+### parsing tremolo
+
+
+AT_SETUP([Parser - loading tremolo file with multiple timesteps])
+AT_KEYWORDS([parser load tremolo timesteps])
+# ::save() does not yet support multiple time steps
+AT_XFAIL_IF([/bin/true])
+
+file=water_multipletimesteps.data
+AT_CHECK([../../molecuilder -i $file -o tremolo -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$file], 0, [ignore], [ignore])
+AT_CHECK([diff -w -I '#.*' $file ${abs_top_srcdir}/tests/regression/Parser/Tremolo/post/$file], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Parser - loading tremolo file with multiple timesteps with Undo])
+AT_KEYWORDS([parser load tremolo timesteps undo])
+# with undo we don't notice missing save() implementation
+AT_XFAIL_IF([/bin/false])
+
+file=water_multipletimesteps.data
+AT_CHECK([../../molecuilder -i $file -o tremolo -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$file --undo], 0, [ignore], [ignore])
+AT_CHECK([diff -w -I '#.*' $file ${abs_top_srcdir}/tests/regression/Parser/Tremolo/post/empty.data], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Parser - loading tremolo file with multiple timesteps with Redo])
+AT_KEYWORDS([parser load tremolo redo])
+# ::save() does not yet support multiple time steps
+AT_XFAIL_IF([/bin/true])
+
+file=water_multipletimesteps.data
+AT_CHECK([../../molecuilder -i $file -o tremolo -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$file --undo --redo], 0, [ignore], [ignore])
+AT_CHECK([diff -w -I '#.*' $file ${abs_top_srcdir}/tests/regression/Parser/Tremolo/post/$file], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+AT_SETUP([Parser - loading tremolo file with multiple timesteps fail])
+AT_KEYWORDS([parser load tremolo timesteps])
+
+file=water_multipletimesteps_fail.data
+AT_CHECK([../../molecuilder -i $file -o tremolo -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$file], 0, [ignore], [ignore])
+AT_CHECK([diff -w -I '#.*' $file ${abs_top_srcdir}/tests/regression/Parser/Tremolo/post/$file], 0, [ignore], [ignore])
+
+AT_CLEANUP
+
+
Index: tests/regression/Parser/testsuite-parser.at
===================================================================
--- tests/regression/Parser/testsuite-parser.at	(revision 95b64f4ce04fbedb2a6ac15f3c6399990141f2fa)
+++ tests/regression/Parser/testsuite-parser.at	(revision efc80ef549eeaa87e6de7ecddb9bbcf6b0387276)
@@ -66,4 +66,5 @@
 m4_include([Parser/Tremolo/testsuite-parser-tremolo-improper.at])
 m4_include([Parser/Tremolo/testsuite-parser-tremolo-load.at])
+m4_include([Parser/Tremolo/testsuite-parser-tremolo-load-multiple-timesteps.at])
 m4_include([Parser/Tremolo/testsuite-parser-tremolo-load-multiply.at])
 m4_include([Parser/Tremolo/testsuite-parser-tremolo-save.at])
