Index: src/Actions/UndoRedoHelpers.cpp
===================================================================
--- src/Actions/UndoRedoHelpers.cpp	(revision 06070b7a13e23eedd9701b62d229b17677769304)
+++ src/Actions/UndoRedoHelpers.cpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
@@ -36,5 +36,5 @@
   for (; i<atoms.size(); ++i) {
     // re-create the atom
-    LOG(1, "Re-adding atom " << atoms[i].getId() << ".");
+    LOG(3, "DEBUG: Re-adding atom " << atoms[i].getId() << ".");
     atom *Walker = World::getInstance().createAtom();
     if (!atoms[i].setAtom(*Walker)) {
@@ -59,4 +59,29 @@
     World::getInstance().destroyAtom(_atom.getId());
   }
+}
+
+void MoleCuilder::StoreBondInformationFromAtoms(
+    const std::vector<const atom*> &atoms,
+    std::vector< BondInfo > &bonds)
+{
+  ASSERT( bonds.empty(),
+      "StoreBondInformationFromAtoms() - give bonds vector is not empty.");
+  bonds.reserve(atoms.size()*4);
+  for (std::vector<const atom*>::const_iterator atomiter = atoms.begin();
+      atomiter != atoms.end(); ++atomiter) {
+    const BondList & _atom_bonds = (*atomiter)->getListOfBonds();
+    for(BondList::const_iterator iter = _atom_bonds.begin(); iter != _atom_bonds.end(); ++iter)
+      bonds.push_back( BondInfo(*iter) );
+  }
+}
+
+bool MoleCuilder::AddBondsFromBondInfo(const std::vector< BondInfo > &bonds)
+{
+  bool status = true;
+  for(std::vector< BondInfo >::const_iterator iter = bonds.begin();
+      iter != bonds.end(); ++iter)
+    if (!(*iter).RecreateBond())
+      status = false;
+  return status;
 }
 
Index: src/Actions/UndoRedoHelpers.hpp
===================================================================
--- src/Actions/UndoRedoHelpers.hpp	(revision 06070b7a13e23eedd9701b62d229b17677769304)
+++ src/Actions/UndoRedoHelpers.hpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
@@ -18,4 +18,5 @@
 
 #include "Atom/AtomicInfo.hpp"
+#include "Bond/BondInfo.hpp"
 
 namespace MoleCuilder {
@@ -33,4 +34,20 @@
    */
   void RemoveAtomsFromAtomicInfo(std::vector<AtomicInfo> &atoms);
+
+  /** Stores the required bond information in for all \a atoms in \a bonds.
+   *
+   * @param atoms atoms whose bonds to store
+   * @param bonds vector with bond information on return
+   */
+  void StoreBondInformationFromAtoms(
+      const std::vector<const atom*> &atoms,
+      std::vector<BondInfo> &bonds);
+
+  /** Recreates bonds from information stored in \a bonds.
+   *
+   * @param bonds bond state information
+   * @return true - all bonds restored, false - at least one bond could not be restored
+   */
+  bool AddBondsFromBondInfo(const std::vector< BondInfo > &bonds);
 
   /** Sets atoms to state information stored as AtomicInfo.
Index: src/Bond/BondInfo.cpp
===================================================================
--- src/Bond/BondInfo.cpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
+++ src/Bond/BondInfo.cpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+/*
+ * BondInfo.cpp
+ *
+ *  Created on: Apr 5, 2012
+ *      Author: heber
+ */
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "BondInfo.hpp"
+
+#include <algorithm>
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+
+#include "Atom/atom.hpp"
+#include "Bond/bond.hpp"
+#include "CodePatterns/Log.hpp"
+#include "Descriptors/AtomIdDescriptor.hpp"
+#include "World.hpp"
+#include "WorldTime.hpp"
+
+BondInfo::BondInfo(const bond * _bond) :
+  leftid(_bond->leftatom->getId()),
+  rightid(_bond->rightatom->getId()),
+  degree(_bond->BondDegree)
+{}
+
+bool BondInfo::RecreateBond() const
+{
+  atom * const leftatom = World::getInstance().getAtom(AtomById(leftid));
+  atom * const rightatom = World::getInstance().getAtom(AtomById(rightid));
+  if ((leftatom == NULL) || (rightatom == NULL)) {
+    ELOG(1, "Either of the two atoms " << leftid << " or "
+        << rightid << " does not exists in the world.");
+    return false;
+  }
+  const BondList &leftbonds = leftatom->getListOfBonds();
+  boost::function< bool (const bond *)> predicate =
+      boost::bind(static_cast<bool (bond::*)(const int) const>(&bond::Contains), _1, rightid);
+  if (std::find_if(leftbonds.begin(), leftbonds.end(), predicate) != leftbonds.end())
+    return false;
+
+  const BondList &rightbonds = rightatom->getListOfBonds();
+  if (std::find_if(rightbonds.begin(), rightbonds.end(), predicate) != rightbonds.end())
+    return false;
+
+  // create bond
+  LOG(3, "DEBUG: Re-creating bond " << leftid << "<->" << rightid << ".");
+  bond * const _bond = leftatom->addBond(WorldTime::getTime(), rightatom);
+  _bond->BondDegree = degree;
+  return true;
+}
Index: src/Bond/BondInfo.hpp
===================================================================
--- src/Bond/BondInfo.hpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
+++ src/Bond/BondInfo.hpp	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
@@ -0,0 +1,51 @@
+/*
+ * BondInfo.hpp
+ *
+ *  Created on: Apr 5, 2012
+ *      Author: heber
+ */
+
+#ifndef BONDINFO_HPP_
+#define BONDINFO_HPP_
+
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "types.hpp"
+
+class bond;
+
+/** Structure for containing bond state information.
+ *
+ * This is used for re-creating bonds during undo/redo of Action's.
+ *
+ */
+struct BondInfo {
+  /** Constructor that takes state information from \a _bond.
+   *
+   * @param _bond bond whose state to store
+   */
+  BondInfo(const bond * _bond);
+
+  /** Recreates the bond whose state is contained in this BondInfo.
+   *
+   * @return true - bond created, false - bond already exists
+   */
+  bool RecreateBond() const;
+
+  //!> id of left bond partner
+  atomId_t leftid;
+
+  //!> id of right bond partner
+  atomId_t rightid;
+
+  //!> bond degree
+  size_t degree;
+};
+
+
+
+#endif /* BONDINFO_HPP_ */
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 06070b7a13e23eedd9701b62d229b17677769304)
+++ src/Makefile.am	(revision af9be32aa2e588261aae3f3bcec741a12087b34c)
@@ -29,4 +29,5 @@
 	Bond/bond.cpp \
 	Bond/bond_observable.cpp \
+	Bond/BondInfo.cpp \
 	Bond/GraphEdge.cpp
 
@@ -34,4 +35,5 @@
 	Bond/bond.hpp \
 	Bond/bond_observable.hpp \
+	Bond/BondInfo.hpp \
 	Bond/GraphEdge.hpp
 
