Index: /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Arc.cs
===================================================================
--- /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Arc.cs	(revision 11237)
+++ /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Arc.cs	(revision 11238)
@@ -31,11 +31,4 @@
   [StorableClass]
   public class Arc : Item, IArc {
-    public event EventHandler Changed;
-    protected virtual void OnChanged(object sender, EventArgs args) {
-      var changed = Changed;
-      if (changed != null)
-        changed(sender, args);
-    }
-
     [Storable]
     public IVertex Source { get; private set; }
@@ -49,4 +42,5 @@
       get { return label; }
       set {
+        if (label.Equals(value)) return;
         label = value;
         OnChanged(this, EventArgs.Empty);
@@ -59,4 +53,5 @@
       get { return weight; }
       set {
+        if (weight.Equals(value)) return;
         weight = value;
         OnChanged(this, EventArgs.Empty);
@@ -69,4 +64,5 @@
       get { return data; }
       set {
+        if (data == value) return;
         data = value;
         OnChanged(this, EventArgs.Empty);
@@ -94,4 +90,11 @@
       return new Arc(this, cloner);
     }
+
+    public event EventHandler Changed;
+    protected virtual void OnChanged(object sender, EventArgs args) {
+      var changed = Changed;
+      if (changed != null)
+        changed(sender, args);
+    }
   }
 
Index: /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/DirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/DirectedGraph.cs	(revision 11237)
+++ /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/DirectedGraph.cs	(revision 11238)
@@ -56,5 +56,4 @@
         vertex.ArcAdded += OnArcAdded;
         vertex.ArcRemoved += OnArcRemoved;
-        vertex.Changed += OnVertexChanged;
       }
 
@@ -64,5 +63,4 @@
         source.AddArc(arc);
         target.AddArc(arc);
-        arc.Changed += OnArcChanged;
       }
     }
@@ -91,5 +89,4 @@
       vertices.Add(vertex);
       // register event handlers
-      vertex.Changed += OnVertexChanged;
       vertex.ArcAdded += OnArcAdded;
       vertex.ArcRemoved += OnArcRemoved;
@@ -99,5 +96,5 @@
       vertices.Remove(vertex);
       // remove connections to/from the removed vertex
-      var arcList = vertex.InArcs.Concat(vertex.OutArcs).ToList();
+      var arcList = vertex.InArcs.Concat(vertex.OutArcs).ToList(); // avoid invalid operation exception: "collection was modified" below
       foreach (var arc in arcList)
         RemoveArc(arc);
@@ -105,5 +102,4 @@
       vertex.ArcAdded -= OnArcAdded;
       vertex.ArcRemoved -= OnArcRemoved;
-      vertex.Changed -= OnVertexChanged;
     }
 
@@ -130,6 +126,4 @@
     }
 
-    protected virtual void OnVertexChanged(object sender, EventArgs args) { }
-
     protected virtual void OnArcAdded(object sender, EventArgs<IArc> args) {
       var arc = args.Value;
@@ -139,5 +133,4 @@
       if (arcs.Contains(arc)) return;
       arcs.Add(arc);
-      arc.Changed += OnArcChanged;
     }
 
@@ -146,12 +139,15 @@
       if (!arcs.Contains(arc)) return; // the same rationale as above 
       arcs.Remove(arc);
-      arc.Changed -= OnArcChanged;
     }
-
-    protected virtual void OnArcChanged(object sender, EventArgs args) { }
 
     public override Image ItemImage {
       get { return Common.Resources.VSImageLibrary.Graph; }
     }
+
+    // events
+    public event EventHandler VertexAdded;
+    public event EventHandler VertexRemoved;
+    public event EventHandler ArcAdded;
+    public event EventHandler ArcRemoved;
   }
 }
Index: /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs
===================================================================
--- /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 11237)
+++ /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IDirectedGraph.cs	(revision 11238)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using HeuristicLab.Core;
@@ -33,4 +34,9 @@
     IEnumerable<IVertex> Vertices { get; }
     IEnumerable<IArc> Arcs { get; }
+
+    event EventHandler VertexAdded;
+    event EventHandler VertexRemoved;
+    event EventHandler ArcAdded;
+    event EventHandler ArcRemoved;
   }
 }
Index: /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IVertex.cs
===================================================================
--- /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 11237)
+++ /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Interfaces/IVertex.cs	(revision 11238)
@@ -45,5 +45,4 @@
     void AddArc(IArc arc);
     void RemoveArc(IArc arc);
-    void RemoveArc(IVertex vertex);
   }
 
Index: /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Vertex.cs
===================================================================
--- /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Vertex.cs	(revision 11237)
+++ /branches/HeuristicLab.BottomUpTreeDistance/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/DirectedGraph/Vertex.cs	(revision 11238)
@@ -30,26 +30,4 @@
   [StorableClass]
   public class Vertex : Item, IVertex {
-    // use the same event to signal a change in the content, weight or label
-    public event EventHandler Changed;
-    protected virtual void OnChanged(object sender, EventArgs args) {
-      var changed = Changed;
-      if (changed != null)
-        changed(sender, args);
-    }
-
-    public event EventHandler<EventArgs<IArc>> ArcAdded;
-    protected virtual void OnArcAdded(object sender, EventArgs<IArc> args) {
-      var added = ArcAdded;
-      if (added != null)
-        added(sender, args);
-    }
-
-    public event EventHandler<EventArgs<IArc>> ArcRemoved;
-    protected virtual void OnArcRemoved(object sender, EventArgs<IArc> args) {
-      var removed = ArcRemoved;
-      if (removed != null)
-        removed(sender, args);
-    }
-
     [Storable]
     protected string label;
@@ -57,4 +35,5 @@
       get { return label; }
       set {
+        if (label.Equals(value)) return;
         label = value;
         OnChanged(this, EventArgs.Empty);
@@ -67,4 +46,5 @@
       get { return weight; }
       set {
+        if (weight.Equals(value)) return;
         weight = value;
         OnChanged(this, EventArgs.Empty);
@@ -77,4 +57,5 @@
       get { return content; }
       set {
+        if (content == value) return;
         content = value;
         OnChanged(this, EventArgs.Empty);
@@ -92,4 +73,8 @@
     }
 
+    public int InDegree { get { return InArcs.Count(); } }
+    public int OutDegree { get { return OutArcs.Count(); } }
+    public int Degree { get { return InDegree + OutDegree; } }
+
     [StorableConstructor]
     public Vertex(bool deserializing) : base(deserializing) { }
@@ -98,8 +83,5 @@
     private void AfterDeserialization() { }
 
-    private Vertex() { }
-
-    public Vertex(object content)
-      : this() {
+    public Vertex(object content) {
       this.content = content;
     }
@@ -126,5 +108,5 @@
         if (outArcs == null)
           outArcs = new List<IArc>();
-        else if (outArcs.Contains(arc) || outArcs.Any(a => a.Target == arc.Target))
+        else if (outArcs.Contains(arc))
           throw new InvalidOperationException("Arc already added.");
         outArcs.Add(arc);
@@ -132,19 +114,9 @@
         if (inArcs == null)
           inArcs = new List<IArc>();
-        else if (inArcs.Contains(arc) || inArcs.Any(a => a.Source == arc.Source))
+        else if (inArcs.Contains(arc))
           throw new InvalidOperationException("Arc already added.");
         inArcs.Add(arc);
       }
       OnArcAdded(this, new EventArgs<IArc>(arc));
-    }
-
-    public void RemoveArc(IVertex vertex) {
-      try {
-        var arc = inArcs.Concat(outArcs).SingleOrDefault(x => x.Target == vertex || x.Source == vertex);
-        RemoveArc(arc);
-      }
-      catch (Exception) {
-        throw new InvalidOperationException("Only one arc allowed between two vertices");
-      }
     }
 
@@ -163,7 +135,27 @@
     }
 
-    public int InDegree { get { return InArcs.Count(); } }
-    public int OutDegree { get { return OutArcs.Count(); } }
-    public int Degree { get { return InDegree + OutDegree; } }
+    #region events
+    // use the same event to signal a change in the content, weight or label
+    public event EventHandler Changed;
+    protected virtual void OnChanged(object sender, EventArgs args) {
+      var changed = Changed;
+      if (changed != null)
+        changed(sender, args);
+    }
+
+    public event EventHandler<EventArgs<IArc>> ArcAdded;
+    protected virtual void OnArcAdded(object sender, EventArgs<IArc> args) {
+      var added = ArcAdded;
+      if (added != null)
+        added(sender, args);
+    }
+
+    public event EventHandler<EventArgs<IArc>> ArcRemoved;
+    protected virtual void OnArcRemoved(object sender, EventArgs<IArc> args) {
+      var removed = ArcRemoved;
+      if (removed != null)
+        removed(sender, args);
+    }
+    #endregion
   }
 
