Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/HeuristicLab.Encodings.ScheduleEncoding.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/HeuristicLab.Encodings.ScheduleEncoding.Views-3.3.csproj	(revision 8885)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/HeuristicLab.Encodings.ScheduleEncoding.Views-3.3.csproj	(revision 8886)
@@ -109,4 +109,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="TaskView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TaskView.Designer.cs">
+      <DependentUpon>TaskView.cs</DependentUpon>
+    </Compile>
     <Compile Include="GanttChart.cs">
       <SubType>UserControl</SubType>
@@ -116,4 +122,10 @@
     </Compile>
     <Compile Include="JobDataPoint.cs" />
+    <Compile Include="JobView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobView.Designer.cs">
+      <DependentUpon>JobView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs	(revision 8886)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.Designer.cs	(revision 8886)
@@ -0,0 +1,136 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Encodings.ScheduleEncoding.Views {
+  partial class JobView {
+    /// <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.indexLabel = new System.Windows.Forms.Label();
+      this.indexTextBox = new System.Windows.Forms.TextBox();
+      this.dueDateLabel = new System.Windows.Forms.Label();
+      this.dueDateTextBox = new System.Windows.Forms.TextBox();
+      this.tasksGroupBox = new System.Windows.Forms.GroupBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // indexLabel
+      // 
+      this.indexLabel.AutoSize = true;
+      this.indexLabel.Location = new System.Drawing.Point(3, 6);
+      this.indexLabel.Name = "indexLabel";
+      this.indexLabel.Size = new System.Drawing.Size(41, 13);
+      this.indexLabel.TabIndex = 0;
+      this.indexLabel.Text = "Job Nr:";
+      // 
+      // indexTextBox
+      // 
+      this.indexTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.indexTextBox.Location = new System.Drawing.Point(65, 3);
+      this.indexTextBox.Name = "indexTextBox";
+      this.indexTextBox.Size = new System.Drawing.Size(451, 20);
+      this.indexTextBox.TabIndex = 1;
+      this.indexTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.indexTextBox_Validating);
+      // 
+      // dueDateLabel
+      // 
+      this.dueDateLabel.AutoSize = true;
+      this.dueDateLabel.Location = new System.Drawing.Point(3, 32);
+      this.dueDateLabel.Name = "dueDateLabel";
+      this.dueDateLabel.Size = new System.Drawing.Size(56, 13);
+      this.dueDateLabel.TabIndex = 0;
+      this.dueDateLabel.Text = "Due Date:";
+      // 
+      // dueDateTextBox
+      // 
+      this.dueDateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.dueDateTextBox.Location = new System.Drawing.Point(65, 29);
+      this.dueDateTextBox.Name = "dueDateTextBox";
+      this.dueDateTextBox.Size = new System.Drawing.Size(451, 20);
+      this.dueDateTextBox.TabIndex = 1;
+      this.dueDateTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.dueDateTextBox_Validating);
+      // 
+      // tasksGroupBox
+      // 
+      this.tasksGroupBox.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.tasksGroupBox.Location = new System.Drawing.Point(6, 55);
+      this.tasksGroupBox.Name = "tasksGroupBox";
+      this.tasksGroupBox.Size = new System.Drawing.Size(510, 214);
+      this.tasksGroupBox.TabIndex = 2;
+      this.tasksGroupBox.TabStop = false;
+      this.tasksGroupBox.Text = "Tasks";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // JobView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.tasksGroupBox);
+      this.Controls.Add(this.dueDateTextBox);
+      this.Controls.Add(this.dueDateLabel);
+      this.Controls.Add(this.indexTextBox);
+      this.Controls.Add(this.indexLabel);
+      this.Name = "JobView";
+      this.Size = new System.Drawing.Size(519, 272);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label indexLabel;
+    private System.Windows.Forms.TextBox indexTextBox;
+    private System.Windows.Forms.Label dueDateLabel;
+    private System.Windows.Forms.TextBox dueDateTextBox;
+    private System.Windows.Forms.GroupBox tasksGroupBox;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.cs	(revision 8886)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/JobView.cs	(revision 8886)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ScheduleEncoding.Views {
+  [View("JobView")]
+  [Content(typeof(Job))]
+  public partial class JobView : ItemView {
+    private ItemListView<Task> tasksView;
+    private bool SuppressEvents = false;
+
+    public new Job Content {
+      get { return (Job)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public JobView() {
+      InitializeComponent();
+      tasksView = new ItemListView<Task> { Dock = DockStyle.Fill };
+      tasksGroupBox.Controls.Add(tasksView);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= Content_PropertyChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += Content_PropertyChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        indexTextBox.Text = String.Empty;
+        dueDateTextBox.Text = String.Empty;
+        tasksView.Content = null;
+      } else {
+        SuppressEvents = true;
+        try {
+          indexTextBox.Text = Content.Index.ToString();
+          dueDateTextBox.Text = Content.DueDate.ToString("r");
+        } finally { SuppressEvents = false; }
+        tasksView.Content = Content.Tasks;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      indexTextBox.Enabled = !ReadOnly && !Locked && Content != null;
+      dueDateTextBox.Enabled = !ReadOnly && !Locked && Content != null;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      SuppressEvents = true;
+      try {
+        switch (e.PropertyName) {
+          case "Index":
+            indexTextBox.Text = Content.Index.ToString();
+            break;
+          case "DueDate":
+            dueDateTextBox.Text = Content.DueDate.ToString("r");
+            break;
+          case "Tasks":
+            tasksView.Content = Content.Tasks;
+            break;
+          default:
+            break;
+        }
+      } finally {
+        SuppressEvents = false;
+      }
+    }
+
+    private void indexTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && indexTextBox.Enabled) {
+        int value;
+        if (int.TryParse(indexTextBox.Text, out value)) {
+          Content.Index = value;
+          errorProvider.SetError(indexTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(indexTextBox, "Please provide a valid integer.");
+        }
+      }
+    }
+
+    private void dueDateTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && dueDateTextBox.Enabled) {
+        double value;
+        if (double.TryParse(dueDateTextBox.Text, out value)) {
+          Content.DueDate = value;
+          errorProvider.SetError(dueDateTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(dueDateTextBox, "Please provide a valid double.");
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs	(revision 8886)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.Designer.cs	(revision 8886)
@@ -0,0 +1,171 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Encodings.ScheduleEncoding.Views {
+  partial class TaskView {
+    /// <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.taskNrLabel = new System.Windows.Forms.Label();
+      this.taskNrTextBox = new System.Windows.Forms.TextBox();
+      this.resourceNrLabel = new System.Windows.Forms.Label();
+      this.resourceNrTextBox = new System.Windows.Forms.TextBox();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.jobNrLabel = new System.Windows.Forms.Label();
+      this.jobNrTextBox = new System.Windows.Forms.TextBox();
+      this.durationLabel = new System.Windows.Forms.Label();
+      this.durationTextBox = new System.Windows.Forms.TextBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // taskNrLabel
+      // 
+      this.taskNrLabel.AutoSize = true;
+      this.taskNrLabel.Location = new System.Drawing.Point(3, 6);
+      this.taskNrLabel.Name = "taskNrLabel";
+      this.taskNrLabel.Size = new System.Drawing.Size(48, 13);
+      this.taskNrLabel.TabIndex = 0;
+      this.taskNrLabel.Text = "Task Nr:";
+      // 
+      // taskNrTextBox
+      // 
+      this.taskNrTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.taskNrTextBox.Location = new System.Drawing.Point(79, 3);
+      this.taskNrTextBox.Name = "taskNrTextBox";
+      this.taskNrTextBox.Size = new System.Drawing.Size(437, 20);
+      this.taskNrTextBox.TabIndex = 1;
+      this.taskNrTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.taskNrTextBox_Validating);
+      // 
+      // resourceNrLabel
+      // 
+      this.resourceNrLabel.AutoSize = true;
+      this.resourceNrLabel.Location = new System.Drawing.Point(3, 32);
+      this.resourceNrLabel.Name = "resourceNrLabel";
+      this.resourceNrLabel.Size = new System.Drawing.Size(70, 13);
+      this.resourceNrLabel.TabIndex = 0;
+      this.resourceNrLabel.Text = "Resource Nr:";
+      // 
+      // resourceNrTextBox
+      // 
+      this.resourceNrTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.resourceNrTextBox.Location = new System.Drawing.Point(79, 29);
+      this.resourceNrTextBox.Name = "resourceNrTextBox";
+      this.resourceNrTextBox.Size = new System.Drawing.Size(437, 20);
+      this.resourceNrTextBox.TabIndex = 1;
+      this.resourceNrTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.resourceNrTextBox_Validating);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // jobNrLabel
+      // 
+      this.jobNrLabel.AutoSize = true;
+      this.jobNrLabel.Location = new System.Drawing.Point(3, 58);
+      this.jobNrLabel.Name = "jobNrLabel";
+      this.jobNrLabel.Size = new System.Drawing.Size(41, 13);
+      this.jobNrLabel.TabIndex = 0;
+      this.jobNrLabel.Text = "Job Nr:";
+      // 
+      // jobNrTextBox
+      // 
+      this.jobNrTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobNrTextBox.Location = new System.Drawing.Point(79, 55);
+      this.jobNrTextBox.Name = "jobNrTextBox";
+      this.jobNrTextBox.Size = new System.Drawing.Size(437, 20);
+      this.jobNrTextBox.TabIndex = 1;
+      this.jobNrTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.jobNrTextBox_Validating);
+      // 
+      // durationLabel
+      // 
+      this.durationLabel.AutoSize = true;
+      this.durationLabel.Location = new System.Drawing.Point(3, 84);
+      this.durationLabel.Name = "durationLabel";
+      this.durationLabel.Size = new System.Drawing.Size(50, 13);
+      this.durationLabel.TabIndex = 0;
+      this.durationLabel.Text = "Duration:";
+      // 
+      // durationTextBox
+      // 
+      this.durationTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.durationTextBox.Location = new System.Drawing.Point(79, 81);
+      this.durationTextBox.Name = "durationTextBox";
+      this.durationTextBox.Size = new System.Drawing.Size(437, 20);
+      this.durationTextBox.TabIndex = 1;
+      this.durationTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.durationTextBox_Validating);
+      // 
+      // TaskView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.durationTextBox);
+      this.Controls.Add(this.durationLabel);
+      this.Controls.Add(this.jobNrTextBox);
+      this.Controls.Add(this.jobNrLabel);
+      this.Controls.Add(this.resourceNrTextBox);
+      this.Controls.Add(this.resourceNrLabel);
+      this.Controls.Add(this.taskNrTextBox);
+      this.Controls.Add(this.taskNrLabel);
+      this.Name = "TaskView";
+      this.Size = new System.Drawing.Size(519, 108);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label taskNrLabel;
+    private System.Windows.Forms.TextBox taskNrTextBox;
+    private System.Windows.Forms.Label resourceNrLabel;
+    private System.Windows.Forms.TextBox resourceNrTextBox;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.TextBox jobNrTextBox;
+    private System.Windows.Forms.Label jobNrLabel;
+    private System.Windows.Forms.TextBox durationTextBox;
+    private System.Windows.Forms.Label durationLabel;
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.cs	(revision 8886)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding.Views/3.3/TaskView.cs	(revision 8886)
@@ -0,0 +1,158 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Encodings.ScheduleEncoding.Views {
+  [View("TaskView")]
+  [Content(typeof(Task))]
+  public partial class TaskView : ItemView {
+    private bool SuppressEvents = false;
+
+    public new Task Content {
+      get { return (Task)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public TaskView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= Content_PropertyChanged;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += Content_PropertyChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        taskNrTextBox.Text = String.Empty;
+        resourceNrTextBox.Text = String.Empty;
+        jobNrTextBox.Text = String.Empty;
+        durationTextBox.Text = String.Empty;
+      } else {
+        SuppressEvents = true;
+        try {
+          taskNrTextBox.Text = Content.TaskNr.ToString();
+          resourceNrTextBox.Text = Content.ResourceNr.ToString();
+          jobNrTextBox.Text = Content.JobNr.ToString();
+          durationTextBox.Text = Content.Duration.ToString();
+        } finally { SuppressEvents = false; }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      taskNrTextBox.Enabled = !ReadOnly && !Locked && Content != null && !Content.IsScheduled;
+      resourceNrTextBox.Enabled = !ReadOnly && !Locked && Content != null && !Content.IsScheduled;
+      jobNrTextBox.Enabled = !ReadOnly && !Locked && Content != null && !Content.IsScheduled;
+      durationTextBox.Enabled = !ReadOnly && !Locked && Content != null && !Content.IsScheduled;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      SuppressEvents = true;
+      try {
+        switch (e.PropertyName) {
+          case "TaskNr":
+            taskNrTextBox.Text = Content.TaskNr.ToString();
+            break;
+          case "ResourceNr":
+            resourceNrTextBox.Text = Content.ResourceNr.ToString();
+            break;
+          case "JobNr":
+            jobNrTextBox.Text = Content.JobNr.ToString();
+            break;
+          case "Duration":
+            durationTextBox.Text = Content.Duration.ToString();
+            break;
+          case "IsScheduled":
+            SetEnabledStateOfControls();
+            break;
+          default:
+            break;
+        }
+      } finally {
+        SuppressEvents = false;
+      }
+    }
+
+    private void taskNrTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && taskNrTextBox.Enabled) {
+        int value;
+        if (int.TryParse(taskNrTextBox.Text, out value)) {
+          Content.TaskNr = value;
+          errorProvider.SetError(taskNrTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(taskNrTextBox, "Please provide a valid integer.");
+        }
+      }
+    }
+
+    private void resourceNrTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && taskNrTextBox.Enabled) {
+        int value;
+        if (int.TryParse(resourceNrTextBox.Text, out value)) {
+          Content.ResourceNr = value;
+          errorProvider.SetError(resourceNrTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(resourceNrTextBox, "Please provide a valid integer.");
+        }
+      }
+    }
+
+    private void jobNrTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && taskNrTextBox.Enabled) {
+        int value;
+        if (int.TryParse(jobNrTextBox.Text, out value)) {
+          Content.JobNr = value;
+          errorProvider.SetError(jobNrTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(jobNrTextBox, "Please provide a valid integer.");
+        }
+      }
+    }
+
+    private void durationTextBox_Validating(object sender, CancelEventArgs e) {
+      if (!SuppressEvents && Content != null && resourceNrTextBox.Enabled) {
+        double value;
+        if (double.TryParse(durationTextBox.Text, out value)) {
+          Content.Duration = value;
+          errorProvider.SetError(durationTextBox, String.Empty);
+        } else {
+          e.Cancel = true;
+          errorProvider.SetError(durationTextBox, "Please provide a valid double.");
+        }
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 8885)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Job.cs	(revision 8886)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.ComponentModel;
 using System.Text;
 using HeuristicLab.Common;
@@ -28,11 +29,36 @@
   [Item("Job", "Represents a composition of tasks that require processing in a scheduling problem.")]
   [StorableClass]
-  public class Job : Item {
-    [Storable]
-    public double DueDate { get; set; }
-    [Storable]
-    public int Index { get; set; }
-    [Storable]
-    public ItemList<Task> Tasks { get; set; }
+  public class Job : Item, INotifyPropertyChanged {
+    [Storable(Name = "DueDate")] private double dueDate;
+    public double DueDate {
+      get { return dueDate; }
+      set {
+        bool changed = dueDate != value;
+        dueDate = value;
+        if (changed) OnPropertyChanged("DueDate");
+      }
+    }
+
+    [Storable(Name = "Index")]
+    private int index;
+    public int Index {
+      get { return index; }
+      set {
+        bool changed = index != value;
+        index = value;
+        if (changed) OnPropertyChanged("Index");
+      }
+    }
+
+    [Storable(Name = "Tasks")]
+    private ItemList<Task> tasks; 
+    public ItemList<Task> Tasks {
+      get { return tasks; }
+      set {
+        bool changed = tasks != value;
+        tasks = value;
+        if (changed) OnPropertyChanged("Tasks");
+      }
+    }
 
     [StorableConstructor]
@@ -49,13 +75,11 @@
     public Job(int index, double dueDate)
       : base() {
+      DueDate = dueDate;
       Index = index;
       Tasks = new ItemList<Task>();
-
-      DueDate = dueDate;
-
     }
 
     public override string ToString() {
-      StringBuilder sb = new StringBuilder();
+      var sb = new StringBuilder();
       sb.Append("Job#" + Index + " [ ");
       foreach (Task t in Tasks) {
@@ -68,11 +92,13 @@
 
     internal Task GetPreviousTask(Task t) {
-      if (t.TaskNr == 0)
-        return null;
-      else
-        return Tasks[t.TaskNr - 1];
+      if (t.TaskNr == 0) return null;
+      return Tasks[t.TaskNr - 1];
     }
 
-
+    public event PropertyChangedEventHandler PropertyChanged;
+    protected virtual void OnPropertyChanged(string propertyName) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs
===================================================================
--- /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 8885)
+++ /trunk/sources/HeuristicLab.Encodings.ScheduleEncoding/3.3/ScheduleEncoding/Task.cs	(revision 8886)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.ComponentModel;
 using System.Text;
 using HeuristicLab.Common;
@@ -28,15 +29,58 @@
   [Item("Task", "Represents a task that has to be scheduled.")]
   [StorableClass]
-  public class Task : Item {
-    [Storable]
-    public int TaskNr { get; set; }
-    [Storable]
-    public int ResourceNr { get; set; }
-    [Storable]
-    public int JobNr { get; set; }
-    [Storable]
-    public double Duration { get; set; }
-    [Storable]
-    public bool IsScheduled { get; set; }
+  public class Task : Item, INotifyPropertyChanged {
+    [Storable(Name = "TaskNr")]
+    private int taskNr;
+    public int TaskNr {
+      get { return taskNr; }
+      set {
+        bool changed = taskNr != value;
+        taskNr = value;
+        if (changed) OnPropertyChanged("TaskNr");
+      }
+    }
+    [Storable(Name = "ResourceNr")]
+    private int resourceNr;
+    public int ResourceNr {
+      get { return resourceNr; }
+      set {
+        bool changed = resourceNr != value;
+        resourceNr = value;
+        if (changed) OnPropertyChanged("ResourceNr");
+      }
+    }
+
+    [Storable(Name = "JobNr")]
+    private int jobNr;
+    public int JobNr {
+      get { return jobNr; }
+      set {
+        bool changed = jobNr != value;
+        jobNr = value;
+        if (changed) OnPropertyChanged("JobNr");
+      }
+    }
+
+    [Storable(Name = "Duration")]
+    private double duration;
+    public double Duration {
+      get { return duration; }
+      set {
+        bool changed = duration != value;
+        duration = value;
+        if (changed) OnPropertyChanged("Duration");
+      }
+    }
+
+    [Storable(Name = "IsScheduled")]
+    private bool isScheduled;
+    public bool IsScheduled {
+      get { return isScheduled; }
+      set {
+        bool changed = isScheduled != value;
+        isScheduled = value;
+        if (changed) OnPropertyChanged("IsScheduled");
+      }
+    }
 
     [StorableConstructor]
@@ -86,4 +130,10 @@
         task1.TaskNr == task2.TaskNr);
     }
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    protected virtual void OnPropertyChanged(string propertyName) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.Scheduling.Views/3.3/HeuristicLab.Problems.Scheduling.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Scheduling.Views/3.3/HeuristicLab.Problems.Scheduling.Views-3.3.csproj	(revision 8885)
+++ /trunk/sources/HeuristicLab.Problems.Scheduling.Views/3.3/HeuristicLab.Problems.Scheduling.Views-3.3.csproj	(revision 8886)
@@ -103,6 +103,8 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 8885)
+++ /trunk/sources/HeuristicLab.Problems.Scheduling/3.3/JobShopSchedulingProblem.cs	(revision 8886)
@@ -79,15 +79,12 @@
     }
 
-    public ValueParameter<IntValue> JobsParameter {
-      get { return (ValueParameter<IntValue>)Parameters["Jobs"]; }
-    }
-    public ValueParameter<IntValue> ResourcesParameter {
-      get { return (ValueParameter<IntValue>)Parameters["Resources"]; }
+    public IFixedValueParameter<IntValue> JobsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Jobs"]; }
+    }
+    public IFixedValueParameter<IntValue> ResourcesParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Resources"]; }
     }
     public ValueParameter<SchedulingEvaluator> SolutionEvaluatorParameter {
       get { return (ValueParameter<SchedulingEvaluator>)Parameters["SolutionEvaluator"]; }
-    }
-    public ValueParameter<BoolValue> DueDatesParameter {
-      get { return (ValueParameter<BoolValue>)Parameters["DueDates"]; }
     }
     #endregion
@@ -102,19 +99,15 @@
       set { BestKnownSolutionParameter.Value = value; }
     }
-    public IntValue Jobs {
-      get { return JobsParameter.Value; }
-      set { JobsParameter.Value = value; }
-    }
-    public IntValue Resources {
-      get { return ResourcesParameter.Value; }
-      set { ResourcesParameter.Value = value; }
+    public int Jobs {
+      get { return JobsParameter.Value.Value; }
+      set { JobsParameter.Value.Value = value; }
+    }
+    public int Resources {
+      get { return ResourcesParameter.Value.Value; }
+      set { ResourcesParameter.Value.Value = value; }
     }
     public SchedulingEvaluator SolutionEvaluator {
       get { return SolutionEvaluatorParameter.Value; }
       set { SolutionEvaluatorParameter.Value = value; }
-    }
-    public BoolValue DueDates {
-      get { return DueDatesParameter.Value; }
-      set { DueDatesParameter.Value = value; }
     }
     public override Image ItemImage {
@@ -129,7 +122,6 @@
       Parameters.Add(new OptionalValueParameter<Schedule>("BestKnownSolution", "The best known solution of this JSSP instance."));
 
-      Parameters.Add(new ValueParameter<IntValue>("Jobs", "The number of jobs used in this JSSP instance.", new IntValue()));
-      Parameters.Add(new ValueParameter<IntValue>("Resources", "The number of resources used in this JSSP instance.", new IntValue()));
-      Parameters.Add(new ValueParameter<BoolValue>("DueDates", "Determines whether the problem instance uses due dates or not.", new BoolValue()));
+      Parameters.Add(new FixedValueParameter<IntValue>("Jobs", "The number of jobs used in this JSSP instance.", new IntValue()));
+      Parameters.Add(new FixedValueParameter<IntValue>("Resources", "The number of resources used in this JSSP instance.", new IntValue()));
       Parameters.Add(new ValueParameter<SchedulingEvaluator>("SolutionEvaluator", "The evaluator used to determine the quality of a solution.", new MakespanEvaluator()));
 
@@ -183,7 +175,6 @@
 
       JobData = jobData;
-      Jobs = new IntValue(data.Jobs);
-      Resources = new IntValue(data.Resources);
-      DueDates = new BoolValue(data.DueDates != null);
+      Jobs = data.Jobs;
+      Resources = data.Resources;
     }
 
@@ -192,14 +183,14 @@
         Name = Name,
         Description = Description,
-        Jobs = Jobs.Value,
-        Resources = Resources.Value,
-        ProcessingTimes = new double[Jobs.Value, Resources.Value],
-        Demands = new int[Jobs.Value, Resources.Value],
-        DueDates = (DueDates.Value ? new double[Jobs.Value] : null)
+        Jobs = Jobs,
+        Resources = Resources,
+        ProcessingTimes = new double[Jobs, Resources],
+        Demands = new int[Jobs, Resources],
+        DueDates = new double[Jobs]
       };
 
       foreach (var job in JobData) {
         var counter = 0;
-        if (DueDates.Value) result.DueDates[job.Index] = job.DueDate;
+        result.DueDates[job.Index] = job.DueDate;
         foreach (var task in job.Tasks) {
           result.ProcessingTimes[task.JobNr, counter] = task.Duration;
