Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.Designer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.Designer.cs	(revision 17533)
@@ -45,7 +45,7 @@
     /// </summary>
     private void InitializeComponent() {
+      HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer tspVisualizer1 = new HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer();
       this.tabControl = new System.Windows.Forms.TabControl();
       this.routingDataTabPage = new System.Windows.Forms.TabPage();
-      this.routingDataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.OrienteeringDataTabPage = new System.Windows.Forms.TabPage();
       this.splitContainer1 = new System.Windows.Forms.SplitContainer();
@@ -60,4 +60,5 @@
       this.startingPointTextBox = new System.Windows.Forms.TextBox();
       this.startingPointLabel = new System.Windows.Forms.Label();
+      this.tspDataView = new HeuristicLab.Problems.TravelingSalesman.Views.ITSPDataView();
       this.tabControl.SuspendLayout();
       this.routingDataTabPage.SuspendLayout();
@@ -82,5 +83,5 @@
       // routingDataTabPage
       // 
-      this.routingDataTabPage.Controls.Add(this.routingDataViewHost);
+      this.routingDataTabPage.Controls.Add(this.tspDataView);
       this.routingDataTabPage.Location = new System.Drawing.Point(4, 22);
       this.routingDataTabPage.Name = "routingDataTabPage";
@@ -90,18 +91,4 @@
       this.routingDataTabPage.Text = "Routing Data";
       this.routingDataTabPage.UseVisualStyleBackColor = true;
-      // 
-      // routingDataViewHost
-      // 
-      this.routingDataViewHost.Caption = "View";
-      this.routingDataViewHost.Content = null;
-      this.routingDataViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.routingDataViewHost.Enabled = false;
-      this.routingDataViewHost.Location = new System.Drawing.Point(3, 3);
-      this.routingDataViewHost.Name = "routingDataViewHost";
-      this.routingDataViewHost.ReadOnly = false;
-      this.routingDataViewHost.Size = new System.Drawing.Size(527, 395);
-      this.routingDataViewHost.TabIndex = 0;
-      this.routingDataViewHost.ViewsLabelVisible = true;
-      this.routingDataViewHost.ViewType = null;
       // 
       // OrienteeringDataTabPage
@@ -238,4 +225,18 @@
       this.startingPointLabel.TabIndex = 0;
       this.startingPointLabel.Text = "Starting Point:";
+      // 
+      // tspDataView
+      // 
+      this.tspDataView.Caption = "TSP Data View";
+      this.tspDataView.Content = null;
+      this.tspDataView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tspDataView.Location = new System.Drawing.Point(3, 3);
+      this.tspDataView.Name = "tspDataView";
+      this.tspDataView.ReadOnly = false;
+      this.tspDataView.Size = new System.Drawing.Size(527, 395);
+      this.tspDataView.TabIndex = 0;
+      tspVisualizer1.Coordinates = null;
+      tspVisualizer1.Tour = null;
+      this.tspDataView.Visualizer = tspVisualizer1;
       // 
       // OrienteeringProblemDataView
@@ -263,5 +264,4 @@
     private System.Windows.Forms.TabControl tabControl;
     private System.Windows.Forms.TabPage routingDataTabPage;
-    private MainForm.WindowsForms.ViewHost routingDataViewHost;
     private System.Windows.Forms.TabPage OrienteeringDataTabPage;
     private System.Windows.Forms.SplitContainer splitContainer1;
@@ -276,4 +276,5 @@
     private System.Windows.Forms.TextBox terminalPointTextBox;
     private System.Windows.Forms.Label terminalPointLabel;
+    private TravelingSalesman.Views.ITSPDataView tspDataView;
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringProblemDataView.cs	(revision 17533)
@@ -22,5 +22,4 @@
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
-using HeuristicLab.Problems.TravelingSalesman.Views;
 
 namespace HeuristicLab.Problems.Orienteering.Views {
@@ -41,5 +40,4 @@
       base.OnContentChanged();
       if (Content == null) {
-        routingDataViewHost.Content = null;
         startingPointTextBox.Text = string.Empty;
         terminalPointTextBox.Text = string.Empty;
@@ -48,5 +46,4 @@
         scoresArrayView.Content = null;
       } else {
-        routingDataViewHost.Content = Content.RoutingData;
         startingPointTextBox.Text = Content.StartingPoint.ToString();
         terminalPointTextBox.Text = Content.TerminalPoint.ToString();
@@ -54,9 +51,6 @@
         maximumTravelCostsTextBox.Text = Content.MaximumTravelCosts.ToString();
         scoresArrayView.Content = Content.Scores;
-        if (routingDataViewHost.ActiveView is ITSPVisualizerView tspVis)
-          tspVis.Visualizer = new OrienteeringVisualizer() {
-            Data = Content
-          };
       }
+      tspDataView.Content = Content?.RoutingData;
     }
   }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.Designer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.Designer.cs	(revision 17533)
@@ -45,42 +45,11 @@
     /// </summary>
     private void InitializeComponent() {
+      HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer tspVisualizer2 = new HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer();
       this.scoreLabel = new System.Windows.Forms.Label();
       this.qualityLabel = new System.Windows.Forms.Label();
       this.qualityValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
       this.scoreValueView = new HeuristicLab.Data.Views.StringConvertibleValueView();
-      this.tabControl.SuspendLayout();
-      this.visualizationTabPage.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
-      this.routeTabPage.SuspendLayout();
+      this.tspSolutionView = new HeuristicLab.Problems.TravelingSalesman.Views.TSPSolutionView();
       this.SuspendLayout();
-      // 
-      // tabControl
-      // 
-      this.tabControl.Location = new System.Drawing.Point(3, 88);
-      this.tabControl.Size = new System.Drawing.Size(417, 314);
-      // 
-      // visualizationTabPage
-      // 
-      this.visualizationTabPage.Size = new System.Drawing.Size(409, 288);
-      // 
-      // pictureBox
-      // 
-      this.pictureBox.Size = new System.Drawing.Size(403, 282);
-      // 
-      // routeTabPage
-      // 
-      this.routeTabPage.Size = new System.Drawing.Size(409, 234);
-      // 
-      // tourViewHost
-      // 
-      this.tourViewHost.Size = new System.Drawing.Size(403, 228);
-      // 
-      // distanceView
-      // 
-      this.distanceView.Location = new System.Drawing.Point(62, 61);
-      // 
-      // distanceLabel
-      // 
-      this.distanceLabel.Location = new System.Drawing.Point(4, 64);
       // 
       // scoreLabel
@@ -112,5 +81,5 @@
       this.qualityValueView.Name = "qualityValueView";
       this.qualityValueView.ReadOnly = false;
-      this.qualityValueView.Size = new System.Drawing.Size(357, 21);
+      this.qualityValueView.Size = new System.Drawing.Size(565, 21);
       this.qualityValueView.TabIndex = 0;
       // 
@@ -125,10 +94,27 @@
       this.scoreValueView.Name = "scoreValueView";
       this.scoreValueView.ReadOnly = false;
-      this.scoreValueView.Size = new System.Drawing.Size(357, 21);
+      this.scoreValueView.Size = new System.Drawing.Size(565, 21);
       this.scoreValueView.TabIndex = 0;
+      // 
+      // tspSolutionView
+      // 
+      this.tspSolutionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tspSolutionView.Caption = "TSP Solution View";
+      this.tspSolutionView.Content = null;
+      this.tspSolutionView.Location = new System.Drawing.Point(0, 61);
+      this.tspSolutionView.Name = "tspSolutionView";
+      this.tspSolutionView.ReadOnly = false;
+      this.tspSolutionView.Size = new System.Drawing.Size(630, 252);
+      this.tspSolutionView.TabIndex = 2;
+      tspVisualizer2.Coordinates = null;
+      tspVisualizer2.Tour = null;
+      this.tspSolutionView.Visualizer = tspVisualizer2;
       // 
       // OrienteeringSolutionView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.tspSolutionView);
       this.Controls.Add(this.scoreLabel);
       this.Controls.Add(this.qualityLabel);
@@ -136,15 +122,5 @@
       this.Controls.Add(this.scoreValueView);
       this.Name = "OrienteeringSolutionView";
-      this.Controls.SetChildIndex(this.scoreValueView, 0);
-      this.Controls.SetChildIndex(this.qualityValueView, 0);
-      this.Controls.SetChildIndex(this.qualityLabel, 0);
-      this.Controls.SetChildIndex(this.scoreLabel, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.distanceView, 0);
-      this.Controls.SetChildIndex(this.distanceLabel, 0);
-      this.tabControl.ResumeLayout(false);
-      this.visualizationTabPage.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
-      this.routeTabPage.ResumeLayout(false);
+      this.Size = new System.Drawing.Size(630, 313);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -157,4 +133,5 @@
     private Data.Views.StringConvertibleValueView qualityValueView;
     private Data.Views.StringConvertibleValueView scoreValueView;
+    private TravelingSalesman.Views.TSPSolutionView tspSolutionView;
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringSolutionView.cs	(revision 17533)
@@ -21,17 +21,15 @@
 
 using System.ComponentModel;
+using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
-using HeuristicLab.Problems.TravelingSalesman.Views;
 
 namespace HeuristicLab.Problems.Orienteering.Views {
   [View("OrienteeringSolution View")]
-  [Content(typeof(OrienteeringSolution), true)]
-  public partial class OrienteeringSolutionView : TSPSolutionView {
-    public new OrienteeringVisualizer Visualizer {
-      get { return (OrienteeringVisualizer)base.Visualizer; }
-      set { base.Visualizer = value; }
-    }
-    public new OrienteeringSolution Content {
-      get { return (OrienteeringSolution)base.Content; }
+  [Content(typeof(IOrienteeringSolution), true)]
+  public partial class OrienteeringSolutionView : ItemView {
+    public OrienteeringVisualizer Visualizer { get; set; }
+
+    public new IOrienteeringSolution Content {
+      get { return (IOrienteeringSolution)base.Content; }
       set { base.Content = value; }
     }
@@ -39,4 +37,5 @@
       InitializeComponent();
       Visualizer = new OrienteeringVisualizer();
+      tspSolutionView.Visualizer = Visualizer;
     }
 
@@ -50,6 +49,5 @@
     }
 
-    protected override void ContentOnPropertyChanged(object sender, PropertyChangedEventArgs e) {
-      base.ContentOnPropertyChanged(sender, e);
+    protected virtual void ContentOnPropertyChanged(object sender, PropertyChangedEventArgs e) {
       switch (e.PropertyName) {
         case nameof(Content.Quality):
@@ -71,7 +69,8 @@
         qualityValueView.Content = Content.Quality;
         scoreValueView.Content = Content.Score;
-        Visualizer.Data = Content.OPData;
-        Visualizer.IsFeasible = Content.TravelCosts.Value <= Content.OPData.MaximumTravelCosts;
+        Visualizer.Data = Content.Data;
+        Visualizer.IsFeasible = Content.TravelCosts.Value <= Content.Data.MaximumTravelCosts;
       }
+      tspSolutionView.Content = Content;
       base.OnContentChanged();
     }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringVisualizer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringVisualizer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering.Views/3.3/OrienteeringVisualizer.cs	(revision 17533)
@@ -36,5 +36,5 @@
 
       if ((coordinates != null) && (coordinates.Rows > 0) && (coordinates.Columns == 2)
-        && (coordinates.Rows == Data.RoutingData.Cities)) {
+        && (coordinates.Rows == Data.Cities)) {
         double xMin = double.MaxValue, yMin = double.MaxValue, xMax = double.MinValue, yMax = double.MinValue;
         for (int i = 0; i < coordinates.Rows; i++) {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Creators/GreedyOrienteeringTourCreator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Creators/GreedyOrienteeringTourCreator.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Creators/GreedyOrienteeringTourCreator.cs	(revision 17533)
@@ -66,7 +66,7 @@
       // Find all points within the maximum distance allowed (ellipse)
       var feasiblePoints = (
-        from point in Enumerable.Range(0, data.RoutingData.Cities)
-        let travelCosts = data.RoutingData.GetDistance(data.StartingPoint, point)
-        + data.RoutingData.GetDistance(point, data.TerminalPoint) + data.PointVisitingCosts
+        from point in Enumerable.Range(0, data.Cities)
+        let travelCosts = data.GetDistance(data.StartingPoint, point)
+        + data.GetDistance(point, data.TerminalPoint) + data.PointVisitingCosts
         let score = data.GetScore(point)
         where travelCosts <= data.MaximumTravelCosts
@@ -81,5 +81,5 @@
         data.TerminalPoint
       };
-      double tourLength = data.RoutingData.GetDistance(data.StartingPoint, data.TerminalPoint);
+      double tourLength = data.GetDistance(data.StartingPoint, data.TerminalPoint);
 
       // Add points in a greedy way
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Improvers/OrienteeringLocalImprovementOperator.cs	(revision 17533)
@@ -126,5 +126,5 @@
 
         // Determine all points that have not yet been visited by this tour
-        var visitablePoints = Enumerable.Range(0, data.RoutingData.Cities).Except(tour).ToList();
+        var visitablePoints = Enumerable.Range(0, data.Cities).Except(tour).ToList();
 
         // Determine if any of the visitable points can be included at any position within the tour
@@ -168,8 +168,8 @@
             double newLength = tourLength;
             // Recalculate length of whole swapped part, in case distances are not symmetric
-            for (int index = position - 1; index < position + blockLength; index++) newLength -= data.RoutingData.GetDistance(tour[index], tour[index + 1]);
-            for (int index = position + blockLength - 1; index > position; index--) newLength += data.RoutingData.GetDistance(tour[index], tour[index - 1]);
-            newLength += data.RoutingData.GetDistance(tour[position - 1], tour[position + blockLength - 1]);
-            newLength += data.RoutingData.GetDistance(tour[position], tour[position + blockLength]);
+            for (int index = position - 1; index < position + blockLength; index++) newLength -= data.GetDistance(tour[index], tour[index + 1]);
+            for (int index = position + blockLength - 1; index > position; index--) newLength += data.GetDistance(tour[index], tour[index - 1]);
+            newLength += data.GetDistance(tour[position - 1], tour[position + blockLength - 1]);
+            newLength += data.GetDistance(tour[position], tour[position + blockLength]);
 
             if (newLength < tourLength - 0.00001) {
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblem.cs	(revision 17533)
@@ -96,10 +96,10 @@
     }
     public static double CalculateTravelCosts(IOrienteeringProblemData data, IntegerVector solution) {
-      var distance = data.RoutingData.GetPathDistance(solution, closed: false);
+      var distance = data.GetPathDistance(solution, closed: false);
       distance += (solution.Length - 2) * data.PointVisitingCosts;
       return distance;
     }
     public static double CalculateTravelCosts(IOrienteeringProblemData data, IList<int> solution) {
-      var distance = data.RoutingData.GetPathDistance(solution, closed: false);
+      var distance = data.GetPathDistance(solution, closed: false);
       distance += (solution.Count - 2) * data.PointVisitingCosts;
       return distance;
@@ -127,18 +127,18 @@
     }
     public static double CalculateInsertionCosts(IOrienteeringProblemData data, IList<int> path, int insertPosition, int point) {
-      double detour = data.RoutingData.GetDistance(path[insertPosition - 1], point) + data.RoutingData.GetDistance(point, path[insertPosition]);
+      double detour = data.GetDistance(path[insertPosition - 1], point) + data.GetDistance(point, path[insertPosition]);
       detour += data.PointVisitingCosts;
-      detour -= data.RoutingData.GetDistance(path[insertPosition - 1], path[insertPosition]);
+      detour -= data.GetDistance(path[insertPosition - 1], path[insertPosition]);
       return detour;
     }
     public static double CalculateReplacementCosts(IOrienteeringProblemData data, IList<int> path, int replacePosition, int point) {
-      double detour = data.RoutingData.GetDistance(path[replacePosition - 1], point) + data.RoutingData.GetDistance(point, path[replacePosition + 1]);
-      detour -= data.RoutingData.GetDistance(path[replacePosition - 1], path[replacePosition]) + data.RoutingData.GetDistance(path[replacePosition], path[replacePosition + 1]);
+      double detour = data.GetDistance(path[replacePosition - 1], point) + data.GetDistance(point, path[replacePosition + 1]);
+      detour -= data.GetDistance(path[replacePosition - 1], path[replacePosition]) + data.GetDistance(path[replacePosition], path[replacePosition + 1]);
       return detour;
     }
     public static double CalculateRemovementSaving(IOrienteeringProblemData data, IList<int> path, int removePosition) {
-      double saving = data.RoutingData.GetDistance(path[removePosition - 1], path[removePosition]);
-      saving += data.RoutingData.GetDistance(path[removePosition], path[removePosition + 1]);
-      saving -= data.RoutingData.GetDistance(path[removePosition - 1], path[removePosition + 1]);
+      double saving = data.GetDistance(path[removePosition - 1], path[removePosition]);
+      saving += data.GetDistance(path[removePosition], path[removePosition + 1]);
+      saving -= data.GetDistance(path[removePosition - 1], path[removePosition + 1]);
       saving += data.PointVisitingCosts;
       return saving;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblemdata.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblemdata.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringProblemdata.cs	(revision 17533)
@@ -1,3 +1,4 @@
 ﻿using System;
+using System.Collections.Generic;
 using HEAL.Attic;
 using HeuristicLab.Common;
@@ -5,4 +6,6 @@
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Problems.Instances;
 using HeuristicLab.Problems.Instances.Types;
 using HeuristicLab.Problems.TravelingSalesman;
@@ -10,6 +13,5 @@
 namespace HeuristicLab.Problems.Orienteering {
   [StorableType("c33063a6-a2ee-4054-9dd8-46a738003139")]
-  public interface IOrienteeringProblemData : INamedItem {
-    ITSPData RoutingData { get; }
+  public interface IOrienteeringProblemData : ITSPData {
     int StartingPoint { get; }
     int TerminalPoint { get; }
@@ -19,5 +21,5 @@
     double GetScore(int city);
     OrienteeringSolution GetSolution(IntegerVector route, double quality, double score, double travelCosts);
-    OPData Export();
+    new OPData Export();
   }
 
@@ -93,4 +95,13 @@
     }
 
+    #region ITSPData members
+    int ITSPData.Cities => RoutingData.Cities;
+    double ITSPData.GetDistance(int fromCity, int toCity) => RoutingData.GetDistance(fromCity, toCity);
+    double ITSPData.GetPathDistance(IEnumerable<int> path, bool closed) => RoutingData.GetPathDistance(path, closed);
+    ITSPSolution ITSPData.GetSolution(Permutation tspTour, double tourLength) => RoutingData.GetSolution(tspTour, tourLength);
+    TSPData ITSPData.Export() => RoutingData.Export();
+    DoubleMatrix ITSPData.GetCoordinatesOrDefault() => RoutingData.GetCoordinatesOrDefault();
+    #endregion
+
     private static double[,] defaultCoordinates = new double[21, 2] {
       {  4.60,  7.10 }, {  5.70, 11.40 }, {  4.40, 12.30 }, {  2.80, 14.30 }, {  3.20, 10.30 },
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringSolution.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringSolution.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/OrienteeringSolution.cs	(revision 17533)
@@ -31,7 +31,15 @@
 
 namespace HeuristicLab.Problems.Orienteering {
+  public interface IOrienteeringSolution : ITSPSolution {
+    new IOrienteeringProblemData Data { get; }
+    new IntegerVector Tour { get; }
+    DoubleValue Quality { get; }
+    DoubleValue Score { get; }
+    DoubleValue TravelCosts { get; }
+  }
+
   [Item("OrienteeringSolution", "Represents a Orienteering solution which can be visualized in the GUI.")]
   [StorableType("BC58ED08-B9A7-40F3-B8E0-A6B33AA993F4")]
-  public sealed class OrienteeringSolution : Item, ITSPSolution {
+  public sealed class OrienteeringSolution : Item, IOrienteeringSolution {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; }
@@ -40,5 +48,5 @@
     [Storable] private Permutation routeAsPermutation;
     [Storable] private IntegerVector route;
-    public IntegerVector Route {
+    public IntegerVector Tour {
       get { return route; }
       set {
@@ -46,16 +54,14 @@
         route = value;
         routeAsPermutation = new Permutation(PermutationTypes.RelativeDirected, value);
-        OnPropertyChanged(nameof(Route));
-        OnPropertyChanged(nameof(ITSPSolution.Tour));
+        OnPropertyChanged(nameof(Tour));
       }
     }
-    [Storable] private IOrienteeringProblemData opData;
-    public IOrienteeringProblemData OPData {
-      get { return opData; }
+    [Storable] private IOrienteeringProblemData data;
+    public IOrienteeringProblemData Data {
+      get { return data; }
       set {
-        if (opData == value) return;
-        opData = value;
-        OnPropertyChanged(nameof(OPData));
-        OnPropertyChanged(nameof(ITSPSolution.TSPData));
+        if (data == value) return;
+        data = value;
+        OnPropertyChanged(nameof(Data));
       }
     }
@@ -92,5 +98,5 @@
     }
 
-    ITSPData ITSPSolution.TSPData => OPData.RoutingData;
+    ITSPData ITSPSolution.Data => Data;
     Permutation ITSPSolution.Tour => routeAsPermutation;
     DoubleValue ITSPSolution.TourLength => TravelCosts;
@@ -102,5 +108,5 @@
       this.route = cloner.Clone(original.route);
       this.routeAsPermutation = cloner.Clone(original.routeAsPermutation);
-      this.opData = cloner.Clone(original.opData);
+      this.data = cloner.Clone(original.data);
       this.quality = cloner.Clone(original.quality);
       this.score = cloner.Clone(original.score);
@@ -112,5 +118,5 @@
       this.route = route;
       this.routeAsPermutation = new Permutation(PermutationTypes.RelativeDirected, route);
-      this.opData = opData;
+      this.data = opData;
       this.quality = quality;
       this.score = score;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Orienteering/3.3/Shakers/OrienteeringShakingOperator.cs	(revision 17533)
@@ -96,5 +96,5 @@
       var initialTour = IntegerVectorParameter.ActualValue;
       var data = OrienteeringProblemDataParameter.ActualValue;
-      int numPoints = data.RoutingData.Cities;
+      int numPoints = data.Cities;
 
       if (NeighborhoodCountParameter.ActualValue == null)
@@ -117,5 +117,5 @@
           from point in Enumerable.Range(0, numPoints)
           // Calculate the distance when going from the starting point to this point and then to the end point
-          let distance = data.RoutingData.GetDistance(data.StartingPoint, point) + data.RoutingData.GetDistance(point, data.TerminalPoint) + data.PointVisitingCosts
+          let distance = data.GetDistance(data.StartingPoint, point) + data.GetDistance(point, data.TerminalPoint) + data.PointVisitingCosts
           // If this distance is feasible and the point is neither starting nor ending point, check the point
           where distance < data.MaximumTravelCosts && point != data.StartingPoint && point != data.TerminalPoint
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/Plugin.cs.frame	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/Plugin.cs.frame	(revision 17533)
@@ -25,5 +25,4 @@
   [Plugin("HeuristicLab.Problems.PTSP.Views", "3.3.16.$WCREV$")]
   [PluginFile("HeuristicLab.Problems.PTSP.Views-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.Common", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.Designer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.Designer.cs	(revision 17533)
@@ -28,5 +28,5 @@
       this.probabilitiesTabPage = new System.Windows.Forms.TabPage();
       this.probabilitiesView = new HeuristicLab.Data.Views.StringConvertibleArrayView();
-      this.tspViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.tspDataView = new HeuristicLab.Problems.TravelingSalesman.Views.ITSPDataView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -55,5 +55,5 @@
       // coordinatesTabPage
       // 
-      this.coordinatesTabPage.Controls.Add(this.tspViewHost);
+      this.coordinatesTabPage.Controls.Add(this.tspDataView);
       this.coordinatesTabPage.Location = new System.Drawing.Point(4, 22);
       this.coordinatesTabPage.Name = "coordinatesTabPage";
@@ -86,17 +86,14 @@
       this.probabilitiesView.TabIndex = 0;
       // 
-      // tspViewHost
+      // tspDataView
       // 
-      this.tspViewHost.Caption = "View";
-      this.tspViewHost.Content = null;
-      this.tspViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.tspViewHost.Enabled = false;
-      this.tspViewHost.Location = new System.Drawing.Point(3, 3);
-      this.tspViewHost.Name = "tspViewHost";
-      this.tspViewHost.ReadOnly = false;
-      this.tspViewHost.Size = new System.Drawing.Size(337, 360);
-      this.tspViewHost.TabIndex = 0;
-      this.tspViewHost.ViewsLabelVisible = true;
-      this.tspViewHost.ViewType = null;
+      this.tspDataView.Caption = "TSP Data View";
+      this.tspDataView.Content = null;
+      this.tspDataView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tspDataView.Location = new System.Drawing.Point(3, 3);
+      this.tspDataView.Name = "tspDataView";
+      this.tspDataView.ReadOnly = false;
+      this.tspDataView.Size = new System.Drawing.Size(337, 360);
+      this.tspDataView.TabIndex = 0;
       // 
       // ProbabilisticTSPDataView
@@ -124,5 +121,5 @@
     private System.Windows.Forms.TabPage probabilitiesTabPage;
     private Data.Views.StringConvertibleArrayView probabilitiesView;
-    private MainForm.WindowsForms.ViewHost tspViewHost;
+    private TravelingSalesman.Views.ITSPDataView tspDataView;
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPDataView.cs	(revision 17533)
@@ -24,5 +24,4 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
-using HeuristicLab.Problems.TravelingSalesman.Views;
 
 namespace HeuristicLab.Problems.PTSP.Views {
@@ -41,4 +40,5 @@
       InitializeComponent();
       Visualizer = new ProbabilisticTSPVisualizer();
+      tspDataView.Visualizer = Visualizer;
     }
 
@@ -47,13 +47,10 @@
       if (Content == null) {
         probabilitiesView.Content = null;
-        tspViewHost.Content = null;
         Visualizer.Probabilities = null;
       } else {
         probabilitiesView.Content = Content.Probabilities;
         Visualizer.Probabilities = Content.Probabilities;
-        tspViewHost.Content = Content.TSPData;
-        if (tspViewHost.ActiveView is ITSPVisualizerView view)
-          view.Visualizer = Visualizer;
       }
+      tspDataView.Content = Content?.TSPData;
     }
 
@@ -61,5 +58,5 @@
       base.SetEnabledStateOfControls();
       probabilitiesView.Enabled = !ReadOnly && !Locked && Content != null;
-      tspViewHost.Enabled = !ReadOnly && !Locked && Content != null;
+      tspDataView.Enabled = !ReadOnly && !Locked && Content != null;
     }
   }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.Designer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.Designer.cs	(revision 17533)
@@ -45,6 +45,33 @@
     /// </summary>
     private void InitializeComponent() {
+      HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer tspVisualizer1 = new HeuristicLab.Problems.TravelingSalesman.Views.TSPVisualizer();
+      this.tspSolutionView = new HeuristicLab.Problems.TravelingSalesman.Views.TSPSolutionView();
+      this.SuspendLayout();
+      // 
+      // tspSolutionView
+      // 
+      this.tspSolutionView.Caption = "TSP Solution View";
+      this.tspSolutionView.Content = null;
+      this.tspSolutionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tspSolutionView.Location = new System.Drawing.Point(0, 0);
+      this.tspSolutionView.Name = "tspSolutionView";
+      this.tspSolutionView.ReadOnly = false;
+      this.tspSolutionView.Size = new System.Drawing.Size(704, 496);
+      this.tspSolutionView.TabIndex = 0;
+      tspVisualizer1.Coordinates = null;
+      tspVisualizer1.Tour = null;
+      this.tspSolutionView.Visualizer = tspVisualizer1;
+      // 
+      // ProbabilisticTSPSolutionView
+      // 
+      this.Controls.Add(this.tspSolutionView);
+      this.Name = "ProbabilisticTSPSolutionView";
+      this.Size = new System.Drawing.Size(704, 496);
+      this.ResumeLayout(false);
+
     }
     #endregion
+
+    private TravelingSalesman.Views.TSPSolutionView tspSolutionView;
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP.Views/3.3/ProbabilisticTSPSolutionView.cs	(revision 17533)
@@ -20,11 +20,6 @@
 #endregion
 
-using System;
-using System.Drawing;
 using HeuristicLab.Core.Views;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.MainForm;
-using HeuristicLab.Problems.TravelingSalesman.Views;
 
 namespace HeuristicLab.Problems.PTSP.Views {
@@ -35,5 +30,6 @@
   [Content(typeof(IProbabilisticTSPSolution), true)]
   public sealed partial class ProbabilisticTSPSolutionView : ItemView {
-    public TSPVisualizer Visualizer { get; set; }
+
+    public ProbabilisticTSPVisualizer Visualizer { get; set; }
 
     public new IProbabilisticTSPSolution Content {
@@ -48,4 +44,13 @@
       InitializeComponent();
       Visualizer = new ProbabilisticTSPVisualizer();
+      tspSolutionView.Visualizer = Visualizer;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null)
+        Visualizer.Probabilities = null;
+      else Visualizer.Probabilities = Content.Probabilities;
+      tspSolutionView.Content = Content;
     }
   }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/AnalyticalPTSP.cs	(revision 17533)
@@ -71,5 +71,5 @@
       for (var i = 0; i < tour.Length - 1; i++) {
         for (var j = i + 1; j < tour.Length; j++) {
-          var prod1 = data.TSPData.GetDistance(tour[i], tour[j]) * data.GetProbability(tour[i]) * data.GetProbability(tour[j]);
+          var prod1 = data.GetDistance(tour[i], tour[j]) * data.GetProbability(tour[i]) * data.GetProbability(tour[j]);
           for (var k = i + 1; k < j; k++) {
             prod1 *= (1 - data.GetProbability(tour[k]));
@@ -81,5 +81,5 @@
       for (var j = 0; j < tour.Length; j++) {
         for (var i = 0; i < j; i++) {
-          var prod2 = data.TSPData.GetDistance(tour[j], tour[i]) * data.GetProbability(tour[i]) * data.GetProbability(tour[j]);
+          var prod2 = data.GetDistance(tour[j], tour[i]) * data.GetProbability(tour[i]) * data.GetProbability(tour[j]);
           for (var k = j + 1; k < tour.Length; k++) {
             prod2 *= (1 - data.GetProbability(tour[k]));
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs	(revision 17533)
@@ -119,8 +119,8 @@
       foreach (var r in realizations) {
         int singleRealization = -1, firstNode = -1;
-        for (var j = 0; j < data.TSPData.Cities; j++) {
+        for (var j = 0; j < data.Cities; j++) {
           if (r[tour[j]]) {
             if (singleRealization != -1) {
-              estimatedSum += data.TSPData.GetDistance(singleRealization, tour[j]);
+              estimatedSum += data.GetDistance(singleRealization, tour[j]);
             } else {
               firstNode = tour[j];
@@ -130,5 +130,5 @@
         }
         if (singleRealization != -1)
-          estimatedSum += data.TSPData.GetDistance(singleRealization, firstNode);
+          estimatedSum += data.GetDistance(singleRealization, firstNode);
         count++;
       }
@@ -153,8 +153,8 @@
         var pSum = 0.0;
         int singleRealization = -1, firstNode = -1;
-        for (var j = 0; j < data.TSPData.Cities; j++) {
+        for (var j = 0; j < data.Cities; j++) {
           if (r[tour[j]]) {
             if (singleRealization != -1) {
-              pSum += data.TSPData.GetDistance(singleRealization, tour[j]);
+              pSum += data.GetDistance(singleRealization, tour[j]);
             } else {
               firstNode = tour[j];
@@ -164,5 +164,5 @@
         }
         if (singleRealization != -1) {
-          pSum += data.TSPData.GetDistance(singleRealization, firstNode);
+          pSum += data.GetDistance(singleRealization, firstNode);
         }
         estimatedSum += pSum;
@@ -201,10 +201,10 @@
       var data = new List<BoolArray>(Realizations);
       var rng = new MersenneTwister((uint)RealizationsSeed);
-      if (Enumerable.Range(0, ProbabilisticTSPData.TSPData.Cities).All(c => ProbabilisticTSPData.GetProbability(c) <= 0))
+      if (Enumerable.Range(0, ProbabilisticTSPData.Cities).All(c => ProbabilisticTSPData.GetProbability(c) <= 0))
         throw new InvalidOperationException("All probabilities are zero.");
       while (data.Count < Realizations) {
         var cities = 0;
-        var r = new bool[ProbabilisticTSPData.TSPData.Cities];
-        for (var j = 0; j < ProbabilisticTSPData.TSPData.Cities; j++) {
+        var r = new bool[ProbabilisticTSPData.Cities];
+        for (var j = 0; j < ProbabilisticTSPData.Cities; j++) {
           if (rng.NextDouble() < ProbabilisticTSPData.GetProbability(j)) {
             r[j] = true;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPEstimatedInsertionMoveEvaluator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPEstimatedInsertionMoveEvaluator.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/OneShift/PTSPEstimatedInsertionMoveEvaluator.cs	(revision 17533)
@@ -126,6 +126,6 @@
           !(aPosteriori[2] == aPosteriori[4] && aPosteriori[3] == aPosteriori[5])) {
           // compute cost difference between the two a posteriori solutions
-          moveQuality = moveQuality + data.TSPData.GetDistance(aPosteriori[6], aPosteriori[7]) + data.TSPData.GetDistance(aPosteriori[8], aPosteriori[9]) + data.TSPData.GetDistance(aPosteriori[10], aPosteriori[11]);
-          moveQuality = moveQuality - data.TSPData.GetDistance(aPosteriori[0], aPosteriori[1]) - data.TSPData.GetDistance(aPosteriori[2], aPosteriori[3]) - data.TSPData.GetDistance(aPosteriori[4], aPosteriori[5]);
+          moveQuality = moveQuality + data.GetDistance(aPosteriori[6], aPosteriori[7]) + data.GetDistance(aPosteriori[8], aPosteriori[9]) + data.GetDistance(aPosteriori[10], aPosteriori[11]);
+          moveQuality = moveQuality - data.GetDistance(aPosteriori[0], aPosteriori[1]) - data.GetDistance(aPosteriori[2], aPosteriori[3]) - data.GetDistance(aPosteriori[4], aPosteriori[5]);
         }
         Array.Clear(aPosteriori, 0, aPosteriori.Length);
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPEstimatedInversionMoveEvaluator.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPEstimatedInversionMoveEvaluator.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/Moves/TwoOpt/PTSPEstimatedInversionMoveEvaluator.cs	(revision 17533)
@@ -89,6 +89,6 @@
         // compute cost difference between the two a posteriori solutions
         if (!(aPosteriori[0] == aPosteriori[2] && aPosteriori[1] == aPosteriori[3])) {
-          moveQuality = moveQuality + data.TSPData.GetDistance(aPosteriori[0], aPosteriori[2]) + data.TSPData.GetDistance(aPosteriori[1], aPosteriori[3])
-            - data.TSPData.GetDistance(aPosteriori[0], aPosteriori[1]) - data.TSPData.GetDistance(aPosteriori[2], aPosteriori[3]);
+          moveQuality = moveQuality + data.GetDistance(aPosteriori[0], aPosteriori[2]) + data.GetDistance(aPosteriori[1], aPosteriori[3])
+            - data.GetDistance(aPosteriori[0], aPosteriori[1]) - data.GetDistance(aPosteriori[2], aPosteriori[3]);
         }
         Array.Clear(aPosteriori, 0, aPosteriori.Length);
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSP.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSP.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSP.cs	(revision 17533)
@@ -42,6 +42,6 @@
 
     #region Parameter Properties
-    [Storable] public ValueParameter<IProbabilisticTSPData> PTSPDataParameter { get; private set; }
-    [Storable] public OptionalValueParameter<IProbabilisticTSPSolution> BestKnownSolutionParameter { get; private set; }
+    [Storable] public ValueParameter<IProbabilisticTSPData> PTSPDataParameter { get; }
+    [Storable] public OptionalValueParameter<IProbabilisticTSPSolution> BestKnownSolutionParameter { get; }
     #endregion
 
@@ -70,10 +70,10 @@
 
       ProbabilisticTSPData = new ProbabilisticTSPData();
-      Encoding.Length = ProbabilisticTSPData.TSPData.Cities;
+      Encoding.Length = ProbabilisticTSPData.Cities;
     }
 
     protected override void OnEncodingChanged() {
       base.OnEncodingChanged();
-      Encoding.Length = ProbabilisticTSPData.TSPData.Cities;
+      Encoding.Length = ProbabilisticTSPData.Cities;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPData.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPData.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPData.cs	(revision 17533)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using HEAL.Attic;
@@ -32,10 +33,8 @@
 namespace HeuristicLab.Problems.PTSP {
   [StorableType("dd2d0ecc-372e-46f1-846f-fb4ca2afa124")]
-  public interface IProbabilisticTSPData : INamedItem {
-    ITSPData TSPData { get; }
-
+  public interface IProbabilisticTSPData : ITSPData {
     double GetProbability(int city);
-    IProbabilisticTSPSolution GetSolution(Permutation tspTour, double tourLength);
-    PTSPData Export();
+    new IProbabilisticTSPSolution GetSolution(Permutation tspTour, double tourLength);
+    new PTSPData Export();
   }
 
@@ -89,4 +88,13 @@
       };
     }
+
+    #region ITSPData members
+    int ITSPData.Cities => TSPData.Cities;
+    double ITSPData.GetDistance(int fromCity, int toCity) => TSPData.GetDistance(fromCity, toCity);
+    double ITSPData.GetPathDistance(IEnumerable<int> path, bool closed) => TSPData.GetPathDistance(path, closed);
+    ITSPSolution ITSPData.GetSolution(Permutation tspTour, double tourLength) => TSPData.GetSolution(tspTour, tourLength);
+    TSPData ITSPData.Export() => TSPData.Export();
+    DoubleMatrix ITSPData.GetCoordinatesOrDefault() => TSPData.GetCoordinatesOrDefault();
+    #endregion
   }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPSolution.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPSolution.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.PTSP/3.3/ProbabilisticTSPSolution.cs	(revision 17533)
@@ -26,11 +26,11 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Problems.TravelingSalesman;
 
 namespace HeuristicLab.Problems.PTSP {
   [StorableType("596f52b5-b2c8-45a0-a7bd-e5b9c787c960")]
-  public interface IProbabilisticTSPSolution : IItem, INotifyPropertyChanged {
-    ITSPSolution TSPSolution { get; }
-    DoubleArray Probabilities { get; }
+  public interface IProbabilisticTSPSolution : ITSPSolution {
+    PercentArray Probabilities { get; }
   }
 
@@ -57,6 +57,6 @@
 
     [Storable]
-    private DoubleArray probabilities;
-    public DoubleArray Probabilities {
+    private PercentArray probabilities;
+    public PercentArray Probabilities {
       get { return probabilities; }
       set {
@@ -66,4 +66,10 @@
       }
     }
+
+    ITSPData ITSPSolution.Data => tspSolution.Data;
+
+    Permutation ITSPSolution.Tour => tspSolution.Tour;
+
+    DoubleValue ITSPSolution.TourLength => tspSolution.TourLength;
 
     [StorableConstructor]
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/HeuristicLab.Problems.TravelingSalesman.Views-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/HeuristicLab.Problems.TravelingSalesman.Views-3.3.csproj	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/HeuristicLab.Problems.TravelingSalesman.Views-3.3.csproj	(revision 17533)
@@ -135,5 +135,10 @@
       <DependentUpon>EuclideanTSPDataView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ITSPDataView.cs" />
+    <Compile Include="ITSPDataView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ITSPDataView.Designer.cs">
+      <DependentUpon>ITSPDataView.cs</DependentUpon>
+    </Compile>
     <Compile Include="MatrixTSPDataView.cs">
       <SubType>UserControl</SubType>
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.Designer.cs	(revision 17533)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.Designer.cs	(revision 17533)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.Problems.TravelingSalesman.Views {
+  partial class ITSPDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.SuspendLayout();
+      // 
+      // viewHost
+      // 
+      this.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.viewHost.Enabled = false;
+      this.viewHost.Location = new System.Drawing.Point(0, 0);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(582, 404);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewsLabelVisible = false;
+      this.viewHost.ViewType = null;
+      // 
+      // ITSPDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.viewHost);
+      this.Name = "ITSPDataView";
+      this.Size = new System.Drawing.Size(582, 404);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private MainForm.WindowsForms.ViewHost viewHost;
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/ITSPDataView.cs	(revision 17533)
@@ -20,7 +20,33 @@
 #endregion
 
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
 namespace HeuristicLab.Problems.TravelingSalesman.Views {
   public interface ITSPVisualizerView {
     TSPVisualizer Visualizer { get; set; }
   }
+
+  [View("TSP Data View")]
+  [Content(typeof(ITSPData), IsDefaultView = true)]
+  public partial class ITSPDataView : ItemView {
+    public TSPVisualizer Visualizer { get; set; } = new TSPVisualizer();
+
+    public new ITSPData Content {
+      get { return (ITSPData)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ITSPDataView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      viewHost.Content = Content;
+      if (viewHost.ActiveView is ITSPVisualizerView view)
+        view.Visualizer = Visualizer;
+    }
+
+  }
 }
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.Designer.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.Designer.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.Designer.cs	(revision 17533)
@@ -121,4 +121,6 @@
       // distanceView
       // 
+      this.distanceView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.distanceView.Caption = "StringConvertibleValue View";
       this.distanceView.Content = null;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman.Views/3.3/TSPSolutionView.cs	(revision 17533)
@@ -67,8 +67,5 @@
       } else {
         distanceView.Content = Content.TourLength;
-        if (Content.TSPData is CoordinatesTSPData coordTsp)
-          Visualizer.Coordinates = coordTsp.Coordinates;
-        else if (Content.TSPData is MatrixTSPData matrixTsp)
-          Visualizer.Coordinates = matrixTsp.DisplayCoordinates;
+        Visualizer.Coordinates = Content.Data.GetCoordinatesOrDefault();
         Visualizer.Tour = Content.Tour;
         GenerateImage();
@@ -98,8 +95,8 @@
       else {
         switch (e.PropertyName) {
-          case nameof(Content.TSPData):
-            if (Content.TSPData is CoordinatesTSPData coordTsp)
+          case nameof(Content.Data):
+            if (Content.Data is CoordinatesTSPData coordTsp)
               Visualizer.Coordinates = coordTsp.Coordinates;
-            else if (Content.TSPData is MatrixTSPData matrixTsp)
+            else if (Content.Data is MatrixTSPData matrixTsp)
               Visualizer.Coordinates = matrixTsp.DisplayCoordinates;
             GenerateImage();
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPData.cs	(revision 17533)
@@ -38,4 +38,6 @@
     ITSPSolution GetSolution(Permutation tspTour, double tourLength);
     TSPData Export();
+
+    DoubleMatrix GetCoordinatesOrDefault();
   }
 
@@ -111,4 +113,8 @@
       };
     }
+
+    public DoubleMatrix GetCoordinatesOrDefault() {
+      return DisplayCoordinates;
+    }
   }
 
@@ -178,4 +184,8 @@
 
     public abstract TSPData Export();
+
+    public DoubleMatrix GetCoordinatesOrDefault() {
+      return Coordinates;
+    }
   }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPSolution.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPSolution.cs	(revision 17532)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.TravelingSalesman/3.3/TSPSolution.cs	(revision 17533)
@@ -31,5 +31,5 @@
   [StorableType("f08a63d9-0b83-4944-9251-42925baeb872")]
   public interface ITSPSolution : IItem, INotifyPropertyChanged {
-    ITSPData TSPData { get; }
+    ITSPData Data { get; }
     Permutation Tour { get; }
     DoubleValue TourLength { get; }
@@ -47,10 +47,10 @@
 
     [Storable] private ITSPData tspData;
-    public ITSPData TSPData {
+    public ITSPData Data {
       get { return tspData; }
       set {
         if (tspData == value) return;
         tspData = value;
-        OnPropertyChanged(nameof(TSPData));
+        OnPropertyChanged(nameof(Data));
       }
     }
