Index: /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs
===================================================================
--- /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 12507)
+++ /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/Dataset.cs	(revision 12508)
@@ -118,4 +118,6 @@
     }
 
+    protected Dataset(Dataset dataset) : this(dataset.variableNames, dataset.variableValues.Values) { }
+
     #region Backwards compatible code, remove with 3.5
     private double[,] storableData;
Index: /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs
===================================================================
--- /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs	(revision 12507)
+++ /branches/HeuristicLab.DatasetRefactor/sources/HeuristicLab.Problems.DataAnalysis/3.4/ModifiableDataset.cs	(revision 12508)
@@ -40,4 +40,6 @@
     public override IDeepCloneable Clone(Cloner cloner) { return new ModifiableDataset(this, cloner); }
     public ModifiableDataset() : base() { }
+
+    public ModifiableDataset(Dataset dataset) : base(dataset) { }
     public ModifiableDataset(IEnumerable<string> variableNames, IEnumerable<IList> variableValues) : base(variableNames, variableValues) { }
 
@@ -56,5 +58,4 @@
         variableValues[variableNames[i]][row] = list[i];
       }
-      OnRowsChanged();
       OnReset();
     }
@@ -123,4 +124,5 @@
 
       list[row] = value;
+      OnItemChanged(row, variableNames.IndexOf(variableName));
     }
 
@@ -153,20 +155,6 @@
 
     bool IStringConvertibleMatrix.Validate(string value, out string errorMessage) {
-      return ValidateValue(value, out errorMessage);
-    }
-
-    private static bool ValidateValue(string value, out string errorMessage) {
-      double dv;
-      if (double.TryParse(value, out dv)) {
-        errorMessage = string.Empty;
-        return true;
-      }
-      DateTime dt;
-      if (DateTime.TryParse(value, out dt)) {
-        errorMessage = string.Empty;
-        return true;
-      }
-      errorMessage = "Value could not be validated. Please ensure that the value is either a string, a double, or a DateTime value.";
-      return false;
+      errorMessage = string.Empty;
+      return true;
     }
 
@@ -174,44 +162,35 @@
     public override event EventHandler RowsChanged;
     private void OnRowsChanged() {
-      var changed = RowsChanged;
-      if (changed != null)
-        changed(this, EventArgs.Empty);
+      var handler = RowsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
     }
 
     public override event EventHandler ColumnsChanged;
     private void OnColumnsChanged() {
-      var changed = ColumnsChanged;
-      if (changed != null)
-        changed(this, EventArgs.Empty);
-    }
-
-    public override event EventHandler RowNamesChanged;
-    private void OnRowNamesChanged() {
-      var changed = RowNamesChanged;
-      if (changed != null)
-        changed(this, EventArgs.Empty);
+      var handler = ColumnsChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
     }
 
     public override event EventHandler ColumnNamesChanged;
     private void OnColumnNamesChanged() {
-      var changed = ColumnNamesChanged;
-      if (changed != null)
-        changed(this, EventArgs.Empty);
+      var handler = ColumnNamesChanged;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
     }
 
     public override event EventHandler Reset;
     private void OnReset() {
-      var reset = Reset;
-      if (reset != null)
-        reset(this, EventArgs.Empty);
+      var handler = Reset;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
     }
 
-    // not sure if this is really applicable in the ModifiableDataset
-    // since this is not a matrix and values are changed based on row + variableName
     public override event EventHandler<EventArgs<int, int>> ItemChanged;
     private void OnItemChanged(int rowIndex, int columnIndex) {
-      var changed = ItemChanged;
-      if (changed != null) {
-        changed(this, new EventArgs<int, int>(rowIndex, columnIndex));
+      var handler = ItemChanged;
+      if (handler != null) {
+        handler(this, new EventArgs<int, int>(rowIndex, columnIndex));
       }
     }
