Index: src/Actions/GraphAction/CreateAdjacencyAction.cpp
===================================================================
--- src/Actions/GraphAction/CreateAdjacencyAction.cpp	(revision f2fda61612d15d768b57a21c2e5147bd9c1e1cdd)
+++ src/Actions/GraphAction/CreateAdjacencyAction.cpp	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -35,4 +35,5 @@
 #include "CodePatterns/MemDebug.hpp"
 
+#include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
 
@@ -50,4 +51,11 @@
 using namespace MoleCuilder;
 
+// Storing undo state
+struct BondInfo_t {
+  atomId_t leftatom;
+  atomId_t rightatom;
+  size_t degree;
+};
+
 // and construct the stuff
 #include "CreateAdjacencyAction.def"
@@ -58,7 +66,45 @@
   ASSERT(BG != NULL, "GraphCreateAdjacencyAction: BondGraph is NULL.");
 
+  // count all present bonds
   World::AtomComposite Set = World::getInstance().getAllAtoms(AtomsBySelection());
+  std::vector<BondInfo_t> bonds;
+  {
+    size_t count_bonds = 0;
+    for (World::AtomComposite::const_iterator iter = Set.begin();
+        iter != Set.end();
+        ++iter) {
+      const atom * const Walker = *iter;
+      count_bonds += Walker->getListOfBonds().size();
+    }
+    bonds.reserve(count_bonds/2);
+  }
+  // Storing undo info
+  for (World::AtomComposite::const_iterator iter = Set.begin();
+      iter != Set.end();
+      ++iter) {
+    const atom * const Walker = *iter;
+    const BondList& ListOfBonds = Walker->getListOfBonds();
+    for (BondList::const_iterator bonditer = ListOfBonds.begin();
+        bonditer != ListOfBonds.end();
+        ++bonditer) {
+      const bond::ptr &CurrentBond = *bonditer;
+      // if both atoms are in selected set, we check ids otherwise not
+      if (((!World::getInstance().isSelected(CurrentBond->leftatom))
+          || (!World::getInstance().isSelected(CurrentBond->rightatom)))
+          || (CurrentBond->leftatom->getId() < CurrentBond->rightatom->getId())) {
+        BondInfo_t BondInfo;
+        BondInfo.leftatom = CurrentBond->leftatom->getId();
+        BondInfo.rightatom = CurrentBond->rightatom->getId();
+        BondInfo.degree = CurrentBond->BondDegree;
+        bonds.push_back(BondInfo);
+      }
+    }
+  }
+  GraphCreateAdjacencyState *UndoState = new GraphCreateAdjacencyState(bonds, params);
+
+  // now recreate adjacency
   BG->CreateAdjacency(Set);
 
+  // give info
   size_t BondCount = 0;
   std::vector<molecule *> molecules = World::getInstance().getAllMolecules();
@@ -68,23 +114,51 @@
   LOG(0, "STATUS: Recognized " << BondCount << " bonds.");
 
-  return Action::success;
+  return Action::state_ptr(UndoState);
 }
 
 Action::state_ptr GraphCreateAdjacencyAction::performUndo(Action::state_ptr _state) {
-//  GraphCreateAdjacencyState *state = assert_cast<GraphCreateAdjacencyState*>(_state.get());
+  GraphCreateAdjacencyState *state = assert_cast<GraphCreateAdjacencyState*>(_state.get());
 
-  return Action::success;
+  BondGraph *BG = World::getInstance().getBondGraph();
+  ASSERT(BG != NULL, "GraphCreateAdjacencyAction: BondGraph is NULL.");
+
+  // remove all bonds in the set
+  World::AtomComposite Set = World::getInstance().getAllAtoms(AtomsBySelection());
+  BG->cleanAdjacencyList(Set);
+
+  // recreate from stored info
+  const size_t CurrentTime = WorldTime::getTime();
+  std::vector<BondInfo_t> &bonds = state->bonds;
+  for(std::vector<BondInfo_t>::const_iterator iter = bonds.begin();
+      iter != bonds.end(); ++iter) {
+    atom * const Walker = World::getInstance().getAtom(AtomById(iter->leftatom));
+    ASSERT( Walker != NULL,
+        "GraphCreateAdjacencyAction::performUndo() - "+toString(iter->leftatom)+" missing.");
+    atom * const OtherWalker = World::getInstance().getAtom(AtomById(iter->rightatom));
+    ASSERT( OtherWalker != NULL,
+        "GraphCreateAdjacencyAction::performUndo() - "+toString(iter->rightatom)+" missing.");
+    bond::ptr CurrentBond = Walker->addBond(CurrentTime, OtherWalker);
+    CurrentBond->BondDegree = iter->degree;
+  }
+  return Action::state_ptr(_state);
 }
 
 Action::state_ptr GraphCreateAdjacencyAction::performRedo(Action::state_ptr _state){
-  return Action::success;
+  BondGraph *BG = World::getInstance().getBondGraph();
+  ASSERT(BG != NULL, "GraphCreateAdjacencyAction: BondGraph is NULL.");
+
+  // now recreate adjacency
+  World::AtomComposite Set = World::getInstance().getAllAtoms(AtomsBySelection());
+  BG->CreateAdjacency(Set);
+
+  return Action::state_ptr(_state);
 }
 
 bool GraphCreateAdjacencyAction::canUndo() {
-  return false;
+  return true;
 }
 
 bool GraphCreateAdjacencyAction::shouldUndo() {
-  return false;
+  return true;
 }
 /** =========== end of function ====================== */
Index: src/Actions/GraphAction/CreateAdjacencyAction.def
===================================================================
--- src/Actions/GraphAction/CreateAdjacencyAction.def	(revision f2fda61612d15d768b57a21c2e5147bd9c1e1cdd)
+++ src/Actions/GraphAction/CreateAdjacencyAction.def	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -7,7 +7,8 @@
 
 // all includes and forward declarations necessary for non-integral types below
+#include <vector>
+#include "types.hpp"
 
-
-#include "Parameters/Validators/DummyValidator.hpp"
+struct BondInfo_t;
 
 // i.e. there is an integer with variable name Z that can be found in
@@ -21,6 +22,6 @@
 #undef paramvalids
 
-#undef statetypes
-#undef statereferences
+#define statetypes (std::vector<BondInfo_t>)
+#define statereferences (bonds)
 
 // some defines for all the names, you may use ACTION, STATE and PARAMS
Index: tests/regression/Graph/CreateAdjacency/post/ethane-half.pdb
===================================================================
--- tests/regression/Graph/CreateAdjacency/post/ethane-half.pdb	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
+++ tests/regression/Graph/CreateAdjacency/post/ethane-half.pdb	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -0,0 +1,13 @@
+REMARK created by molecuilder on Fri Mar  1 19:45:11 2013, time step 0
+ATOM      1 C01 0eth 01          3.125  10.442  10.000  0.00  0.00           C 0
+ATOM      2 C02 0eth 01          4.374   9.559  10.000  0.00  0.00           C 0
+ATOM      3 H01 0eth 01          3.125  11.071   9.110  0.00  0.00           H 0
+ATOM      4 H02 0eth 01          3.125  11.071  10.890  0.00  0.00           H 0
+ATOM      5 H03 0eth 01          4.374   8.929   9.110  0.00  0.00           H 0
+ATOM      6 H04 0eth 01          4.374   8.929  10.890  0.00  0.00           H 0
+ATOM      7 H05 0eth 01          2.235   9.813  10.000  0.00  0.00           H 0
+ATOM      8 H06 0eth 01          5.264  10.188  10.000  0.00  0.00           H 0
+CONECT    5    2                                                                
+CONECT    6    2                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Graph/CreateAdjacency/post/ethane.pdb
===================================================================
--- tests/regression/Graph/CreateAdjacency/post/ethane.pdb	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
+++ tests/regression/Graph/CreateAdjacency/post/ethane.pdb	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -0,0 +1,18 @@
+REMARK created by molecuilder on Fri Mar  1 19:45:11 2013, time step 0
+ATOM      1 C01 0eth 01          3.125  10.442  10.000  0.00  0.00           C 0
+ATOM      2 C02 0eth 01          4.374   9.559  10.000  0.00  0.00           C 0
+ATOM      3 H01 0eth 01          3.125  11.071   9.110  0.00  0.00           H 0
+ATOM      4 H02 0eth 01          3.125  11.071  10.890  0.00  0.00           H 0
+ATOM      5 H03 0eth 01          4.374   8.929   9.110  0.00  0.00           H 0
+ATOM      6 H04 0eth 01          4.374   8.929  10.890  0.00  0.00           H 0
+ATOM      7 H05 0eth 01          2.235   9.813  10.000  0.00  0.00           H 0
+ATOM      8 H06 0eth 01          5.264  10.188  10.000  0.00  0.00           H 0
+CONECT    1    2    3    4    7                                                 
+CONECT    2    1    5    6    8                                                 
+CONECT    3    1                                                                
+CONECT    4    1                                                                
+CONECT    5    2                                                                
+CONECT    6    2                                                                
+CONECT    7    1                                                                
+CONECT    8    2                                                                
+END
Index: tests/regression/Graph/CreateAdjacency/pre/ethane.xyz
===================================================================
--- tests/regression/Graph/CreateAdjacency/pre/ethane.xyz	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
+++ tests/regression/Graph/CreateAdjacency/pre/ethane.xyz	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -0,0 +1,10 @@
+8
+	Created by molecuilder on Fri Mar  1 19:45:11 2013, time step 0
+C	3.125	10.442	10.000
+C	4.374	9.559	10.000
+H	3.125	11.071	9.110
+H	3.125	11.071	10.890
+H	4.374	8.929	9.110
+H	4.374	8.929	10.890
+H	2.235	9.813	10.000
+H	5.264	10.188	10.000
Index: tests/regression/Graph/CreateAdjacency/testsuite-graph-create-adjacency.at
===================================================================
--- tests/regression/Graph/CreateAdjacency/testsuite-graph-create-adjacency.at	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
+++ tests/regression/Graph/CreateAdjacency/testsuite-graph-create-adjacency.at	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -0,0 +1,78 @@
+#
+#    MoleCuilder - creates and alters molecular systems
+#    Copyright (C) 2008-2012 University of Bonn
+#
+#    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/>.
+#
+### create adjacency
+
+AT_SETUP([Graph - create adjacency])
+AT_KEYWORDS([graph create-adjacency])
+
+file=ethane.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-all-atoms --create-adjacency], 0, [stdout], [stderr])
+AT_CHECK([fgrep "I detected 7 bonds in the molecule" stdout], 0, [ignore], [ignore])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 0, [stdout], [ignore])
+AT_CHECK([fgrep "8" stdout], 0, [stdout], [ignore])
+
+file=ethane-half.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-atom-by-element 6 --create-adjacency], 0, [stdout], [stderr])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 0, [stdout], [ignore])
+AT_CHECK([fgrep "1" stdout], 0, [stdout], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Graph - create adjacency with Undo])
+AT_KEYWORDS([graph create-adjacency undo])
+
+file=ethane.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-all-atoms --create-adjacency --undo], 0, [stdout], [stderr])
+AT_CHECK([fgrep "I detected 7 bonds in the molecule" stdout], 0, [ignore], [ignore])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 1, [ignore], [ignore])
+
+file=ethane-half.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-atom-by-element 6 --create-adjacency --undo], 0, [stdout], [stderr])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 1, [ignore], [ignore])
+
+AT_CLEANUP
+
+
+AT_SETUP([Graph - create adjacency with Redo])
+AT_KEYWORDS([graph create-adjacency redo])
+
+file=ethane.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-all-atoms --create-adjacency --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([fgrep "I detected 7 bonds in the molecule" stdout], 0, [ignore], [ignore])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 0, [stdout], [ignore])
+AT_CHECK([fgrep "8" stdout], 0, [stdout], [ignore])
+
+file=ethane-half.xyz
+AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Graph/CreateAdjacency/pre/ethane.xyz $file], 0)
+AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
+AT_CHECK([../../molecuilder -i $file -o pdb --select-atom-by-element 6 --create-adjacency --undo --redo], 0, [stdout], [stderr])
+AT_CHECK([fgrep "CONECT" ethane.pdb], 0, [stdout], [ignore])
+AT_CHECK([fgrep "1" stdout], 0, [stdout], [ignore])
+
+AT_CLEANUP
Index: tests/regression/Graph/testsuite-graph.at
===================================================================
--- tests/regression/Graph/testsuite-graph.at	(revision f2fda61612d15d768b57a21c2e5147bd9c1e1cdd)
+++ tests/regression/Graph/testsuite-graph.at	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -18,4 +18,7 @@
 AT_BANNER([MoleCuilder - Graph routines test])
 
+# create adjacency
+m4_include([Graph/CreateAdjacency/testsuite-graph-create-adjacency.at])
+
 # DFS analysis
 m4_include([Graph/DepthFirstSearch/testsuite-graph-depth-first-search.at])
Index: tests/regression/Makefile.am
===================================================================
--- tests/regression/Makefile.am	(revision f2fda61612d15d768b57a21c2e5147bd9c1e1cdd)
+++ tests/regression/Makefile.am	(revision 055ad7d1ba1b8d09c8c3cf8f1dfdf2b27859c787)
@@ -76,4 +76,5 @@
 	$(srcdir)/Fragmentation/StoreSaturatedFragment/testsuite-fragmentation-store-saturated-fragment.at \
 	$(srcdir)/Graph/testsuite-graph.at \
+	$(srcdir)/Graph/CreateAdjacency/testsuite-graph-create-adjacency.at \
 	$(srcdir)/Graph/DepthFirstSearch/testsuite-graph-depth-first-search.at \
 	$(srcdir)/Graph/SubgraphDissection/testsuite-graph-subgraph-dissection.at \
