Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/HeuristicLab.Problems.RoutePlanning.csproj
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/HeuristicLab.Problems.RoutePlanning.csproj	(revision 8289)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/HeuristicLab.Problems.RoutePlanning.csproj	(revision 8290)
@@ -48,4 +48,5 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
@@ -55,4 +56,9 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Osm\Node.cs" />
+    <Compile Include="Osm\OsmBase.cs" />
+    <Compile Include="Osm\PointD.cs" />
+    <Compile Include="Osm\Tags.cs" />
+    <Compile Include="Osm\Way.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Node.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Node.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Node.cs	(revision 8290)
@@ -0,0 +1,20 @@
+﻿
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public class Node : OsmBase {
+    private PointD point;
+
+    public double Longitude {
+      get { return point.X; }
+      set { point.X = value; }
+    }
+    public double Latitude {
+      get { return point.Y; }
+      set { point.Y = value; }
+    }
+
+    public Node(int id, double lat, double lon)
+      : base(id) {
+      point = new PointD(lat, lon);
+    }
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/OsmBase.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/OsmBase.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/OsmBase.cs	(revision 8290)
@@ -0,0 +1,20 @@
+﻿using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public abstract class OsmBase {
+    public int Id { get; set; }
+    public string User { get; set; }
+    public int UserId { get; set; }
+    public DateTime Timestamp { get; set; }
+    public int Changeset { get; set; }
+    public int Version { get; set; }
+    public bool Visible { get; set; }
+    public IDictionary<string, string> Tags { get; set; }
+
+    public OsmBase(int id) {
+      Id = id;
+      Tags = new Dictionary<string, string>();
+    }
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/PointD.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/PointD.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/PointD.cs	(revision 8290)
@@ -0,0 +1,55 @@
+﻿
+using System.Drawing;
+
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public struct PointD {
+    public double X;
+    public double Y;
+
+    #region Constructors
+
+    public PointD(double x, double y) {
+      this.X = x;
+      this.Y = y;
+    }
+
+    public PointD(PointD p) {
+      this.X = p.X;
+      this.Y = p.Y;
+    }
+
+    #endregion
+
+    #region Operators
+
+    public static bool operator !=(PointD left, PointD right) {
+      return left.X != right.X || left.Y != right.Y;
+    }
+
+    public static bool operator ==(PointD left, PointD right) {
+      return left.X == right.X && left.Y == right.Y;
+    }
+
+    public static explicit operator PointF(PointD p) {
+      return new PointF((float)p.X, (float)p.Y);
+    }
+
+    #endregion
+
+    #region Overridden Methods
+
+    public override bool Equals(object obj) {
+      if (obj is PointD) {
+        PointD p = (PointD)obj;
+        return (this.X == p.X && this.Y == p.Y);
+      }
+      return false;
+    }
+
+    public override int GetHashCode() {
+      return ((PointF)this).GetHashCode();
+    }
+
+    #endregion
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Relation.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Relation.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Relation.cs	(revision 8290)
@@ -0,0 +1,16 @@
+﻿
+using System.Collections.Generic;
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public class Relation : OsmBase {
+    private List<RelationMember> members;
+
+    public Relation(int id)
+      : base(id) {
+      members = new List<RelationMember>();
+    }
+
+    public List<RelationMember> Members {
+      get { return members; }
+    }
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/RelationMember.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/RelationMember.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/RelationMember.cs	(revision 8290)
@@ -0,0 +1,7 @@
+﻿
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public class RelationMember {
+    public OsmBase Member { get; set; }
+    public string Role { get; set; }
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/TagConstants.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/TagConstants.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/TagConstants.cs	(revision 8290)
@@ -0,0 +1,6 @@
+﻿
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  public class TagConstants {
+    public const string HighwayTagKey = "highway";
+  }
+}
Index: /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Way.cs
===================================================================
--- /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Way.cs	(revision 8290)
+++ /branches/RoutePlanning/HeuristicLab.Problems.RoutePlanning/3.3/Osm/Way.cs	(revision 8290)
@@ -0,0 +1,68 @@
+﻿
+using System;
+using System.Collections.Generic;
+namespace HeuristicLab.Problems.RoutePlanning.Osm {
+  #region Highway Types
+
+  // see: https://wiki.openstreetmap.org/wiki/Key:highway
+  public enum HighwayType {
+    null_type,
+    motorway,
+    motorway_link,
+    trunk,
+    trunk_link,
+    primary,
+    primary_link,
+    secondary,
+    secondary_link,
+    tertiary,
+    tertiary_link,
+    living_street,
+    pedestrian,
+    residential,
+    unclassified,
+    service,
+    track,
+    bus_guideway,
+    raceway,
+    road,
+    path,
+    footway,
+    cycleway,
+    bridleway,
+    steps
+  }
+
+  #endregion
+
+  public class Way : OsmBase {
+    private List<Node> nodes;
+
+    public Way(int id)
+      : base(id) {
+      nodes = new List<Node>();
+    }
+
+    public List<Node> Nodes {
+      get { return nodes; }
+    }
+
+    private HighwayType highwayTag;
+    public HighwayType HighwayTag {
+      get {
+        if (!base.Tags.ContainsKey(TagConstants.HighwayTagKey)) {
+          return HighwayType.null_type;
+        }
+        if (Enum.IsDefined(typeof(HighwayType), base.Tags[TagConstants.HighwayTagKey])) {
+          HighwayType ht = (HighwayType)Enum.Parse(
+            typeof(HighwayType),
+            base.Tags[TagConstants.HighwayTagKey],
+            true);
+          return ht;
+        } else {
+          return HighwayType.null_type;
+        }
+      }
+    }
+  }
+}
