Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherBase.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherBase.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherBase.cs	(revision 2088)
@@ -41,5 +41,21 @@
     private IStore store;
     private DataSet dataset;
-    
+
+    public IEnumerable<string> AllowedTargetVariables {
+      get {
+        if (dataset != null) {
+          return dataset.Problem.AllowedTargetVariables.Select(x => dataset.Problem.Dataset.GetVariableName(x));
+        } else return new string[0];
+      }
+    }
+
+    public IEnumerable<string> AllowedInputVariables {
+      get {
+        if (dataset != null) {
+          return dataset.Problem.AllowedInputVariables.Select(x => dataset.Problem.Dataset.GetVariableName(x));
+        } else return new string[0];
+      }
+    }
+
     public DispatcherBase(IStore store) {
       this.store = store;
@@ -91,4 +107,12 @@
       return Enumerable.Range(0, dataset.Rows).Select(x => dataset.GetValue(x, targetVariable)).Distinct();
     }
+
+    #region IViewable Members
+
+    public IView CreateView() {
+      return new DispatcherView(this);
+    }
+
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs	(revision 2088)
@@ -0,0 +1,88 @@
+﻿namespace HeuristicLab.CEDMA.Server {
+  partial class DispatcherView {
+    /// <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 && (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.targetVariableList = new System.Windows.Forms.CheckedListBox();
+      this.inputVariableList = new System.Windows.Forms.CheckedListBox();
+      this.targetVariablesLabel = new System.Windows.Forms.Label();
+      this.inputVariablesLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // targetVariableList
+      // 
+      this.targetVariableList.FormattingEnabled = true;
+      this.targetVariableList.Location = new System.Drawing.Point(3, 16);
+      this.targetVariableList.Name = "targetVariableList";
+      this.targetVariableList.Size = new System.Drawing.Size(171, 409);
+      this.targetVariableList.TabIndex = 0;
+      // 
+      // inputVariableList
+      // 
+      this.inputVariableList.FormattingEnabled = true;
+      this.inputVariableList.Location = new System.Drawing.Point(194, 16);
+      this.inputVariableList.Name = "inputVariableList";
+      this.inputVariableList.Size = new System.Drawing.Size(170, 409);
+      this.inputVariableList.TabIndex = 1;
+      // 
+      // targetVariablesLabel
+      // 
+      this.targetVariablesLabel.AutoSize = true;
+      this.targetVariablesLabel.Location = new System.Drawing.Point(3, 0);
+      this.targetVariablesLabel.Name = "targetVariablesLabel";
+      this.targetVariablesLabel.Size = new System.Drawing.Size(86, 13);
+      this.targetVariablesLabel.TabIndex = 2;
+      this.targetVariablesLabel.Text = "Target variables:";
+      // 
+      // inputVariablesLabel
+      // 
+      this.inputVariablesLabel.AutoSize = true;
+      this.inputVariablesLabel.Location = new System.Drawing.Point(191, 0);
+      this.inputVariablesLabel.Name = "inputVariablesLabel";
+      this.inputVariablesLabel.Size = new System.Drawing.Size(79, 13);
+      this.inputVariablesLabel.TabIndex = 3;
+      this.inputVariablesLabel.Text = "Input variables:";
+      // 
+      // DispatcherView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.inputVariablesLabel);
+      this.Controls.Add(this.targetVariablesLabel);
+      this.Controls.Add(this.inputVariableList);
+      this.Controls.Add(this.targetVariableList);
+      this.Name = "DispatcherView";
+      this.Size = new System.Drawing.Size(417, 427);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.CheckedListBox targetVariableList;
+    private System.Windows.Forms.CheckedListBox inputVariableList;
+    private System.Windows.Forms.Label targetVariablesLabel;
+    private System.Windows.Forms.Label inputVariablesLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs	(revision 2088)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.CEDMA.Server {
+  public partial class DispatcherView : ViewBase {
+    private DispatcherBase dispatcher;
+    public DispatcherView(DispatcherBase dispatcher) {
+      this.dispatcher = dispatcher;
+      InitializeComponent();
+
+      UpdateControls();
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+
+      foreach (string targetVar in dispatcher.AllowedTargetVariables) {
+        targetVariableList.Items.Add(targetVar);
+      }
+
+      foreach (string inputVar in dispatcher.AllowedInputVariables) {
+        inputVariableList.Items.Add(inputVar);
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx	(revision 2088)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterBase.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterBase.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterBase.cs	(revision 2088)
@@ -129,4 +129,13 @@
 
     public abstract string[] GetJobs();
+
+
+    #region IViewable Members
+
+    public IView CreateView() {
+      return new ExecuterView(this);
+    }
+
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.Designer.cs	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.Designer.cs	(revision 2088)
@@ -0,0 +1,93 @@
+﻿namespace HeuristicLab.CEDMA.Server {
+  partial class ExecuterView {
+    /// <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 && (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.refreshTimer = new System.Windows.Forms.Timer(this.components);
+      this.jobsList = new System.Windows.Forms.ListBox();
+      this.maxJobsLabel = new System.Windows.Forms.Label();
+      this.maxActiveJobs = new System.Windows.Forms.NumericUpDown();
+      ((System.ComponentModel.ISupportInitialize)(this.maxActiveJobs)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // refreshTimer
+      // 
+      this.refreshTimer.Interval = 1000;
+      this.refreshTimer.Tick += new System.EventHandler(this.refreshTimer_Tick);
+      // 
+      // jobsList
+      // 
+      this.jobsList.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.jobsList.FormattingEnabled = true;
+      this.jobsList.Location = new System.Drawing.Point(3, 29);
+      this.jobsList.Name = "jobsList";
+      this.jobsList.Size = new System.Drawing.Size(327, 264);
+      this.jobsList.TabIndex = 0;
+      // 
+      // maxJobsLabel
+      // 
+      this.maxJobsLabel.AutoSize = true;
+      this.maxJobsLabel.Location = new System.Drawing.Point(5, 5);
+      this.maxJobsLabel.Name = "maxJobsLabel";
+      this.maxJobsLabel.Size = new System.Drawing.Size(87, 13);
+      this.maxJobsLabel.TabIndex = 1;
+      this.maxJobsLabel.Text = "Max. active jobs:";
+      // 
+      // maxActiveJobs
+      // 
+      this.maxActiveJobs.Location = new System.Drawing.Point(98, 3);
+      this.maxActiveJobs.Maximum = new decimal(new int[] {
+            64,
+            0,
+            0,
+            0});
+      this.maxActiveJobs.Name = "maxActiveJobs";
+      this.maxActiveJobs.Size = new System.Drawing.Size(120, 20);
+      this.maxActiveJobs.TabIndex = 2;
+      // 
+      // ExecuterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.maxActiveJobs);
+      this.Controls.Add(this.maxJobsLabel);
+      this.Controls.Add(this.jobsList);
+      this.Name = "ExecuterView";
+      this.Size = new System.Drawing.Size(333, 294);
+      ((System.ComponentModel.ISupportInitialize)(this.maxActiveJobs)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Timer refreshTimer;
+    private System.Windows.Forms.ListBox jobsList;
+    private System.Windows.Forms.Label maxJobsLabel;
+    private System.Windows.Forms.NumericUpDown maxActiveJobs;
+  }
+}
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.cs	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.cs	(revision 2088)
@@ -0,0 +1,28 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.CEDMA.Server {
+  public partial class ExecuterView : ViewBase {
+    private ExecuterBase executer;
+    public ExecuterView(ExecuterBase executer) {
+      this.executer = executer;
+      InitializeComponent();
+      refreshTimer.Enabled = true;
+    }
+
+    private void refreshTimer_Tick(object sender, EventArgs e) {
+      jobsList.DataSource = executer.GetJobs();
+    }
+
+    private void maxActiveJobsUpDown_ValueChanged(object sender, EventArgs e) {
+      executer.MaxActiveJobs = Convert.ToInt32(maxActiveJobs.Value);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.resx
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.resx	(revision 2088)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ExecuterView.resx	(revision 2088)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="refreshTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/HeuristicLab.CEDMA.Server-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/HeuristicLab.CEDMA.Server-3.3.csproj	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/HeuristicLab.CEDMA.Server-3.3.csproj	(revision 2088)
@@ -91,4 +91,16 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ExecuterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExecuterView.Designer.cs">
+      <DependentUpon>ExecuterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="DispatcherView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="DispatcherView.Designer.cs">
+      <DependentUpon>DispatcherView.cs</DependentUpon>
+    </Compile>
     <Compile Include="ExecuterBase.cs" />
     <Compile Include="IExecuter.cs" />
@@ -101,5 +113,5 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ServerForm.cs">
-      <SubType>Form</SubType>
+      <SubType>UserControl</SubType>
     </Compile>
     <Compile Include="ServerForm.designer.cs">
@@ -159,4 +171,10 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="DispatcherView.resx">
+      <DependentUpon>DispatcherView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExecuterView.resx">
+      <DependentUpon>ExecuterView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="ServerForm.resx">
       <DependentUpon>ServerForm.cs</DependentUpon>
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/IDispatcher.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/IDispatcher.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/IDispatcher.cs	(revision 2088)
@@ -38,5 +38,5 @@
 
 namespace HeuristicLab.CEDMA.Server {
-  public interface IDispatcher {
+  public interface IDispatcher : IViewable {
     IAlgorithm GetNextJob();
   }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/IExecuter.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/IExecuter.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/IExecuter.cs	(revision 2088)
@@ -37,5 +37,5 @@
 
 namespace HeuristicLab.CEDMA.Server {
-  public interface IExecuter {
+  public interface IExecuter : IViewable {
     int MaxActiveJobs { get; set; }
     string[] GetJobs();
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/Server.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/Server.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/Server.cs	(revision 2088)
@@ -32,7 +32,8 @@
 using HeuristicLab.Grid;
 using HeuristicLab.Grid.HiveBridge;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.CEDMA.Server {
-  public class Server {
+  public class Server : IViewable {
     private static readonly string rdfFile = AppDomain.CurrentDomain.BaseDirectory + "rdf_store.db3";
     private static readonly string rdfConnectionString = "sqlite:rdf:Data Source=\"" + rdfFile + "\"";
@@ -40,6 +41,9 @@
     private ServiceHost host;
     private Store store;
+
     private IDispatcher dispatcher;
+    public IDispatcher Dispatcher { get { return dispatcher; } }
     private IExecuter executer;
+    public IExecuter Executer { get { return executer; } }
 
     private string gridServiceUrl;
@@ -53,17 +57,4 @@
       get { return cedmaServiceUrl; }
       set { cedmaServiceUrl = value; }
-    }
-
-    private int maxActiveJobs;
-    public int MaxActiveJobs {
-      get { return maxActiveJobs; }
-      set {
-        if (value > 0) {
-          maxActiveJobs = value;
-          if (executer != null) {
-            executer.MaxActiveJobs = value;
-          }
-        }
-      }
     }
 
@@ -80,5 +71,4 @@
       cedmaServiceUrl = "net.tcp://" + addresses[index] + ":8002/CEDMA";
       store = new Store(rdfConnectionString);
-      maxActiveJobs = 10;
     }
 
@@ -103,9 +93,4 @@
     }
 
-    internal string[] GetActiveJobDescriptions() {
-      if (executer != null) return executer.GetJobs();
-      else return new string[] { };
-    }
-
     internal void Connect(string serverUrl) {
       dispatcher = new SimpleDispatcher(store);
@@ -118,7 +103,13 @@
       }
       executer = new GridExecuter(dispatcher, store, gridServer);
-      executer.MaxActiveJobs = MaxActiveJobs;
       executer.Start();
     }
+    #region IViewable Members
+
+    public IView CreateView() {
+      return new ServerForm(this);
+    }
+
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerApplication.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerApplication.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerApplication.cs	(revision 2088)
@@ -30,5 +30,10 @@
   class ServerApplication : ApplicationBase {
     public override void Run() {
-      Form mainForm = new ServerForm();
+      Server server = new Server();
+      server.Start();
+      Form mainForm = new Form();
+      UserControl serverControl = (UserControl)server.CreateView();
+      serverControl.Dock = DockStyle.Fill;
+      mainForm.Controls.Add(serverControl);
       Application.Run(mainForm);
     }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.cs	(revision 2088)
@@ -41,30 +41,22 @@
 
 namespace HeuristicLab.CEDMA.Server {
-  public partial class ServerForm : Form {
+  public partial class ServerForm : ViewBase {
     private Server server;
 
-
-    public ServerForm() {
+    public ServerForm(Server server) {
+      this.server = server;
       InitializeComponent();
-      server = new Server();
-      server.Start();
       addressTextBox.Text = server.CedmaServiceUrl;
-    }
-
-    private void refreshTimer_Tick(object sender, EventArgs e) {
-      listBox.DataSource = server.GetActiveJobDescriptions();
     }
 
     private void connectButton_Click(object sender, EventArgs e) {
       server.Connect(address.Text);
-      maxActiveJobsUpDown.Enabled = true;
-      activeJobsLabel.Enabled = true;
-      maxActiveJobsUpDown.Value = server.MaxActiveJobs;
-      connectButton.Enabled = false;
-      refreshTimer.Start();
-    }
-
-    private void maxActiveJobsUpDown_ValueChanged(object sender, EventArgs e) {
-      server.MaxActiveJobs = Convert.ToInt32(maxActiveJobsUpDown.Value);
+      UserControl executerControl = (UserControl)server.Executer.CreateView();
+      executerControl.Dock = DockStyle.Fill;
+      executerTabPage.Controls.Add(executerControl);
+      UserControl dispatcherControl = (UserControl)server.Dispatcher.CreateView();
+      dispatcherControl.Dock = DockStyle.Fill;
+      dispatcherTabPage.Controls.Add(dispatcherControl);
+      connectButton.Enabled = false;      
     }
   }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.designer.cs
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.designer.cs	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.designer.cs	(revision 2088)
@@ -45,5 +45,4 @@
     /// </summary>
     private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
       this.addressTextBox = new System.Windows.Forms.TextBox();
       this.externalAddressLabel = new System.Windows.Forms.Label();
@@ -51,9 +50,8 @@
       this.address = new System.Windows.Forms.TextBox();
       this.connectButton = new System.Windows.Forms.Button();
-      this.listBox = new System.Windows.Forms.ListBox();
-      this.refreshTimer = new System.Windows.Forms.Timer(this.components);
-      this.maxActiveJobsUpDown = new System.Windows.Forms.NumericUpDown();
-      this.activeJobsLabel = new System.Windows.Forms.Label();
-      ((System.ComponentModel.ISupportInitialize)(this.maxActiveJobsUpDown)).BeginInit();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.executerTabPage = new System.Windows.Forms.TabPage();
+      this.dispatcherTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -101,43 +99,36 @@
       this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
       // 
-      // listBox
+      // tabControl
       // 
-      this.listBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+      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.listBox.FormattingEnabled = true;
-      this.listBox.Location = new System.Drawing.Point(12, 84);
-      this.listBox.Name = "listBox";
-      this.listBox.Size = new System.Drawing.Size(350, 251);
-      this.listBox.TabIndex = 11;
+      this.tabControl.Controls.Add(this.executerTabPage);
+      this.tabControl.Controls.Add(this.dispatcherTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 58);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(573, 543);
+      this.tabControl.TabIndex = 14;
       // 
-      // refreshTimer
+      // executerTabPage
       // 
-      this.refreshTimer.Interval = 1000;
-      this.refreshTimer.Tick += new System.EventHandler(this.refreshTimer_Tick);
+      this.executerTabPage.Location = new System.Drawing.Point(4, 22);
+      this.executerTabPage.Name = "executerTabPage";
+      this.executerTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.executerTabPage.Size = new System.Drawing.Size(565, 517);
+      this.executerTabPage.TabIndex = 0;
+      this.executerTabPage.Text = "Executer";
+      this.executerTabPage.UseVisualStyleBackColor = true;
       // 
-      // maxActiveJobsUpDown
+      // dispatcherTabPage
       // 
-      this.maxActiveJobsUpDown.Enabled = false;
-      this.maxActiveJobsUpDown.Location = new System.Drawing.Point(106, 59);
-      this.maxActiveJobsUpDown.Maximum = new decimal(new int[] {
-            64,
-            0,
-            0,
-            0});
-      this.maxActiveJobsUpDown.Name = "maxActiveJobsUpDown";
-      this.maxActiveJobsUpDown.Size = new System.Drawing.Size(120, 20);
-      this.maxActiveJobsUpDown.TabIndex = 12;
-      this.maxActiveJobsUpDown.ValueChanged += new System.EventHandler(this.maxActiveJobsUpDown_ValueChanged);
-      // 
-      // activeJobsLabel
-      // 
-      this.activeJobsLabel.AutoSize = true;
-      this.activeJobsLabel.Enabled = false;
-      this.activeJobsLabel.Location = new System.Drawing.Point(12, 61);
-      this.activeJobsLabel.Name = "activeJobsLabel";
-      this.activeJobsLabel.Size = new System.Drawing.Size(84, 13);
-      this.activeJobsLabel.TabIndex = 13;
-      this.activeJobsLabel.Text = "&Max active jobs:";
+      this.dispatcherTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dispatcherTabPage.Name = "dispatcherTabPage";
+      this.dispatcherTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dispatcherTabPage.Size = new System.Drawing.Size(565, 517);
+      this.dispatcherTabPage.TabIndex = 1;
+      this.dispatcherTabPage.Text = "Dispatcher";
+      this.dispatcherTabPage.UseVisualStyleBackColor = true;
       // 
       // ServerForm
@@ -145,8 +136,5 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.ClientSize = new System.Drawing.Size(374, 342);
-      this.Controls.Add(this.activeJobsLabel);
-      this.Controls.Add(this.maxActiveJobsUpDown);
-      this.Controls.Add(this.listBox);
+      this.Controls.Add(this.tabControl);
       this.Controls.Add(this.connectButton);
       this.Controls.Add(this.gridAddressLabel);
@@ -155,6 +143,6 @@
       this.Controls.Add(this.addressTextBox);
       this.Name = "ServerForm";
-      this.Text = "CEDMA Server";
-      ((System.ComponentModel.ISupportInitialize)(this.maxActiveJobsUpDown)).EndInit();
+      this.Size = new System.Drawing.Size(579, 604);
+      this.tabControl.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -169,8 +157,7 @@
     private System.Windows.Forms.TextBox address;
     private System.Windows.Forms.Button connectButton;
-    private System.Windows.Forms.ListBox listBox;
-    private System.Windows.Forms.Timer refreshTimer;
-    private System.Windows.Forms.NumericUpDown maxActiveJobsUpDown;
-    private System.Windows.Forms.Label activeJobsLabel;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage executerTabPage;
+    private System.Windows.Forms.TabPage dispatcherTabPage;
   }
 }
Index: trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.resx
===================================================================
--- trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.resx	(revision 2087)
+++ trunk/sources/HeuristicLab.CEDMA.Server/3.3/ServerForm.resx	(revision 2088)
@@ -118,6 +118,3 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="refreshTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
 </root>
