Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.Designer.cs	(revision 1920)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.Designer.cs	(revision 1921)
@@ -103,5 +103,5 @@
             this.exitToolStripMenuItem});
       this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
-      this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20);
+      this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
       this.fileToolStripMenuItem.Text = "&File";
       // 
@@ -109,5 +109,5 @@
       // 
       this.newToolStripMenuItem.Name = "newToolStripMenuItem";
-      this.newToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.newToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.newToolStripMenuItem.Text = "&New";
       // 
@@ -116,5 +116,5 @@
       this.openToolStripMenuItem.Name = "openToolStripMenuItem";
       this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
-      this.openToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.openToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.openToolStripMenuItem.Text = "&Open...";
       this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
@@ -125,5 +125,5 @@
       this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
       this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
-      this.saveToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.saveToolStripMenuItem.Text = "&Save";
       this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
@@ -133,5 +133,5 @@
       this.saveAsToolStripMenuItem.Enabled = false;
       this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
-      this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.saveAsToolStripMenuItem.Text = "Save &As...";
       this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
@@ -143,5 +143,5 @@
       this.saveAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
                   | System.Windows.Forms.Keys.S)));
-      this.saveAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.saveAllToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.saveAllToolStripMenuItem.Text = "Save Al&l";
       this.saveAllToolStripMenuItem.Click += new System.EventHandler(this.saveAllToolStripMenuItem_Click);
@@ -151,5 +151,5 @@
       this.closeToolStripMenuItem.Enabled = false;
       this.closeToolStripMenuItem.Name = "closeToolStripMenuItem";
-      this.closeToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.closeToolStripMenuItem.Text = "&Close";
       this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
@@ -159,5 +159,5 @@
       this.closeAllToolStripMenuItem.Enabled = false;
       this.closeAllToolStripMenuItem.Name = "closeAllToolStripMenuItem";
-      this.closeAllToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.closeAllToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.closeAllToolStripMenuItem.Text = "Clos&e All";
       this.closeAllToolStripMenuItem.Click += new System.EventHandler(this.closeAllToolStripMenuItem_Click);
@@ -166,10 +166,10 @@
       // 
       this.toolStripMenuItem1.Name = "toolStripMenuItem1";
-      this.toolStripMenuItem1.Size = new System.Drawing.Size(188, 6);
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(184, 6);
       // 
       // exitToolStripMenuItem
       // 
       this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
-      this.exitToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
       this.exitToolStripMenuItem.Text = "E&xit";
       this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
@@ -180,5 +180,5 @@
             this.availableOperatorsToolStripMenuItem});
       this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
-      this.viewToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
       this.viewToolStripMenuItem.Text = "&View";
       // 
@@ -186,5 +186,5 @@
       // 
       this.availableOperatorsToolStripMenuItem.Name = "availableOperatorsToolStripMenuItem";
-      this.availableOperatorsToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
+      this.availableOperatorsToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
       this.availableOperatorsToolStripMenuItem.Text = "Available &Operators...";
       this.availableOperatorsToolStripMenuItem.Click += new System.EventHandler(this.availableOperatorsToolStripMenuItem_Click);
@@ -195,5 +195,5 @@
             this.collectGarbageToolStripMenuItem});
       this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem";
-      this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+      this.toolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20);
       this.toolsToolStripMenuItem.Text = "&Tools";
       // 
@@ -201,5 +201,5 @@
       // 
       this.collectGarbageToolStripMenuItem.Name = "collectGarbageToolStripMenuItem";
-      this.collectGarbageToolStripMenuItem.Size = new System.Drawing.Size(161, 22);
+      this.collectGarbageToolStripMenuItem.Size = new System.Drawing.Size(158, 22);
       this.collectGarbageToolStripMenuItem.Text = "Collect &Garbage";
       this.collectGarbageToolStripMenuItem.Click += new System.EventHandler(this.collectGarbageToolStripMenuItem_Click);
@@ -210,5 +210,5 @@
             this.aboutToolStripMenuItem});
       this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
-      this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20);
+      this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
       this.helpToolStripMenuItem.Text = "&Help";
       // 
@@ -216,5 +216,5 @@
       // 
       this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
-      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(114, 22);
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(107, 22);
       this.aboutToolStripMenuItem.Text = "&About";
       this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
@@ -238,5 +238,5 @@
       this.saveFileDialog.DefaultExt = "hl";
       this.saveFileDialog.FileName = "item";
-      this.saveFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.saveFileDialog.Filter = "HeuristicLab archives|*.hl|Compressed HeuristicLab archives|*.hl|All files|*.*";
       this.saveFileDialog.Title = "Save file as ...";
       // 
Index: /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.cs	(revision 1920)
+++ /trunk/sources/HeuristicLab.AdvancedOptimizationFrontend/3.3/MainForm.cs	(revision 1921)
@@ -184,4 +184,5 @@
         else {
           editor.Filename = task.filename;
+          editor.SaveFinished += new EventHandler(SaveFinished);
           PluginManager.ControlManager.ShowControl(editor);
         }
@@ -193,40 +194,31 @@
       }
     }
+
     private void Save(EditorForm form) {
       if (form.Editor.Filename == null)
         SaveAs(form);
       else {
+        Cursor = Cursors.AppStarting;
         lock (locker) runningTasks++;
-        Cursor = Cursors.AppStarting;
-        ((Control)form.Editor).Enabled = false;
         EnableDisableItems();
-        Task task = new Task(form.Editor.Filename, form.Editor.Item, form.Editor);
-        ThreadPool.QueueUserWorkItem(new WaitCallback(AsynchronousSave), task);
+        form.Editor.Save();
       }
     }
     private void SaveAs(EditorForm form) {
+      if (form.Editor.Compressed)
+        saveFileDialog.FilterIndex = 2;
+      else
+        saveFileDialog.FilterIndex = 1;
+
       if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
         form.Editor.Filename = saveFileDialog.FileName;
+        form.Editor.Compressed = saveFileDialog.FilterIndex == 2;
         Save(form);
       }
-
-    }
-    private void AsynchronousSave(object state) {
-      Task task = (Task)state;
-      try {
-        PersistenceManager.Save(task.storable, task.filename);
-      } catch (Exception e) {
-        MessageBox.Show(String.Format(
-          "Sorry couldn't save file \"{0}\".\n The following exception occurred: {1}",
-          task.filename, e.ToString()),
-          "Reader Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
-      }
-      SaveFinished(task);
-    }
-    private void SaveFinished(Task task) {
+    }
+    private void SaveFinished(object sender, EventArgs e) {
       if (InvokeRequired)
-        Invoke(new TaskFinishedDelegate(SaveFinished), task);
+        Invoke(new EventHandler(SaveFinished), sender, e);
       else {
-        ((Control)task.editor).Enabled = true;
         EnableDisableItems();
         lock (locker) {
@@ -255,4 +247,5 @@
           MessageBox.Show("The selected item doesn't provide an editor.", "Editor Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         } else {
+          editor.SaveFinished += new EventHandler(SaveFinished);
           PluginManager.ControlManager.ShowControl(editor);
           EnableDisableItems();
Index: /trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs	(revision 1920)
+++ /trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs	(revision 1921)
@@ -26,4 +26,5 @@
 using System.Data;
 using System.Text;
+using System.Threading;
 using System.Windows.Forms;
 
@@ -49,4 +50,9 @@
 
     /// <summary>
+    /// Gets or sets, if the contained item should be compressed.
+    /// </summary>
+    public bool Compressed { get; set; }
+
+    /// <summary>
     /// Initializes a new instance of <see cref="EditorBase"/> with the caption "Editor".
     /// </summary>
@@ -54,4 +60,28 @@
       InitializeComponent();
       Caption = "Editor";
+    }
+
+    /// <summary>
+    /// Asynchronously saves the contained object to a file.
+    /// </summary>
+    /// <remarks>The filename to save the contained item to is given by <see cref="Filename"/>.</remarks>
+    public void Save() {
+      Enabled = false;
+      ThreadPool.QueueUserWorkItem((o) => {
+        try {
+          if (Compressed)
+            PersistenceManager.SaveCompressed(Item, Filename);
+          else
+            PersistenceManager.Save(Item, Filename);
+        } catch (Exception e) {
+          MessageBox.Show(String.Format(
+            "Sorry couldn't save file \"{0}\".\n The following exception occurred: {1}",
+            Filename, e.ToString()),
+            "Reader Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        } finally {
+          Invoke(new Action(() => Enabled = true));
+          OnSaveFinished();
+        }
+      });
     }
 
@@ -79,4 +109,16 @@
         FilenameChanged(this, new EventArgs());
     }
+
+    /// <summary>
+    /// Occurs after a save operation is finished.
+    /// </summary>
+    public event EventHandler SaveFinished;
+
+    /// <summary>
+    /// Fires a new <c>SaveFinished</c> event.
+    /// </summary>
+    protected virtual void OnSaveFinished() {
+      SaveFinished(this, new EventArgs());
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs	(revision 1920)
+++ /trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs	(revision 1921)
@@ -36,7 +36,23 @@
 
     /// <summary>
+    /// Gets or sets, it the contained item should be compressed.
+    /// </summary>
+    bool Compressed { get; set; }
+
+    /// <summary>
+    /// Saves the contained object to a file.
+    /// </summary>
+    /// <remarks>The filename to save the contained item to is given by <see cref="Filename"/>.</remarks>
+    void Save();
+
+    /// <summary>
     /// Occurs when the filename was changed.
     /// </summary>
     event EventHandler FilenameChanged;
+
+    /// <summary>
+    /// Occurs after a save operation is finished.
+    /// </summary>
+    event EventHandler SaveFinished;
   }
 }
