Index: /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Arc.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Arc.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Arc.cs	(revision 11935)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core {
+  [Item("Arc", "A graph arc connecting two graph vertices, that can have a weight, label, and data object for holding additional info")]
+  [StorableClass]
+  public class Arc : Item, IArc {
+    [Storable]
+    public IVertex Source { get; private set; }
+
+    [Storable]
+    public IVertex Target { get; private set; }
+
+    [Storable]
+    protected string label;
+    public string Label {
+      get { return label; }
+      set {
+        if (label.Equals(value)) return;
+        label = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    protected double weight;
+    public double Weight {
+      get { return weight; }
+      set {
+        if (weight.Equals(value)) return;
+        weight = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+
+    [StorableConstructor]
+    protected Arc(bool deserializing) : base(deserializing) { }
+
+    public Arc(IVertex source, IVertex target) {
+      Source = source;
+      Target = target;
+    }
+
+    protected Arc(Arc original, Cloner cloner)
+      : base(original, cloner) {
+      Source = cloner.Clone(original.Source);
+      Target = cloner.Clone(original.Target);
+      label = original.Label;
+      weight = original.Weight;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { 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);
+    }
+  }
+
+  [StorableClass]
+  public class Arc<T> : Arc, IArc<T> where T : class,IDeepCloneable {
+    [Storable]
+    protected T data;
+    public T Data {
+      get { return data; }
+      set {
+        if (data == value) return;
+        data = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Arc<T>(this, cloner);
+    }
+
+    protected Arc(Arc<T> original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.Data != null)
+        Data = cloner.Clone(original.Data);
+    }
+
+    public Arc(bool deserializing)
+      : base(deserializing) {
+    }
+
+    public Arc(IVertex source, IVertex target)
+      : base(source, target) {
+    }
+
+    protected Arc(Arc original, Cloner cloner)
+      : base(original, cloner) {
+    }
+  }
+}
Index: /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/DirectedGraph.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/DirectedGraph.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/DirectedGraph.cs	(revision 11935)
@@ -0,0 +1,206 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core {
+  [Item("DirectedGraph", "Generic class representing a directed graph with custom vertices and content")]
+  [StorableClass]
+  public class DirectedGraph : Item, IDirectedGraph {
+    public override Image ItemImage { get { return VSImageLibrary.Graph; } }
+
+    private HashSet<IVertex> vertices;
+    [Storable]
+    public IEnumerable<IVertex> Vertices {
+      get { return vertices; }
+      private set { vertices = new HashSet<IVertex>(value); }
+    }
+
+    private HashSet<IArc> arcs;
+    [Storable]
+    public IEnumerable<IArc> Arcs {
+      get { return arcs; }
+      private set { arcs = new HashSet<IArc>(value); }
+    }
+
+    public DirectedGraph() {
+      vertices = new HashSet<IVertex>();
+      arcs = new HashSet<IArc>();
+    }
+
+    protected DirectedGraph(DirectedGraph original, Cloner cloner)
+      : base(original, cloner) {
+      vertices = new HashSet<IVertex>(original.vertices.Select(cloner.Clone));
+      arcs = new HashSet<IArc>(original.arcs.Select(cloner.Clone));
+
+      // add the arcs to the newly cloned vertices
+      foreach (var arc in arcs) {
+        arc.Source.AddArc(arc);
+        arc.Target.AddArc(arc);
+      }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DirectedGraph(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected DirectedGraph(bool serializing)
+      : base(serializing) {
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var vertex in vertices) {
+        vertex.ArcAdded += Vertex_ArcAdded;
+        vertex.ArcRemoved += Vertex_ArcRemoved;
+      }
+
+      foreach (var arc in arcs) {
+        var source = arc.Source;
+        var target = arc.Target;
+        source.AddArc(arc);
+        target.AddArc(arc);
+      }
+    }
+
+    public virtual void Clear() {
+      vertices.Clear();
+      arcs.Clear();
+    }
+
+    public virtual void AddVertex(IVertex vertex) {
+      if (!vertices.Contains(vertex) && vertex.Degree > 0)
+        throw new ArgumentException("New vertices cannot have any arcs.");
+
+      if (vertices.Add(vertex)) {
+        // register event handlers
+        vertex.ArcAdded += Vertex_ArcAdded;
+        vertex.ArcRemoved += Vertex_ArcRemoved;
+        OnVertexAdded(this, new EventArgs<IVertex>(vertex));
+      }
+    }
+
+    public virtual void AddVertices(IEnumerable<IVertex> vertexList) {
+      foreach (var v in vertexList) { AddVertex(v); }
+    }
+
+    public virtual void RemoveVertices(IEnumerable<IVertex> vertexList) {
+      foreach (var v in vertexList) { RemoveVertex(v); }
+    }
+
+    public virtual void RemoveVertex(IVertex vertex) {
+      vertices.Remove(vertex);
+      // remove connections to/from the removed vertex
+      var arcList = vertex.InArcs.Concat(vertex.OutArcs).ToList(); // avoid invalid operation exception: "collection was modified" below
+      foreach (var arc in arcList)
+        RemoveArc(arc);
+      // deregister event handlers
+      vertex.ArcAdded -= Vertex_ArcAdded;
+      vertex.ArcRemoved -= Vertex_ArcRemoved;
+      OnVertexRemoved(this, new EventArgs<IVertex>(vertex));
+    }
+
+    public virtual IArc AddArc(IVertex source, IVertex target) {
+      var arc = new Arc(source, target);
+      AddArc(arc);
+      return arc;
+    }
+
+    public virtual void AddArc(IArc arc) {
+      var source = arc.Source;
+      var target = arc.Target;
+
+      if (source == target)
+        throw new InvalidOperationException("Source and target cannot be the same.");
+
+      if (!vertices.Contains(source) || !vertices.Contains(target))
+        throw new InvalidOperationException("Cannot add arc connecting vertices that are not in the graph.");
+
+      source.AddArc(arc);
+      target.AddArc(arc);
+      arcs.Add(arc);
+    }
+
+    public virtual void AddArcs(IEnumerable<IArc> arcList) {
+      foreach (var a in arcList) { AddArc(a); }
+    }
+
+    public virtual void RemoveArc(IArc arc) {
+      arcs.Remove(arc);
+      var source = (Vertex)arc.Source;
+      var target = (Vertex)arc.Target;
+      source.RemoveArc(arc);
+      target.RemoveArc(arc);
+    }
+
+    public virtual void RemoveArcs(IEnumerable<IArc> arcList) {
+      foreach (var a in arcList) { RemoveArc(a); }
+    }
+
+    protected virtual void Vertex_ArcAdded(object sender, EventArgs<IArc> args) {
+      // the ArcAdded event is fired by a vertex when an arc from/to another vertex is added to its list of connections
+      // because the arc is added in both directions by both the source and the target, this event will get fired twice here
+      var arc = args.Value;
+      if (arcs.Add(arc)) OnArcAdded(this, new EventArgs<IArc>(arc));
+    }
+
+    protected virtual void Vertex_ArcRemoved(object sender, EventArgs<IArc> args) {
+      var arc = args.Value;
+      if (arcs.Remove(arc)) OnArcRemoved(this, new EventArgs<IArc>(arc));
+    }
+
+    // events
+    public event EventHandler<EventArgs<IVertex>> VertexAdded;
+    protected virtual void OnVertexAdded(object sender, EventArgs<IVertex> args) {
+      var added = VertexAdded;
+      if (added != null)
+        added(sender, args);
+    }
+
+    public event EventHandler<EventArgs<IVertex>> VertexRemoved;
+    protected virtual void OnVertexRemoved(object sender, EventArgs<IVertex> args) {
+      var removed = VertexRemoved;
+      if (removed != null)
+        removed(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);
+    }
+  }
+}
Index: /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Vertex.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Vertex.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Collections/DirectedGraph/Vertex.cs	(revision 11935)
@@ -0,0 +1,171 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core {
+  [Item("Vertex", "An object representing a vertex in the graph. It can have a text label, a weight, and an additional data object.")]
+  [StorableClass]
+  public class Vertex : Item, IVertex {
+    [Storable]
+    private string label;
+    public string Label {
+      get { return label; }
+      set {
+        if (label.Equals(value)) return;
+        label = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double weight;
+    public double Weight {
+      get { return weight; }
+      set {
+        if (weight.Equals(value)) return;
+        weight = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    private readonly List<IArc> inArcs = new List<IArc>();
+    public IEnumerable<IArc> InArcs {
+      get { return inArcs; }
+    }
+
+    private readonly List<IArc> outArcs = new List<IArc>();
+    public IEnumerable<IArc> OutArcs {
+      get { return outArcs; }
+    }
+
+    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) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public Vertex() { }
+
+    protected Vertex(Vertex original, Cloner cloner)
+      : base(original, cloner) {
+      label = original.Label;
+      weight = original.Weight;
+      // we do not clone the arcs here (would cause too much recursion and ultimately a stack overflow)
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Vertex(this, cloner);
+    }
+
+    public void AddArc(IArc arc) {
+      if (this != arc.Source && this != arc.Target)
+        throw new ArgumentException("The current vertex must be either the arc source or the arc target.");
+
+      if (arc.Source == arc.Target)
+        throw new ArgumentException("Arc source and target must be different.");
+
+      if (this == arc.Source) {
+        if (outArcs.Contains(arc)) throw new InvalidOperationException("Arc already added.");
+        outArcs.Add(arc);
+      }
+      if (this == arc.Target) {
+        if (inArcs.Contains(arc)) throw new InvalidOperationException("Arc already added.");
+        inArcs.Add(arc);
+      }
+      OnArcAdded(this, new EventArgs<IArc>(arc));
+    }
+
+    public void RemoveArc(IArc arc) {
+      if (this != arc.Source && this != arc.Target)
+        throw new ArgumentException("The current vertex must be either the arc source or the arc target.");
+
+      if (this == arc.Source) {
+        if (!outArcs.Remove(arc)) throw new InvalidOperationException("Arc is not present in this vertex' outgoing arcs.");
+      }
+      if (this == arc.Target) {
+        if (!inArcs.Remove(arc)) throw new InvalidOperationException("Arc is not present in this vertex' incoming arcs.");
+      }
+      OnArcRemoved(this, new EventArgs<IArc>(arc));
+    }
+
+    #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
+  }
+
+  [StorableClass]
+  public class Vertex<T> : Vertex, IVertex<T> where T : class,IDeepCloneable {
+    [Storable]
+    private T data;
+    public T Data {
+      get { return data; }
+      set {
+        if (data == value) return;
+        data = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [StorableConstructor]
+    protected Vertex(bool deserializing) : base(deserializing) { }
+
+    protected Vertex(Vertex<T> original, Cloner cloner)
+      : base(original, cloner) {
+      if (original.Data != null)
+        Data = cloner.Clone(original.Data);
+    }
+
+    public Vertex() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Vertex<T>(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 11934)
+++ /stable/HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj	(revision 11935)
@@ -122,4 +122,7 @@
     <Compile Include="Collections\CheckedItemCollection.cs" />
     <Compile Include="Collections\CheckedItemList.cs" />
+    <Compile Include="Collections\DirectedGraph\Arc.cs" />
+    <Compile Include="Collections\DirectedGraph\DirectedGraph.cs" />
+    <Compile Include="Collections\DirectedGraph\Vertex.cs" />
     <Compile Include="Collections\ReadOnlyCheckedItemCollection.cs" />
     <Compile Include="Collections\ReadOnlyCheckedItemList.cs">
@@ -154,4 +157,7 @@
     <Compile Include="Constraints\IConstraint.cs" />
     <Compile Include="Constraints\TypeCompatibilityConstraint.cs" />
+    <Compile Include="Interfaces\DirectedGraph\IArc.cs" />
+    <Compile Include="Interfaces\DirectedGraph\IDirectedGraph.cs" />
+    <Compile Include="Interfaces\DirectedGraph\IVertex.cs" />
     <Compile Include="Interfaces\ICheckedMultiOperator.cs" />
     <Compile Include="Interfaces\IConstrainedValueParameter.cs" />
Index: /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IArc.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IArc.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IArc.cs	(revision 11935)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Core {
+  public interface IArc : IItem {
+    IVertex Source { get; }
+    IVertex Target { get; }
+    string Label { get; set; }
+    double Weight { get; set; }
+
+    event EventHandler Changed; // generic event for when the label, weight or data were changed
+  }
+
+  public interface IArc<T> : IArc where T : class,IDeepCloneable {
+    T Data { get; set; }
+  }
+}
Index: /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IDirectedGraph.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IDirectedGraph.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IDirectedGraph.cs	(revision 11935)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Core {
+  public interface IDirectedGraph : IItem {
+    IEnumerable<IVertex> Vertices { get; }
+    IEnumerable<IArc> Arcs { get; }
+
+    void Clear();
+    void AddVertex(IVertex vertex);
+    void RemoveVertex(IVertex vertex);
+
+    void AddVertices(IEnumerable<IVertex> vertexList);
+    void RemoveVertices(IEnumerable<IVertex> vertexList);
+
+    IArc AddArc(IVertex source, IVertex target);
+    void AddArc(IArc arc);
+    void RemoveArc(IArc arc);
+
+    void AddArcs(IEnumerable<IArc> arcs);
+    void RemoveArcs(IEnumerable<IArc> removeArcs);
+
+    event EventHandler<EventArgs<IVertex>> VertexAdded;
+    event EventHandler<EventArgs<IVertex>> VertexRemoved;
+    event EventHandler<EventArgs<IArc>> ArcAdded;
+    event EventHandler<EventArgs<IArc>> ArcRemoved;
+  }
+}
Index: /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IVertex.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IVertex.cs	(revision 11935)
+++ /stable/HeuristicLab.Core/3.3/Interfaces/DirectedGraph/IVertex.cs	(revision 11935)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab 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.
+ *
+ * HeuristicLab 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 HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Core {
+  public interface IVertex : IItem {
+    IEnumerable<IArc> InArcs { get; }
+    IEnumerable<IArc> OutArcs { get; }
+
+    int InDegree { get; }
+    int OutDegree { get; }
+    int Degree { get; }
+
+    string Label { get; set; }
+    double Weight { get; set; }
+
+    void AddArc(IArc arc);
+    void RemoveArc(IArc arc);
+
+    event EventHandler Changed; // generic event for when the content, label or weight have changed
+    event EventHandler<EventArgs<IArc>> ArcAdded;
+    event EventHandler<EventArgs<IArc>> ArcRemoved;
+  }
+
+  public interface IVertex<T> : IVertex where T : class, IDeepCloneable {
+    T Data { get; set; }
+  }
+}
