Index: /trunk/sources/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 7955)
+++ /trunk/sources/HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj	(revision 7956)
@@ -430,4 +430,6 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_SaveAsHH.png" />
+    <None Include="Resources\SaveAs.bmp" />
     <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Checkout.png" />
     <Content Include="Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_Clone.png" />
Index: /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.Designer.cs	(revision 7956)
@@ -2,5 +2,5 @@
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.239
+//     Runtime Version:4.0.30319.269
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
@@ -838,4 +838,11 @@
         }
         
+        public static System.Drawing.Bitmap SaveAs {
+            get {
+                object obj = ResourceManager.GetObject("SaveAs", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         public static System.Drawing.Bitmap Script {
             get {
Index: /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx
===================================================================
--- /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 7955)
+++ /trunk/sources/HeuristicLab.Common.Resources/3.3/VSImageLibrary.resx	(revision 7956)
@@ -508,5 +508,5 @@
   <data name="DisplayInColorVertical" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>Resources\VS2008ImageLibrary\VS2008ImageLibrary_Actions_DisplayInColor_Vertical.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>  
+  </data>
   <data name="InformationLarge" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Information_Large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -518,3 +518,6 @@
     <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Objects_Network_Center_Large.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="SaveAs" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2010ImageLibrary\VS2010ImageLibrary_Actions_SaveAsHH.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
 </root>
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 7956)
@@ -46,5 +46,5 @@
     private void InitializeComponent() {
       this.problemInstanceSplitContainer = new System.Windows.Forms.SplitContainer();
-      this.problemInstanceConsumerView = new HeuristicLab.Problems.Instances.Views.ProblemInstanceConsumerView();
+      this.ProblemInstanceConsumerViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).BeginInit();
@@ -87,5 +87,5 @@
       // problemInstanceSplitContainer.Panel1
       // 
-      this.problemInstanceSplitContainer.Panel1.Controls.Add(this.problemInstanceConsumerView);
+      this.problemInstanceSplitContainer.Panel1.Controls.Add(this.ProblemInstanceConsumerViewHost);
       this.problemInstanceSplitContainer.Panel1MinSize = 10;
       // 
@@ -100,16 +100,19 @@
       this.problemInstanceSplitContainer.TabIndex = 13;
       // 
-      // problemInstanceConsumerView
+      // ProblemInstanceConsumerViewHost
       // 
-      this.problemInstanceConsumerView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+      this.ProblemInstanceConsumerViewHost.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.problemInstanceConsumerView.Caption = "ProblemInstanceProviderView";
-      this.problemInstanceConsumerView.Content = null;
-      this.problemInstanceConsumerView.Location = new System.Drawing.Point(0, 1);
-      this.problemInstanceConsumerView.Name = "problemInstanceConsumerView";
-      this.problemInstanceConsumerView.ReadOnly = false;
-      this.problemInstanceConsumerView.Size = new System.Drawing.Size(511, 23);
-      this.problemInstanceConsumerView.TabIndex = 0;
+      this.ProblemInstanceConsumerViewHost.Caption = "ProblemInstanceConsumerView";
+      this.ProblemInstanceConsumerViewHost.Content = null;
+      this.ProblemInstanceConsumerViewHost.Enabled = false;
+      this.ProblemInstanceConsumerViewHost.Location = new System.Drawing.Point(0, 1);
+      this.ProblemInstanceConsumerViewHost.Name = "ProblemInstanceConsumerViewHost";
+      this.ProblemInstanceConsumerViewHost.ReadOnly = false;
+      this.ProblemInstanceConsumerViewHost.Size = new System.Drawing.Size(511, 23);
+      this.ProblemInstanceConsumerViewHost.TabIndex = 0;
+      this.ProblemInstanceConsumerViewHost.ViewsLabelVisible = false;
+      this.ProblemInstanceConsumerViewHost.ViewType = null;
       // 
       // ProblemView
@@ -133,5 +136,5 @@
 
     protected System.Windows.Forms.SplitContainer problemInstanceSplitContainer;
-    protected HeuristicLab.Problems.Instances.Views.ProblemInstanceConsumerView problemInstanceConsumerView;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost ProblemInstanceConsumerViewHost;
   }
 }
Index: /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs	(revision 7956)
@@ -20,4 +20,6 @@
 #endregion
 
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Forms;
@@ -25,4 +27,5 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.Problems.Instances;
+using HeuristicLab.Problems.Instances.Views;
 
 namespace HeuristicLab.Optimization.Views {
@@ -33,4 +36,7 @@
   [Content(typeof(IProblem), true)]
   public partial class ProblemView : ParameterizedNamedItemView {
+
+    private static Type neededViewType = typeof(ProblemInstanceConsumerView);
+
     public new IProblem Content {
       get { return (IProblem)base.Content; }
@@ -49,6 +55,10 @@
       IProblemInstanceConsumer consumer = Content as IProblemInstanceConsumer;
       if (consumer != null) {
-        problemInstanceConsumerView.Content = consumer;
-        problemInstanceSplitContainer.Panel1Collapsed = !problemInstanceConsumerView.ProblemInstanceProviders.Any();
+        IEnumerable<Type> viewTypes = MainFormManager.GetViewTypes(consumer.GetType(), true);
+        Type genericView = viewTypes.Where(x => x.IsSubclassOf(neededViewType)).First();
+        ProblemInstanceConsumerViewHost.ViewType = genericView;
+        ProblemInstanceConsumerViewHost.Content = consumer;
+        ProblemInstanceConsumerView view = (ProblemInstanceConsumerView)ProblemInstanceConsumerViewHost.ActiveView;
+        problemInstanceSplitContainer.Panel1Collapsed = !view.ProblemInstanceProviders.Any();
       } else {
         problemInstanceSplitContainer.Panel1Collapsed = true;
Index: /trunk/sources/HeuristicLab.Problems.Instances.TSPLIB.Views/3.3/TSPLIBTSPInstanceProviderView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.TSPLIB.Views/3.3/TSPLIBTSPInstanceProviderView.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.TSPLIB.Views/3.3/TSPLIBTSPInstanceProviderView.cs	(revision 7956)
@@ -21,16 +21,16 @@
 
 using System;
+using System.IO;
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
 using HeuristicLab.Problems.Instances.Views;
-using System.IO;
 
 namespace HeuristicLab.Problems.Instances.TSPLIB.Views {
   [View("TSPLIB TSP InstanceProvider View")]
-  [Content(typeof(TSPLIBTSPInstanceProvider), IsDefaultView = true)]
-  public partial class TSPLIBTSPInstanceProviderView : ProblemInstanceProviderViewGeneric<TSPData> {
-    public new TSPLIBTSPInstanceProvider Content {
-      get { return (TSPLIBTSPInstanceProvider)base.Content; }
+  [Content(typeof(IProblemInstanceConsumer<TSPData>), IsDefaultView = true)]
+  public partial class TSPLIBTSPInstanceProviderView : ProblemInstanceConsumerViewGeneric<TSPData> {
+    public new IProblemInstanceConsumer<TSPData> Content {
+      get { return (IProblemInstanceConsumer<TSPData>)base.Content; }
       set { base.Content = value; }
     }
@@ -41,14 +41,19 @@
 
     protected override void importButton_Click(object sender, EventArgs e) {
-      using (var dialog = new TSPLIBImportDialog()) {
-        if (dialog.ShowDialog() == DialogResult.OK) {
-          var instance = Content.LoadData(dialog.TSPFileName, dialog.TourFileName, dialog.Quality);
-          try {
-            GenericConsumer.Load(instance);
-          }
-          catch (Exception ex) {
-            MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
+      TSPLIBTSPInstanceProvider provider = SelectedProvider as TSPLIBTSPInstanceProvider;
+      if (provider != null) {
+        using (var dialog = new TSPLIBImportDialog()) {
+          if (dialog.ShowDialog() == DialogResult.OK) {
+            var instance = provider.LoadData(dialog.TSPFileName, dialog.TourFileName, dialog.Quality);
+            try {
+              GenericConsumer.Load(instance);
+            }
+            catch (Exception ex) {
+              MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
+            }
           }
         }
+      } else {
+        base.importButton_Click(sender, e);
       }
     }
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.cs	(revision 7956)
@@ -21,17 +21,17 @@
 
 using System;
+using System.IO;
 using System.Windows.Forms;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
 using HeuristicLab.Problems.Instances.Views;
-using System.IO;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting.Views {
   [View("VRP InstanceProvider View")]
-  [Content(typeof(VRPInstanceProvider<>), IsDefaultView = true)]
-  public partial class VRPInstanceProviderView<T> : ProblemInstanceProviderViewGeneric<T> where T : class, IVRPData  {
+  [Content(typeof(IProblemInstanceConsumer<IVRPData>), IsDefaultView = true)]
+  public partial class VRPInstanceProviderView<T> : ProblemInstanceConsumerViewGeneric<T> where T : class, IVRPData {
 
-    public new VRPInstanceProvider<T> Content {
-      get { return (VRPInstanceProvider<T>)base.Content; }
+    public new IProblemInstanceConsumer<T> Content {
+      get { return (IProblemInstanceConsumer<T>)base.Content; }
       set { base.Content = value; }
     }
@@ -42,12 +42,15 @@
 
     protected override void importButton_Click(object sender, EventArgs e) {
-      using (var dialog = new VRPImportDialog(Content.Name)) {
-        if (dialog.ShowDialog() == DialogResult.OK) {
-          var instance = Content.LoadData(dialog.VRPFileName, dialog.TourFileName);
-          try {
-            GenericConsumer.Load(instance as T);
-          }
-          catch (Exception ex) {
-            MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
+      IVRPInstanceProvider provider = SelectedProvider as IVRPInstanceProvider;
+      if (provider != null) {
+        using (var dialog = new VRPImportDialog(SelectedProvider.Name)) {
+          if (dialog.ShowDialog() == DialogResult.OK) {
+            var instance = provider.LoadData(dialog.VRPFileName, dialog.TourFileName);
+            try {
+              GenericConsumer.Load(instance as T);
+            }
+            catch (Exception ex) {
+              MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
+            }
           }
         }
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/HeuristicLab.Problems.Instances.VehicleRouting-3.4.csproj	(revision 7956)
@@ -115,4 +115,5 @@
     <Compile Include="GoldenFormat\GoldenParser.cs" />
     <Compile Include="GoldenFormat\GoldenFormatInstanceProvider.cs" />
+    <Compile Include="IVRPInstanceProvider.cs" />
     <Compile Include="TaillardFormat\TaillardInstanceProvider.cs" />
     <Compile Include="TaillardFormat\TaillardParser.cs" />
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs	(revision 7956)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs	(revision 7956)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting {
+  public interface IVRPInstanceProvider {
+    IVRPData LoadData(string vrpFile, string tourFile);
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 7956)
@@ -29,5 +29,5 @@
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
-  public abstract class VRPInstanceProvider<T> : ProblemInstanceProvider<T> where T : IVRPData {
+  public abstract class VRPInstanceProvider<T> : ProblemInstanceProvider<T>, IVRPInstanceProvider where T : IVRPData {
     protected abstract string FileName { get; }
 
@@ -110,5 +110,5 @@
     }
 
-    public T LoadData(string vrpFile, string tourFile) {
+    public IVRPData LoadData(string vrpFile, string tourFile) {
       var data = LoadData(vrpFile);
       if (!String.IsNullOrEmpty(tourFile)) {
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/HeuristicLab.Problems.Instances.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/HeuristicLab.Problems.Instances.Views-3.3.csproj	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/HeuristicLab.Problems.Instances.Views-3.3.csproj	(revision 7956)
@@ -102,4 +102,7 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
@@ -113,4 +116,17 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ProblemInstanceConsumerViewGeneric.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProblemInstanceConsumerViewGeneric.Designer.cs">
+      <DependentUpon>ProblemInstanceConsumerViewGeneric.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemInstanceConsumerView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProblemInstanceConsumerView.Designer.cs">
+      <DependentUpon>ProblemInstanceConsumerView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ProblemInstanceProviderView.cs">
       <SubType>UserControl</SubType>
@@ -118,11 +134,4 @@
     <Compile Include="ProblemInstanceProviderView.Designer.cs">
       <DependentUpon>ProblemInstanceProviderView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Plugin.cs" />
-    <Compile Include="ProblemInstanceConsumerView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ProblemInstanceConsumerView.Designer.cs">
-      <DependentUpon>ProblemInstanceConsumerView.cs</DependentUpon>
     </Compile>
     <Compile Include="ProblemInstanceProviderViewGeneric.cs">
@@ -149,4 +158,8 @@
       <Name>HeuristicLab.Common-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104A0B-90E7-42F3-9ABE-9BBBADD4B943}</Project>
+      <Name>HeuristicLab.Data.Views-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.Designer.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.Designer.cs	(revision 7956)
@@ -46,54 +46,6 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      this.problemInstanceProviderComboBox = new System.Windows.Forms.ComboBox();
-      this.libraryInfoButton = new System.Windows.Forms.Button();
-      this.libraryLabel = new System.Windows.Forms.Label();
-      this.problemInstanceProviderViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
       this.SuspendLayout();
-      // 
-      // problemInstanceProviderComboBox
-      // 
-      this.problemInstanceProviderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-      this.problemInstanceProviderComboBox.FormattingEnabled = true;
-      this.problemInstanceProviderComboBox.Location = new System.Drawing.Point(50, 0);
-      this.problemInstanceProviderComboBox.Name = "problemInstanceProviderComboBox";
-      this.problemInstanceProviderComboBox.Size = new System.Drawing.Size(171, 21);
-      this.problemInstanceProviderComboBox.TabIndex = 16;
-      this.problemInstanceProviderComboBox.SelectedIndexChanged += new System.EventHandler(this.problemInstanceProviderComboBox_SelectedIndexChanged);
-      // 
-      // libraryInfoButton
-      // 
-      this.libraryInfoButton.Location = new System.Drawing.Point(226, -1);
-      this.libraryInfoButton.Name = "libraryInfoButton";
-      this.libraryInfoButton.Size = new System.Drawing.Size(24, 24);
-      this.libraryInfoButton.TabIndex = 17;
-      this.libraryInfoButton.Text = "Info";
-      this.libraryInfoButton.UseVisualStyleBackColor = true;
-      this.libraryInfoButton.Click += new System.EventHandler(this.libraryInfoButton_Click);
-      // 
-      // libraryLabel
-      // 
-      this.libraryLabel.AutoSize = true;
-      this.libraryLabel.Location = new System.Drawing.Point(3, 3);
-      this.libraryLabel.Name = "libraryLabel";
-      this.libraryLabel.Size = new System.Drawing.Size(41, 13);
-      this.libraryLabel.TabIndex = 15;
-      this.libraryLabel.Text = "Library:";
-      // 
-      // problemInstanceProviderViewHost
-      // 
-      this.problemInstanceProviderViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.problemInstanceProviderViewHost.Caption = "View";
-      this.problemInstanceProviderViewHost.Content = null;
-      this.problemInstanceProviderViewHost.Enabled = false;
-      this.problemInstanceProviderViewHost.Location = new System.Drawing.Point(258, 0);
-      this.problemInstanceProviderViewHost.Name = "problemInstanceProviderViewHost";
-      this.problemInstanceProviderViewHost.ReadOnly = false;
-      this.problemInstanceProviderViewHost.Size = new System.Drawing.Size(433, 22);
-      this.problemInstanceProviderViewHost.TabIndex = 15;
-      this.problemInstanceProviderViewHost.ViewsLabelVisible = false;
-      this.problemInstanceProviderViewHost.ViewType = null;
       // 
       // ProblemInstanceConsumerView
@@ -101,12 +53,7 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.problemInstanceProviderViewHost);
-      this.Controls.Add(this.problemInstanceProviderComboBox);
-      this.Controls.Add(this.libraryInfoButton);
-      this.Controls.Add(this.libraryLabel);
       this.Name = "ProblemInstanceConsumerView";
       this.Size = new System.Drawing.Size(694, 22);
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -114,8 +61,4 @@
     #endregion
 
-    private System.Windows.Forms.ComboBox problemInstanceProviderComboBox;
-    private System.Windows.Forms.Button libraryInfoButton;
-    private System.Windows.Forms.Label libraryLabel;
-    private MainForm.WindowsForms.ViewHost problemInstanceProviderViewHost;
     private System.Windows.Forms.ToolTip toolTip;
   }
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerView.cs	(revision 7956)
@@ -20,10 +20,6 @@
 #endregion
 
-using System;
 using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
 using System.Windows.Forms;
-using HeuristicLab.Common.Resources;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -32,5 +28,5 @@
   [View("ProblemInstanceConsumerView")]
   [Content(typeof(IProblemInstanceConsumer), IsDefaultView = false)]
-  public sealed partial class ProblemInstanceConsumerView : AsynchronousContentView {
+  public partial class ProblemInstanceConsumerView : AsynchronousContentView {
 
     public new IProblemInstanceConsumer Content {
@@ -39,98 +35,12 @@
     }
 
-    public IProblemInstanceProvider SelectedProvider {
-      get;
-      private set;
-    }
-
+    protected IEnumerable<IProblemInstanceProvider> problemInstanceProviders;
     public IEnumerable<IProblemInstanceProvider> ProblemInstanceProviders {
-      get;
-      private set;
+      get { return new List<IProblemInstanceProvider>(problemInstanceProviders); }
     }
 
     public ProblemInstanceConsumerView() {
       InitializeComponent();
-      libraryInfoButton.Text = String.Empty;
-      libraryInfoButton.Image = VSImageLibrary.Help;
     }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        ProblemInstanceProviders = null;
-        problemInstanceProviderComboBox.DataSource = null;
-      } else {
-        problemInstanceProviderComboBox.DisplayMember = "Name";
-        ProblemInstanceProviders = ProblemInstanceManager.GetProviders(Content);
-        problemInstanceProviderComboBox.DataSource = ProblemInstanceProviders.OrderBy(x => x.Name).ToList();
-      }
-      SetEnabledStateOfControls();
-    }
-
-    public bool ContainsProviders() {
-      return problemInstanceProviderComboBox.Items.Count > 0;
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      problemInstanceProviderComboBox.Enabled = !ReadOnly && !Locked && Content != null && problemInstanceProviderComboBox.Items.Count > 0;
-      libraryInfoButton.Enabled = SelectedProvider != null && SelectedProvider.WebLink != null;
-    }
-
-    private void problemInstanceProviderComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
-      if (problemInstanceProviderComboBox.SelectedIndex >= 0) {
-        SelectedProvider = (IProblemInstanceProvider)problemInstanceProviderComboBox.SelectedItem;
-        problemInstanceProviderViewHost.Content = SelectedProvider;
-        ProblemInstanceProviderView view = (ProblemInstanceProviderView)problemInstanceProviderViewHost.ActiveView;
-        view.Consumer = Content;
-        if (CheckForIProblemInstanceExporter(Content)) {
-          view.Exporter = (IProblemInstanceExporter)Content;
-        }
-        SetTooltip();
-      } else {
-        SelectedProvider = null;
-      }
-
-      SetEnabledStateOfControls();
-    }
-
-    private bool CheckForIProblemInstanceExporter(IProblemInstanceConsumer content) {
-      return Content.GetType().GetInterfaces()
-                    .Any(x => x.Equals(typeof(IProblemInstanceExporter)));
-    }
-
-    private void libraryInfoButton_Click(object sender, EventArgs e) {
-      if (problemInstanceProviderComboBox.SelectedIndex >= 0) {
-        if (SelectedProvider != null && SelectedProvider.WebLink != null)
-          Process.Start(SelectedProvider.WebLink.ToString());
-      }
-    }
-
-    #region ToolTip
-    private void SetTooltip() {
-      toolTip.SetToolTip(problemInstanceProviderComboBox, GetProviderToolTip());
-      if (SelectedProvider.WebLink != null)
-        toolTip.SetToolTip(libraryInfoButton, "Browse to " + SelectedProvider.WebLink.ToString());
-      else toolTip.SetToolTip(libraryInfoButton, "Library does not have a web reference.");
-    }
-
-    private string GetProviderToolTip() {
-      var provider = SelectedProvider;
-      string toolTip = provider.Name;
-
-      if (!String.IsNullOrEmpty(provider.ReferencePublication)) {
-        toolTip = toolTip
-            + Environment.NewLine + Environment.NewLine
-            + provider.ReferencePublication;
-      }
-      if (provider.WebLink != null) {
-        toolTip = toolTip
-            + Environment.NewLine
-            + provider.WebLink.ToString();
-      }
-
-      return toolTip;
-    }
-    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs	(revision 7956)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs	(revision 7956)
@@ -0,0 +1,192 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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
+
+namespace HeuristicLab.Problems.Instances.Views {
+  partial class ProblemInstanceConsumerViewGeneric<T> {
+    /// <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.components = new System.ComponentModel.Container();
+      this.problemInstanceProviderComboBox = new System.Windows.Forms.ComboBox();
+      this.libraryInfoButton = new System.Windows.Forms.Button();
+      this.libraryLabel = new System.Windows.Forms.Label();
+      this.problemInstanceProviderViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.importButton = new System.Windows.Forms.Button();
+      this.exportButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.problemInstanceProviderSplitContainer = new System.Windows.Forms.SplitContainer();
+      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceProviderSplitContainer)).BeginInit();
+      this.problemInstanceProviderSplitContainer.Panel1.SuspendLayout();
+      this.problemInstanceProviderSplitContainer.Panel2.SuspendLayout();
+      this.problemInstanceProviderSplitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // problemInstanceProviderComboBox
+      // 
+      this.problemInstanceProviderComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemInstanceProviderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.problemInstanceProviderComboBox.FormattingEnabled = true;
+      this.problemInstanceProviderComboBox.Location = new System.Drawing.Point(50, 1);
+      this.problemInstanceProviderComboBox.Name = "problemInstanceProviderComboBox";
+      this.problemInstanceProviderComboBox.Size = new System.Drawing.Size(171, 21);
+      this.problemInstanceProviderComboBox.TabIndex = 16;
+      this.problemInstanceProviderComboBox.SelectedIndexChanged += new System.EventHandler(this.problemInstanceProviderComboBox_SelectedIndexChanged);
+      // 
+      // libraryInfoButton
+      // 
+      this.libraryInfoButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.libraryInfoButton.Location = new System.Drawing.Point(227, -1);
+      this.libraryInfoButton.Name = "libraryInfoButton";
+      this.libraryInfoButton.Size = new System.Drawing.Size(24, 24);
+      this.libraryInfoButton.TabIndex = 17;
+      this.libraryInfoButton.Text = "Info";
+      this.libraryInfoButton.UseVisualStyleBackColor = true;
+      this.libraryInfoButton.Click += new System.EventHandler(this.libraryInfoButton_Click);
+      // 
+      // libraryLabel
+      // 
+      this.libraryLabel.AutoSize = true;
+      this.libraryLabel.Location = new System.Drawing.Point(4, 4);
+      this.libraryLabel.Name = "libraryLabel";
+      this.libraryLabel.Size = new System.Drawing.Size(41, 13);
+      this.libraryLabel.TabIndex = 15;
+      this.libraryLabel.Text = "Library:";
+      // 
+      // problemInstanceProviderViewHost
+      // 
+      this.problemInstanceProviderViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemInstanceProviderViewHost.Caption = "View";
+      this.problemInstanceProviderViewHost.Content = null;
+      this.problemInstanceProviderViewHost.Enabled = false;
+      this.problemInstanceProviderViewHost.Location = new System.Drawing.Point(318, 0);
+      this.problemInstanceProviderViewHost.Name = "problemInstanceProviderViewHost";
+      this.problemInstanceProviderViewHost.ReadOnly = false;
+      this.problemInstanceProviderViewHost.Size = new System.Drawing.Size(373, 22);
+      this.problemInstanceProviderViewHost.TabIndex = 15;
+      this.problemInstanceProviderViewHost.ViewsLabelVisible = false;
+      this.problemInstanceProviderViewHost.ViewType = null;
+      // 
+      // importButton
+      // 
+      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.importButton.Location = new System.Drawing.Point(257, -1);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(24, 24);
+      this.importButton.TabIndex = 18;
+      this.importButton.Text = "Import";
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // exportButton
+      // 
+      this.exportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.exportButton.Location = new System.Drawing.Point(1, -1);
+      this.exportButton.Name = "exportButton";
+      this.exportButton.Size = new System.Drawing.Size(24, 24);
+      this.exportButton.TabIndex = 19;
+      this.exportButton.Text = "Export";
+      this.exportButton.UseVisualStyleBackColor = true;
+      this.exportButton.Click += new System.EventHandler(this.exportButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.Filter = "All files|*.*";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.Filter = "CSV files|*.csv|All files|*.*";
+      this.saveFileDialog.Title = "Save RegressionInstance...";
+      // 
+      // problemInstanceProviderSplitContainer
+      // 
+      this.problemInstanceProviderSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.problemInstanceProviderSplitContainer.IsSplitterFixed = true;
+      this.problemInstanceProviderSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.problemInstanceProviderSplitContainer.Name = "problemInstanceProviderSplitContainer";
+      // 
+      // problemInstanceProviderSplitContainer.Panel1
+      // 
+      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.problemInstanceProviderComboBox);
+      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.importButton);
+      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.libraryLabel);
+      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.libraryInfoButton);
+      // 
+      // problemInstanceProviderSplitContainer.Panel2
+      // 
+      this.problemInstanceProviderSplitContainer.Panel2.Controls.Add(this.exportButton);
+      this.problemInstanceProviderSplitContainer.Size = new System.Drawing.Size(312, 22);
+      this.problemInstanceProviderSplitContainer.SplitterDistance = 280;
+      this.problemInstanceProviderSplitContainer.TabIndex = 20;
+      // 
+      // ProblemInstanceConsumerViewGeneric
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.problemInstanceProviderSplitContainer);
+      this.Controls.Add(this.problemInstanceProviderViewHost);
+      this.Name = "ProblemInstanceConsumerViewGeneric";
+      this.problemInstanceProviderSplitContainer.Panel1.ResumeLayout(false);
+      this.problemInstanceProviderSplitContainer.Panel1.PerformLayout();
+      this.problemInstanceProviderSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceProviderSplitContainer)).EndInit();
+      this.problemInstanceProviderSplitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.ComboBox problemInstanceProviderComboBox;
+    private System.Windows.Forms.Button libraryInfoButton;
+    private System.Windows.Forms.Label libraryLabel;
+    protected MainForm.WindowsForms.ViewHost problemInstanceProviderViewHost;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button importButton;
+    private System.Windows.Forms.Button exportButton;
+    protected System.Windows.Forms.SaveFileDialog saveFileDialog;
+    protected System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SplitContainer problemInstanceProviderSplitContainer;
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 7956)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 7956)
@@ -0,0 +1,195 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Instances.Views {
+  [View("ProblemInstanceConsumerView")]
+  [Content(typeof(IProblemInstanceConsumer<>), IsDefaultView = true)]
+  public partial class ProblemInstanceConsumerViewGeneric<T> : ProblemInstanceConsumerView {
+
+    public new IProblemInstanceConsumer<T> Content {
+      get { return (IProblemInstanceConsumer<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected IProblemInstanceProvider<T> GenericSelectedProvider { get { return SelectedProvider as IProblemInstanceProvider<T>; } }
+    public IProblemInstanceProvider SelectedProvider { get; protected set; }
+
+    #region Importer & Exporter
+    protected IProblemInstanceConsumer<T> GenericConsumer { get { return Consumer as IProblemInstanceConsumer<T>; } }
+    protected IProblemInstanceConsumer consumer;
+    public IProblemInstanceConsumer Consumer {
+      get { return consumer; }
+      set {
+        consumer = value;
+        SetEnabledStateOfControls();
+      }
+    }
+
+    protected IProblemInstanceExporter<T> GenericExporter { get { return Exporter as IProblemInstanceExporter<T>; } }
+    protected IProblemInstanceExporter exporter;
+    public IProblemInstanceExporter Exporter {
+      get { return exporter; }
+      set {
+        exporter = value;
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    public ProblemInstanceConsumerViewGeneric() {
+      InitializeComponent();
+      importButton.Text = String.Empty;
+      importButton.Image = VSImageLibrary.Open;
+      toolTip.SetToolTip(importButton, "Open a " + GetProblemType() + " problem from file.");
+      exportButton.Text = String.Empty;
+      exportButton.Image = VSImageLibrary.SaveAs;
+      toolTip.SetToolTip(exportButton, "Export currently loaded " + GetProblemType() + " problem to a file.");
+      libraryInfoButton.Text = String.Empty;
+      libraryInfoButton.Image = VSImageLibrary.Help;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        problemInstanceProviders = null;
+        problemInstanceProviderComboBox.DataSource = null;
+      } else {
+        problemInstanceProviderComboBox.DisplayMember = "Name";
+        problemInstanceProviders = ProblemInstanceManager.GetProviders(Content);
+        problemInstanceProviderComboBox.DataSource = ProblemInstanceProviders.OrderBy(x => x.Name).ToList();
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      problemInstanceProviderComboBox.Enabled = !ReadOnly && !Locked && Content != null && problemInstanceProviderComboBox.Items.Count > 0;
+      libraryInfoButton.Enabled = SelectedProvider != null && SelectedProvider.WebLink != null;
+      importButton.Enabled = !ReadOnly && !Locked && Content != null && Consumer != null;
+      exportButton.Enabled = !ReadOnly && !Locked && Content != null && Exporter != null;
+      problemInstanceProviderSplitContainer.Panel2Collapsed = !exportButton.Enabled;
+    }
+
+    protected virtual void problemInstanceProviderComboBox_SelectedIndexChanged(object sender, System.EventArgs e) {
+      if (problemInstanceProviderComboBox.SelectedIndex >= 0) {
+        SelectedProvider = (IProblemInstanceProvider)problemInstanceProviderComboBox.SelectedItem;
+        problemInstanceProviderViewHost.Content = SelectedProvider;
+        ProblemInstanceProviderView view = (ProblemInstanceProviderView)problemInstanceProviderViewHost.ActiveView;
+        consumer = Content;
+        view.Consumer = Content;
+        if (CheckForIProblemInstanceExporter(Content)) {
+          exporter = (IProblemInstanceExporter)Content;
+        }
+        SetTooltip();
+      } else {
+        SelectedProvider = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected bool CheckForIProblemInstanceExporter(IProblemInstanceConsumer content) {
+      return Content.GetType().GetInterfaces()
+                    .Any(x => x.Equals(typeof(IProblemInstanceExporter)));
+    }
+
+    private void libraryInfoButton_Click(object sender, EventArgs e) {
+      if (problemInstanceProviderComboBox.SelectedIndex >= 0) {
+        if (SelectedProvider != null && SelectedProvider.WebLink != null)
+          Process.Start(SelectedProvider.WebLink.ToString());
+      }
+    }
+
+    protected virtual void importButton_Click(object sender, EventArgs e) {
+      openFileDialog.FileName = GetProblemType() + " instance";
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        T instance = default(T);
+        try {
+          instance = GenericSelectedProvider.LoadData(openFileDialog.FileName);
+        }
+        catch (Exception ex) {
+          MessageBox.Show(String.Format("There was an error parsing the file: {0}", Environment.NewLine + ex.Message), "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
+          return;
+        }
+        try {
+          GenericConsumer.Load(instance);
+        }
+        catch (Exception ex) {
+          MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
+        }
+      }
+    }
+
+    protected void exportButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          GenericSelectedProvider.SaveData(GenericExporter.Export(), saveFileDialog.FileName);
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+
+    protected string GetProblemType() {
+      string dataTypeName = typeof(T).Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last();
+      if (dataTypeName.EndsWith("Data"))
+        return dataTypeName.Substring(0, dataTypeName.Length - "Data".Length);
+      else return dataTypeName;
+    }
+
+    #region ToolTip
+    protected void SetTooltip() {
+      toolTip.SetToolTip(problemInstanceProviderComboBox, GetProviderToolTip());
+      if (SelectedProvider.WebLink != null)
+        toolTip.SetToolTip(libraryInfoButton, "Browse to " + SelectedProvider.WebLink.ToString());
+      else toolTip.SetToolTip(libraryInfoButton, "Library does not have a web reference.");
+    }
+
+    private string GetProviderToolTip() {
+      var provider = SelectedProvider;
+      string toolTip = provider.Name;
+
+      if (!String.IsNullOrEmpty(provider.ReferencePublication)) {
+        toolTip = toolTip
+            + Environment.NewLine + Environment.NewLine
+            + provider.ReferencePublication;
+      }
+      if (provider.WebLink != null) {
+        toolTip = toolTip
+            + Environment.NewLine
+            + provider.WebLink.ToString();
+      }
+
+      return toolTip;
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderView.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderView.cs	(revision 7956)
@@ -36,6 +36,4 @@
     public abstract IProblemInstanceConsumer Consumer { get; set; }
 
-    public abstract IProblemInstanceExporter Exporter { get; set; }
-
     public ProblemInstanceProviderView() {
       InitializeComponent();
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.Designer.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.Designer.cs	(revision 7956)
@@ -49,14 +49,7 @@
       this.instanceLabel = new System.Windows.Forms.Label();
       this.instancesComboBox = new System.Windows.Forms.ComboBox();
-      this.importButton = new System.Windows.Forms.Button();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.exportButton = new System.Windows.Forms.Button();
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
-      this.problemInstanceProviderSplitContainer = new System.Windows.Forms.SplitContainer();
-      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceProviderSplitContainer)).BeginInit();
-      this.problemInstanceProviderSplitContainer.Panel1.SuspendLayout();
-      this.problemInstanceProviderSplitContainer.Panel2.SuspendLayout();
-      this.problemInstanceProviderSplitContainer.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -64,5 +57,5 @@
       // 
       this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.loadButton.Location = new System.Drawing.Point(604, 0);
+      this.loadButton.Location = new System.Drawing.Point(667, -1);
       this.loadButton.Name = "loadButton";
       this.loadButton.Size = new System.Drawing.Size(24, 24);
@@ -83,5 +76,5 @@
       // instancesComboBox
       // 
-      this.instancesComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+      this.instancesComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
       this.instancesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
@@ -89,35 +82,11 @@
       this.instancesComboBox.Location = new System.Drawing.Point(60, 1);
       this.instancesComboBox.Name = "instancesComboBox";
-      this.instancesComboBox.Size = new System.Drawing.Size(538, 21);
+      this.instancesComboBox.Size = new System.Drawing.Size(601, 21);
       this.instancesComboBox.TabIndex = 7;
-      this.instancesComboBox.DataSourceChanged += new System.EventHandler(this.comboBox_DataSourceChanged);
-      // 
-      // importButton
-      // 
-      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.importButton.Location = new System.Drawing.Point(636, 0);
-      this.importButton.Name = "importButton";
-      this.importButton.Size = new System.Drawing.Size(24, 24);
-      this.importButton.TabIndex = 6;
-      this.importButton.Text = "Import";
-      this.importButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.importButton.UseVisualStyleBackColor = true;
-      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      this.instancesComboBox.DataSourceChanged += new System.EventHandler(this.instancesComboBox_DataSourceChanged);
       // 
       // openFileDialog
       // 
       this.openFileDialog.Filter = "All files|*.*";
-      // 
-      // exportButton
-      // 
-      this.exportButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.exportButton.Location = new System.Drawing.Point(-1, 0);
-      this.exportButton.Name = "exportButton";
-      this.exportButton.Size = new System.Drawing.Size(24, 24);
-      this.exportButton.TabIndex = 8;
-      this.exportButton.Text = "Export";
-      this.exportButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.exportButton.UseVisualStyleBackColor = true;
-      this.exportButton.Click += new System.EventHandler(this.exportButton_Click);
       // 
       // saveFileDialog
@@ -126,41 +95,15 @@
       this.saveFileDialog.Title = "Save RegressionInstance...";
       // 
-      // problemInstanceProviderSplitContainer
-      // 
-      this.problemInstanceProviderSplitContainer.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.problemInstanceProviderSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
-      this.problemInstanceProviderSplitContainer.IsSplitterFixed = true;
-      this.problemInstanceProviderSplitContainer.Location = new System.Drawing.Point(0, -1);
-      this.problemInstanceProviderSplitContainer.Name = "problemInstanceProviderSplitContainer";
-      // 
-      // problemInstanceProviderSplitContainer.Panel1
-      // 
-      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.instanceLabel);
-      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.instancesComboBox);
-      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.importButton);
-      this.problemInstanceProviderSplitContainer.Panel1.Controls.Add(this.loadButton);
-      // 
-      // problemInstanceProviderSplitContainer.Panel2
-      // 
-      this.problemInstanceProviderSplitContainer.Panel2.Controls.Add(this.exportButton);
-      this.problemInstanceProviderSplitContainer.Size = new System.Drawing.Size(694, 22);
-      this.problemInstanceProviderSplitContainer.SplitterDistance = 665;
-      this.problemInstanceProviderSplitContainer.TabIndex = 9;
-      // 
-      // ProblemInstanceProviderView
+      // ProblemInstanceProviderViewGeneric
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.problemInstanceProviderSplitContainer);
-      this.Name = "ProblemInstanceProviderView";
+      this.Controls.Add(this.instanceLabel);
+      this.Controls.Add(this.instancesComboBox);
+      this.Controls.Add(this.loadButton);
+      this.Name = "ProblemInstanceProviderViewGeneric";
       this.Size = new System.Drawing.Size(694, 21);
-      this.problemInstanceProviderSplitContainer.Panel1.ResumeLayout(false);
-      this.problemInstanceProviderSplitContainer.Panel1.PerformLayout();
-      this.problemInstanceProviderSplitContainer.Panel2.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.problemInstanceProviderSplitContainer)).EndInit();
-      this.problemInstanceProviderSplitContainer.ResumeLayout(false);
       this.ResumeLayout(false);
+      this.PerformLayout();
 
     }
@@ -173,9 +116,5 @@
     protected System.Windows.Forms.Label instanceLabel;
     protected System.Windows.Forms.ComboBox instancesComboBox;
-    protected System.Windows.Forms.Button importButton;
-    protected System.Windows.Forms.Button exportButton;
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
-    protected System.Windows.Forms.SplitContainer problemInstanceProviderSplitContainer;
-
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceProviderViewGeneric.cs	(revision 7956)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
 using System.Windows.Forms;
@@ -28,5 +27,4 @@
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.Instances.Views {
@@ -40,7 +38,7 @@
     }
 
-    #region Importer & Exporter
-    protected IProblemInstanceConsumer<T> GenericConsumer { get { return Consumer as IProblemInstanceConsumer<T>; } }
-    protected IProblemInstanceConsumer consumer;
+    private IProblemInstanceConsumer<T> GenericConsumer { get { return Consumer as IProblemInstanceConsumer<T>; } }
+
+    public IProblemInstanceConsumer consumer;
     public override IProblemInstanceConsumer Consumer {
       get { return consumer; }
@@ -51,23 +49,6 @@
     }
 
-    protected IProblemInstanceExporter<T> GenericExporter { get { return Exporter as IProblemInstanceExporter<T>; } }
-    protected IProblemInstanceExporter exporter;
-    public override IProblemInstanceExporter Exporter {
-      get { return exporter; }
-      set {
-        exporter = value;
-        SetEnabledStateOfControls();
-      }
-    }
-    #endregion
-
     public ProblemInstanceProviderViewGeneric() {
       InitializeComponent();
-      importButton.Text = String.Empty;
-      importButton.Image = VSImageLibrary.Open;
-      toolTip.SetToolTip(importButton, "Open a " + GetProblemType() + " problem from file.");
-      exportButton.Text = String.Empty;
-      exportButton.Image = VSImageLibrary.Save;
-      toolTip.SetToolTip(exportButton, "Export currently loaded " + GetProblemType() + " problem to a file.");
       loadButton.Text = String.Empty;
       loadButton.Image = VSImageLibrary.RefreshDocument;
@@ -103,7 +84,4 @@
       instancesComboBox.Enabled = !ReadOnly && !Locked && Content != null && GenericConsumer != null;
       loadButton.Enabled = !ReadOnly && !Locked && Content != null && GenericConsumer != null;
-      importButton.Enabled = !ReadOnly && !Locked && Content != null && GenericConsumer != null;
-      exportButton.Enabled = !ReadOnly && !Locked && Content != null && GenericExporter != null;
-      problemInstanceProviderSplitContainer.Panel2Collapsed = !exportButton.Enabled;
     }
 
@@ -119,47 +97,9 @@
     }
 
-    protected virtual void importButton_Click(object sender, EventArgs e) {
-      openFileDialog.FileName = GetProblemType() + " instance";
-      if (openFileDialog.ShowDialog() == DialogResult.OK) {
-        T instance = default(T);
-        try {
-          instance = Content.LoadData(openFileDialog.FileName);
-        }
-        catch (Exception ex) {
-          MessageBox.Show(String.Format("There was an error parsing the file: {0}", Environment.NewLine + ex.Message), "Error while parsing", MessageBoxButtons.OK, MessageBoxIcon.Error);
-          return;
-        }
-        try {
-          GenericConsumer.Load(instance);
-        }
-        catch (Exception ex) {
-          MessageBox.Show(String.Format("This problem does not support loading the instance {0}: {1}", Path.GetFileName(openFileDialog.FileName), Environment.NewLine + ex.Message), "Cannot load instance");
-        }
-      }
-    }
-
-    protected virtual void exportButton_Click(object sender, EventArgs e) {
-      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
-        try {
-          Content.SaveData(GenericExporter.Export(), saveFileDialog.FileName);
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(this, ex);
-        }
-      }
-    }
-
-    private void comboBox_DataSourceChanged(object sender, EventArgs e) {
+    private void instancesComboBox_DataSourceChanged(object sender, EventArgs e) {
       var comboBox = (ComboBox)sender;
       if (comboBox.DataSource == null)
         comboBox.Items.Clear();
     }
-
-    protected virtual string GetProblemType() {
-      string dataTypeName = typeof(T).Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last();
-      if (dataTypeName.EndsWith("Data"))
-        return dataTypeName.Substring(0, dataTypeName.Length - "Data".Length);
-      else return dataTypeName;
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/VRP/IVRPData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/VRP/IVRPData.cs	(revision 7955)
+++ /trunk/sources/HeuristicLab.Problems.Instances/3.3/Types/VRP/IVRPData.cs	(revision 7956)
@@ -20,8 +20,4 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 
 namespace HeuristicLab.Problems.Instances {
