Index: stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.Designer.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.Designer.cs	(revision 14186)
+++ stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.Designer.cs	(revision 15081)
@@ -49,6 +49,21 @@
       this.refreshButton = new System.Windows.Forms.Button();
       this.cloneProblemButton = new System.Windows.Forms.Button();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
       this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.flaAnalysisTabPage = new System.Windows.Forms.TabPage();
+      this.calculateButton = new System.Windows.Forms.Button();
+      this.flaSplitContainer = new System.Windows.Forms.SplitContainer();
+      this.characteristicsMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.uploadCharacteristicsButton = new System.Windows.Forms.Button();
+      this.downloadCharacteristicsButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.flaAnalysisTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.flaSplitContainer)).BeginInit();
+      this.flaSplitContainer.Panel1.SuspendLayout();
+      this.flaSplitContainer.Panel2.SuspendLayout();
+      this.flaSplitContainer.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -58,5 +73,5 @@
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
       this.nameTextBox.Location = new System.Drawing.Point(72, 27);
-      this.nameTextBox.Size = new System.Drawing.Size(604, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(640, 20);
       this.nameTextBox.TabIndex = 5;
       // 
@@ -68,16 +83,16 @@
       // infoLabel
       // 
-      this.infoLabel.Location = new System.Drawing.Point(687, 30);
+      this.infoLabel.Location = new System.Drawing.Point(723, 30);
       this.infoLabel.TabIndex = 6;
       // 
       // problemComboBox
       // 
-      this.problemComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.problemComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
       this.problemComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.problemComboBox.FormattingEnabled = true;
       this.problemComboBox.Location = new System.Drawing.Point(72, 0);
       this.problemComboBox.Name = "problemComboBox";
-      this.problemComboBox.Size = new System.Drawing.Size(574, 21);
+      this.problemComboBox.Size = new System.Drawing.Size(610, 21);
       this.problemComboBox.TabIndex = 1;
       this.problemComboBox.SelectedValueChanged += new System.EventHandler(this.problemComboBox_SelectedValueChanged);
@@ -95,6 +110,5 @@
       // 
       this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
-      this.refreshButton.Location = new System.Drawing.Point(682, -1);
+      this.refreshButton.Location = new System.Drawing.Point(718, -1);
       this.refreshButton.Name = "refreshButton";
       this.refreshButton.Size = new System.Drawing.Size(24, 24);
@@ -107,6 +121,5 @@
       // 
       this.cloneProblemButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.cloneProblemButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Clone;
-      this.cloneProblemButton.Location = new System.Drawing.Point(652, -1);
+      this.cloneProblemButton.Location = new System.Drawing.Point(688, -1);
       this.cloneProblemButton.Name = "cloneProblemButton";
       this.cloneProblemButton.Size = new System.Drawing.Size(24, 24);
@@ -116,17 +129,116 @@
       this.cloneProblemButton.Click += new System.EventHandler(this.cloneProblemButton_Click);
       // 
+      // 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.parametersTabPage);
+      this.tabControl.Controls.Add(this.flaAnalysisTabPage);
+      this.tabControl.Location = new System.Drawing.Point(6, 53);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(736, 473);
+      this.tabControl.TabIndex = 8;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(692, 314);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
       // parameterCollectionView
       // 
       this.parameterCollectionView.AllowEditingOfHiddenParameters = false;
-      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection View";
       this.parameterCollectionView.Content = null;
-      this.parameterCollectionView.Location = new System.Drawing.Point(0, 53);
+      this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.parameterCollectionView.Location = new System.Drawing.Point(3, 3);
       this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.ReadOnly = false;
-      this.parameterCollectionView.Size = new System.Drawing.Size(706, 340);
-      this.parameterCollectionView.TabIndex = 7;
+      this.parameterCollectionView.ReadOnly = true;
+      this.parameterCollectionView.ShowDetails = true;
+      this.parameterCollectionView.Size = new System.Drawing.Size(686, 308);
+      this.parameterCollectionView.TabIndex = 8;
+      // 
+      // flaAnalysisTabPage
+      // 
+      this.flaAnalysisTabPage.Controls.Add(this.flaSplitContainer);
+      this.flaAnalysisTabPage.Location = new System.Drawing.Point(4, 22);
+      this.flaAnalysisTabPage.Name = "flaAnalysisTabPage";
+      this.flaAnalysisTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.flaAnalysisTabPage.Size = new System.Drawing.Size(728, 447);
+      this.flaAnalysisTabPage.TabIndex = 2;
+      this.flaAnalysisTabPage.Text = "Fitness Landscape Analysis";
+      this.flaAnalysisTabPage.UseVisualStyleBackColor = true;
+      // 
+      // calculateButton
+      // 
+      this.calculateButton.Location = new System.Drawing.Point(3, 3);
+      this.calculateButton.Name = "calculateButton";
+      this.calculateButton.Size = new System.Drawing.Size(26, 23);
+      this.calculateButton.TabIndex = 8;
+      this.calculateButton.Text = "Calculate";
+      this.calculateButton.UseVisualStyleBackColor = true;
+      this.calculateButton.Click += new System.EventHandler(this.calculateButton_Click);
+      // 
+      // flaSplitContainer
+      // 
+      this.flaSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.flaSplitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.flaSplitContainer.Location = new System.Drawing.Point(3, 3);
+      this.flaSplitContainer.Name = "flaSplitContainer";
+      // 
+      // flaSplitContainer.Panel1
+      // 
+      this.flaSplitContainer.Panel1.Controls.Add(this.calculateButton);
+      // 
+      // flaSplitContainer.Panel2
+      // 
+      this.flaSplitContainer.Panel2.Controls.Add(this.characteristicsMatrixView);
+      this.flaSplitContainer.Panel2.Controls.Add(this.uploadCharacteristicsButton);
+      this.flaSplitContainer.Panel2.Controls.Add(this.downloadCharacteristicsButton);
+      this.flaSplitContainer.Size = new System.Drawing.Size(722, 441);
+      this.flaSplitContainer.SplitterDistance = 363;
+      this.flaSplitContainer.TabIndex = 7;
+      // 
+      // characteristicsMatrixView
+      // 
+      this.characteristicsMatrixView.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.characteristicsMatrixView.Caption = "StringConvertibleMatrix View";
+      this.characteristicsMatrixView.Content = null;
+      this.characteristicsMatrixView.Location = new System.Drawing.Point(3, 32);
+      this.characteristicsMatrixView.Name = "characteristicsMatrixView";
+      this.characteristicsMatrixView.ReadOnly = false;
+      this.characteristicsMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.characteristicsMatrixView.ShowStatisticalInformation = false;
+      this.characteristicsMatrixView.Size = new System.Drawing.Size(349, 406);
+      this.characteristicsMatrixView.TabIndex = 4;
+      // 
+      // uploadCharacteristicsButton
+      // 
+      this.uploadCharacteristicsButton.Location = new System.Drawing.Point(35, 3);
+      this.uploadCharacteristicsButton.Name = "uploadCharacteristicsButton";
+      this.uploadCharacteristicsButton.Size = new System.Drawing.Size(26, 23);
+      this.uploadCharacteristicsButton.TabIndex = 5;
+      this.uploadCharacteristicsButton.Text = "Upload";
+      this.uploadCharacteristicsButton.UseVisualStyleBackColor = true;
+      this.uploadCharacteristicsButton.Click += new System.EventHandler(this.uploadCharacteristicsButton_Click);
+      // 
+      // downloadCharacteristicsButton
+      // 
+      this.downloadCharacteristicsButton.Location = new System.Drawing.Point(3, 3);
+      this.downloadCharacteristicsButton.Name = "downloadCharacteristicsButton";
+      this.downloadCharacteristicsButton.Size = new System.Drawing.Size(26, 23);
+      this.downloadCharacteristicsButton.TabIndex = 6;
+      this.downloadCharacteristicsButton.Text = "Download";
+      this.downloadCharacteristicsButton.UseVisualStyleBackColor = true;
+      this.downloadCharacteristicsButton.Click += new System.EventHandler(this.downloadCharacteristicsButton_Click);
       // 
       // OKBProblemView
@@ -134,20 +246,27 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
       this.Controls.Add(this.problemComboBox);
-      this.Controls.Add(this.parameterCollectionView);
       this.Controls.Add(this.problemLabel);
       this.Controls.Add(this.cloneProblemButton);
       this.Controls.Add(this.refreshButton);
       this.Name = "OKBProblemView";
-      this.Size = new System.Drawing.Size(706, 393);
+      this.Size = new System.Drawing.Size(742, 526);
       this.Controls.SetChildIndex(this.refreshButton, 0);
       this.Controls.SetChildIndex(this.cloneProblemButton, 0);
       this.Controls.SetChildIndex(this.problemLabel, 0);
-      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      this.Controls.SetChildIndex(this.problemComboBox, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.infoLabel, 0);
-      this.Controls.SetChildIndex(this.problemComboBox, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.flaAnalysisTabPage.ResumeLayout(false);
+      this.flaSplitContainer.Panel1.ResumeLayout(false);
+      this.flaSplitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.flaSplitContainer)).EndInit();
+      this.flaSplitContainer.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -161,5 +280,13 @@
     private System.Windows.Forms.Button refreshButton;
     private System.Windows.Forms.Button cloneProblemButton;
-    private HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage parametersTabPage;
+    private Core.Views.ParameterCollectionView parameterCollectionView;
+    private System.Windows.Forms.TabPage flaAnalysisTabPage;
+    private System.Windows.Forms.Button calculateButton;
+    private System.Windows.Forms.SplitContainer flaSplitContainer;
+    private Data.Views.StringConvertibleMatrixView characteristicsMatrixView;
+    private System.Windows.Forms.Button uploadCharacteristicsButton;
+    private System.Windows.Forms.Button downloadCharacteristicsButton;
 
 
Index: stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.cs	(revision 14186)
+++ stable/HeuristicLab.Clients.OKB.Views/3.3/RunCreation/Views/OKBProblemView.cs	(revision 15081)
@@ -20,9 +20,16 @@
 #endregion
 
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Data;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
 using System;
+using System.Collections.Generic;
+using System.Drawing;
 using System.Linq;
 using System.Windows.Forms;
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
 
 namespace HeuristicLab.Clients.OKB.RunCreation {
@@ -31,4 +38,6 @@
   [Content(typeof(MultiObjectiveOKBProblem), true)]
   public sealed partial class OKBProblemView : NamedItemView {
+    private readonly CheckedItemList<ICharacteristicCalculator> calculatorList;
+
     public new OKBProblem Content {
       get { return (OKBProblem)base.Content; }
@@ -38,4 +47,34 @@
     public OKBProblemView() {
       InitializeComponent();
+      var calculatorListView = new CheckedItemListView<ICharacteristicCalculator>() {
+        Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Top,
+        Location = new Point(flaSplitContainer.Padding.Left, calculateButton.Location.Y + calculateButton.Height + calculateButton.Padding.Bottom + 3),
+      };
+      calculatorListView.Size = new Size(flaSplitContainer.Panel1.Size.Width - flaSplitContainer.Panel1.Padding.Horizontal,
+          flaSplitContainer.Panel1.Height - calculatorListView.Location.Y - flaSplitContainer.Panel1.Padding.Bottom);
+      calculatorList = new CheckedItemList<ICharacteristicCalculator>();
+      calculatorList.ItemsAdded += CalculatorListOnChanged;
+      calculatorList.ItemsRemoved += CalculatorListOnChanged;
+      calculatorList.ItemsReplaced += CalculatorListOnChanged;
+      calculatorList.CollectionReset += CalculatorListOnChanged;
+      calculatorList.CheckedItemsChanged += CalculatorListOnChanged;
+
+      calculatorListView.Content = calculatorList.AsReadOnly();
+
+      flaSplitContainer.Panel1.Controls.Add(calculatorListView);
+      calculateButton.Text = string.Empty;
+      calculateButton.Image = VSImageLibrary.Play;
+      refreshButton.Text = string.Empty;
+      refreshButton.Image = VSImageLibrary.Refresh;
+      cloneProblemButton.Text = string.Empty;
+      cloneProblemButton.Image = VSImageLibrary.Clone;
+      downloadCharacteristicsButton.Text = string.Empty;
+      downloadCharacteristicsButton.Image = VSImageLibrary.Refresh;
+      uploadCharacteristicsButton.Text = string.Empty;
+      uploadCharacteristicsButton.Image = VSImageLibrary.PublishToWeb;
+    }
+
+    private void CalculatorListOnChanged(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
     }
 
@@ -65,4 +104,5 @@
         parameterCollectionView.Content = Content.Parameters;
       }
+      UpdateCharacteristicCalculators();
     }
 
@@ -73,4 +113,9 @@
       refreshButton.Enabled = (Content != null) && !ReadOnly && !Locked;
       parameterCollectionView.Enabled = Content != null;
+      characteristicsMatrixView.Enabled = Content != null;
+      downloadCharacteristicsButton.Enabled = Content != null && Content.ProblemId != -1 && !Locked;
+      uploadCharacteristicsButton.Enabled = Content != null && Content.ProblemId != -1 && !Locked && !ReadOnly
+        && characteristicsMatrixView.Content != null && characteristicsMatrixView.Content.Rows > 0;
+      calculateButton.Enabled = Content != null && Content.ProblemId != -1 && !Locked && !ReadOnly && calculatorList.CheckedItems.Any();
     }
 
@@ -79,4 +124,16 @@
       RunCreationClient.Instance.Refreshed -= new EventHandler(RunCreationClient_Refreshed);
       base.OnClosed(e);
+    }
+
+    private void UpdateCharacteristicCalculators() {
+      calculatorList.Clear();
+      if (Content == null || Content.ProblemId == -1) return;
+      var problem = Content.CloneProblem();
+      var calculators = ApplicationManager.Manager.GetInstances<ICharacteristicCalculator>().ToList();
+      foreach (var calc in calculators) {
+        calc.Problem = problem;
+        if (!calc.CanCalculate()) continue;
+        calculatorList.Add(calc, true);
+      }
     }
 
@@ -103,6 +160,8 @@
       if (InvokeRequired)
         Invoke(new EventHandler(Content_ProblemChanged), sender, e);
-      else
+      else {
         OnContentChanged();
+        SetEnabledStateOfControls();
+      }
     }
     #endregion
@@ -123,4 +182,73 @@
       }
     }
+    private void downloadCharacteristicsButton_Click(object sender, EventArgs e) {
+      var values = RunCreationClient.GetCharacteristicValues(Content.ProblemId).ToList();
+      var content = new StringMatrix(values.Count, 3);
+      for (var i = 0; i < values.Count; i++) {
+        content[i, 0] = values[i].Name;
+        content[i, 1] = values[i].GetValue();
+        content[i, 2] = values[i].GetType().Name;
+      }
+      characteristicsMatrixView.Content = content;
+      SetEnabledStateOfControls();
+    }
+    private void uploadCharacteristicsButton_Click(object sender, EventArgs e) {
+      var matrix = characteristicsMatrixView.Content as StringMatrix;
+      if (matrix == null) return;
+      var values = new List<Value>(matrix.Rows);
+      for (var i = 0; i < matrix.Rows; i++) {
+        var name = matrix[i, 0];
+        var strValue = matrix[i, 1];
+        var type = matrix[i, 2];
+        values.Add(Value.Create(name, strValue, type));
+      }
+      try {
+        RunCreationClient.SetCharacteristicValues(Content.ProblemId, values);
+      } catch (Exception ex) { ErrorHandling.ShowErrorDialog(ex); }
+    }
+    private void calculateButton_Click(object sender, EventArgs e) {
+      var calculators = calculatorList.CheckedItems.Select(x => x.Value).Where(x => x.CanCalculate()).ToList();
+      if (calculators.Count == 0) return;
+
+      var results = new Dictionary<string, Value>();
+      foreach (var calc in calculators) {
+        foreach (var result in calc.Calculate())
+          results[result.Name] = RunCreationClient.Instance.ConvertToValue(result.Value, result.Name);
+      }
+      var matrix = (characteristicsMatrixView.Content as StringMatrix) ?? (new StringMatrix(results.Count, 3));
+      for (var i = 0; i < matrix.Rows; i++) {
+        Value r;
+        if (results.TryGetValue(matrix[i, 0], out r)) {
+          matrix[i, 1] = r.GetValue();
+          matrix[i, 2] = r.GetType().Name;
+          results.Remove(matrix[i, 0]);
+        }
+      }
+      if (results.Count == 0) return;
+      var resultsList = results.ToList();
+      var counter = resultsList.Count - 1;
+      for (var i = 0; i < matrix.Rows; i++) {
+        if (string.IsNullOrEmpty(matrix[i, 0])) {
+          matrix[i, 0] = resultsList[counter].Key;
+          matrix[i, 1] = resultsList[counter].Value.GetValue();
+          matrix[i, 2] = resultsList[counter].Value.GetType().Name;
+          resultsList.RemoveAt(counter);
+          counter--;
+          if (counter < 0) return;
+        }
+      }
+      if (counter >= 0) {
+        ((IStringConvertibleMatrix)matrix).Rows += counter + 1;
+        for (var i = matrix.Rows - 1; counter >= 0; i--) {
+          matrix[i, 0] = resultsList[0].Key;
+          matrix[i, 1] = resultsList[0].Value.GetValue();
+          matrix[i, 2] = resultsList[0].Value.GetType().Name;
+          resultsList.RemoveAt(0);
+          counter--;
+        }
+      }
+      characteristicsMatrixView.Content = matrix;
+      SetEnabledStateOfControls();
+    }
     #endregion
 
@@ -132,4 +260,5 @@
     }
     #endregion
+
   }
 }
