Index: trunk/sources/HeuristicLab.Common/3.2/Content/ContentManager.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.2/Content/ContentManager.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.2/Content/ContentManager.cs	(revision 3500)
@@ -60,21 +60,32 @@
     public static void Save(IStorableContent content, string filename, bool compressed) {
       if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
-      instance.SaveContent(content, filename, compressed);
+      instance.SaveContent((IStorableContent)content.Clone(), filename, compressed);
       content.Filename = filename;
     }
     public static void SaveAsync(IStorableContent content, string filename, bool compressed, Action<IStorableContent, Exception> savingCompletedCallback) {
       if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
-      var action = new Action<IStorableContent, string, bool>(instance.SaveContent);
-      action.BeginInvoke(content, filename, compressed, delegate(IAsyncResult result) {
-        Exception error = null;
-        try {
-          action.EndInvoke(result);
-          content.Filename = filename;
-        }
-        catch (Exception ex) {
-          error = ex;
-        }
-        savingCompletedCallback(content, error);
-      }, null);
+
+      IStorableContent clone = null;
+      try {
+        clone = (IStorableContent)content.Clone();
+      }
+      catch (Exception ex) {
+        savingCompletedCallback(content, ex);
+      }
+
+      if (clone != null) {
+        var action = new Action<IStorableContent, string, bool>(instance.SaveContent);
+        action.BeginInvoke(clone, filename, compressed, delegate(IAsyncResult result) {
+          Exception error = null;
+          try {
+            action.EndInvoke(result);
+            content.Filename = filename;
+          }
+          catch (Exception ex) {
+            error = ex;
+          }
+          savingCompletedCallback(content, error);
+        }, null);
+      }
     }
     protected abstract void SaveContent(IStorableContent content, string filename, bool compressed);
Index: trunk/sources/HeuristicLab.Common/3.2/Content/IStorableContent.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.2/Content/IStorableContent.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.2/Content/IStorableContent.cs	(revision 3500)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Common {
-  public interface IStorableContent : IContent {
+  public interface IStorableContent : IContent, IDeepCloneable {
     string Filename { get; set; }
 
Index: trunk/sources/HeuristicLab.Common/3.2/Content/StorableContent.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.2/Content/StorableContent.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.2/Content/StorableContent.cs	(revision 3500)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Common {
-  public class StorableContent : IStorableContent {
+  public class StorableContent : DeepCloneable, IStorableContent {
     private string filename;
     public string Filename {
Index: trunk/sources/HeuristicLab.Common/3.3/Content/ContentManager.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/Content/ContentManager.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.3/Content/ContentManager.cs	(revision 3500)
@@ -60,21 +60,32 @@
     public static void Save(IStorableContent content, string filename, bool compressed) {
       if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
-      instance.SaveContent(content, filename, compressed);
+      instance.SaveContent((IStorableContent)content.Clone(), filename, compressed);
       content.Filename = filename;
     }
     public static void SaveAsync(IStorableContent content, string filename, bool compressed, Action<IStorableContent, Exception> savingCompletedCallback) {
       if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
-      var action = new Action<IStorableContent, string, bool>(instance.SaveContent);
-      action.BeginInvoke(content, filename, compressed, delegate(IAsyncResult result) {
-        Exception error = null;
-        try {
-          action.EndInvoke(result);
-          content.Filename = filename;
-        }
-        catch (Exception ex) {
-          error = ex;
-        }
-        savingCompletedCallback(content, error);
-      }, null);
+
+      IStorableContent clone = null;
+      try {
+        clone = (IStorableContent)content.Clone();
+      }
+      catch (Exception ex) {
+        savingCompletedCallback(content, ex);
+      }
+
+      if (clone != null) {
+        var action = new Action<IStorableContent, string, bool>(instance.SaveContent);
+        action.BeginInvoke(clone, filename, compressed, delegate(IAsyncResult result) {
+          Exception error = null;
+          try {
+            action.EndInvoke(result);
+            content.Filename = filename;
+          }
+          catch (Exception ex) {
+            error = ex;
+          }
+          savingCompletedCallback(content, error);
+        }, null);
+      }
     }
     protected abstract void SaveContent(IStorableContent content, string filename, bool compressed);
Index: trunk/sources/HeuristicLab.Common/3.3/Content/IStorableContent.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/Content/IStorableContent.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.3/Content/IStorableContent.cs	(revision 3500)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Common {
-  public interface IStorableContent : IContent {
+  public interface IStorableContent : IContent, IDeepCloneable {
     string Filename { get; set; }
 
Index: trunk/sources/HeuristicLab.Common/3.3/Content/StorableContent.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/Content/StorableContent.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Common/3.3/Content/StorableContent.cs	(revision 3500)
@@ -23,5 +23,5 @@
 
 namespace HeuristicLab.Common {
-  public class StorableContent : IStorableContent {
+  public class StorableContent : DeepCloneable, IStorableContent {
     private string filename;
     public string Filename {
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 3500)
@@ -28,5 +28,5 @@
   /// Interface to represent (almost) every HeuristicLab object (an object, an operator,...).
   /// </summary>
-  public interface IItem : IStorableContent, IDeepCloneable {
+  public interface IItem : IStorableContent {
     string ItemName { get; }
     string ItemDescription { get; }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 3500)
@@ -187,17 +187,11 @@
       openFileDialog.Title = "Open Problem";
       if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
-        this.Cursor = Cursors.AppStarting;
         newProblemButton.Enabled = openProblemButton.Enabled = false;
         problemViewHost.Enabled = false;
 
-        var call = new Func<string, object>(XmlParser.Deserialize);
-        call.BeginInvoke(openFileDialog.FileName, delegate(IAsyncResult a) {
-          IProblem problem = null;
+        ContentManager.LoadAsync(openFileDialog.FileName, delegate(IStorableContent content, Exception error) {
           try {
-            problem = call.EndInvoke(a) as IProblem;
-          } catch (Exception ex) {
-            Auxiliary.ShowErrorMessageBox(ex);
-          }
-          Invoke(new Action(delegate() {
+            if (error != null) throw error;
+            IProblem problem = content as IProblem;
             if (problem == null)
               MessageBox.Show(this, "The selected file does not contain a problem.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
@@ -206,9 +200,15 @@
             else
               Content.Problem = problem;
-            problemViewHost.Enabled = true;
-            newProblemButton.Enabled = openProblemButton.Enabled = true;
-            this.Cursor = Cursors.Default;
-          }));
-        }, null);
+          }
+          catch (Exception ex) {
+            Auxiliary.ShowErrorMessageBox(ex);
+          }
+          finally {
+            Invoke(new Action(delegate() {
+              problemViewHost.Enabled = true;
+              newProblemButton.Enabled = openProblemButton.Enabled = true;
+            }));
+          }
+        });
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/BatchRunView.cs	(revision 3500)
@@ -174,26 +174,26 @@
       openFileDialog.Title = "Open Algorithm";
       if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
-        this.Cursor = Cursors.AppStarting;
         newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = false;
         algorithmViewHost.Enabled = false;
 
-        var call = new Func<string, object>(XmlParser.Deserialize);
-        call.BeginInvoke(openFileDialog.FileName, delegate(IAsyncResult a) {
-          IAlgorithm algorithm = null;
+        ContentManager.LoadAsync(openFileDialog.FileName, delegate(IStorableContent content, Exception error) {
           try {
-            algorithm = call.EndInvoke(a) as IAlgorithm;
-          } catch (Exception ex) {
-            Auxiliary.ShowErrorMessageBox(ex);
-          }
-          Invoke(new Action(delegate() {
+            if (error != null) throw error;
+            IAlgorithm algorithm = content as IAlgorithm;
             if (algorithm == null)
               MessageBox.Show(this, "The selected file does not contain an algorithm.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
             else
               Content.Algorithm = algorithm;
-            algorithmViewHost.Enabled = true;
-            newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = true;
-            this.Cursor = Cursors.Default;
-          }));
-        }, null);
+          }
+          catch (Exception ex) {
+            Auxiliary.ShowErrorMessageBox(ex);
+          }
+          finally {
+            Invoke(new Action(delegate() {
+              algorithmViewHost.Enabled = true;
+              newAlgorithmButton.Enabled = openAlgorithmButton.Enabled = true;
+            }));
+          }
+        });
       }
     }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs	(revision 3500)
@@ -80,27 +80,26 @@
       openFileDialog.Title = "Open Operator Graph";
       if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
-        this.Cursor = Cursors.AppStarting;
         newOperatorGraphButton.Enabled = openOperatorGraphButton.Enabled = false;
         operatorGraphViewHost.Enabled = false;
 
-        var call = new Func<string, object>(XmlParser.Deserialize);
-        call.BeginInvoke(openFileDialog.FileName, delegate(IAsyncResult a) {
-          OperatorGraph operatorGraph = null;
+        ContentManager.LoadAsync(openFileDialog.FileName, delegate(IStorableContent content, Exception error) {
           try {
-            operatorGraph = call.EndInvoke(a) as OperatorGraph;
+            if (error != null) throw error;
+            OperatorGraph operatorGraph = content as OperatorGraph;
+            if (operatorGraph == null)
+              MessageBox.Show(this, "The selected file does not contain an operator graph.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            else
+              Content.OperatorGraph = operatorGraph;
           }
           catch (Exception ex) {
             Auxiliary.ShowErrorMessageBox(ex);
           }
-          Invoke(new Action(delegate() {
-            if (operatorGraph == null)
-              MessageBox.Show(this, "The selected file does not contain an operator graph.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
-            else
-              Content.OperatorGraph = operatorGraph;
-            operatorGraphViewHost.Enabled = true;
-            newOperatorGraphButton.Enabled = openOperatorGraphButton.Enabled = true;
-            this.Cursor = Cursors.Default;
-          }));
-        }, null);
+          finally {
+            Invoke(new Action(delegate() {
+              operatorGraphViewHost.Enabled = true;
+              newOperatorGraphButton.Enabled = openOperatorGraphButton.Enabled = true;
+            }));
+          }
+        });
       }
     }
Index: trunk/sources/HeuristicLab.Optimizer/3.3/FileManager.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 3499)
+++ trunk/sources/HeuristicLab.Optimizer/3.3/FileManager.cs	(revision 3500)
@@ -95,5 +95,4 @@
         else {
           ((OptimizerMainForm)MainFormManager.MainForm).SetAppStartingCursor();
-          ((Form)MainFormManager.MainForm).Enabled = false;
           ContentManager.SaveAsync(content, content.Filename, true, SavingCompleted);
         }
@@ -120,5 +119,4 @@
         if (saveFileDialog.ShowDialog() == DialogResult.OK) {
           ((OptimizerMainForm)MainFormManager.MainForm).SetAppStartingCursor();
-          ((Form)MainFormManager.MainForm).Enabled = false;
           if (saveFileDialog.FilterIndex == 1) {
             ContentManager.SaveAsync(content, saveFileDialog.FileName, false, SavingCompleted);
@@ -134,5 +132,4 @@
         Invoke(delegate() {
           ((OptimizerMainForm)MainFormManager.MainForm).UpdateTitle();
-          ((Form)MainFormManager.MainForm).Enabled = true;
         });
       }
