Index: trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 8192)
@@ -81,5 +81,8 @@
     }
 
-    public override GQAPData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override GQAPData ImportData(string path) {
       var parser = new CordeauGQAPParser();
       parser.Parse(path);
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs	(revision 8192)
@@ -20,10 +20,11 @@
 #endregion
 
-
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
+
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public class ClassificationCSVInstanceProvider : ClassificationInstanceProvider {
@@ -43,13 +44,46 @@
     }
 
-    public override bool CanSaveData {
-      get { return true; }
-    }
-
     public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
       return new List<IDataDescriptor>();
     }
 
-    public override void SaveData(IClassificationProblemData instance, string path) {
+    public override IClassificationProblemData LoadData(IDataDescriptor descriptor) {
+      throw new NotImplementedException();
+    }
+
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override IClassificationProblemData ImportData(string path) {
+      TableFileParser csvFileParser = new TableFileParser();
+
+      csvFileParser.Parse(path);
+
+      Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
+      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
+      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
+
+      ClassificationProblemData claData = new ClassificationProblemData(dataset, allowedInputVars, targetVar);
+
+      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
+      claData.TrainingPartition.Start = 0;
+      claData.TrainingPartition.End = trainingPartEnd;
+      claData.TestPartition.Start = trainingPartEnd;
+      claData.TestPartition.End = csvFileParser.Rows;
+      int pos = path.LastIndexOf('\\');
+      if (pos < 0)
+        claData.Name = path;
+      else {
+        pos++;
+        claData.Name = path.Substring(pos, path.Length - pos);
+      }
+
+      return claData;
+    }
+
+    public override bool CanExportData {
+      get { return true; }
+    }
+    public override void ExportData(IClassificationProblemData instance, string path) {
       StringBuilder strBuilder = new StringBuilder();
 
@@ -74,8 +108,4 @@
       }
     }
-
-    public override IClassificationProblemData LoadData(IDataDescriptor descriptor) {
-      throw new NotImplementedException();
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs	(revision 8192)
@@ -20,37 +20,8 @@
 #endregion
 
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public abstract class ClassificationInstanceProvider : ProblemInstanceProvider<IClassificationProblemData> {
-    public override IClassificationProblemData LoadData(string path) {
-      TableFileParser csvFileParser = new TableFileParser();
-
-      csvFileParser.Parse(path);
-
-      Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
-      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
-
-      ClassificationProblemData claData = new ClassificationProblemData(dataset, allowedInputVars, targetVar);
-
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      claData.TrainingPartition.Start = 0;
-      claData.TrainingPartition.End = trainingPartEnd;
-      claData.TestPartition.Start = trainingPartEnd;
-      claData.TestPartition.End = csvFileParser.Rows;
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        claData.Name = path;
-      else {
-        pos++;
-        claData.Name = path.Substring(pos, path.Length - pos);
-      }
-
-      return claData;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs	(revision 8192)
@@ -47,9 +47,39 @@
     }
 
-    public override bool CanSaveData {
+    public override IClusteringProblemData LoadData(IDataDescriptor descriptor) {
+      throw new NotImplementedException();
+    }
+
+    public override bool CanImportData {
       get { return true; }
     }
+    public override IClusteringProblemData ImportData(string path) {
+      var csvFileParser = new TableFileParser();
 
-    public override void SaveData(IClusteringProblemData instance, string path) {
+      csvFileParser.Parse(path);
+
+      var dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
+      var claData = new ClusteringProblemData(dataset, dataset.DoubleVariables);
+
+      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
+      claData.TrainingPartition.Start = 0;
+      claData.TrainingPartition.End = trainingPartEnd;
+      claData.TestPartition.Start = trainingPartEnd;
+      claData.TestPartition.End = csvFileParser.Rows;
+      int pos = path.LastIndexOf('\\');
+      if (pos < 0)
+        claData.Name = path;
+      else {
+        pos++;
+        claData.Name = path.Substring(pos, path.Length - pos);
+      }
+
+      return claData;
+    }
+
+    public override bool CanExportData {
+      get { return true; }
+    }
+    public override void ExportData(IClusteringProblemData instance, string path) {
       var strBuilder = new StringBuilder();
 
@@ -74,8 +104,4 @@
       }
     }
-
-    public override IClusteringProblemData LoadData(IDataDescriptor descriptor) {
-      throw new NotImplementedException();
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/ClusteringInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/ClusteringInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/ClusteringInstanceProvider.cs	(revision 8192)
@@ -24,27 +24,4 @@
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public abstract class ClusteringInstanceProvider : ProblemInstanceProvider<IClusteringProblemData> {
-    public override IClusteringProblemData LoadData(string path) {
-      var csvFileParser = new TableFileParser();
-
-      csvFileParser.Parse(path);
-
-      var dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      var claData = new ClusteringProblemData(dataset, dataset.DoubleVariables);
-
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      claData.TrainingPartition.Start = 0;
-      claData.TrainingPartition.End = trainingPartEnd;
-      claData.TestPartition.Start = trainingPartEnd;
-      claData.TestPartition.End = csvFileParser.Rows;
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        claData.Name = path;
-      else {
-        pos++;
-        claData.Name = path.Substring(pos, path.Length - pos);
-      }
-
-      return claData;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs	(revision 8192)
@@ -20,10 +20,11 @@
 #endregion
 
-
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
+
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public class RegressionCSVInstanceProvider : RegressionInstanceProvider {
@@ -43,13 +44,45 @@
     }
 
-    public override bool CanSaveData {
-      get { return true; }
-    }
-
     public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
       return new List<IDataDescriptor>();
     }
+    public override IRegressionProblemData LoadData(IDataDescriptor descriptor) {
+      throw new NotImplementedException();
+    }
 
-    public override void SaveData(IRegressionProblemData instance, string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override IRegressionProblemData ImportData(string path) {
+      TableFileParser csvFileParser = new TableFileParser();
+      csvFileParser.Parse(path);
+
+      Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
+      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
+
+      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
+
+      IRegressionProblemData regData = new RegressionProblemData(dataset, allowedInputVars, targetVar);
+
+      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
+      regData.TrainingPartition.Start = 0;
+      regData.TrainingPartition.End = trainingPartEnd;
+      regData.TestPartition.Start = trainingPartEnd;
+      regData.TestPartition.End = csvFileParser.Rows;
+
+      int pos = path.LastIndexOf('\\');
+      if (pos < 0)
+        regData.Name = path;
+      else {
+        pos++;
+        regData.Name = path.Substring(pos, path.Length - pos);
+      }
+      return regData;
+    }
+
+    public override bool CanExportData {
+      get { return true; }
+    }
+    public override void ExportData(IRegressionProblemData instance, string path) {
       StringBuilder strBuilder = new StringBuilder();
 
@@ -74,8 +107,4 @@
       }
     }
-
-    public override IRegressionProblemData LoadData(IDataDescriptor descriptor) {
-      throw new NotImplementedException();
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs	(revision 8192)
@@ -20,38 +20,8 @@
 #endregion
 
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
   public abstract class RegressionInstanceProvider : ProblemInstanceProvider<IRegressionProblemData> {
-
-    public override IRegressionProblemData LoadData(string path) {
-      TableFileParser csvFileParser = new TableFileParser();
-      csvFileParser.Parse(path);
-
-      Dataset dataset = new Dataset(csvFileParser.VariableNames, csvFileParser.Values);
-      string targetVar = csvFileParser.VariableNames.Where(x => dataset.DoubleVariables.Contains(x)).Last();
-
-      IEnumerable<string> allowedInputVars = dataset.DoubleVariables.Where(x => !x.Equals(targetVar));
-
-      IRegressionProblemData regData = new RegressionProblemData(dataset, allowedInputVars, targetVar);
-
-      int trainingPartEnd = csvFileParser.Rows * 2 / 3;
-      regData.TrainingPartition.Start = 0;
-      regData.TrainingPartition.End = trainingPartEnd;
-      regData.TestPartition.Start = trainingPartEnd;
-      regData.TestPartition.End = csvFileParser.Rows;
-
-      int pos = path.LastIndexOf('\\');
-      if (pos < 0)
-        regData.Name = path;
-      else {
-        pos++;
-        regData.Name = path.Substring(pos, path.Length - pos);
-      }
-      return regData;
-    }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 8192)
@@ -103,5 +103,8 @@
     }
 
-    public override CTAPData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override CTAPData ImportData(string path) {
       var parser = new ElloumiCTAPParser();
       parser.Parse(path);
Index: trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8192)
@@ -219,5 +219,8 @@
     }
 
-    public override QAPData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override QAPData ImportData(string path) {
       var parser = new QAPLIBParser();
       parser.Parse(path);
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 8192)
@@ -90,5 +90,8 @@
     }
 
-    public override T LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override T ImportData(string path) {
       return LoadInstance(new TSPLIBParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/HeuristicLab.Problems.Instances.VehicleRouting.Views-3.4.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/HeuristicLab.Problems.Instances.VehicleRouting.Views-3.4.csproj	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/HeuristicLab.Problems.Instances.VehicleRouting.Views-3.4.csproj	(revision 8192)
@@ -115,9 +115,9 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="VRPInstanceProviderView.cs">
+    <Compile Include="VRPInstanceConsumerView.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="VRPInstanceProviderView.designer.cs">
-      <DependentUpon>VRPInstanceProviderView.cs</DependentUpon>
+    <Compile Include="VRPInstanceConsumerView.designer.cs">
+      <DependentUpon>VRPInstanceConsumerView.cs</DependentUpon>
     </Compile>
     <Compile Include="VRPImportDialog.cs">
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.cs	(revision 8192)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.cs	(revision 8192)
@@ -0,0 +1,87 @@
+﻿#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.IO;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Instances.Views;
+
+namespace HeuristicLab.Problems.Instances.VehicleRouting.Views {
+  [View("VRP InstanceProvider View")]
+  [Content(typeof(IProblemInstanceConsumer<IVRPData>), IsDefaultView = true)]
+  public partial class VRPInstanceProviderView<T> : ProblemInstanceConsumerViewGeneric<T> where T : class, IVRPData {
+
+    public new IProblemInstanceConsumer<T> Content {
+      get { return (IProblemInstanceConsumer<T>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public VRPInstanceProviderView() {
+      InitializeComponent();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      problemInstanceProviderComboBox.Enabled = !ReadOnly && !Locked && Content != null && problemInstanceProviderComboBox.Items.Count > 0;
+      libraryInfoButton.Enabled = SelectedProvider != null && SelectedProvider.WebLink != null;
+      IVRPInstanceProvider provider = SelectedProvider as IVRPInstanceProvider;
+      importButton.Enabled = !ReadOnly && !Locked && Content != null && Consumer != null &&
+                             provider != null && provider.CanImportData;
+      ProviderImportSplitContainer.Panel2Collapsed = !importButton.Enabled;
+      exportButton.Enabled = !ReadOnly && !Locked && Content != null && Exporter != null &&
+                             provider != null && provider.CanExportData;
+      ProviderExportSplitContainer.Panel2Collapsed = !exportButton.Enabled;
+    }
+
+    protected override void importButton_Click(object sender, EventArgs e) {
+      IVRPInstanceProvider provider = SelectedProvider as IVRPInstanceProvider;
+      if (provider != null) {
+        using (var dialog = new VRPImportDialog(SelectedProvider.Name)) {
+          if (dialog.ShowDialog() == DialogResult.OK) {
+            var instance = provider.Import(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");
+            }
+          }
+        }
+      }
+    }
+
+    protected override void exportButton_Click(object sender, EventArgs e) {
+      IVRPInstanceProvider provider = SelectedProvider as IVRPInstanceProvider;
+      if (provider != null) {
+        if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+          try {
+            provider.Export(GenericExporter.Export(), saveFileDialog.FileName);
+          }
+          catch (Exception ex) {
+            ErrorHandling.ShowErrorDialog(this, ex);
+          }
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.designer.cs	(revision 8192)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceConsumerView.designer.cs	(revision 8192)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.Instances.VehicleRouting.Views {
+  partial class VRPInstanceProviderView<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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.cs	(revision 8190)
+++ 	(revision )
@@ -1,60 +1,0 @@
-﻿#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.IO;
-using System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-using HeuristicLab.Problems.Instances.Views;
-
-namespace HeuristicLab.Problems.Instances.VehicleRouting.Views {
-  [View("VRP InstanceProvider View")]
-  [Content(typeof(IProblemInstanceConsumer<IVRPData>), IsDefaultView = true)]
-  public partial class VRPInstanceProviderView<T> : ProblemInstanceConsumerViewGeneric<T> where T : class, IVRPData {
-
-    public new IProblemInstanceConsumer<T> Content {
-      get { return (IProblemInstanceConsumer<T>)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public VRPInstanceProviderView() {
-      InitializeComponent();
-    }
-
-    protected override void importButton_Click(object sender, EventArgs e) {
-      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.Views/3.4/VRPInstanceProviderView.designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting.Views/3.4/VRPInstanceProviderView.designer.cs	(revision 8190)
+++ 	(revision )
@@ -1,32 +1,0 @@
-﻿namespace HeuristicLab.Problems.Instances.VehicleRouting.Views {
-  partial class VRPInstanceProviderView<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() {
-      components = new System.ComponentModel.Container();
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-    }
-
-    #endregion
-  }
-}
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/CordeauFormat/CordeauFormatInstanceProvider.cs	(revision 8192)
@@ -20,12 +20,5 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
-using HeuristicLab.Problems.Instances.TSPLIB;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
@@ -35,5 +28,8 @@
     }
 
-    public override MDCVRPTWData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override MDCVRPTWData ImportData(string path) {
       return LoadInstance(new CordeauParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/GoldenFormat/GoldenFormatInstanceProvider.cs	(revision 8192)
@@ -21,11 +21,5 @@
 
 using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
-using HeuristicLab.Problems.Instances.TSPLIB;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
@@ -35,5 +29,8 @@
     }
 
-    public override CVRPTWData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override CVRPTWData ImportData(string path) {
       return LoadInstance(new GoldenParser(path));
     }
@@ -66,5 +63,5 @@
       }
 
-      if(parser.Distance > 0)
+      if (parser.Distance > 0)
         instance.DueTimes[0] = parser.Distance;
 
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/IVRPInstanceProvider.cs	(revision 8192)
@@ -22,5 +22,9 @@
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
   public interface IVRPInstanceProvider {
-    IVRPData LoadData(string vrpFile, string tourFile);
+    bool CanImportData { get; }
+    IVRPData Import(string vrpFile, string tourFile);
+
+    bool CanExportData { get; }
+    void Export(IVRPData instance, string path);
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/LiLimFormat/LiLimFormatInstanceProvider.cs	(revision 8192)
@@ -20,12 +20,5 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
-using HeuristicLab.Problems.Instances.TSPLIB;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
@@ -35,5 +28,8 @@
     }
 
-    public override PDPTWData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override PDPTWData ImportData(string path) {
       return LoadInstance(new LiLimParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/SolomonFormat/SolomonFormatInstanceProvider.cs	(revision 8192)
@@ -20,12 +20,5 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
-using HeuristicLab.Problems.Instances.TSPLIB;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
@@ -35,5 +28,8 @@
     }
 
-    public override CVRPTWData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override CVRPTWData ImportData(string path) {
       return LoadInstance(new SolomonParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TSPLibFormat/TSPLibFormatInstanceProvider.cs	(revision 8192)
@@ -21,10 +21,5 @@
 
 using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
 using HeuristicLab.Problems.Instances.TSPLIB;
 
@@ -35,5 +30,8 @@
     }
 
-    public override CVRPData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override CVRPData ImportData(string path) {
       return LoadInstance(new TSPLIBParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/TaillardFormat/TaillardFormatInstanceProvider.cs	(revision 8192)
@@ -20,12 +20,5 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using ICSharpCode.SharpZipLib.Zip;
-using HeuristicLab.Problems.Instances.TSPLIB;
 
 namespace HeuristicLab.Problems.Instances.VehicleRouting {
@@ -35,5 +28,8 @@
     }
 
-    public override CVRPData LoadData(string path) {
+    public override bool CanImportData {
+      get { return true; }
+    }
+    public override CVRPData ImportData(string path) {
       return LoadInstance(new TaillardParser(path));
     }
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 8192)
@@ -107,10 +107,14 @@
     protected abstract T LoadData(Stream stream);
 
-    public IVRPData LoadData(string vrpFile, string tourFile) {
-      var data = LoadData(vrpFile);
+    public IVRPData Import(string vrpFile, string tourFile) {
+      var data = ImportData(vrpFile);
       if (!String.IsNullOrEmpty(tourFile)) {
         LoadSolution(tourFile, data);
       }
       return data;
+    }
+
+    public void Export(IVRPData instance, string path) {
+      ExportData((T)instance, path);
     }
 
Index: trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.Designer.cs	(revision 8192)
@@ -55,20 +55,25 @@
       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.ProviderExportSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.ProviderImportSplitContainer = new System.Windows.Forms.SplitContainer();
+      ((System.ComponentModel.ISupportInitialize)(this.ProviderExportSplitContainer)).BeginInit();
+      this.ProviderExportSplitContainer.Panel1.SuspendLayout();
+      this.ProviderExportSplitContainer.Panel2.SuspendLayout();
+      this.ProviderExportSplitContainer.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.ProviderImportSplitContainer)).BeginInit();
+      this.ProviderImportSplitContainer.Panel1.SuspendLayout();
+      this.ProviderImportSplitContainer.Panel2.SuspendLayout();
+      this.ProviderImportSplitContainer.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.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.Size = new System.Drawing.Size(174, 21);
       this.problemInstanceProviderComboBox.TabIndex = 16;
       this.problemInstanceProviderComboBox.SelectedIndexChanged += new System.EventHandler(this.problemInstanceProviderComboBox_SelectedIndexChanged);
@@ -77,5 +82,5 @@
       // 
       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.Location = new System.Drawing.Point(230, -1);
       this.libraryInfoButton.Name = "libraryInfoButton";
       this.libraryInfoButton.Size = new System.Drawing.Size(24, 24);
@@ -88,5 +93,5 @@
       // 
       this.libraryLabel.AutoSize = true;
-      this.libraryLabel.Location = new System.Drawing.Point(4, 4);
+      this.libraryLabel.Location = new System.Drawing.Point(3, 5);
       this.libraryLabel.Name = "libraryLabel";
       this.libraryLabel.Size = new System.Drawing.Size(41, 13);
@@ -96,6 +101,6 @@
       // 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.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;
@@ -112,5 +117,5 @@
       // 
       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.Location = new System.Drawing.Point(1, -1);
       this.importButton.Name = "importButton";
       this.importButton.Size = new System.Drawing.Size(24, 24);
@@ -140,37 +145,59 @@
       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;
+      // ProviderExportSplitContainer
+      // 
+      this.ProviderExportSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.ProviderExportSplitContainer.IsSplitterFixed = true;
+      this.ProviderExportSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.ProviderExportSplitContainer.Name = "ProviderExportSplitContainer";
+      // 
+      // ProviderExportSplitContainer.Panel1
+      // 
+      this.ProviderExportSplitContainer.Panel1.Controls.Add(this.ProviderImportSplitContainer);
+      // 
+      // ProviderExportSplitContainer.Panel2
+      // 
+      this.ProviderExportSplitContainer.Panel2.Controls.Add(this.exportButton);
+      this.ProviderExportSplitContainer.Size = new System.Drawing.Size(312, 22);
+      this.ProviderExportSplitContainer.SplitterDistance = 283;
+      this.ProviderExportSplitContainer.TabIndex = 20;
+      // 
+      // ProviderImportSplitContainer
+      // 
+      this.ProviderImportSplitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.ProviderImportSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.ProviderImportSplitContainer.IsSplitterFixed = true;
+      this.ProviderImportSplitContainer.Location = new System.Drawing.Point(0, 0);
+      this.ProviderImportSplitContainer.Name = "ProviderImportSplitContainer";
+      // 
+      // ProviderImportSplitContainer.Panel1
+      // 
+      this.ProviderImportSplitContainer.Panel1.Controls.Add(this.libraryLabel);
+      this.ProviderImportSplitContainer.Panel1.Controls.Add(this.problemInstanceProviderComboBox);
+      this.ProviderImportSplitContainer.Panel1.Controls.Add(this.libraryInfoButton);
+      // 
+      // ProviderImportSplitContainer.Panel2
+      // 
+      this.ProviderImportSplitContainer.Panel2.Controls.Add(this.importButton);
+      this.ProviderImportSplitContainer.Size = new System.Drawing.Size(282, 23);
+      this.ProviderImportSplitContainer.SplitterDistance = 253;
+      this.ProviderImportSplitContainer.TabIndex = 21;
       // 
       // ProblemInstanceConsumerViewGeneric
       // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.problemInstanceProviderSplitContainer);
+      this.Controls.Add(this.ProviderExportSplitContainer);
       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.ProviderExportSplitContainer.Panel1.ResumeLayout(false);
+      this.ProviderExportSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.ProviderExportSplitContainer)).EndInit();
+      this.ProviderExportSplitContainer.ResumeLayout(false);
+      this.ProviderImportSplitContainer.Panel1.ResumeLayout(false);
+      this.ProviderImportSplitContainer.Panel1.PerformLayout();
+      this.ProviderImportSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.ProviderImportSplitContainer)).EndInit();
+      this.ProviderImportSplitContainer.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -180,13 +207,14 @@
 
     protected System.Windows.Forms.ComboBox problemInstanceProviderComboBox;
-    private System.Windows.Forms.Button libraryInfoButton;
-    private System.Windows.Forms.Label libraryLabel;
+    protected System.Windows.Forms.Button libraryInfoButton;
+    protected 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.ToolTip toolTip;
+    protected System.Windows.Forms.Button importButton;
+    protected System.Windows.Forms.Button exportButton;
     protected System.Windows.Forms.SaveFileDialog saveFileDialog;
     protected System.Windows.Forms.OpenFileDialog openFileDialog;
-    private System.Windows.Forms.SplitContainer problemInstanceProviderSplitContainer;
+    protected System.Windows.Forms.SplitContainer ProviderExportSplitContainer;
+    protected System.Windows.Forms.SplitContainer ProviderImportSplitContainer;
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 8192)
@@ -92,8 +92,10 @@
       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;
+      importButton.Enabled = !ReadOnly && !Locked && Content != null && Consumer != null &&
+                             GenericSelectedProvider != null && GenericSelectedProvider.CanImportData;
+      ProviderImportSplitContainer.Panel2Collapsed = !importButton.Enabled;
       exportButton.Enabled = !ReadOnly && !Locked && Content != null && Exporter != null &&
-                             GenericSelectedProvider != null && GenericSelectedProvider.CanSaveData;
-      problemInstanceProviderSplitContainer.Panel2Collapsed = !exportButton.Enabled;
+                             GenericSelectedProvider != null && GenericSelectedProvider.CanExportData;
+      ProviderExportSplitContainer.Panel2Collapsed = !exportButton.Enabled;
     }
 
@@ -132,5 +134,5 @@
         T instance = default(T);
         try {
-          instance = GenericSelectedProvider.LoadData(openFileDialog.FileName);
+          instance = GenericSelectedProvider.ImportData(openFileDialog.FileName);
         }
         catch (Exception ex) {
@@ -147,8 +149,8 @@
     }
 
-    protected void exportButton_Click(object sender, EventArgs e) {
+    protected virtual void exportButton_Click(object sender, EventArgs e) {
       if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          GenericSelectedProvider.SaveData(GenericExporter.Export(), saveFileDialog.FileName);
+          GenericSelectedProvider.ExportData(GenericExporter.Export(), saveFileDialog.FileName);
         }
         catch (Exception ex) {
Index: trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 8192)
@@ -35,8 +35,10 @@
     IEnumerable<IDataDescriptor> GetDataDescriptors();
     TData LoadData(IDataDescriptor descriptor);
-    TData LoadData(string path);
 
-    bool CanSaveData { get; }
-    void SaveData(TData instance, string path);
+    bool CanImportData { get; }
+    TData ImportData(string path);
+
+    bool CanExportData { get; }
+    void ExportData(TData instance, string path);
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 8190)
+++ trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 8192)
@@ -33,10 +33,16 @@
 
     public abstract TData LoadData(IDataDescriptor descriptor);
-    public abstract TData LoadData(string path);
 
-    public virtual bool CanSaveData {
+    public virtual bool CanImportData {
       get { return false; }
     }
-    public virtual void SaveData(TData instance, string path) {
+    public virtual TData ImportData(string path) {
+      throw new NotSupportedException();
+    }
+
+    public virtual bool CanExportData {
+      get { return false; }
+    }
+    public virtual void ExportData(TData instance, string path) {
       throw new NotSupportedException();
     }
