Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.Designer.cs	(revision 5587)
@@ -34,5 +34,4 @@
     /// </summary>
     private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmView));
       this.platformLabel = new System.Windows.Forms.Label();
       this.platformComboBox = new System.Windows.Forms.ComboBox();
@@ -45,12 +44,21 @@
       this.refreshUsersButton = new System.Windows.Forms.Button();
       this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.noViewAvailableLabel = new System.Windows.Forms.Label();
+      this.dataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.saveFileButton = new System.Windows.Forms.Button();
+      this.openFileButton = new System.Windows.Forms.Button();
+      this.newDataButton = new System.Windows.Forms.Button();
+      this.storeDataButton = new System.Windows.Forms.Button();
+      this.refreshDataButton = new System.Windows.Forms.Button();
       this.dataTypeNameLabel = new System.Windows.Forms.Label();
       this.dataTypeGroupBox = new System.Windows.Forms.GroupBox();
       this.dataTypeTypeNameTextBox = new System.Windows.Forms.TextBox();
-      this.setDataTypeButton = new System.Windows.Forms.Button();
       this.dataTypeNameTextBox = new System.Windows.Forms.TextBox();
       this.dataTypeTypeNameLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
       this.tabControl.SuspendLayout();
       this.usersTabPage.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
       this.dataTypeGroupBox.SuspendLayout();
       this.SuspendLayout();
@@ -153,5 +161,5 @@
       // storeUsersButton
       // 
-      this.storeUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("storeUsersButton.Image")));
+      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
       this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
       this.storeUsersButton.Name = "storeUsersButton";
@@ -164,5 +172,5 @@
       // refreshUsersButton
       // 
-      this.refreshUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshUsersButton.Image")));
+      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
       this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
       this.refreshUsersButton.Name = "refreshUsersButton";
@@ -175,4 +183,11 @@
       // dataTabPage
       // 
+      this.dataTabPage.Controls.Add(this.noViewAvailableLabel);
+      this.dataTabPage.Controls.Add(this.dataViewHost);
+      this.dataTabPage.Controls.Add(this.saveFileButton);
+      this.dataTabPage.Controls.Add(this.openFileButton);
+      this.dataTabPage.Controls.Add(this.newDataButton);
+      this.dataTabPage.Controls.Add(this.storeDataButton);
+      this.dataTabPage.Controls.Add(this.refreshDataButton);
       this.dataTabPage.Location = new System.Drawing.Point(4, 22);
       this.dataTabPage.Name = "dataTabPage";
@@ -183,4 +198,85 @@
       this.dataTabPage.UseVisualStyleBackColor = true;
       // 
+      // noViewAvailableLabel
+      // 
+      this.noViewAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noViewAvailableLabel.AutoSize = true;
+      this.noViewAvailableLabel.Location = new System.Drawing.Point(265, 84);
+      this.noViewAvailableLabel.Name = "noViewAvailableLabel";
+      this.noViewAvailableLabel.Size = new System.Drawing.Size(94, 13);
+      this.noViewAvailableLabel.TabIndex = 6;
+      this.noViewAvailableLabel.Text = "No view available.";
+      // 
+      // dataViewHost
+      // 
+      this.dataViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataViewHost.Caption = "View";
+      this.dataViewHost.Content = null;
+      this.dataViewHost.Enabled = false;
+      this.dataViewHost.Location = new System.Drawing.Point(6, 36);
+      this.dataViewHost.Name = "dataViewHost";
+      this.dataViewHost.ReadOnly = false;
+      this.dataViewHost.Size = new System.Drawing.Size(613, 138);
+      this.dataViewHost.TabIndex = 5;
+      this.dataViewHost.ViewsLabelVisible = true;
+      this.dataViewHost.ViewType = null;
+      // 
+      // saveFileButton
+      // 
+      this.saveFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Save;
+      this.saveFileButton.Location = new System.Drawing.Point(126, 6);
+      this.saveFileButton.Name = "saveFileButton";
+      this.saveFileButton.Size = new System.Drawing.Size(24, 24);
+      this.saveFileButton.TabIndex = 4;
+      this.toolTip.SetToolTip(this.saveFileButton, "Save Algorithm Data into File");
+      this.saveFileButton.UseVisualStyleBackColor = true;
+      this.saveFileButton.Click += new System.EventHandler(this.saveFileButton_Click);
+      // 
+      // openFileButton
+      // 
+      this.openFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openFileButton.Location = new System.Drawing.Point(96, 6);
+      this.openFileButton.Name = "openFileButton";
+      this.openFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openFileButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.openFileButton, "Load Algorithm Data from File");
+      this.openFileButton.UseVisualStyleBackColor = true;
+      this.openFileButton.Click += new System.EventHandler(this.openFileButton_Click);
+      // 
+      // newDataButton
+      // 
+      this.newDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.NewDocument;
+      this.newDataButton.Location = new System.Drawing.Point(66, 6);
+      this.newDataButton.Name = "newDataButton";
+      this.newDataButton.Size = new System.Drawing.Size(24, 24);
+      this.newDataButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.newDataButton, "Create New Algorithm Data");
+      this.newDataButton.UseVisualStyleBackColor = true;
+      this.newDataButton.Click += new System.EventHandler(this.newDataButton_Click);
+      // 
+      // storeDataButton
+      // 
+      this.storeDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeDataButton.Location = new System.Drawing.Point(36, 6);
+      this.storeDataButton.Name = "storeDataButton";
+      this.storeDataButton.Size = new System.Drawing.Size(24, 24);
+      this.storeDataButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.storeDataButton, "Store Algorithm Data");
+      this.storeDataButton.UseVisualStyleBackColor = true;
+      this.storeDataButton.Click += new System.EventHandler(this.storeDataButton_Click);
+      // 
+      // refreshDataButton
+      // 
+      this.refreshDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshDataButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshDataButton.Name = "refreshDataButton";
+      this.refreshDataButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshDataButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshDataButton, "Refresh Algorithm Data");
+      this.refreshDataButton.UseVisualStyleBackColor = true;
+      this.refreshDataButton.Click += new System.EventHandler(this.refreshDataButton_Click);
+      // 
       // dataTypeNameLabel
       // 
@@ -197,5 +293,4 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.dataTypeGroupBox.Controls.Add(this.dataTypeTypeNameTextBox);
-      this.dataTypeGroupBox.Controls.Add(this.setDataTypeButton);
       this.dataTypeGroupBox.Controls.Add(this.dataTypeNameTextBox);
       this.dataTypeGroupBox.Controls.Add(this.dataTypeTypeNameLabel);
@@ -214,21 +309,9 @@
       this.dataTypeTypeNameTextBox.Location = new System.Drawing.Point(90, 45);
       this.dataTypeTypeNameTextBox.Name = "dataTypeTypeNameTextBox";
-      this.dataTypeTypeNameTextBox.Size = new System.Drawing.Size(507, 20);
+      this.dataTypeTypeNameTextBox.Size = new System.Drawing.Size(537, 20);
       this.dataTypeTypeNameTextBox.TabIndex = 3;
       this.toolTip.SetToolTip(this.dataTypeTypeNameTextBox, "Machine Readable Data Type Name (e.g. Assembly Qualified Name)");
       this.dataTypeTypeNameTextBox.TextChanged += new System.EventHandler(this.dataTypeTypeNameTextBox_TextChanged);
       // 
-      // setDataTypeButton
-      // 
-      this.setDataTypeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.setDataTypeButton.Image = ((System.Drawing.Image)(resources.GetObject("setDataTypeButton.Image")));
-      this.setDataTypeButton.Location = new System.Drawing.Point(603, 29);
-      this.setDataTypeButton.Name = "setDataTypeButton";
-      this.setDataTypeButton.Size = new System.Drawing.Size(24, 24);
-      this.setDataTypeButton.TabIndex = 4;
-      this.toolTip.SetToolTip(this.setDataTypeButton, "Set Data Type");
-      this.setDataTypeButton.UseVisualStyleBackColor = true;
-      this.setDataTypeButton.Click += new System.EventHandler(this.setDataTypeButton_Click);
-      // 
       // dataTypeNameTextBox
       // 
@@ -237,5 +320,5 @@
       this.dataTypeNameTextBox.Location = new System.Drawing.Point(90, 19);
       this.dataTypeNameTextBox.Name = "dataTypeNameTextBox";
-      this.dataTypeNameTextBox.Size = new System.Drawing.Size(507, 20);
+      this.dataTypeNameTextBox.Size = new System.Drawing.Size(537, 20);
       this.dataTypeNameTextBox.TabIndex = 1;
       this.toolTip.SetToolTip(this.dataTypeNameTextBox, "Human Readable Data Type Name");
@@ -250,4 +333,16 @@
       this.dataTypeTypeNameLabel.TabIndex = 2;
       this.dataTypeTypeNameLabel.Text = "&Type Name:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.FileName = "data";
+      this.openFileDialog.Filter = "All Files (*.*)|*.*";
+      this.openFileDialog.Title = "Load Algorithm Data";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.FileName = "data";
+      this.saveFileDialog.Filter = "All Files (*.*)|*.*";
+      this.saveFileDialog.Title = "Save Algorithm Data";
       // 
       // AlgorithmView
@@ -275,4 +370,6 @@
       this.tabControl.ResumeLayout(false);
       this.usersTabPage.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.dataTabPage.PerformLayout();
       this.dataTypeGroupBox.ResumeLayout(false);
       this.dataTypeGroupBox.PerformLayout();
@@ -299,5 +396,13 @@
     private System.Windows.Forms.TextBox dataTypeNameTextBox;
     private System.Windows.Forms.Label dataTypeTypeNameLabel;
-    private System.Windows.Forms.Button setDataTypeButton;
+    private System.Windows.Forms.Button storeDataButton;
+    private System.Windows.Forms.Button refreshDataButton;
+    private System.Windows.Forms.Button openFileButton;
+    private System.Windows.Forms.Button newDataButton;
+    private System.Windows.Forms.Button saveFileButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private MainForm.WindowsForms.ViewHost dataViewHost;
+    private System.Windows.Forms.Label noViewAvailableLabel;
 
   }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/AlgorithmView.cs	(revision 5587)
@@ -22,11 +22,15 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Clients.OKB.Authentication;
+using HeuristicLab.Common;
 using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
 using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.OKB.Administration {
@@ -37,4 +41,5 @@
     private List<AlgorithmClass> algorithmClassComboBoxValues;
     private TypeSelectorDialog typeSelectorDialog;
+    private byte[] data;
 
     public new Algorithm Content {
@@ -58,9 +63,17 @@
       base.OnContentChanged();
 
+      platformComboBox.SelectedValueChanged -= new EventHandler(platformComboBox_SelectedValueChanged);
       platformComboBoxValues = AdministrationClient.Instance.Platforms.ToList();
       platformComboBox.DataSource = platformComboBoxValues;
+      platformComboBox.SelectedValueChanged += new EventHandler(platformComboBox_SelectedValueChanged);
+
+      algorithmClassComboBox.SelectedValueChanged -= new EventHandler(algorithmClassComboBox_SelectedValueChanged);
       algorithmClassComboBoxValues = AdministrationClient.Instance.AlgorithmClasses.ToList();
       algorithmClassComboBox.DataSource = algorithmClassComboBoxValues;
-
+      algorithmClassComboBox.SelectedValueChanged += new EventHandler(algorithmClassComboBox_SelectedValueChanged);
+
+      usersListBox.DataSource = null;
+      data = null;
+      dataViewHost.Content = null;
       if (Content == null) {
         platformComboBox.SelectedIndex = -1;
@@ -74,5 +87,4 @@
         dataTypeTypeNameTextBox.Text = Content.DataTypeTypeName;
       }
-      usersListBox.DataSource = null;
     }
 
@@ -85,11 +97,17 @@
       storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
       usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      refreshDataButton.Enabled = (Content != null) && (Content.Id != 0);
+      storeDataButton.Enabled = ((data != null) || (dataViewHost.Content != null)) && !ReadOnly;
+      openFileButton.Enabled = (Content != null) && (Content.Id != 0);
+      saveFileButton.Enabled = (data != null) || (dataViewHost.Content != null);
+      noViewAvailableLabel.Visible = dataViewHost.Content == null;
 
       bool isHL33Platform = platformComboBox.Text == "HeuristicLab 3.3";
-      setDataTypeButton.Enabled = isHL33Platform && !ReadOnly;
       dataTypeNameTextBox.ReadOnly = isHL33Platform;
       dataTypeTypeNameTextBox.ReadOnly = isHL33Platform;
-    }
-
+      newDataButton.Enabled = isHL33Platform && (Content.Id != 0) && !ReadOnly;
+    }
+
+    #region Content Events
     protected override void OnContentPropertyChanged(string propertyName) {
       switch (propertyName) {
@@ -112,5 +130,7 @@
       }
     }
-
+    #endregion
+
+    #region Control Events
     private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
       if (Content != null) {
@@ -126,5 +146,83 @@
     }
 
-    private void setDataTypeButton_Click(object sender, EventArgs e) {
+    private void dataTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeNameTextBox.Text != Content.DataTypeName)
+        Content.DataTypeName = dataTypeNameTextBox.Text;
+    }
+    private void dataTypeTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeTypeNameTextBox.Text != Content.DataTypeTypeName)
+        Content.DataTypeTypeName = dataTypeTypeNameTextBox.Text;
+    }
+
+    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
+      try {
+        List<Guid> ids = AdministrationClient.GetAlgorithmUsers(Content.Id);
+        if (ids != null) {
+          if (AuthenticationClient.Instance.Users == null) AuthenticationClient.Instance.Refresh();
+          List<User> users = AuthenticationClient.Instance.Users.ToList();
+          usersListBox.DataSource = users;
+          usersListBox.DisplayMember = "Name";
+          for (int i = 0; i < users.Count; i++)
+            usersListBox.SetItemChecked(i, ids.Contains(users[i].Id));
+          usersListBox.Enabled = !ReadOnly;
+          storeUsersButton.Enabled = false;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Refresh authorized users and groups failed.", ex);
+      }
+    }
+    private void storeUsersButton_Click(object sender, System.EventArgs e) {
+      try {
+        AdministrationClient.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
+        storeUsersButton.Enabled = false;
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Store authorized users and groups failed.", ex);
+      }
+    }
+    private void usersListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
+      storeUsersButton.Enabled = !ReadOnly;
+    }
+
+    private void refreshDataButton_Click(object sender, EventArgs e) {
+      CallAsync(
+        () => {
+          data = null;
+          dataViewHost.Content = null;
+          data = AdministrationClient.GetAlgorithmData(Content.Id);
+          if (data != null) {
+            using (MemoryStream stream = new MemoryStream(data)) {
+              try {
+                dataViewHost.Content = XmlParser.Deserialize<IContent>(stream);
+              }
+              catch (Exception) { }
+              stream.Close();
+            }
+          }
+        },
+        "Refresh algorithm data failed.",
+        () => SetEnabledStateOfControls()
+      );
+    }
+    private void storeDataButton_Click(object sender, EventArgs e) {
+      CallAsync(
+        () => {
+          if (dataViewHost.Content != null) {
+            using (MemoryStream stream = new MemoryStream()) {
+              IAlgorithm algorithm = dataViewHost.Content as IAlgorithm;
+              algorithm.Prepare(true);
+              XmlGenerator.Serialize(algorithm, stream);
+              stream.Close();
+              data = stream.ToArray();
+            }
+          }
+          AdministrationClient.UpdateAlgorithmData(Content.Id, data);
+        },
+        "Store algorithm data failed.",
+        null
+      );
+    }
+    private void newDataButton_Click(object sender, EventArgs e) {
       if (typeSelectorDialog == null) {
         typeSelectorDialog = new TypeSelectorDialog();
@@ -134,37 +232,97 @@
       }
       if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
-        Content.DataTypeName = typeSelectorDialog.TypeSelector.SelectedType.Name;
-        Content.DataTypeTypeName = typeSelectorDialog.TypeSelector.SelectedType.AssemblyQualifiedName;
-      }
-    }
-    private void dataTypeNameTextBox_TextChanged(object sender, EventArgs e) {
-      if (dataTypeNameTextBox.Text != Content.DataTypeName)
-        Content.DataTypeName = dataTypeNameTextBox.Text;
-    }
-    private void dataTypeTypeNameTextBox_TextChanged(object sender, EventArgs e) {
-      if (dataTypeTypeNameTextBox.Text != Content.DataTypeTypeName)
-        Content.DataTypeTypeName = dataTypeTypeNameTextBox.Text;
-    }
-
-    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = AdministrationClient.GetAlgorithmUsers(Content.Id);
-      if (ids != null) {
-        if (AuthenticationClient.Instance.Users == null) AuthenticationClient.Instance.Refresh();
-        List<User> users = AuthenticationClient.Instance.Users.ToList();
-        usersListBox.DataSource = users;
-        usersListBox.DisplayMember = "Name";
-        for (int i = 0; i < users.Count; i++)
-          usersListBox.SetItemChecked(i, ids.Contains(users[i].Id));
-        usersListBox.Enabled = !ReadOnly;
-        storeUsersButton.Enabled = false;
-      }
-    }
-    private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      AdministrationClient.UpdateAlgorithmUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
-      storeUsersButton.Enabled = false;
-    }
-    private void usersListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
-      storeUsersButton.Enabled = !ReadOnly;
-    }
+        try {
+          Content.DataTypeName = typeSelectorDialog.TypeSelector.SelectedType.Name;
+          Content.DataTypeTypeName = typeSelectorDialog.TypeSelector.SelectedType.AssemblyQualifiedName;
+          data = null;
+          dataViewHost.Content = (IContent)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, "Create new algorithm data failed.", ex);
+        }
+        SetEnabledStateOfControls();
+      }
+    }
+    private void openFileButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        CallAsync(
+          () => {
+            IContent algorithm = null;
+            try {
+              algorithm = XmlParser.Deserialize<IContent>(openFileDialog.FileName);
+            }
+            catch (Exception) { }
+
+            if (algorithm != null) {
+              Content.DataTypeName = algorithm.GetType().Name;
+              Content.DataTypeTypeName = algorithm.GetType().AssemblyQualifiedName;
+              data = null;
+            } else {
+              using (FileStream stream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
+                data = new byte[stream.Length];
+                stream.Read(data, 0, data.Length);
+                stream.Close();
+              }
+            }
+            dataViewHost.Content = algorithm;
+          },
+          "Save algorithm data into file failed.",
+          () => SetEnabledStateOfControls()
+        );
+      }
+    }
+    private void saveFileButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        CallAsync(
+          () => {
+            if (dataViewHost.Content != null) {
+              XmlGenerator.Serialize(dataViewHost.Content, saveFileDialog.FileName);
+            } else {
+              using (FileStream stream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write)) {
+                stream.Write(data, 0, data.Length);
+                stream.Close();
+              }
+            }
+          },
+          "Save algorithm data into file failed.",
+          null
+        );
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void CallAsync(Action call, string errorMessage, Action continueWith) {
+      BeginAsyncCall();
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception exception = null;
+        try {
+          call.EndInvoke(result);
+        }
+        catch (Exception ex) {
+          exception = ex;
+        }
+        EndAsyncCall(errorMessage, exception, continueWith);
+      }, null);
+    }
+    private void BeginAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(BeginAsyncCall));
+      else {
+        Cursor = Cursors.AppStarting;
+        Enabled = false;
+      }
+    }
+    private void EndAsyncCall(string errorMessage, Exception exception, Action continueWith) {
+      if (InvokeRequired)
+        Invoke(new Action<string, Exception, Action>(EndAsyncCall), errorMessage, exception, continueWith);
+      else {
+        Cursor = Cursors.Default;
+        Enabled = true;
+        if (exception != null) ErrorHandling.ShowErrorDialog(this, errorMessage, exception);
+        if (continueWith != null) continueWith();
+      }
+    }
+    #endregion
   }
 }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.Designer.cs	(revision 5587)
@@ -27,15 +27,4 @@
     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) {
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
     #region Component Designer generated code
 
@@ -51,10 +40,26 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.usersTabPage = new System.Windows.Forms.TabPage();
+      this.usersListBox = new System.Windows.Forms.CheckedListBox();
       this.storeUsersButton = new System.Windows.Forms.Button();
       this.refreshUsersButton = new System.Windows.Forms.Button();
       this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.usersListBox = new System.Windows.Forms.CheckedListBox();
+      this.noViewAvailableLabel = new System.Windows.Forms.Label();
+      this.dataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.saveFileButton = new System.Windows.Forms.Button();
+      this.openFileButton = new System.Windows.Forms.Button();
+      this.newDataButton = new System.Windows.Forms.Button();
+      this.storeDataButton = new System.Windows.Forms.Button();
+      this.refreshDataButton = new System.Windows.Forms.Button();
+      this.dataTypeNameLabel = new System.Windows.Forms.Label();
+      this.dataTypeGroupBox = new System.Windows.Forms.GroupBox();
+      this.dataTypeTypeNameTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeNameTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeTypeNameLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
       this.tabControl.SuspendLayout();
       this.usersTabPage.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.dataTypeGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -99,5 +104,5 @@
       this.problemClassLabel.Location = new System.Drawing.Point(3, 111);
       this.problemClassLabel.Name = "problemClassLabel";
-      this.problemClassLabel.Size = new System.Drawing.Size(76, 13);
+      this.problemClassLabel.Size = new System.Drawing.Size(81, 13);
       this.problemClassLabel.TabIndex = 7;
       this.problemClassLabel.Text = "&Problem Class:";
@@ -122,9 +127,9 @@
       this.tabControl.Controls.Add(this.usersTabPage);
       this.tabControl.Controls.Add(this.dataTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 162);
+      this.tabControl.Location = new System.Drawing.Point(0, 239);
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(633, 283);
-      this.tabControl.TabIndex = 9;
+      this.tabControl.Size = new System.Drawing.Size(633, 206);
+      this.tabControl.TabIndex = 10;
       // 
       // usersTabPage
@@ -136,8 +141,21 @@
       this.usersTabPage.Name = "usersTabPage";
       this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.usersTabPage.Size = new System.Drawing.Size(625, 257);
+      this.usersTabPage.Size = new System.Drawing.Size(625, 180);
       this.usersTabPage.TabIndex = 0;
-      this.usersTabPage.Text = "Authorized Users";
+      this.usersTabPage.Text = "Authorized Users and Groups";
       this.usersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // usersListBox
+      // 
+      this.usersListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.usersListBox.CheckOnClick = true;
+      this.usersListBox.FormattingEnabled = true;
+      this.usersListBox.Location = new System.Drawing.Point(6, 35);
+      this.usersListBox.Name = "usersListBox";
+      this.usersListBox.Size = new System.Drawing.Size(613, 139);
+      this.usersListBox.TabIndex = 2;
+      this.usersListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.usersListBox_ItemCheck);
       // 
       // storeUsersButton
@@ -165,26 +183,171 @@
       // dataTabPage
       // 
+      this.dataTabPage.Controls.Add(this.noViewAvailableLabel);
+      this.dataTabPage.Controls.Add(this.dataViewHost);
+      this.dataTabPage.Controls.Add(this.saveFileButton);
+      this.dataTabPage.Controls.Add(this.openFileButton);
+      this.dataTabPage.Controls.Add(this.newDataButton);
+      this.dataTabPage.Controls.Add(this.storeDataButton);
+      this.dataTabPage.Controls.Add(this.refreshDataButton);
       this.dataTabPage.Location = new System.Drawing.Point(4, 22);
       this.dataTabPage.Name = "dataTabPage";
       this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTabPage.Size = new System.Drawing.Size(625, 266);
+      this.dataTabPage.Size = new System.Drawing.Size(625, 180);
       this.dataTabPage.TabIndex = 1;
       this.dataTabPage.Text = "Platform-Specific Problem Data";
       this.dataTabPage.UseVisualStyleBackColor = true;
       // 
-      // usersListBox
-      // 
-      this.usersListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+      // noViewAvailableLabel
+      // 
+      this.noViewAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noViewAvailableLabel.AutoSize = true;
+      this.noViewAvailableLabel.Location = new System.Drawing.Point(265, 84);
+      this.noViewAvailableLabel.Name = "noViewAvailableLabel";
+      this.noViewAvailableLabel.Size = new System.Drawing.Size(94, 13);
+      this.noViewAvailableLabel.TabIndex = 6;
+      this.noViewAvailableLabel.Text = "No view available.";
+      // 
+      // dataViewHost
+      // 
+      this.dataViewHost.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.usersListBox.FormattingEnabled = true;
-      this.usersListBox.Location = new System.Drawing.Point(6, 36);
-      this.usersListBox.Name = "usersListBox";
-      this.usersListBox.Size = new System.Drawing.Size(613, 214);
-      this.usersListBox.TabIndex = 3;
+      this.dataViewHost.Caption = "View";
+      this.dataViewHost.Content = null;
+      this.dataViewHost.Enabled = false;
+      this.dataViewHost.Location = new System.Drawing.Point(6, 36);
+      this.dataViewHost.Name = "dataViewHost";
+      this.dataViewHost.ReadOnly = false;
+      this.dataViewHost.Size = new System.Drawing.Size(613, 138);
+      this.dataViewHost.TabIndex = 5;
+      this.dataViewHost.ViewsLabelVisible = true;
+      this.dataViewHost.ViewType = null;
+      // 
+      // saveFileButton
+      // 
+      this.saveFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Save;
+      this.saveFileButton.Location = new System.Drawing.Point(126, 6);
+      this.saveFileButton.Name = "saveFileButton";
+      this.saveFileButton.Size = new System.Drawing.Size(24, 24);
+      this.saveFileButton.TabIndex = 4;
+      this.toolTip.SetToolTip(this.saveFileButton, "Save Problem Data into File");
+      this.saveFileButton.UseVisualStyleBackColor = true;
+      this.saveFileButton.Click += new System.EventHandler(this.saveFileButton_Click);
+      // 
+      // openFileButton
+      // 
+      this.openFileButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.openFileButton.Location = new System.Drawing.Point(96, 6);
+      this.openFileButton.Name = "openFileButton";
+      this.openFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openFileButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.openFileButton, "Load Problem Data from File");
+      this.openFileButton.UseVisualStyleBackColor = true;
+      this.openFileButton.Click += new System.EventHandler(this.openFileButton_Click);
+      // 
+      // newDataButton
+      // 
+      this.newDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.NewDocument;
+      this.newDataButton.Location = new System.Drawing.Point(66, 6);
+      this.newDataButton.Name = "newDataButton";
+      this.newDataButton.Size = new System.Drawing.Size(24, 24);
+      this.newDataButton.TabIndex = 2;
+      this.toolTip.SetToolTip(this.newDataButton, "Create New Problem Data");
+      this.newDataButton.UseVisualStyleBackColor = true;
+      this.newDataButton.Click += new System.EventHandler(this.newDataButton_Click);
+      // 
+      // storeDataButton
+      // 
+      this.storeDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeDataButton.Location = new System.Drawing.Point(36, 6);
+      this.storeDataButton.Name = "storeDataButton";
+      this.storeDataButton.Size = new System.Drawing.Size(24, 24);
+      this.storeDataButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.storeDataButton, "Store Problem Data");
+      this.storeDataButton.UseVisualStyleBackColor = true;
+      this.storeDataButton.Click += new System.EventHandler(this.storeDataButton_Click);
+      // 
+      // refreshDataButton
+      // 
+      this.refreshDataButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshDataButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshDataButton.Name = "refreshDataButton";
+      this.refreshDataButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshDataButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshDataButton, "Refresh Problem Data");
+      this.refreshDataButton.UseVisualStyleBackColor = true;
+      this.refreshDataButton.Click += new System.EventHandler(this.refreshDataButton_Click);
+      // 
+      // dataTypeNameLabel
+      // 
+      this.dataTypeNameLabel.AutoSize = true;
+      this.dataTypeNameLabel.Location = new System.Drawing.Point(6, 22);
+      this.dataTypeNameLabel.Name = "dataTypeNameLabel";
+      this.dataTypeNameLabel.Size = new System.Drawing.Size(38, 13);
+      this.dataTypeNameLabel.TabIndex = 0;
+      this.dataTypeNameLabel.Text = "&Name:";
+      // 
+      // dataTypeGroupBox
+      // 
+      this.dataTypeGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeGroupBox.Controls.Add(this.dataTypeTypeNameTextBox);
+      this.dataTypeGroupBox.Controls.Add(this.dataTypeNameTextBox);
+      this.dataTypeGroupBox.Controls.Add(this.dataTypeTypeNameLabel);
+      this.dataTypeGroupBox.Controls.Add(this.dataTypeNameLabel);
+      this.dataTypeGroupBox.Location = new System.Drawing.Point(0, 146);
+      this.dataTypeGroupBox.Name = "dataTypeGroupBox";
+      this.dataTypeGroupBox.Size = new System.Drawing.Size(633, 77);
+      this.dataTypeGroupBox.TabIndex = 9;
+      this.dataTypeGroupBox.TabStop = false;
+      this.dataTypeGroupBox.Text = "Data Type";
+      // 
+      // dataTypeTypeNameTextBox
+      // 
+      this.dataTypeTypeNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTypeNameTextBox.Location = new System.Drawing.Point(90, 45);
+      this.dataTypeTypeNameTextBox.Name = "dataTypeTypeNameTextBox";
+      this.dataTypeTypeNameTextBox.Size = new System.Drawing.Size(537, 20);
+      this.dataTypeTypeNameTextBox.TabIndex = 3;
+      this.toolTip.SetToolTip(this.dataTypeTypeNameTextBox, "Machine Readable Data Type Name (e.g. Assembly Qualified Name)");
+      this.dataTypeTypeNameTextBox.TextChanged += new System.EventHandler(this.dataTypeTypeNameTextBox_TextChanged);
+      // 
+      // dataTypeNameTextBox
+      // 
+      this.dataTypeNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeNameTextBox.Location = new System.Drawing.Point(90, 19);
+      this.dataTypeNameTextBox.Name = "dataTypeNameTextBox";
+      this.dataTypeNameTextBox.Size = new System.Drawing.Size(537, 20);
+      this.dataTypeNameTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.dataTypeNameTextBox, "Human Readable Data Type Name");
+      this.dataTypeNameTextBox.TextChanged += new System.EventHandler(this.dataTypeNameTextBox_TextChanged);
+      // 
+      // dataTypeTypeNameLabel
+      // 
+      this.dataTypeTypeNameLabel.AutoSize = true;
+      this.dataTypeTypeNameLabel.Location = new System.Drawing.Point(6, 48);
+      this.dataTypeTypeNameLabel.Name = "dataTypeTypeNameLabel";
+      this.dataTypeTypeNameLabel.Size = new System.Drawing.Size(65, 13);
+      this.dataTypeTypeNameLabel.TabIndex = 2;
+      this.dataTypeTypeNameLabel.Text = "&Type Name:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.FileName = "data";
+      this.openFileDialog.Filter = "All Files (*.*)|*.*";
+      this.openFileDialog.Title = "Load Problem Data";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.FileName = "data";
+      this.saveFileDialog.Filter = "All Files (*.*)|*.*";
+      this.saveFileDialog.Title = "Save Problem Data";
       // 
       // ProblemView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.dataTypeGroupBox);
       this.Controls.Add(this.tabControl);
       this.Controls.Add(this.platformComboBox);
@@ -199,4 +362,5 @@
       this.Controls.SetChildIndex(this.platformComboBox, 0);
       this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.dataTypeGroupBox, 0);
       this.Controls.SetChildIndex(this.storeButton, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -206,4 +370,8 @@
       this.tabControl.ResumeLayout(false);
       this.usersTabPage.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.dataTabPage.PerformLayout();
+      this.dataTypeGroupBox.ResumeLayout(false);
+      this.dataTypeGroupBox.PerformLayout();
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -223,4 +391,18 @@
     private System.Windows.Forms.TabPage dataTabPage;
     private System.Windows.Forms.CheckedListBox usersListBox;
+    private System.Windows.Forms.Label dataTypeNameLabel;
+    private System.Windows.Forms.GroupBox dataTypeGroupBox;
+    private System.Windows.Forms.TextBox dataTypeTypeNameTextBox;
+    private System.Windows.Forms.TextBox dataTypeNameTextBox;
+    private System.Windows.Forms.Label dataTypeTypeNameLabel;
+    private System.Windows.Forms.Button storeDataButton;
+    private System.Windows.Forms.Button refreshDataButton;
+    private System.Windows.Forms.Button openFileButton;
+    private System.Windows.Forms.Button newDataButton;
+    private System.Windows.Forms.Button saveFileButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private MainForm.WindowsForms.ViewHost dataViewHost;
+    private System.Windows.Forms.Label noViewAvailableLabel;
 
   }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/Administration/Views/ProblemView.cs	(revision 5587)
@@ -22,9 +22,15 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Windows.Forms;
 using HeuristicLab.Clients.OKB.Authentication;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.OKB.Administration {
@@ -34,4 +40,6 @@
     private List<Platform> platformComboBoxValues;
     private List<ProblemClass> problemClassComboBoxValues;
+    private TypeSelectorDialog typeSelectorDialog;
+    private byte[] data;
 
     public new Problem Content {
@@ -44,22 +52,39 @@
     }
 
-    protected override void OnInitialized(System.EventArgs e) {
-      base.OnInitialized(e);
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      platformComboBox.SelectedValueChanged -= new EventHandler(platformComboBox_SelectedValueChanged);
       platformComboBoxValues = AdministrationClient.Instance.Platforms.ToList();
       platformComboBox.DataSource = platformComboBoxValues;
+      platformComboBox.SelectedValueChanged += new EventHandler(platformComboBox_SelectedValueChanged);
+
+      problemClassComboBox.SelectedValueChanged -= new EventHandler(problemClassComboBox_SelectedValueChanged);
       problemClassComboBoxValues = AdministrationClient.Instance.ProblemClasses.ToList();
       problemClassComboBox.DataSource = problemClassComboBoxValues;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
+      problemClassComboBox.SelectedValueChanged += new EventHandler(problemClassComboBox_SelectedValueChanged);
+
+      usersListBox.DataSource = null;
+      data = null;
+      dataViewHost.Content = null;
       if (Content == null) {
         platformComboBox.SelectedIndex = -1;
         problemClassComboBox.SelectedIndex = -1;
+        dataTypeNameTextBox.Text = string.Empty;
+        dataTypeTypeNameTextBox.Text = string.Empty;
       } else {
         platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
         problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
-      }
-      usersListBox.DataSource = null;
+        dataTypeNameTextBox.Text = Content.DataTypeName;
+        dataTypeTypeNameTextBox.Text = Content.DataTypeTypeName;
+      }
     }
 
@@ -68,20 +93,44 @@
       platformComboBox.Enabled = (Content != null) && !ReadOnly;
       problemClassComboBox.Enabled = (Content != null) && !ReadOnly;
-      refreshUsersButton.Enabled = Content != null;
+      dataTypeGroupBox.Enabled = (Content != null) && !ReadOnly;
+      refreshUsersButton.Enabled = (Content != null) && (Content.Id != 0);
       storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
       usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
-    }
-
+      refreshDataButton.Enabled = (Content != null) && (Content.Id != 0);
+      storeDataButton.Enabled = ((data != null) || (dataViewHost.Content != null)) && !ReadOnly;
+      openFileButton.Enabled = (Content != null) && (Content.Id != 0);
+      saveFileButton.Enabled = (data != null) || (dataViewHost.Content != null);
+      noViewAvailableLabel.Visible = dataViewHost.Content == null;
+
+      bool isHL33Platform = platformComboBox.Text == "HeuristicLab 3.3";
+      dataTypeNameTextBox.ReadOnly = isHL33Platform;
+      dataTypeTypeNameTextBox.ReadOnly = isHL33Platform;
+      newDataButton.Enabled = isHL33Platform && (Content.Id != 0) && !ReadOnly;
+    }
+
+    #region Content Events
     protected override void OnContentPropertyChanged(string propertyName) {
       switch (propertyName) {
+        case "Id":
+          SetEnabledStateOfControls();
+          break;
         case "PlatformId":
           platformComboBox.SelectedItem = platformComboBoxValues.FirstOrDefault(p => p.Id == Content.PlatformId);
+          SetEnabledStateOfControls();
           break;
         case "ProblemClassId":
           problemClassComboBox.SelectedItem = problemClassComboBoxValues.FirstOrDefault(a => a.Id == Content.ProblemClassId);
           break;
-      }
-    }
-
+        case "DataTypeName":
+          dataTypeNameTextBox.Text = Content.DataTypeName;
+          break;
+        case "DataTypeTypeName":
+          dataTypeTypeNameTextBox.Text = Content.DataTypeTypeName;
+          break;
+      }
+    }
+    #endregion
+
+    #region Control Events
     private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
       if (Content != null) {
@@ -97,24 +146,181 @@
     }
 
+    private void dataTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeNameTextBox.Text != Content.DataTypeName)
+        Content.DataTypeName = dataTypeNameTextBox.Text;
+    }
+    private void dataTypeTypeNameTextBox_TextChanged(object sender, EventArgs e) {
+      if (dataTypeTypeNameTextBox.Text != Content.DataTypeTypeName)
+        Content.DataTypeTypeName = dataTypeTypeNameTextBox.Text;
+    }
+
     private void refreshUsersButton_Click(object sender, System.EventArgs e) {
-      List<Guid> ids = AdministrationClient.GetProblemUsers(Content.Id);
-      if (ids != null) {
-        List<User> users = AuthenticationClient.Instance.Users.ToList();
-        usersListBox.DataSource = users;
-        usersListBox.DisplayMember = "Name";
-        usersListBox.SelectedItems.Clear();
-        foreach (Guid id in ids)
-          usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
-        usersListBox.Enabled = !ReadOnly;
+      try {
+        List<Guid> ids = AdministrationClient.GetProblemUsers(Content.Id);
+        if (ids != null) {
+          if (AuthenticationClient.Instance.Users == null) AuthenticationClient.Instance.Refresh();
+          List<User> users = AuthenticationClient.Instance.Users.ToList();
+          usersListBox.DataSource = users;
+          usersListBox.DisplayMember = "Name";
+          for (int i = 0; i < users.Count; i++)
+            usersListBox.SetItemChecked(i, ids.Contains(users[i].Id));
+          usersListBox.Enabled = !ReadOnly;
+          storeUsersButton.Enabled = false;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Refresh authorized users and groups failed.", ex);
+      }
+    }
+    private void storeUsersButton_Click(object sender, System.EventArgs e) {
+      try {
+        AdministrationClient.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
         storeUsersButton.Enabled = false;
       }
-    }
-    private void storeUsersButton_Click(object sender, System.EventArgs e) {
-      AdministrationClient.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToList());
-      storeUsersButton.Enabled = false;
-    }
-    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Store authorized users and groups failed.", ex);
+      }
+    }
+    private void usersListBox_ItemCheck(object sender, ItemCheckEventArgs e) {
       storeUsersButton.Enabled = !ReadOnly;
     }
+
+    private void refreshDataButton_Click(object sender, EventArgs e) {
+      CallAsync(
+        () => {
+          data = null;
+          dataViewHost.Content = null;
+          data = AdministrationClient.GetProblemData(Content.Id);
+          if (data != null) {
+            using (MemoryStream stream = new MemoryStream(data)) {
+              try {
+                dataViewHost.Content = XmlParser.Deserialize<IContent>(stream);
+              }
+              catch (Exception) { }
+              stream.Close();
+            }
+          }
+        },
+        "Refresh problem data failed.",
+        () => SetEnabledStateOfControls()
+      );
+    }
+    private void storeDataButton_Click(object sender, EventArgs e) {
+      CallAsync(
+        () => {
+          if (dataViewHost.Content != null) {
+            using (MemoryStream stream = new MemoryStream()) {
+              XmlGenerator.Serialize(dataViewHost.Content, stream);
+              stream.Close();
+              data = stream.ToArray();
+            }
+          }
+          AdministrationClient.UpdateProblemData(Content.Id, data);
+        },
+        "Store problem data failed.",
+        null
+      );
+    }
+    private void newDataButton_Click(object sender, EventArgs e) {
+      if (typeSelectorDialog == null) {
+        typeSelectorDialog = new TypeSelectorDialog();
+        typeSelectorDialog.Caption = "Select Problem";
+        typeSelectorDialog.TypeSelector.Caption = "Available Problems";
+        typeSelectorDialog.TypeSelector.Configure(typeof(IProblem), false, true);
+      }
+      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          Content.DataTypeName = typeSelectorDialog.TypeSelector.SelectedType.Name;
+          Content.DataTypeTypeName = typeSelectorDialog.TypeSelector.SelectedType.AssemblyQualifiedName;
+          data = null;
+          dataViewHost.Content = (IContent)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, "Create new problem data failed.", ex);
+        }
+        SetEnabledStateOfControls();
+      }
+    }
+    private void openFileButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        CallAsync(
+          () => {
+            IContent problem = null;
+            try {
+              problem = XmlParser.Deserialize<IContent>(openFileDialog.FileName);
+            }
+            catch (Exception) { }
+
+            if (problem != null) {
+              Content.DataTypeName = problem.GetType().Name;
+              Content.DataTypeTypeName = problem.GetType().AssemblyQualifiedName;
+              data = null;
+            } else {
+              using (FileStream stream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
+                data = new byte[stream.Length];
+                stream.Read(data, 0, data.Length);
+                stream.Close();
+              }
+            }
+            dataViewHost.Content = problem;
+          },
+          "Save problem data into file failed.",
+          () => SetEnabledStateOfControls()
+        );
+      }
+    }
+    private void saveFileButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        CallAsync(
+          () => {
+            if (dataViewHost.Content != null) {
+              XmlGenerator.Serialize(dataViewHost.Content, saveFileDialog.FileName);
+            } else {
+              using (FileStream stream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write)) {
+                stream.Write(data, 0, data.Length);
+                stream.Close();
+              }
+            }
+          },
+          "Save problem data into file failed.",
+          null
+        );
+      }
+    }
+    #endregion
+
+    #region Helpers
+    private void CallAsync(Action call, string errorMessage, Action continueWith) {
+      BeginAsyncCall();
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception exception = null;
+        try {
+          call.EndInvoke(result);
+        }
+        catch (Exception ex) {
+          exception = ex;
+        }
+        EndAsyncCall(errorMessage, exception, continueWith);
+      }, null);
+    }
+    private void BeginAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(BeginAsyncCall));
+      else {
+        Cursor = Cursors.AppStarting;
+        Enabled = false;
+      }
+    }
+    private void EndAsyncCall(string errorMessage, Exception exception, Action continueWith) {
+      if (InvokeRequired)
+        Invoke(new Action<string, Exception, Action>(EndAsyncCall), errorMessage, exception, continueWith);
+      else {
+        Cursor = Cursors.Default;
+        Enabled = true;
+        if (exception != null) ErrorHandling.ShowErrorDialog(this, errorMessage, exception);
+        if (continueWith != null) continueWith();
+      }
+    }
+    #endregion
   }
 }
Index: /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/HeuristicLab.Clients.OKB-3.3.csproj	(revision 5587)
@@ -196,9 +196,4 @@
     <None Include="HeuristicLabClientsOKBPlugin.cs.frame" />
   </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Administration\Views\AlgorithmView.resx">
-      <DependentUpon>AlgorithmView.cs</DependentUpon>
-    </EmbeddedResource>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 5587)
@@ -99,5 +99,5 @@
       <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
       <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
-      <Column Name="Hash" Type="System.Data.Linq.Binary" DbType="VarBinary(20)" IsDbGenerated="true" CanBeNull="true" UpdateCheck="Never" />
+      <Column Name="Hash" Type="System.Byte[]" DbType="VarBinary(20) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
       <Association Name="BinaryData_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="BinaryDataId" Type="Algorithm" />
       <Association Name="BinaryData_Problem" Member="Problems" ThisKey="Id" OtherKey="BinaryDataId" Type="Problem" />
Index: /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs	(revision 5587)
@@ -2188,5 +2188,5 @@
 		private System.Data.Linq.Binary _Data;
 		
-		private System.Data.Linq.Binary _Hash;
+		private byte[] _Hash;
 		
 		private EntitySet<Algorithm> _Algorithms;
@@ -2204,5 +2204,5 @@
     partial void OnDataChanging(System.Data.Linq.Binary value);
     partial void OnDataChanged();
-    partial void OnHashChanging(System.Data.Linq.Binary value);
+    partial void OnHashChanging(byte[] value);
     partial void OnHashChanged();
     #endregion
@@ -2256,6 +2256,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Hash", AutoSync=AutoSync.Always, DbType="VarBinary(20)", IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)]
-		public System.Data.Linq.Binary Hash
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Hash", DbType="VarBinary(20) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		public byte[] Hash
 		{
 			get
Index: /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs	(revision 5587)
@@ -126,5 +126,5 @@
       var entity = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).FirstOrDefault();
       if (entity == null)
-        entity = new DA.BinaryData() { Id = 0, Data = data };
+        entity = new DA.BinaryData() { Id = 0, Data = data, Hash = hash };
       return entity;
     }
Index: /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs
===================================================================
--- /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 5586)
+++ /branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 5587)
@@ -122,5 +122,5 @@
       var entity = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).FirstOrDefault();
       if (entity == null)
-        entity = new DA.BinaryData() { Id = 0, Data = data };
+        entity = new DA.BinaryData() { Id = 0, Data = data, Hash = hash };
       return entity;
     }
