Index: trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.CordeauGQAP/3.3/CordeauGQAPInstanceProvider.cs	(revision 8180)
@@ -92,8 +92,4 @@
     }
 
-    public override void SaveData(GQAPData instance, string path) {
-      throw new NotSupportedException();
-    }
-
     private GQAPData Load(CordeauGQAPParser parser) {
       var instance = new GQAPData();
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 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/CSV/ClassifiactionCSVInstanceProvider.cs	(revision 8180)
@@ -23,4 +23,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
+using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
@@ -41,6 +43,34 @@
     }
 
+    public override bool CanSaveData {
+      get { return true; }
+    }
+
     public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
       return new List<IDataDescriptor>();
+    }
+
+    public override void SaveData(IClassificationProblemData instance, string path) {
+      StringBuilder strBuilder = new StringBuilder();
+
+      foreach (var variable in instance.InputVariables) {
+        strBuilder.Append(variable + ";");
+      }
+      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.AppendLine();
+
+      Dataset dataset = instance.Dataset;
+
+      for (int i = 0; i < dataset.Rows; i++) {
+        for (int j = 0; j < dataset.Columns; j++) {
+          strBuilder.Append(dataset.GetValue(i, j) + ";");
+        }
+        strBuilder.Remove(strBuilder.Length - 1, 1);
+        strBuilder.AppendLine();
+      }
+
+      using (StreamWriter writer = new StreamWriter(path)) {
+        writer.Write(strBuilder);
+      }
     }
 
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Classification/ClassificationInstanceProvider.cs	(revision 8180)
@@ -20,15 +20,12 @@
 #endregion
 
-using System;
 using System.Collections;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
-using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
-  public abstract class ClassificationInstanceProvider : IProblemInstanceProvider<IClassificationProblemData> {
-    public IClassificationProblemData LoadData(string path) {
+  public abstract class ClassificationInstanceProvider : ProblemInstanceProvider<IClassificationProblemData> {
+    public override IClassificationProblemData LoadData(string path) {
       TableFileParser csvFileParser = new TableFileParser();
 
@@ -56,36 +53,4 @@
       return claData;
     }
-
-    public void SaveData(IClassificationProblemData instance, string path) {
-      StringBuilder strBuilder = new StringBuilder();
-
-      foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
-      }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
-      strBuilder.AppendLine();
-
-      Dataset dataset = instance.Dataset;
-
-      for (int i = 0; i < dataset.Rows; i++) {
-        for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
-        }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
-        strBuilder.AppendLine();
-      }
-
-      using (StreamWriter writer = new StreamWriter(path)) {
-        writer.Write(strBuilder);
-      }
-    }
-
-    public abstract IEnumerable<IDataDescriptor> GetDataDescriptors();
-    public abstract IClassificationProblemData LoadData(IDataDescriptor descriptor);
-
-    public abstract string Name { get; }
-    public abstract string Description { get; }
-    public abstract Uri WebLink { get; }
-    public abstract string ReferencePublication { get; }
   }
 }
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 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/CSV/ClusteringCSVInstanceProvider.cs	(revision 8180)
@@ -22,4 +22,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
+using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 
@@ -45,4 +47,32 @@
     }
 
+    public override bool CanSaveData {
+      get { return true; }
+    }
+
+    public override void SaveData(IClusteringProblemData instance, string path) {
+      var strBuilder = new StringBuilder();
+
+      foreach (var variable in instance.InputVariables) {
+        strBuilder.Append(variable + ";");
+      }
+      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.AppendLine();
+
+      var dataset = instance.Dataset;
+
+      for (int i = 0; i < dataset.Rows; i++) {
+        for (int j = 0; j < dataset.Columns; j++) {
+          strBuilder.Append(dataset.GetValue(i, j) + ";");
+        }
+        strBuilder.Remove(strBuilder.Length - 1, 1);
+        strBuilder.AppendLine();
+      }
+
+      using (var writer = new StreamWriter(path)) {
+        writer.Write(strBuilder);
+      }
+    }
+
     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 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Clustering/ClusteringInstanceProvider.cs	(revision 8180)
@@ -20,13 +20,9 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
-  public abstract class ClusteringInstanceProvider : IProblemInstanceProvider<IClusteringProblemData> {
-    public IClusteringProblemData LoadData(string path) {
+  public abstract class ClusteringInstanceProvider : ProblemInstanceProvider<IClusteringProblemData> {
+    public override IClusteringProblemData LoadData(string path) {
       var csvFileParser = new TableFileParser();
 
@@ -51,36 +47,4 @@
       return claData;
     }
-
-    public void SaveData(IClusteringProblemData instance, string path) {
-      var strBuilder = new StringBuilder();
-
-      foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
-      }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
-      strBuilder.AppendLine();
-
-      var dataset = instance.Dataset;
-
-      for (int i = 0; i < dataset.Rows; i++) {
-        for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
-        }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
-        strBuilder.AppendLine();
-      }
-
-      using (var writer = new StreamWriter(path)) {
-        writer.Write(strBuilder);
-      }
-    }
-
-    public abstract IEnumerable<IDataDescriptor> GetDataDescriptors();
-    public abstract IClusteringProblemData LoadData(IDataDescriptor descriptor);
-
-    public abstract string Name { get; }
-    public abstract string Description { get; }
-    public abstract Uri WebLink { get; }
-    public abstract string ReferencePublication { get; }
   }
 }
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 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/CSV/RegressionCSVInstanceProvider.cs	(revision 8180)
@@ -23,4 +23,6 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
+using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
@@ -41,6 +43,34 @@
     }
 
+    public override bool CanSaveData {
+      get { return true; }
+    }
+
     public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
       return new List<IDataDescriptor>();
+    }
+
+    public override void SaveData(IRegressionProblemData instance, string path) {
+      StringBuilder strBuilder = new StringBuilder();
+
+      foreach (var variable in instance.InputVariables) {
+        strBuilder.Append(variable + ";");
+      }
+      strBuilder.Remove(strBuilder.Length - 1, 1);
+      strBuilder.AppendLine();
+
+      Dataset dataset = instance.Dataset;
+
+      for (int i = 0; i < dataset.Rows; i++) {
+        for (int j = 0; j < dataset.Columns; j++) {
+          strBuilder.Append(dataset.GetValue(i, j) + ";");
+        }
+        strBuilder.Remove(strBuilder.Length - 1, 1);
+        strBuilder.AppendLine();
+      }
+
+      using (StreamWriter writer = new StreamWriter(path)) {
+        writer.Write(strBuilder);
+      }
     }
 
Index: trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.DataAnalysis/3.3/Regression/RegressionInstanceProvider.cs	(revision 8180)
@@ -20,16 +20,13 @@
 #endregion
 
-using System;
 using System.Collections;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
-using System.Text;
 using HeuristicLab.Problems.DataAnalysis;
 
 namespace HeuristicLab.Problems.Instances.DataAnalysis {
-  public abstract class RegressionInstanceProvider : IProblemInstanceProvider<IRegressionProblemData> {
+  public abstract class RegressionInstanceProvider : ProblemInstanceProvider<IRegressionProblemData> {
 
-    public IRegressionProblemData LoadData(string path) {
+    public override IRegressionProblemData LoadData(string path) {
       TableFileParser csvFileParser = new TableFileParser();
       csvFileParser.Parse(path);
@@ -57,36 +54,4 @@
       return regData;
     }
-
-    public void SaveData(IRegressionProblemData instance, string path) {
-      StringBuilder strBuilder = new StringBuilder();
-
-      foreach (var variable in instance.InputVariables) {
-        strBuilder.Append(variable + ";");
-      }
-      strBuilder.Remove(strBuilder.Length - 1, 1);
-      strBuilder.AppendLine();
-
-      Dataset dataset = instance.Dataset;
-
-      for (int i = 0; i < dataset.Rows; i++) {
-        for (int j = 0; j < dataset.Columns; j++) {
-          strBuilder.Append(dataset.GetValue(i, j) + ";");
-        }
-        strBuilder.Remove(strBuilder.Length - 1, 1);
-        strBuilder.AppendLine();
-      }
-
-      using (StreamWriter writer = new StreamWriter(path)) {
-        writer.Write(strBuilder);
-      }
-    }
-
-    public abstract IEnumerable<IDataDescriptor> GetDataDescriptors();
-    public abstract IRegressionProblemData LoadData(IDataDescriptor descriptor);
-
-    public abstract string Name { get; }
-    public abstract string Description { get; }
-    public abstract Uri WebLink { get; }
-    public abstract string ReferencePublication { get; }
   }
 }
Index: trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.ElloumiCTAP/3.3/ElloumiCTAPInstanceProvider.cs	(revision 8180)
@@ -112,8 +112,4 @@
     }
 
-    public override void SaveData(CTAPData instance, string path) {
-      throw new NotSupportedException();
-    }
-
     private CTAPData Load(ElloumiCTAPParser parser) {
       var instance = new CTAPData();
Index: trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs	(revision 8180)
@@ -168,5 +168,5 @@
         using (var solutionsZipFile = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(solutionsArchiveName))) {
           foreach (var entry in GetZipContents(solutionsZipFile))
-              solutions.Add(Path.GetFileNameWithoutExtension(entry) + ".dat", entry);
+            solutions.Add(Path.GetFileNameWithoutExtension(entry) + ".dat", entry);
         }
       }
@@ -228,8 +228,4 @@
     }
 
-    public override void SaveData(QAPData instance, string path) {
-      throw new NotSupportedException();
-    }
-
     private QAPData Load(QAPLIBParser parser) {
       var instance = new QAPData();
Index: trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBInstanceProvider.cs	(revision 8180)
@@ -94,8 +94,4 @@
     }
 
-    public override void SaveData(T instance, string path) {
-      throw new NotSupportedException();
-    }
-
     protected virtual string GetResourceName(string fileName) {
       return Assembly.GetExecutingAssembly().GetManifestResourceNames()
Index: trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.VehicleRouting/3.4/VRPInstanceProvider.cs	(revision 8180)
@@ -106,7 +106,4 @@
 
     protected abstract T LoadData(Stream stream);
-    public override void SaveData(T instance, string path) {
-      throw new NotSupportedException();
-    }
 
     public IVRPData LoadData(string vrpFile, string tourFile) {
Index: trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances.Views/3.3/ProblemInstanceConsumerViewGeneric.cs	(revision 8180)
@@ -93,5 +93,6 @@
       libraryInfoButton.Enabled = SelectedProvider != null && SelectedProvider.WebLink != null;
       importButton.Enabled = !ReadOnly && !Locked && Content != null && Consumer != null;
-      exportButton.Enabled = !ReadOnly && !Locked && Content != null && Exporter != null;
+      exportButton.Enabled = !ReadOnly && !Locked && Content != null && Exporter != null &&
+                             GenericSelectedProvider != null && GenericSelectedProvider.CanSaveData;
       problemInstanceProviderSplitContainer.Panel2Collapsed = !exportButton.Enabled;
     }
Index: trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances/3.3/IProblemInstanceProvider.cs	(revision 8180)
@@ -37,4 +37,5 @@
     TData LoadData(string path);
 
+    bool CanSaveData { get; }
     void SaveData(TData instance, string path);
   }
Index: trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 8179)
+++ trunk/sources/HeuristicLab.Problems.Instances/3.3/ProblemInstanceProvider.cs	(revision 8180)
@@ -35,5 +35,10 @@
     public abstract TData LoadData(string path);
 
-    public abstract void SaveData(TData instance, string path);
+    public virtual bool CanSaveData {
+      get { return false; }
+    }
+    public virtual void SaveData(TData instance, string path) {
+      throw new NotSupportedException();
+    }
   }
 }
