Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.Designer.cs	(revision 4492)
@@ -46,5 +46,4 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmDataView));
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
       this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
@@ -109,5 +108,5 @@
       this.viewHost.Caption = "View";
       this.viewHost.Content = null;
-      this.viewHost.Enabled = false;
+      this.viewHost.Enabled = true;
       this.viewHost.Location = new System.Drawing.Point(6, 19);
       this.viewHost.Name = "viewHost";
@@ -131,5 +130,5 @@
       // newDataButton
       // 
-      this.newDataButton.Image = ((System.Drawing.Image)(resources.GetObject("newDataButton.Image")));
+      this.newDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
       this.newDataButton.Location = new System.Drawing.Point(90, 0);
       this.newDataButton.Name = "newDataButton";
@@ -142,5 +141,5 @@
       // saveFileButton
       // 
-      this.saveFileButton.Image = ((System.Drawing.Image)(resources.GetObject("saveFileButton.Image")));
+      this.saveFileButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
       this.saveFileButton.Location = new System.Drawing.Point(150, 0);
       this.saveFileButton.Name = "saveFileButton";
@@ -153,5 +152,5 @@
       // openFileButton
       // 
-      this.openFileButton.Image = ((System.Drawing.Image)(resources.GetObject("openFileButton.Image")));
+      this.openFileButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
       this.openFileButton.Location = new System.Drawing.Point(120, 0);
       this.openFileButton.Name = "openFileButton";
@@ -174,5 +173,5 @@
       // refreshDataButton
       // 
-      this.refreshDataButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshDataButton.Image")));
+      this.refreshDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Refresh;
       this.refreshDataButton.Location = new System.Drawing.Point(0, 0);
       this.refreshDataButton.Name = "refreshDataButton";
@@ -185,5 +184,5 @@
       // storeDataButton
       // 
-      this.storeDataButton.Image = ((System.Drawing.Image)(resources.GetObject("storeDataButton.Image")));
+      this.storeDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.PublishToWeb;
       this.storeDataButton.Location = new System.Drawing.Point(30, 0);
       this.storeDataButton.Name = "storeDataButton";
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmDataView.cs	(revision 4492)
@@ -21,4 +21,5 @@
 
 using System;
+using System.ComponentModel;
 using System.IO;
 using System.Linq;
@@ -36,5 +37,15 @@
   [Content(typeof(AlgorithmData), true)]
   public partial class AlgorithmDataView : AsynchronousContentView {
-    public long AlgorithmId { get; set; }
+    private long algorithmId;
+    public long AlgorithmId {
+      get { return algorithmId; }
+      set {
+        algorithmId = value;
+        if (Content != null) {
+          Content.AlgorithmId = value;
+          SetEnabledStateOfControls();
+        }
+      }
+    }
 
     public new AlgorithmData Content {
@@ -51,4 +62,13 @@
       dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
       dataTypeComboBox.SelectedIndex = -1;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
     }
 
@@ -79,13 +99,31 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      storeDataButton.Enabled = saveFileButton.Enabled = Content != null;
-      dataTypeComboBox.Enabled = Content != null && viewHost.Content == null;
+      newDataButton.Enabled = !ReadOnly;
+      openFileButton.Enabled = !ReadOnly;
+      saveFileButton.Enabled = (Content != null) && (((Content.Data != null) && (Content.Data.Length != 0)) || (viewHost.Content != null));
+      storeDataButton.Enabled = saveFileButton.Enabled && (Content.AlgorithmId != 0) && !ReadOnly;
+      dataTypeComboBox.Enabled = Content != null && viewHost.Content == null && !ReadOnly;
       fileTextBox.Enabled = Content != null;
       groupBox.Enabled = Content != null;
     }
 
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      switch (e.PropertyName) {
+        case "DataTypeId":
+          dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+          break;
+      }
+    }
+
     private void refreshDataButton_Click(object sender, EventArgs e) {
-      AlgorithmData data = Administrator.Instance.GetAlgorithmData(AlgorithmId);
-      Content = data;
+      BeginAsyncCall();
+      var call = new Action(delegate() {
+        AlgorithmData data = Administrator.Instance.GetAlgorithmData(AlgorithmId);
+        Content = data;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        call.EndInvoke(result);
+        EndAsyncCall();
+      }, null);
     }
     private void storeDataButton_Click(object sender, EventArgs e) {
@@ -95,5 +133,4 @@
             IAlgorithm algorithm = viewHost.Content as IAlgorithm;
             algorithm.Prepare(true);
-            algorithm.Problem = null;
             XmlGenerator.Serialize(algorithm, stream);
             stream.Close();
@@ -114,19 +151,18 @@
         if (dialog.ShowDialog(this) == DialogResult.OK) {
           try {
-            if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId, Data = new byte[0] };
+            if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId };
             viewHost.Content = (IContent)dialog.TypeSelector.CreateInstanceOfSelectedType();
             DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
-              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "Blob" };
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
               dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
-
-              Administrator.Instance.Store(dataType);
+              dataType.Store();
               Administrator.Instance.DataTypes.Add(dataType);
               dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
             }
             dataTypeComboBox.SelectedItem = dataType;
-            dataTypeComboBox.Enabled = false;
             fileTextBox.Text = "-";
             noViewAvailableLabel.Visible = false;
+            SetEnabledStateOfControls();
           }
           catch (Exception ex) {
@@ -139,5 +175,5 @@
       if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId, Data = new byte[0] };
+          if (Content == null) Content = new AlgorithmData { AlgorithmId = AlgorithmId };
           IAlgorithm algorithm = null;
           try {
@@ -151,8 +187,7 @@
             DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
             if (dataType == null) {
-              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "Blob" };
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
               dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
-
-              Administrator.Instance.Store(dataType);
+              dataType.Store();
               Administrator.Instance.DataTypes.Add(dataType);
               dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
@@ -169,6 +204,6 @@
             }
           }
-          dataTypeComboBox.Enabled = viewHost.Content == null;
           fileTextBox.Text = openFileDialog.FileName;
+          SetEnabledStateOfControls();
         }
         catch (Exception ex) {
@@ -198,4 +233,21 @@
       if (Content != null) Content.DataTypeId = ((DataType)dataTypeComboBox.SelectedItem).Id;
     }
+
+    private void BeginAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(BeginAsyncCall));
+      else {
+        Cursor = Cursors.AppStarting;
+        Enabled = false;
+      }
+    }
+    private void EndAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(EndAsyncCall));
+      else {
+        Cursor = Cursors.Default;
+        Enabled = true;
+      }
+    }
   }
 }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.Designer.cs	(revision 4492)
@@ -45,5 +45,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();
@@ -57,5 +56,4 @@
       this.dataTabPage = new System.Windows.Forms.TabPage();
       this.algorithmDataView = new HeuristicLab.Clients.OKB.AlgorithmDataView();
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).BeginInit();
       this.tabControl.SuspendLayout();
       this.usersTabPage.SuspendLayout();
@@ -66,18 +64,14 @@
       // 
       this.nameTextBox.Location = new System.Drawing.Point(90, 29);
-      this.nameTextBox.Size = new System.Drawing.Size(495, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
       // 
       // descriptionTextBox
       // 
       this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
-      this.descriptionTextBox.Size = new System.Drawing.Size(495, 20);
+      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
       // 
       // storeButton
       // 
       this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // modifiedPictureBox
-      // 
-      this.modifiedPictureBox.Location = new System.Drawing.Point(591, 3);
       // 
       // platformLabel
@@ -98,5 +92,5 @@
       this.platformComboBox.Location = new System.Drawing.Point(90, 81);
       this.platformComboBox.Name = "platformComboBox";
-      this.platformComboBox.Size = new System.Drawing.Size(495, 21);
+      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
       this.platformComboBox.TabIndex = 6;
       this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
@@ -119,5 +113,5 @@
       this.algorithmClassComboBox.Location = new System.Drawing.Point(90, 108);
       this.algorithmClassComboBox.Name = "algorithmClassComboBox";
-      this.algorithmClassComboBox.Size = new System.Drawing.Size(495, 21);
+      this.algorithmClassComboBox.Size = new System.Drawing.Size(543, 21);
       this.algorithmClassComboBox.TabIndex = 8;
       this.algorithmClassComboBox.SelectedValueChanged += new System.EventHandler(this.algorithmClassComboBox_SelectedValueChanged);
@@ -165,5 +159,5 @@
       // storeUsersButton
       // 
-      this.storeUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("storeUsersButton.Image")));
+      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.PublishToWeb;
       this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
       this.storeUsersButton.Name = "storeUsersButton";
@@ -176,5 +170,5 @@
       // refreshUsersButton
       // 
-      this.refreshUsersButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshUsersButton.Image")));
+      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Refresh;
       this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
       this.refreshUsersButton.Name = "refreshUsersButton";
@@ -198,4 +192,5 @@
       // algorithmDataView
       // 
+      this.algorithmDataView.AlgorithmId = ((long)(0));
       this.algorithmDataView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                   | System.Windows.Forms.AnchorStyles.Left)
@@ -224,5 +219,4 @@
       this.Controls.SetChildIndex(this.platformComboBox, 0);
       this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.modifiedPictureBox, 0);
       this.Controls.SetChildIndex(this.storeButton, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -230,5 +224,4 @@
       this.Controls.SetChildIndex(this.descriptionLabel, 0);
       this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).EndInit();
       this.tabControl.ResumeLayout(false);
       this.usersTabPage.ResumeLayout(false);
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/AlgorithmView.cs	(revision 4492)
@@ -46,13 +46,4 @@
     }
 
-    protected override void DeregisterContentEvents() {
-      // ...
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      // ...
-    }
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
@@ -72,9 +63,9 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      platformComboBox.Enabled = Content != null;
-      algorithmClassComboBox.Enabled = Content != null;
+      platformComboBox.Enabled = (Content != null) && !ReadOnly;
+      algorithmClassComboBox.Enabled = (Content != null) && !ReadOnly;
       refreshUsersButton.Enabled = Content != null;
-      storeUsersButton.Enabled = usersListBox.DataSource != null;
-      usersListBox.Enabled = usersListBox.DataSource != null;
+      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
       algorithmDataView.Enabled = Content != null;
     }
@@ -82,4 +73,7 @@
     protected override void OnContentPropertyChanged(string propertyName) {
       switch (propertyName) {
+        case "Id":
+          algorithmDataView.AlgorithmId = Content.Id;
+          break;
         case "PlatformId":
           platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
@@ -113,5 +107,5 @@
         foreach (Guid id in ids)
           usersListBox.SelectedItems.Add(users.First(u => u.Id == id));
-        usersListBox.Enabled = true;
+        usersListBox.Enabled = !ReadOnly;
         storeUsersButton.Enabled = false;
       }
@@ -122,5 +116,5 @@
     }
     private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
-      storeUsersButton.Enabled = true;
+      storeUsersButton.Enabled = !ReadOnly;
     }
   }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.Designer.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.Designer.cs	(revision 4492)
@@ -48,8 +48,8 @@
       this.nameTextBox = new System.Windows.Forms.TextBox();
       this.sqlNameLabel = new System.Windows.Forms.Label();
-      this.sqlNameTextBox = new System.Windows.Forms.TextBox();
       this.platformLabel = new System.Windows.Forms.Label();
       this.platformComboBox = new System.Windows.Forms.ComboBox();
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).BeginInit();
+      this.comboBox1 = new System.Windows.Forms.ComboBox();
+      this.sqlNameComboBox = new System.Windows.Forms.ComboBox();
       this.SuspendLayout();
       // 
@@ -57,8 +57,4 @@
       // 
       this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // modifiedPictureBox
-      // 
-      this.modifiedPictureBox.Location = new System.Drawing.Point(308, 3);
       // 
       // nameLabel
@@ -77,5 +73,5 @@
       this.nameTextBox.Location = new System.Drawing.Point(71, 29);
       this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(231, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(279, 20);
       this.nameTextBox.TabIndex = 2;
       this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
@@ -91,20 +87,8 @@
       this.sqlNameLabel.Text = "&SQL Name:";
       // 
-      // sqlNameTextBox
-      // 
-      this.sqlNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.sqlNameTextBox.Location = new System.Drawing.Point(71, 55);
-      this.sqlNameTextBox.Name = "sqlNameTextBox";
-      this.sqlNameTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-      this.sqlNameTextBox.Size = new System.Drawing.Size(231, 20);
-      this.sqlNameTextBox.TabIndex = 4;
-      this.sqlNameTextBox.TextChanged += new System.EventHandler(this.sqlNameTextBox_TextChanged);
-      this.sqlNameTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.sqlNameTextBox_KeyDown);
-      // 
       // platformLabel
       // 
       this.platformLabel.AutoSize = true;
-      this.platformLabel.Location = new System.Drawing.Point(3, 84);
+      this.platformLabel.Location = new System.Drawing.Point(3, 85);
       this.platformLabel.Name = "platformLabel";
       this.platformLabel.Size = new System.Drawing.Size(48, 13);
@@ -118,9 +102,39 @@
       this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.platformComboBox.FormattingEnabled = true;
-      this.platformComboBox.Location = new System.Drawing.Point(71, 81);
+      this.platformComboBox.Location = new System.Drawing.Point(71, 82);
       this.platformComboBox.Name = "platformComboBox";
-      this.platformComboBox.Size = new System.Drawing.Size(231, 21);
+      this.platformComboBox.Size = new System.Drawing.Size(279, 21);
       this.platformComboBox.TabIndex = 6;
       this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
+      // 
+      // comboBox1
+      // 
+      this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.comboBox1.FormattingEnabled = true;
+      this.comboBox1.Location = new System.Drawing.Point(71, 55);
+      this.comboBox1.Name = "comboBox1";
+      this.comboBox1.Size = new System.Drawing.Size(279, 21);
+      this.comboBox1.TabIndex = 6;
+      this.comboBox1.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
+      // 
+      // sqlNameComboBox
+      // 
+      this.sqlNameComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.sqlNameComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.sqlNameComboBox.FormattingEnabled = true;
+      this.sqlNameComboBox.Items.AddRange(new object[] {
+            "bigint",
+            "bit",
+            "float",
+            "nvarchar",
+            "varbinary"});
+      this.sqlNameComboBox.Location = new System.Drawing.Point(71, 55);
+      this.sqlNameComboBox.Name = "sqlNameComboBox";
+      this.sqlNameComboBox.Size = new System.Drawing.Size(279, 21);
+      this.sqlNameComboBox.TabIndex = 4;
+      this.sqlNameComboBox.SelectedValueChanged += new System.EventHandler(this.sqlNameComboBox_SelectedValueChanged);
       // 
       // DataTypeView
@@ -128,6 +142,7 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.sqlNameComboBox);
+      this.Controls.Add(this.comboBox1);
       this.Controls.Add(this.platformComboBox);
-      this.Controls.Add(this.sqlNameTextBox);
       this.Controls.Add(this.platformLabel);
       this.Controls.Add(this.sqlNameLabel);
@@ -135,6 +150,5 @@
       this.Controls.Add(this.nameTextBox);
       this.Name = "DataTypeView";
-      this.Size = new System.Drawing.Size(350, 229);
-      this.Controls.SetChildIndex(this.modifiedPictureBox, 0);
+      this.Size = new System.Drawing.Size(350, 126);
       this.Controls.SetChildIndex(this.storeButton, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -142,7 +156,7 @@
       this.Controls.SetChildIndex(this.sqlNameLabel, 0);
       this.Controls.SetChildIndex(this.platformLabel, 0);
-      this.Controls.SetChildIndex(this.sqlNameTextBox, 0);
       this.Controls.SetChildIndex(this.platformComboBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).EndInit();
+      this.Controls.SetChildIndex(this.comboBox1, 0);
+      this.Controls.SetChildIndex(this.sqlNameComboBox, 0);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -155,7 +169,8 @@
     private System.Windows.Forms.Label nameLabel;
     private System.Windows.Forms.Label sqlNameLabel;
-    private System.Windows.Forms.TextBox sqlNameTextBox;
     private System.Windows.Forms.Label platformLabel;
     private System.Windows.Forms.ComboBox platformComboBox;
+    private System.Windows.Forms.ComboBox comboBox1;
+    private System.Windows.Forms.ComboBox sqlNameComboBox;
   }
 }
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/DataTypeView.cs	(revision 4492)
@@ -21,7 +21,6 @@
 
 using System;
+using System.Linq;
 using System.Windows.Forms;
-using System.Linq;
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
 using HeuristicLab.MainForm.WindowsForms;
@@ -49,5 +48,5 @@
       if (Content == null) {
         nameTextBox.Text = string.Empty;
-        sqlNameTextBox.Text = string.Empty;
+        sqlNameComboBox.SelectedIndex = -1;
         platformComboBox.SelectedIndex = -1;
         if (ViewAttribute.HasViewAttribute(this.GetType()))
@@ -57,5 +56,5 @@
       } else {
         nameTextBox.Text = Content.Name;
-        sqlNameTextBox.Text = Content.SqlName;
+        sqlNameComboBox.Text = Content.SqlName;
         platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
         Caption = Content.Name;
@@ -65,15 +64,8 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      if (Content == null) {
-        nameTextBox.Enabled = false;
-        sqlNameTextBox.Enabled = false;
-        platformComboBox.Enabled = false;
-      } else {
-        nameTextBox.Enabled = true;
-        nameTextBox.ReadOnly = ReadOnly;
-        sqlNameTextBox.Enabled = true;
-        sqlNameTextBox.ReadOnly = ReadOnly;
-        platformComboBox.Enabled = true;
-      }
+      nameTextBox.Enabled = Content != null;
+      nameTextBox.ReadOnly = ReadOnly;
+      sqlNameComboBox.Enabled = (Content != null) && !ReadOnly;
+      platformComboBox.Enabled = (Content != null) && !ReadOnly;
     }
 
@@ -85,5 +77,5 @@
           break;
         case "SqlName":
-          sqlNameTextBox.Text = Content.SqlName;
+          sqlNameComboBox.Text = Content.SqlName;
           break;
         case "PlatformId":
@@ -105,15 +97,8 @@
         Content.Name = nameTextBox.Text;
     }
-    private void sqlNameTextBox_KeyDown(object sender, KeyEventArgs e) {
-      if ((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
-        sqlNameLabel.Focus();  // set focus on label to validate data
-      if (e.KeyCode == Keys.Escape) {
-        sqlNameTextBox.Text = Content.SqlName;
-        sqlNameLabel.Focus();  // set focus on label to validate data
+    private void sqlNameComboBox_SelectedValueChanged(object sender, EventArgs e) {
+      if (sqlNameComboBox.Text != Content.SqlName) {
+        Content.SqlName = sqlNameComboBox.Text;
       }
-    }
-    private void sqlNameTextBox_TextChanged(object sender, EventArgs e) {
-      if (sqlNameTextBox.Text != Content.SqlName)
-        Content.SqlName = sqlNameTextBox.Text;
     }
     private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.Designer.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.Designer.cs	(revision 4492)
@@ -49,5 +49,4 @@
       this.descriptionLabel = new System.Windows.Forms.Label();
       this.descriptionTextBox = new System.Windows.Forms.TextBox();
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).BeginInit();
       this.SuspendLayout();
       // 
@@ -55,9 +54,4 @@
       // 
       this.toolTip.SetToolTip(this.storeButton, "Store Data");
-      // 
-      // modifiedPictureBox
-      // 
-      this.modifiedPictureBox.Location = new System.Drawing.Point(308, 3);
-      this.modifiedPictureBox.Size = new System.Drawing.Size(39, 130);
       // 
       // nameLabel
@@ -76,5 +70,5 @@
       this.nameTextBox.Location = new System.Drawing.Point(72, 29);
       this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(230, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(278, 20);
       this.nameTextBox.TabIndex = 2;
       this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
@@ -97,5 +91,5 @@
       this.descriptionTextBox.Name = "descriptionTextBox";
       this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-      this.descriptionTextBox.Size = new System.Drawing.Size(230, 20);
+      this.descriptionTextBox.Size = new System.Drawing.Size(278, 20);
       this.descriptionTextBox.TabIndex = 4;
       this.descriptionTextBox.TextChanged += new System.EventHandler(this.descriptionTextBox_TextChanged);
@@ -111,6 +105,5 @@
       this.Controls.Add(this.nameTextBox);
       this.Name = "NamedOKBItemView";
-      this.Size = new System.Drawing.Size(350, 229);
-      this.Controls.SetChildIndex(this.modifiedPictureBox, 0);
+      this.Size = new System.Drawing.Size(350, 93);
       this.Controls.SetChildIndex(this.storeButton, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -118,5 +111,4 @@
       this.Controls.SetChildIndex(this.descriptionLabel, 0);
       this.Controls.SetChildIndex(this.descriptionTextBox, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).EndInit();
       this.ResumeLayout(false);
       this.PerformLayout();
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/NamedOKBItemView.cs	(revision 4492)
@@ -60,13 +60,8 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      if (Content == null) {
-        nameTextBox.Enabled = false;
-        descriptionTextBox.Enabled = false;
-      } else {
-        nameTextBox.Enabled = true;
-        nameTextBox.ReadOnly = ReadOnly;
-        descriptionTextBox.Enabled = true;
-        descriptionTextBox.ReadOnly = ReadOnly;
-      }
+      nameTextBox.Enabled = Content != null;
+      nameTextBox.ReadOnly = ReadOnly;
+      descriptionTextBox.Enabled = Content != null;
+      descriptionTextBox.ReadOnly = ReadOnly;
     }
 
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.Designer.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.Designer.cs	(revision 4492)
@@ -48,6 +48,4 @@
       this.storeButton = new System.Windows.Forms.Button();
       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.modifiedPictureBox = new System.Windows.Forms.PictureBox();
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).BeginInit();
       this.SuspendLayout();
       // 
@@ -63,26 +61,11 @@
       this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
       // 
-      // modifiedPictureBox
-      // 
-      this.modifiedPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.modifiedPictureBox.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.HighPriorityLarge;
-      this.modifiedPictureBox.Location = new System.Drawing.Point(312, 3);
-      this.modifiedPictureBox.Name = "modifiedPictureBox";
-      this.modifiedPictureBox.Size = new System.Drawing.Size(39, 130);
-      this.modifiedPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
-      this.modifiedPictureBox.TabIndex = 1;
-      this.modifiedPictureBox.TabStop = false;
-      this.toolTip.SetToolTip(this.modifiedPictureBox, "Data Modified");
-      this.modifiedPictureBox.Visible = false;
-      // 
       // OKBItemView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.modifiedPictureBox);
       this.Controls.Add(this.storeButton);
       this.Name = "OKBItemView";
       this.Size = new System.Drawing.Size(354, 308);
-      ((System.ComponentModel.ISupportInitialize)(this.modifiedPictureBox)).EndInit();
       this.ResumeLayout(false);
 
@@ -93,5 +76,4 @@
     protected System.Windows.Forms.Button storeButton;
     protected System.Windows.Forms.ToolTip toolTip;
-    protected System.Windows.Forms.PictureBox modifiedPictureBox;
 
 
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.cs	(revision 4481)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/OKBItemView.cs	(revision 4492)
@@ -54,6 +54,5 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      storeButton.Enabled = (Content != null) && Content.Modified;
-      modifiedPictureBox.Visible = (Content != null) && Content.Modified;
+      storeButton.Enabled = (Content != null) && !ReadOnly && Content.Modified;
     }
 
@@ -69,8 +68,6 @@
       if (InvokeRequired)
         Invoke(new EventHandler(Content_ModifiedChanged), sender, e);
-      else {
-        storeButton.Enabled = Content.Modified;
-        modifiedPictureBox.Visible = Content.Modified;
-      }
+      else
+        SetEnabledStateOfControls();
     }
 
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.Designer.cs	(revision 4492)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.Designer.cs	(revision 4492)
@@ -0,0 +1,254 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.OKB {
+  partial class ProblemDataView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    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
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.noViewAvailableLabel = new System.Windows.Forms.Label();
+      this.viewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.newDataButton = new System.Windows.Forms.Button();
+      this.saveFileButton = new System.Windows.Forms.Button();
+      this.openFileButton = new System.Windows.Forms.Button();
+      this.fileTextBox = new System.Windows.Forms.TextBox();
+      this.refreshDataButton = new System.Windows.Forms.Button();
+      this.storeDataButton = new System.Windows.Forms.Button();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.fileLabel = new System.Windows.Forms.Label();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.groupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // 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";
+      // 
+      // groupBox
+      // 
+      this.groupBox.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.groupBox.Controls.Add(this.noViewAvailableLabel);
+      this.groupBox.Controls.Add(this.viewHost);
+      this.groupBox.Location = new System.Drawing.Point(0, 83);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(633, 371);
+      this.groupBox.TabIndex = 19;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Data:";
+      // 
+      // noViewAvailableLabel
+      // 
+      this.noViewAvailableLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.noViewAvailableLabel.AutoSize = true;
+      this.noViewAvailableLabel.Location = new System.Drawing.Point(269, 179);
+      this.noViewAvailableLabel.Name = "noViewAvailableLabel";
+      this.noViewAvailableLabel.Size = new System.Drawing.Size(94, 13);
+      this.noViewAvailableLabel.TabIndex = 1;
+      this.noViewAvailableLabel.Text = "No view available.";
+      this.noViewAvailableLabel.Visible = false;
+      // 
+      // viewHost
+      // 
+      this.viewHost.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.viewHost.Caption = "View";
+      this.viewHost.Content = null;
+      this.viewHost.Enabled = true;
+      this.viewHost.Location = new System.Drawing.Point(6, 19);
+      this.viewHost.Name = "viewHost";
+      this.viewHost.ReadOnly = false;
+      this.viewHost.Size = new System.Drawing.Size(621, 346);
+      this.viewHost.TabIndex = 0;
+      this.viewHost.ViewType = null;
+      // 
+      // dataTypeComboBox
+      // 
+      this.dataTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.dataTypeComboBox.FormattingEnabled = true;
+      this.dataTypeComboBox.Location = new System.Drawing.Point(66, 30);
+      this.dataTypeComboBox.Name = "dataTypeComboBox";
+      this.dataTypeComboBox.Size = new System.Drawing.Size(567, 21);
+      this.dataTypeComboBox.TabIndex = 16;
+      this.dataTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.dataTypeComboBox_SelectedIndexChanged);
+      // 
+      // newDataButton
+      // 
+      this.newDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
+      this.newDataButton.Location = new System.Drawing.Point(90, 0);
+      this.newDataButton.Name = "newDataButton";
+      this.newDataButton.Size = new System.Drawing.Size(24, 24);
+      this.newDataButton.TabIndex = 12;
+      this.toolTip.SetToolTip(this.newDataButton, "Create New Problem Data");
+      this.newDataButton.UseVisualStyleBackColor = true;
+      this.newDataButton.Click += new System.EventHandler(this.newDataButton_Click);
+      // 
+      // saveFileButton
+      // 
+      this.saveFileButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveFileButton.Location = new System.Drawing.Point(150, 0);
+      this.saveFileButton.Name = "saveFileButton";
+      this.saveFileButton.Size = new System.Drawing.Size(24, 24);
+      this.saveFileButton.TabIndex = 14;
+      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.VS2008ImageLibrary.Open;
+      this.openFileButton.Location = new System.Drawing.Point(120, 0);
+      this.openFileButton.Name = "openFileButton";
+      this.openFileButton.Size = new System.Drawing.Size(24, 24);
+      this.openFileButton.TabIndex = 13;
+      this.toolTip.SetToolTip(this.openFileButton, "Load Problem Data from File");
+      this.openFileButton.UseVisualStyleBackColor = true;
+      this.openFileButton.Click += new System.EventHandler(this.openFileButton_Click);
+      // 
+      // fileTextBox
+      // 
+      this.fileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.fileTextBox.Location = new System.Drawing.Point(66, 57);
+      this.fileTextBox.Name = "fileTextBox";
+      this.fileTextBox.ReadOnly = true;
+      this.fileTextBox.Size = new System.Drawing.Size(567, 20);
+      this.fileTextBox.TabIndex = 18;
+      // 
+      // refreshDataButton
+      // 
+      this.refreshDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Refresh;
+      this.refreshDataButton.Location = new System.Drawing.Point(0, 0);
+      this.refreshDataButton.Name = "refreshDataButton";
+      this.refreshDataButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshDataButton.TabIndex = 10;
+      this.toolTip.SetToolTip(this.refreshDataButton, "Refresh Problem Data from OKB");
+      this.refreshDataButton.UseVisualStyleBackColor = true;
+      this.refreshDataButton.Click += new System.EventHandler(this.refreshDataButton_Click);
+      // 
+      // storeDataButton
+      // 
+      this.storeDataButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.PublishToWeb;
+      this.storeDataButton.Location = new System.Drawing.Point(30, 0);
+      this.storeDataButton.Name = "storeDataButton";
+      this.storeDataButton.Size = new System.Drawing.Size(24, 24);
+      this.storeDataButton.TabIndex = 11;
+      this.toolTip.SetToolTip(this.storeDataButton, "Store Problem Data in OKB");
+      this.storeDataButton.UseVisualStyleBackColor = true;
+      this.storeDataButton.Click += new System.EventHandler(this.storeDataButton_Click);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 33);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(57, 13);
+      this.dataTypeLabel.TabIndex = 15;
+      this.dataTypeLabel.Text = "&DataType:";
+      // 
+      // fileLabel
+      // 
+      this.fileLabel.AutoSize = true;
+      this.fileLabel.Location = new System.Drawing.Point(3, 60);
+      this.fileLabel.Name = "fileLabel";
+      this.fileLabel.Size = new System.Drawing.Size(26, 13);
+      this.fileLabel.TabIndex = 17;
+      this.fileLabel.Text = "&File:";
+      // 
+      // ProblemDataView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.groupBox);
+      this.Controls.Add(this.dataTypeComboBox);
+      this.Controls.Add(this.newDataButton);
+      this.Controls.Add(this.saveFileButton);
+      this.Controls.Add(this.openFileButton);
+      this.Controls.Add(this.fileTextBox);
+      this.Controls.Add(this.refreshDataButton);
+      this.Controls.Add(this.storeDataButton);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.fileLabel);
+      this.Name = "ProblemDataView";
+      this.Size = new System.Drawing.Size(633, 454);
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Label noViewAvailableLabel;
+    private MainForm.WindowsForms.ViewHost viewHost;
+    private System.Windows.Forms.ComboBox dataTypeComboBox;
+    private System.Windows.Forms.Button newDataButton;
+    private System.Windows.Forms.Button saveFileButton;
+    private System.Windows.Forms.Button openFileButton;
+    private System.Windows.Forms.TextBox fileTextBox;
+    private System.Windows.Forms.Button refreshDataButton;
+    private System.Windows.Forms.Button storeDataButton;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.Label fileLabel;
+
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs	(revision 4492)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemDataView.cs	(revision 4492)
@@ -0,0 +1,252 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+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 {
+  [View("ProblemData View")]
+  [Content(typeof(ProblemData), true)]
+  public partial class ProblemDataView : AsynchronousContentView {
+    private long problemId;
+    public long ProblemId {
+      get { return problemId; }
+      set {
+        problemId = value;
+        if (Content != null) {
+          Content.ProblemId = value;
+          SetEnabledStateOfControls();
+        }
+      }
+    }
+
+    public new ProblemData Content {
+      get { return (ProblemData)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProblemDataView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(System.EventArgs e) {
+      base.OnInitialized(e);
+      dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.ToList();
+      dataTypeComboBox.SelectedIndex = -1;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        dataTypeComboBox.SelectedIndex = -1;
+        viewHost.Content = null;
+        noViewAvailableLabel.Visible = false;
+      } else {
+        dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+
+        using (MemoryStream stream = new MemoryStream(Content.Data)) {
+          try {
+            viewHost.Content = XmlParser.Deserialize<IContent>(stream);
+            noViewAvailableLabel.Visible = false;
+          }
+          catch (Exception) {
+            viewHost.Content = null;
+            noViewAvailableLabel.Visible = true;
+          }
+          stream.Close();
+        }
+      }
+      fileTextBox.Text = "-";
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      newDataButton.Enabled = !ReadOnly;
+      openFileButton.Enabled = !ReadOnly;
+      saveFileButton.Enabled = (Content != null) && (((Content.Data != null) && (Content.Data.Length != 0)) || (viewHost.Content != null));
+      storeDataButton.Enabled = saveFileButton.Enabled && (Content.ProblemId != 0) && !ReadOnly;
+      dataTypeComboBox.Enabled = Content != null && viewHost.Content == null && !ReadOnly;
+      fileTextBox.Enabled = Content != null;
+      groupBox.Enabled = Content != null;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      switch (e.PropertyName) {
+        case "DataTypeId":
+          dataTypeComboBox.SelectedItem = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Id == Content.DataTypeId);
+          break;
+      }
+    }
+
+    private void refreshDataButton_Click(object sender, EventArgs e) {
+      BeginAsyncCall();
+      var call = new Action(delegate() {
+        ProblemData data = Administrator.Instance.GetProblemData(ProblemId);
+        Content = data;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        call.EndInvoke(result);
+        EndAsyncCall();
+      }, null);
+    }
+    private void storeDataButton_Click(object sender, EventArgs e) {
+      if (viewHost.Content != null) {
+        try {
+          using (MemoryStream stream = new MemoryStream()) {
+            IProblem problem = viewHost.Content as IProblem;
+            XmlGenerator.Serialize(problem, stream);
+            stream.Close();
+            Content.Data = stream.ToArray();
+          }
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+      Administrator.Instance.UpdateProblemData(Content);
+    }
+    private void newDataButton_Click(object sender, EventArgs e) {
+      using (TypeSelectorDialog dialog = new TypeSelectorDialog()) {
+        dialog.Caption = "Select Problem";
+        dialog.TypeSelector.Caption = "Available Problems";
+        dialog.TypeSelector.Configure(typeof(IProblem), false, true);
+        if (dialog.ShowDialog(this) == DialogResult.OK) {
+          try {
+            if (Content == null) Content = new ProblemData { ProblemId = ProblemId };
+            viewHost.Content = (IContent)dialog.TypeSelector.CreateInstanceOfSelectedType();
+            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            if (dataType == null) {
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
+              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.Store();
+              Administrator.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+            }
+            dataTypeComboBox.SelectedItem = dataType;
+            fileTextBox.Text = "-";
+            noViewAvailableLabel.Visible = false;
+            SetEnabledStateOfControls();
+          }
+          catch (Exception ex) {
+            ErrorHandling.ShowErrorDialog(this, ex);
+          }
+        }
+      }
+    }
+    private void openFileButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (Content == null) Content = new ProblemData { ProblemId = ProblemId };
+          IProblem problem = null;
+          try {
+            problem = XmlParser.Deserialize<IProblem>(openFileDialog.FileName);
+          }
+          catch (Exception) { }
+
+          if (problem != null) {
+            viewHost.Content = problem;
+            noViewAvailableLabel.Visible = false;
+            DataType dataType = Administrator.Instance.DataTypes.FirstOrDefault(d => d.Name == viewHost.Content.GetType().AssemblyQualifiedName);
+            if (dataType == null) {
+              dataType = new DataType { Name = viewHost.Content.GetType().AssemblyQualifiedName, SqlName = "varbinary" };
+              dataType.PlatformId = Administrator.Instance.Platforms.FirstOrDefault(p => p.Name == "HeuristicLab 3.3").Id;
+              dataType.Store();
+              Administrator.Instance.DataTypes.Add(dataType);
+              dataTypeComboBox.DataSource = Administrator.Instance.DataTypes.OrderBy(d => d.Name).ToList();
+            }
+            dataTypeComboBox.SelectedItem = dataType;
+          } else {
+            viewHost.Content = null;
+            noViewAvailableLabel.Visible = true;
+            using (FileStream stream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
+              byte[] bytes = new byte[stream.Length];
+              stream.Read(bytes, 0, bytes.Length);
+              stream.Close();
+              Content.Data = bytes;
+            }
+          }
+          fileTextBox.Text = openFileDialog.FileName;
+          SetEnabledStateOfControls();
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    private void saveFileButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (viewHost.Content != null) {
+            XmlGenerator.Serialize(viewHost.Content, saveFileDialog.FileName);
+          } else {
+            using (FileStream stream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write)) {
+              stream.Write(Content.Data, 0, Content.Data.Length);
+              stream.Close();
+            }
+          }
+          fileTextBox.Text = saveFileDialog.FileName;
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(this, ex);
+        }
+      }
+    }
+    private void dataTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (Content != null) Content.DataTypeId = ((DataType)dataTypeComboBox.SelectedItem).Id;
+    }
+
+    private void BeginAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(BeginAsyncCall));
+      else {
+        Cursor = Cursors.AppStarting;
+        Enabled = false;
+      }
+    }
+    private void EndAsyncCall() {
+      if (InvokeRequired)
+        Invoke(new Action(EndAsyncCall));
+      else {
+        Cursor = Cursors.Default;
+        Enabled = true;
+      }
+    }
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.Designer.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.Designer.cs	(revision 4492)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.Designer.cs	(revision 4492)
@@ -0,0 +1,249 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.OKB {
+  partial class ProblemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    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
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.platformLabel = new System.Windows.Forms.Label();
+      this.platformComboBox = new System.Windows.Forms.ComboBox();
+      this.problemClassLabel = new System.Windows.Forms.Label();
+      this.problemClassComboBox = new System.Windows.Forms.ComboBox();
+      this.usersListBox = new System.Windows.Forms.ListBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.usersTabPage = new System.Windows.Forms.TabPage();
+      this.storeUsersButton = new System.Windows.Forms.Button();
+      this.refreshUsersButton = new System.Windows.Forms.Button();
+      this.dataTabPage = new System.Windows.Forms.TabPage();
+      this.problemDataView = new HeuristicLab.Clients.OKB.ProblemDataView();
+      this.tabControl.SuspendLayout();
+      this.usersTabPage.SuspendLayout();
+      this.dataTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Location = new System.Drawing.Point(90, 29);
+      this.nameTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Location = new System.Drawing.Point(90, 55);
+      this.descriptionTextBox.Size = new System.Drawing.Size(543, 20);
+      // 
+      // storeButton
+      // 
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      // 
+      // platformLabel
+      // 
+      this.platformLabel.AutoSize = true;
+      this.platformLabel.Location = new System.Drawing.Point(3, 84);
+      this.platformLabel.Name = "platformLabel";
+      this.platformLabel.Size = new System.Drawing.Size(48, 13);
+      this.platformLabel.TabIndex = 5;
+      this.platformLabel.Text = "&Platform:";
+      // 
+      // platformComboBox
+      // 
+      this.platformComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.platformComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.platformComboBox.FormattingEnabled = true;
+      this.platformComboBox.Location = new System.Drawing.Point(90, 81);
+      this.platformComboBox.Name = "platformComboBox";
+      this.platformComboBox.Size = new System.Drawing.Size(543, 21);
+      this.platformComboBox.TabIndex = 6;
+      this.platformComboBox.SelectedValueChanged += new System.EventHandler(this.platformComboBox_SelectedValueChanged);
+      // 
+      // problemClassLabel
+      // 
+      this.problemClassLabel.AutoSize = true;
+      this.problemClassLabel.Location = new System.Drawing.Point(3, 111);
+      this.problemClassLabel.Name = "problemClassLabel";
+      this.problemClassLabel.Size = new System.Drawing.Size(81, 13);
+      this.problemClassLabel.TabIndex = 7;
+      this.problemClassLabel.Text = "&Problem Class:";
+      // 
+      // problemClassComboBox
+      // 
+      this.problemClassComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemClassComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.problemClassComboBox.FormattingEnabled = true;
+      this.problemClassComboBox.Location = new System.Drawing.Point(90, 108);
+      this.problemClassComboBox.Name = "problemClassComboBox";
+      this.problemClassComboBox.Size = new System.Drawing.Size(543, 21);
+      this.problemClassComboBox.TabIndex = 8;
+      this.problemClassComboBox.SelectedValueChanged += new System.EventHandler(this.problemClassComboBox_SelectedValueChanged);
+      // 
+      // 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.Enabled = false;
+      this.usersListBox.FormattingEnabled = true;
+      this.usersListBox.Location = new System.Drawing.Point(6, 36);
+      this.usersListBox.Name = "usersListBox";
+      this.usersListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
+      this.usersListBox.Size = new System.Drawing.Size(613, 225);
+      this.usersListBox.TabIndex = 2;
+      this.usersListBox.SelectedIndexChanged += new System.EventHandler(this.usersListBox_SelectedIndexChanged);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.usersTabPage);
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 162);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(633, 292);
+      this.tabControl.TabIndex = 9;
+      // 
+      // usersTabPage
+      // 
+      this.usersTabPage.Controls.Add(this.storeUsersButton);
+      this.usersTabPage.Controls.Add(this.refreshUsersButton);
+      this.usersTabPage.Controls.Add(this.usersListBox);
+      this.usersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.usersTabPage.Name = "usersTabPage";
+      this.usersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.usersTabPage.Size = new System.Drawing.Size(625, 266);
+      this.usersTabPage.TabIndex = 0;
+      this.usersTabPage.Text = "Authorized Users";
+      this.usersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // storeUsersButton
+      // 
+      this.storeUsersButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.PublishToWeb;
+      this.storeUsersButton.Location = new System.Drawing.Point(36, 6);
+      this.storeUsersButton.Name = "storeUsersButton";
+      this.storeUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.storeUsersButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.storeUsersButton, "Store Authorized Users");
+      this.storeUsersButton.UseVisualStyleBackColor = true;
+      this.storeUsersButton.Click += new System.EventHandler(this.storeUsersButton_Click);
+      // 
+      // refreshUsersButton
+      // 
+      this.refreshUsersButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Refresh;
+      this.refreshUsersButton.Location = new System.Drawing.Point(6, 6);
+      this.refreshUsersButton.Name = "refreshUsersButton";
+      this.refreshUsersButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshUsersButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.refreshUsersButton, "Refresh Authorized Users");
+      this.refreshUsersButton.UseVisualStyleBackColor = true;
+      this.refreshUsersButton.Click += new System.EventHandler(this.refreshUsersButton_Click);
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Controls.Add(this.problemDataView);
+      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.TabIndex = 1;
+      this.dataTabPage.Text = "Platform-Specific Problem Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // problemDataView
+      // 
+      this.problemDataView.ProblemId = ((long)(0));
+      this.problemDataView.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.problemDataView.Caption = "ProblemData View";
+      this.problemDataView.Content = null;
+      this.problemDataView.Location = new System.Drawing.Point(6, 6);
+      this.problemDataView.Name = "problemDataView";
+      this.problemDataView.ReadOnly = false;
+      this.problemDataView.Size = new System.Drawing.Size(613, 254);
+      this.problemDataView.TabIndex = 0;
+      // 
+      // ProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.platformComboBox);
+      this.Controls.Add(this.platformLabel);
+      this.Controls.Add(this.problemClassComboBox);
+      this.Controls.Add(this.problemClassLabel);
+      this.Name = "ProblemView";
+      this.Size = new System.Drawing.Size(633, 454);
+      this.Controls.SetChildIndex(this.problemClassLabel, 0);
+      this.Controls.SetChildIndex(this.problemClassComboBox, 0);
+      this.Controls.SetChildIndex(this.platformLabel, 0);
+      this.Controls.SetChildIndex(this.platformComboBox, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.storeButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.tabControl.ResumeLayout(false);
+      this.usersTabPage.ResumeLayout(false);
+      this.dataTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label platformLabel;
+    private System.Windows.Forms.ComboBox platformComboBox;
+    private System.Windows.Forms.Label problemClassLabel;
+    private System.Windows.Forms.ComboBox problemClassComboBox;
+    private System.Windows.Forms.ListBox usersListBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage usersTabPage;
+    private System.Windows.Forms.Button storeUsersButton;
+    private System.Windows.Forms.Button refreshUsersButton;
+    private System.Windows.Forms.TabPage dataTabPage;
+    private ProblemDataView problemDataView;
+
+  }
+}
Index: branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs
===================================================================
--- branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs	(revision 4492)
+++ branches/OKB/HeuristicLab.Clients.OKB-3.3/Views/ProblemView.cs	(revision 4492)
@@ -0,0 +1,121 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.OKB {
+  [View("Problem View")]
+  [Content(typeof(Problem), true)]
+  public partial class ProblemView : NamedOKBItemView {
+    public new Problem Content {
+      get { return (Problem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProblemView() {
+      InitializeComponent();
+    }
+
+    protected override void OnInitialized(System.EventArgs e) {
+      base.OnInitialized(e);
+      platformComboBox.DataSource = Administrator.Instance.Platforms.ToList();
+      problemClassComboBox.DataSource = Administrator.Instance.ProblemClasses.ToList();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        platformComboBox.SelectedIndex = -1;
+        problemClassComboBox.SelectedIndex = -1;
+        problemDataView.ProblemId = 0;
+      } else {
+        platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+        problemClassComboBox.SelectedItem = Administrator.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+        problemDataView.ProblemId = Content.Id;
+      }
+      usersListBox.DataSource = null;
+      problemDataView.Content = null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      platformComboBox.Enabled = (Content != null) && !ReadOnly;
+      problemClassComboBox.Enabled = (Content != null) && !ReadOnly;
+      refreshUsersButton.Enabled = Content != null;
+      storeUsersButton.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      usersListBox.Enabled = (usersListBox.DataSource != null) && !ReadOnly;
+      problemDataView.Enabled = Content != null;
+    }
+
+    protected override void OnContentPropertyChanged(string propertyName) {
+      switch (propertyName) {
+        case "Id":
+          problemDataView.ProblemId = Content.Id;
+          break;
+        case "PlatformId":
+          platformComboBox.SelectedItem = Administrator.Instance.Platforms.FirstOrDefault(p => p.Id == Content.PlatformId);
+          break;
+        case "ProblemClassId":
+          problemClassComboBox.SelectedItem = Administrator.Instance.ProblemClasses.FirstOrDefault(a => a.Id == Content.ProblemClassId);
+          break;
+      }
+    }
+
+    private void platformComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        Platform selected = platformComboBox.SelectedItem as Platform;
+        if (selected != null) Content.PlatformId = selected.Id;
+      }
+    }
+    private void problemClassComboBox_SelectedValueChanged(object sender, System.EventArgs e) {
+      if (Content != null) {
+        ProblemClass selected = problemClassComboBox.SelectedItem as ProblemClass;
+        if (selected != null) Content.ProblemClassId = selected.Id;
+      }
+    }
+
+    private void refreshUsersButton_Click(object sender, System.EventArgs e) {
+      Guid[] ids = Administrator.Instance.GetProblemUsers(Content.Id);
+      if (ids != null) {
+        List<User> users = Administrator.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;
+        storeUsersButton.Enabled = false;
+      }
+    }
+    private void storeUsersButton_Click(object sender, System.EventArgs e) {
+      if (Administrator.Instance.UpdateProblemUsers(Content.Id, usersListBox.SelectedItems.Cast<User>().Select(u => u.Id).ToArray()))
+        storeUsersButton.Enabled = false;
+    }
+    private void usersListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      storeUsersButton.Enabled = !ReadOnly;
+    }
+  }
+}
