Index: gui/broken_edge.cc
===================================================================
--- gui/broken_edge.cc	(revision 1504)
+++ gui/broken_edge.cc	(revision 1505)
@@ -1,4 +1,3 @@
 #include <broken_edge.h>
-#include <lemon/xy.h>
 #include <math.h>
 
@@ -113,4 +112,5 @@
       if(gdc.get_actual_tool()!=CREATE_NODE)
 	{
+	  gdc.toggle_edge_activity(this, true);
 	  clicked_x=e->button.x;
 	  clicked_y=e->button.y;
@@ -119,5 +119,9 @@
       break;
     case GDK_BUTTON_RELEASE:
-      isbutton=false;
+      if(gdc.get_actual_tool()!=CREATE_NODE)
+	{
+	  gdc.toggle_edge_activity(this, false);
+	  isbutton=false;
+	}
       break;
     case GDK_MOTION_NOTIFY:
@@ -140,4 +144,5 @@
 
 	  set_points(points_new);
+	  gdc.text_reposition(xy<double>(my_points[1].get_x(),my_points[1].get_y()));
 
 	  clicked_x=e->motion.x;
@@ -150,2 +155,8 @@
   return true;
 }
+
+xy<double> BrokenEdge::get_arrow_pos()
+{
+  xy<double> ret_val(my_points[1].get_x(),my_points[1].get_y());
+  return ret_val;
+}
Index: gui/broken_edge.h
===================================================================
--- gui/broken_edge.h	(revision 1501)
+++ gui/broken_edge.h	(revision 1505)
@@ -10,4 +10,5 @@
 #include <libgnomecanvasmm/polygon.h>
 #include <graph_displayer_canvas.h>
+#include <lemon/xy.h>
 
 class BrokenEdge : public Gnome::Canvas::Line
@@ -31,4 +32,5 @@
   ~BrokenEdge();
   void set_points(Gnome::Canvas::Points, bool move=false);
+  xy<double> get_arrow_pos();
 };
 
Index: gui/graph_displayer_canvas.cc
===================================================================
--- gui/graph_displayer_canvas.cc	(revision 1501)
+++ gui/graph_displayer_canvas.cc	(revision 1505)
@@ -31,8 +31,8 @@
     //initializing edge-text as well, to empty string
 
-    double x1, x2, y1, y2;
-    edgesmap[i]->get_bounds(x1, y1, x2, y2);
-    
-    edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph,(x1+x2)/2, (y1+y2)/2, "");
+    xy<double> text_pos=edgesmap[i]->get_arrow_pos();
+    text_pos+=(xy<double>(10,10));
+
+    edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
     edgetextmap[i]->property_fill_color().set_value("black");
   }
@@ -174,4 +174,5 @@
 };
 
+//Deprecated
 bool GraphDisplayerCanvas::event_handler(GdkEvent* e, Node n)
 {
@@ -425,8 +426,8 @@
 	      }
 
-	    edgesmap[ei]->get_bounds(x1, y1, x2, y2);
-
-	    edgetextmap[ei]->property_x().set_value((x1+x2)/2);
-	    edgetextmap[ei]->property_y().set_value((y1+y2)/2);
+	    xy<double> text_pos=edgesmap[ei]->get_arrow_pos();
+	    text_pos+=(xy<double>(10,10));
+	    edgetextmap[ei]->property_x().set_value(text_pos.x);
+	    edgetextmap[ei]->property_y().set_value(text_pos.y);
         }
 
@@ -452,8 +453,8 @@
 	      }
 
-	    edgesmap[ei]->get_bounds(x1, y1, x2, y2);
-
-	    edgetextmap[ei]->property_x().set_value((x1+x2)/2);
-	    edgetextmap[ei]->property_y().set_value((y1+y2)/2);
+	    xy<double> text_pos=edgesmap[ei]->get_arrow_pos();
+	    text_pos+=(xy<double>(10,10));
+	    edgetextmap[ei]->property_x().set_value(text_pos.x);
+	    edgetextmap[ei]->property_y().set_value(text_pos.y);
         }
       }
@@ -590,6 +591,8 @@
 
 		  //initializing edge-text as well, to empty string
-		  edgesmap[active_edge]->get_bounds(x1, y1, x2, y2);
-		  edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph,(x1+x2)/2, (y1+y2)/2, "");
+		  xy<double> text_pos=edgesmap[active_edge]->get_arrow_pos();
+		  text_pos+=(xy<double>(10,10));
+
+		  edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
 		  edgetextmap[active_edge]->property_fill_color().set_value("black");
 		}
@@ -739,2 +742,41 @@
 }
 
+void GraphDisplayerCanvas::text_reposition(xy<double> new_place)
+{
+  new_place+=(xy<double>(10,10));
+  edgetextmap[active_edge]->property_x().set_value(new_place.x);
+  edgetextmap[active_edge]->property_y().set_value(new_place.y);
+}
+
+void GraphDisplayerCanvas::toggle_edge_activity(BrokenEdge* active_bre, bool on)
+{
+  if(on)
+    {
+      if(active_edge!=INVALID)
+	{
+	  std::cout << "ERROR!!!! Valid edge found!" << std::endl;
+	}
+      else
+	{
+	  for (EdgeIt i(g); i!=INVALID; ++i)
+	    {
+	      if(edgesmap[i]==active_bre)
+		{
+		  active_edge=i;
+		}
+	    }
+	}
+    }
+  else
+    {
+      if(active_edge!=INVALID)
+	{
+	  active_edge=INVALID;
+	}
+      else
+	{
+	  std::cout << "ERROR!!!! Invalid edge found!" << std::endl;
+	}
+    }
+
+}
Index: gui/graph_displayer_canvas.h
===================================================================
--- gui/graph_displayer_canvas.h	(revision 1501)
+++ gui/graph_displayer_canvas.h	(revision 1505)
@@ -57,4 +57,5 @@
   ///reaction of any action happened in the territory
   ///of the canvas
+  ///DEPRECATED!!!!
   bool event_handler(GdkEvent* e, Node n);
 
@@ -74,4 +75,10 @@
   ///event handler for the case when eraser-tool is active
   bool edge_map_edit_event_handler(GdkEvent*);
+
+public:
+  ///Moves the text to new place
+  void text_reposition(xy<double>);
+  ///Activates an edge belonging to a BrokenEdge
+  void toggle_edge_activity(BrokenEdge*, bool);
 
 public:
