Index: gui/all_include.h
===================================================================
--- gui/all_include.h	(revision 1468)
+++ gui/all_include.h	(revision 1485)
@@ -18,5 +18,5 @@
 
 enum {WIDTH, COLOR, TEXT, PROPERTY_NUM}; // edge properties;
-enum {MOVE, CREATE_NODE, CREATE_EDGE, TOOL_NUM}; // tools;
+enum {MOVE, CREATE_NODE, CREATE_EDGE, ERASER, TOOL_NUM}; // tools;
 #define RANGE 3
 #define WIN_WIDTH 900
Index: gui/edit_win.cc
===================================================================
--- gui/edit_win.cc	(revision 1478)
+++ gui/edit_win.cc	(revision 1485)
@@ -69,4 +69,18 @@
   table.attach(*buttons[MOVE],0,1,1,2);
       
+  //New edge button
+  buttons[ERASER]=new Gtk::RadioButton("Erase Item");
+  buttons[ERASER]->set_mode(false);
+  buttons[ERASER]->set_group(group);
+  buttons[ERASER]->signal_clicked().connect
+    (
+     sigc::bind
+     (
+      sigc::mem_fun(*this, &EditWin::makeEditorialToolChanged),
+      3
+      )
+     );
+  table.attach(*buttons[ERASER],1,2,1,2);
+    
   add(table);
 
Index: gui/graph_displayer_canvas.cc
===================================================================
--- gui/graph_displayer_canvas.cc	(revision 1478)
+++ gui/graph_displayer_canvas.cc	(revision 1485)
@@ -323,4 +323,9 @@
       actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::create_edge_event_handler), false);
       break;
+
+    case ERASER:
+      actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraser_event_handler), false);
+      break;
+
     default:
       break;
@@ -585,2 +590,86 @@
 }
 
+bool GraphDisplayerCanvas::eraser_event_handler(GdkEvent* e)
+{
+  switch(e->type)
+    {
+    case GDK_BUTTON_PRESS:
+      active_item=(get_item_at(e->button.x, e->button.y));
+      active_node=INVALID;
+      active_edge=INVALID;
+      for (NodeIt i(g); i!=INVALID; ++i)
+	{
+	  if(nodesmap[i]==active_item)
+	    {
+	      active_node=i;
+	    }
+	}
+      if(active_node==INVALID)
+	{
+	  for (EdgeIt i(g); i!=INVALID; ++i)
+	    {
+	      if(edgesmap[i]==active_item)
+		{
+		  active_edge=i;
+		}
+	    }
+	}
+    *active_item << Gnome::Canvas::Properties::fill_color("red");
+      break;
+
+    case GDK_BUTTON_RELEASE:
+      if(active_item==(get_item_at(e->button.x, e->button.y)))
+	{
+	  if(active_node!=INVALID)
+	    {
+	      EdgeIt e;
+	      g.firstOut(e,active_node);
+	      for(;e!=INVALID;g.nextOut(e))
+		{
+		  delete_item(edgesmap[e]);
+		  //edgesmap[e]->property_points().set_value(coos);
+		  //edgetextmap[e]->property_y().set_value((y1+y2)/2);
+		}
+
+	      g.firstIn(e,active_node);
+	      for(;e!=INVALID;g.nextIn(e))
+		{
+		  delete_item(edgesmap[e]);
+		  //edgesmap[e]->get_bounds(x1, y1, x2, y2);
+		  //edgetextmap[e]->property_y().set_value((y1+y2)/2);
+		}
+	    }
+	  delete_item(active_item);
+	  
+	}
+      else
+	{
+	  if(active_node!=INVALID)
+	    {
+	      *active_item << Gnome::Canvas::Properties::fill_color("blue");
+	    }
+	  else
+	    {
+	      *active_item << Gnome::Canvas::Properties::fill_color("green");
+	    }
+	}
+      active_item=NULL;
+      active_edge=INVALID;
+      active_node=INVALID;
+      break;
+
+    case GDK_MOTION_NOTIFY:
+      break;
+
+    default:
+      break;
+    }
+  return true;
+}
+
+void GraphDisplayerCanvas::delete_item(Gnome::Canvas::Item * item_to_delete)
+{
+  //item_to_delete->hide();
+  delete(item_to_delete);
+}
+
Index: gui/graph_displayer_canvas.h
===================================================================
--- gui/graph_displayer_canvas.h	(revision 1474)
+++ gui/graph_displayer_canvas.h	(revision 1485)
@@ -67,4 +67,9 @@
   ///event handler for the case when create_edge-tool is active
   bool create_edge_event_handler(GdkEvent*);
+  ///event handler for the case when eraser-tool is active
+  bool eraser_event_handler(GdkEvent*);
+
+  ///Deletes the given item.
+  void delete_item(Gnome::Canvas::Item *);
 
   ///The graph, on which we work
