Index: /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.Designer.cs	(revision 2843)
@@ -24,4 +24,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       this.targetVariableList = new System.Windows.Forms.CheckedListBox();
       this.inputVariableList = new System.Windows.Forms.CheckedListBox();
@@ -30,13 +31,10 @@
       this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.learningTaskGroupBox = new System.Windows.Forms.GroupBox();
+      this.editEngineButton = new System.Windows.Forms.Button();
       this.setAlgorithmDefault = new System.Windows.Forms.Button();
       this.autoregressiveLabel = new System.Windows.Forms.Label();
       this.classificationRadioButton = new System.Windows.Forms.RadioButton();
       this.algorithmsListBox = new System.Windows.Forms.CheckedListBox();
-      this.minTimeOffsetLabel = new System.Windows.Forms.Label();
-      this.minTimeOffsetTextBox = new System.Windows.Forms.TextBox();
-      this.maxTimeOffsetLabel = new System.Windows.Forms.Label();
       this.regressionRadioButton = new System.Windows.Forms.RadioButton();
-      this.maxTimeOffsetTextBox = new System.Windows.Forms.TextBox();
       this.timeSeriesRadioButton = new System.Windows.Forms.RadioButton();
       this.autoregressiveCheckBox = new System.Windows.Forms.CheckBox();
@@ -52,5 +50,5 @@
       this.testLabel = new System.Windows.Forms.Label();
       this.setAllButton = new System.Windows.Forms.Button();
-      this.editEngineButton = new System.Windows.Forms.Button();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
@@ -58,4 +56,5 @@
       this.learningTaskGroupBox.SuspendLayout();
       this.partitioningGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
       // 
@@ -136,9 +135,5 @@
       this.learningTaskGroupBox.Controls.Add(this.classificationRadioButton);
       this.learningTaskGroupBox.Controls.Add(this.algorithmsListBox);
-      this.learningTaskGroupBox.Controls.Add(this.minTimeOffsetLabel);
-      this.learningTaskGroupBox.Controls.Add(this.minTimeOffsetTextBox);
-      this.learningTaskGroupBox.Controls.Add(this.maxTimeOffsetLabel);
       this.learningTaskGroupBox.Controls.Add(this.regressionRadioButton);
-      this.learningTaskGroupBox.Controls.Add(this.maxTimeOffsetTextBox);
       this.learningTaskGroupBox.Controls.Add(this.timeSeriesRadioButton);
       this.learningTaskGroupBox.Controls.Add(this.autoregressiveCheckBox);
@@ -146,13 +141,24 @@
       this.learningTaskGroupBox.Location = new System.Drawing.Point(6, 236);
       this.learningTaskGroupBox.Name = "learningTaskGroupBox";
-      this.learningTaskGroupBox.Size = new System.Drawing.Size(343, 321);
+      this.learningTaskGroupBox.Size = new System.Drawing.Size(343, 341);
       this.learningTaskGroupBox.TabIndex = 36;
       this.learningTaskGroupBox.TabStop = false;
       this.learningTaskGroupBox.Text = "Learning task";
       // 
+      // editEngineButton
+      // 
+      this.editEngineButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.editEngineButton.Location = new System.Drawing.Point(108, 312);
+      this.editEngineButton.Name = "editEngineButton";
+      this.editEngineButton.Size = new System.Drawing.Size(75, 23);
+      this.editEngineButton.TabIndex = 37;
+      this.editEngineButton.Text = "Edit engine";
+      this.editEngineButton.UseVisualStyleBackColor = true;
+      this.editEngineButton.Click += new System.EventHandler(this.editEngineButton_Click);
+      // 
       // setAlgorithmDefault
       // 
       this.setAlgorithmDefault.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.setAlgorithmDefault.Location = new System.Drawing.Point(6, 292);
+      this.setAlgorithmDefault.Location = new System.Drawing.Point(6, 312);
       this.setAlgorithmDefault.Name = "setAlgorithmDefault";
       this.setAlgorithmDefault.Size = new System.Drawing.Size(96, 23);
@@ -191,40 +197,10 @@
       this.algorithmsListBox.FormattingEnabled = true;
       this.algorithmsListBox.HorizontalScrollbar = true;
-      this.algorithmsListBox.Location = new System.Drawing.Point(6, 155);
+      this.algorithmsListBox.Location = new System.Drawing.Point(6, 110);
       this.algorithmsListBox.Name = "algorithmsListBox";
-      this.algorithmsListBox.Size = new System.Drawing.Size(331, 124);
+      this.algorithmsListBox.Size = new System.Drawing.Size(331, 184);
       this.algorithmsListBox.TabIndex = 4;
       this.algorithmsListBox.SelectedIndexChanged += new System.EventHandler(this.algorithmsListBox_SelectedIndexChanged);
       this.algorithmsListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.algorithmsListBox_ItemCheck);
-      // 
-      // minTimeOffsetLabel
-      // 
-      this.minTimeOffsetLabel.AutoSize = true;
-      this.minTimeOffsetLabel.Enabled = false;
-      this.minTimeOffsetLabel.Location = new System.Drawing.Point(38, 106);
-      this.minTimeOffsetLabel.Name = "minTimeOffsetLabel";
-      this.minTimeOffsetLabel.Size = new System.Drawing.Size(87, 13);
-      this.minTimeOffsetLabel.TabIndex = 31;
-      this.minTimeOffsetLabel.Text = "Min. Time Offset:";
-      // 
-      // minTimeOffsetTextBox
-      // 
-      this.minTimeOffsetTextBox.Enabled = false;
-      this.minTimeOffsetTextBox.Location = new System.Drawing.Point(131, 103);
-      this.minTimeOffsetTextBox.Name = "minTimeOffsetTextBox";
-      this.minTimeOffsetTextBox.Size = new System.Drawing.Size(96, 20);
-      this.minTimeOffsetTextBox.TabIndex = 32;
-      this.minTimeOffsetTextBox.Validated += new System.EventHandler(this.timeOffsetTextBox_Validated);
-      this.minTimeOffsetTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.timeOffsetTextBox_Validating);
-      // 
-      // maxTimeOffsetLabel
-      // 
-      this.maxTimeOffsetLabel.AutoSize = true;
-      this.maxTimeOffsetLabel.Enabled = false;
-      this.maxTimeOffsetLabel.Location = new System.Drawing.Point(35, 132);
-      this.maxTimeOffsetLabel.Name = "maxTimeOffsetLabel";
-      this.maxTimeOffsetLabel.Size = new System.Drawing.Size(90, 13);
-      this.maxTimeOffsetLabel.TabIndex = 33;
-      this.maxTimeOffsetLabel.Text = "Max. Time Offset:";
       // 
       // regressionRadioButton
@@ -238,14 +214,4 @@
       this.regressionRadioButton.UseVisualStyleBackColor = true;
       this.regressionRadioButton.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);
-      // 
-      // maxTimeOffsetTextBox
-      // 
-      this.maxTimeOffsetTextBox.Enabled = false;
-      this.maxTimeOffsetTextBox.Location = new System.Drawing.Point(131, 129);
-      this.maxTimeOffsetTextBox.Name = "maxTimeOffsetTextBox";
-      this.maxTimeOffsetTextBox.Size = new System.Drawing.Size(96, 20);
-      this.maxTimeOffsetTextBox.TabIndex = 34;
-      this.maxTimeOffsetTextBox.Validated += new System.EventHandler(this.timeOffsetTextBox_Validated);
-      this.maxTimeOffsetTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.timeOffsetTextBox_Validating);
       // 
       // timeSeriesRadioButton
@@ -285,7 +251,7 @@
       this.partitioningGroupBox.Controls.Add(this.testLabel);
       this.partitioningGroupBox.Enabled = false;
-      this.partitioningGroupBox.Location = new System.Drawing.Point(6, 563);
+      this.partitioningGroupBox.Location = new System.Drawing.Point(6, 583);
       this.partitioningGroupBox.Name = "partitioningGroupBox";
-      this.partitioningGroupBox.Size = new System.Drawing.Size(343, 122);
+      this.partitioningGroupBox.Size = new System.Drawing.Size(343, 102);
       this.partitioningGroupBox.TabIndex = 26;
       this.partitioningGroupBox.TabStop = false;
@@ -294,5 +260,5 @@
       // validationSamplesEndTextBox
       // 
-      this.validationSamplesEndTextBox.Location = new System.Drawing.Point(221, 43);
+      this.validationSamplesEndTextBox.Location = new System.Drawing.Point(222, 45);
       this.validationSamplesEndTextBox.Name = "validationSamplesEndTextBox";
       this.validationSamplesEndTextBox.Size = new System.Drawing.Size(96, 20);
@@ -304,5 +270,5 @@
       // 
       this.trainingLabel.AutoSize = true;
-      this.trainingLabel.Location = new System.Drawing.Point(13, 20);
+      this.trainingLabel.Location = new System.Drawing.Point(14, 22);
       this.trainingLabel.Name = "trainingLabel";
       this.trainingLabel.Size = new System.Drawing.Size(89, 13);
@@ -312,5 +278,5 @@
       // trainingSamplesStartTextBox
       // 
-      this.trainingSamplesStartTextBox.Location = new System.Drawing.Point(119, 17);
+      this.trainingSamplesStartTextBox.Location = new System.Drawing.Point(120, 19);
       this.trainingSamplesStartTextBox.Name = "trainingSamplesStartTextBox";
       this.trainingSamplesStartTextBox.Size = new System.Drawing.Size(96, 20);
@@ -321,5 +287,5 @@
       // trainingSamplesEndTextBox
       // 
-      this.trainingSamplesEndTextBox.Location = new System.Drawing.Point(221, 17);
+      this.trainingSamplesEndTextBox.Location = new System.Drawing.Point(222, 19);
       this.trainingSamplesEndTextBox.Name = "trainingSamplesEndTextBox";
       this.trainingSamplesEndTextBox.Size = new System.Drawing.Size(96, 20);
@@ -331,5 +297,5 @@
       // 
       this.validationLabel.AutoSize = true;
-      this.validationLabel.Location = new System.Drawing.Point(5, 46);
+      this.validationLabel.Location = new System.Drawing.Point(6, 48);
       this.validationLabel.Name = "validationLabel";
       this.validationLabel.Size = new System.Drawing.Size(97, 13);
@@ -339,5 +305,5 @@
       // testSamplesEndTextBox
       // 
-      this.testSamplesEndTextBox.Location = new System.Drawing.Point(221, 68);
+      this.testSamplesEndTextBox.Location = new System.Drawing.Point(222, 70);
       this.testSamplesEndTextBox.Name = "testSamplesEndTextBox";
       this.testSamplesEndTextBox.Size = new System.Drawing.Size(96, 20);
@@ -348,5 +314,5 @@
       // validationSamplesStartTextBox
       // 
-      this.validationSamplesStartTextBox.Location = new System.Drawing.Point(119, 43);
+      this.validationSamplesStartTextBox.Location = new System.Drawing.Point(120, 45);
       this.validationSamplesStartTextBox.Name = "validationSamplesStartTextBox";
       this.validationSamplesStartTextBox.Size = new System.Drawing.Size(96, 20);
@@ -357,5 +323,5 @@
       // testSamplesStartTextBox
       // 
-      this.testSamplesStartTextBox.Location = new System.Drawing.Point(119, 68);
+      this.testSamplesStartTextBox.Location = new System.Drawing.Point(120, 70);
       this.testSamplesStartTextBox.Name = "testSamplesStartTextBox";
       this.testSamplesStartTextBox.Size = new System.Drawing.Size(96, 20);
@@ -367,5 +333,5 @@
       // 
       this.testLabel.AutoSize = true;
-      this.testLabel.Location = new System.Drawing.Point(30, 71);
+      this.testLabel.Location = new System.Drawing.Point(31, 73);
       this.testLabel.Name = "testLabel";
       this.testLabel.Size = new System.Drawing.Size(72, 13);
@@ -384,13 +350,7 @@
       this.setAllButton.Click += new System.EventHandler(this.setAllButton_Click);
       // 
-      // editEngineButton
-      // 
-      this.editEngineButton.Location = new System.Drawing.Point(108, 292);
-      this.editEngineButton.Name = "editEngineButton";
-      this.editEngineButton.Size = new System.Drawing.Size(75, 23);
-      this.editEngineButton.TabIndex = 37;
-      this.editEngineButton.Text = "Edit engine";
-      this.editEngineButton.UseVisualStyleBackColor = true;
-      this.editEngineButton.Click += new System.EventHandler(this.editEngineButton_Click);
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
       // 
       // DispatcherView
@@ -410,4 +370,5 @@
       this.partitioningGroupBox.ResumeLayout(false);
       this.partitioningGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
 
@@ -436,13 +397,10 @@
     private System.Windows.Forms.Label autoregressiveLabel;
     private System.Windows.Forms.RadioButton classificationRadioButton;
-    private System.Windows.Forms.Label minTimeOffsetLabel;
-    private System.Windows.Forms.TextBox minTimeOffsetTextBox;
-    private System.Windows.Forms.Label maxTimeOffsetLabel;
     private System.Windows.Forms.RadioButton regressionRadioButton;
-    private System.Windows.Forms.TextBox maxTimeOffsetTextBox;
     private System.Windows.Forms.RadioButton timeSeriesRadioButton;
     private System.Windows.Forms.CheckBox autoregressiveCheckBox;
     private System.Windows.Forms.Button setAlgorithmDefault;
     private System.Windows.Forms.Button editEngineButton;
+    private System.Windows.Forms.ErrorProvider errorProvider;
   }
 }
Index: /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.cs	(revision 2843)
@@ -102,6 +102,4 @@
       testSamplesStartTextBox.Text = selectedSpec.TestSamplesStart.ToString();
       testSamplesEndTextBox.Text = selectedSpec.TestSamplesEnd.ToString();
-      minTimeOffsetTextBox.Text = selectedSpec.MinTimeOffset.ToString();
-      maxTimeOffsetTextBox.Text = selectedSpec.MaxTimeOffset.ToString();
       autoregressiveCheckBox.Checked = selectedSpec.AutoRegressive;
     }
@@ -136,6 +134,4 @@
           ProblemSpecification spec = dispatcher.GetProblemSpecification(targetVar);
           spec.LearningTask = selectedSpec.LearningTask;
-          spec.MinTimeOffset = selectedSpec.MinTimeOffset;
-          spec.MaxTimeOffset = selectedSpec.MaxTimeOffset;
           spec.AutoRegressive = selectedSpec.AutoRegressive;
           var curAllowedAlgos = dispatcher.GetAllowedAlgorithms(targetVar).ToList();
@@ -157,8 +153,4 @@
 
     private void radioButton_CheckedChanged(object sender, EventArgs e) {
-      minTimeOffsetLabel.Enabled = timeSeriesRadioButton.Checked;
-      minTimeOffsetTextBox.Enabled = timeSeriesRadioButton.Checked;
-      maxTimeOffsetLabel.Enabled = timeSeriesRadioButton.Checked;
-      maxTimeOffsetTextBox.Enabled = timeSeriesRadioButton.Checked;
       autoregressiveCheckBox.Enabled = timeSeriesRadioButton.Checked;
       autoregressiveLabel.Enabled = timeSeriesRadioButton.Checked;
@@ -171,16 +163,4 @@
       }
       UpdateAlgorithms();
-    }
-
-    private void timeOffsetTextBox_Validating(object sender, CancelEventArgs e) {
-      int min, max;
-      e.Cancel = !int.TryParse(minTimeOffsetTextBox.Text, out min);
-      e.Cancel = !int.TryParse(maxTimeOffsetTextBox.Text, out max);
-      e.Cancel = min > max;
-    }
-
-    private void timeOffsetTextBox_Validated(object sender, EventArgs e) {
-      selectedSpec.MinTimeOffset = int.Parse(minTimeOffsetTextBox.Text);
-      selectedSpec.MaxTimeOffset = int.Parse(maxTimeOffsetTextBox.Text);
     }
 
@@ -255,5 +235,4 @@
       editEngineButton.Enabled = algorithmsListBox.SelectedItems.Count > 0;
     }
-
   }
 }
Index: /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx	(revision 2842)
+++ /trunk/sources/HeuristicLab.CEDMA.Server/3.3/DispatcherView.resx	(revision 2843)
@@ -118,3 +118,6 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="errorProvider.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/ProblemSpecification.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Server/3.3/ProblemSpecification.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.CEDMA.Server/3.3/ProblemSpecification.cs	(revision 2843)
@@ -83,7 +83,4 @@
     }
 
-    public int MaxTimeOffset { get; set; }
-    public int MinTimeOffset { get; set; }
-
     public bool AutoRegressive { get; set; }
 
@@ -108,6 +105,4 @@
       LearningTask = original.LearningTask;
       TargetVariable = original.TargetVariable;
-      MinTimeOffset = original.MinTimeOffset;
-      MaxTimeOffset = original.MaxTimeOffset;
       AutoRegressive = original.AutoRegressive;
       TrainingSamplesStart = original.TrainingSamplesStart;
@@ -134,6 +129,4 @@
       return
         other.LearningTask == LearningTask &&
-        other.MinTimeOffset == MinTimeOffset &&
-        other.MaxTimeOffset == MaxTimeOffset &&
         other.AutoRegressive == AutoRegressive &&
         other.TargetVariable == TargetVariable &&
@@ -156,6 +149,4 @@
         LearningTask.GetHashCode() |
         TargetVariable.GetHashCode() |
-        MinTimeOffset.GetHashCode() |
-        MaxTimeOffset.GetHashCode() |
         AutoRegressive.GetHashCode() |
         TrainingSamplesStart.GetHashCode() |
Index: /trunk/sources/HeuristicLab.CEDMA.Server/3.3/SimpleDispatcher.cs
===================================================================
--- /trunk/sources/HeuristicLab.CEDMA.Server/3.3/SimpleDispatcher.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.CEDMA.Server/3.3/SimpleDispatcher.cs	(revision 2843)
@@ -106,4 +106,20 @@
     private object locker = new object();
 
+
+    public double TrainingSetPercentageSize {
+      get;
+      set;
+    }
+
+    public int SkippedRowsBeginning {
+      get;
+      set;
+    }
+
+    public int SkippedRowsEnd {
+      get;
+      set;
+    }
+
     public SimpleDispatcher(IModelingDatabase database, Dataset dataset) {
       this.dataset = dataset;
@@ -117,6 +133,9 @@
       finishedAndDispatchedRuns = new Dictionary<string, List<AlgorithmConfiguration>>();
 
-      
+
       defaultAlgorithms = ApplicationManager.Manager.GetInstances<HeuristicLab.Modeling.IAlgorithm>().ToArray();
+
+      TrainingSetPercentageSize = 0.5;
+      SkippedRowsBeginning = 2;
 
       // PopulateFinishedRuns();
@@ -190,8 +209,5 @@
 
       if (spec.LearningTask == LearningTask.TimeSeries) {
-        ITimeSeriesAlgorithm timeSeriesAlgo = (ITimeSeriesAlgorithm)algo;
-        timeSeriesAlgo.MinTimeOffset = spec.MinTimeOffset;
-        timeSeriesAlgo.MaxTimeOffset = spec.MaxTimeOffset;
-        timeSeriesAlgo.TrainingSamplesStart = spec.TrainingSamplesStart - spec.MinTimeOffset + 1; // first possible index is 1 because of differential symbol
+        algo.TrainingSamplesStart = spec.TrainingSamplesStart + 1; // first possible index is 1 because of differential symbol
         if (spec.AutoRegressive) {
           allowedFeatures.Add(spec.TargetVariable);
@@ -255,4 +271,5 @@
         if (!(double.IsNaN(x) || double.IsInfinity(x))) break;
       }
+      firstValueIndex += SkippedRowsBeginning;
       // find index of last correct target value
       int lastValueIndex;
@@ -261,10 +278,11 @@
         if (!(double.IsNaN(x) || double.IsInfinity(x))) break;
       }
+      lastValueIndex -= SkippedRowsEnd;
 
       int validTargetRange = lastValueIndex - firstValueIndex;
       spec.TrainingSamplesStart = firstValueIndex;
-      spec.TrainingSamplesEnd = firstValueIndex + (int)Math.Floor(validTargetRange * 0.5);
+      spec.TrainingSamplesEnd = firstValueIndex + (int)Math.Floor(validTargetRange * TrainingSetPercentageSize);
       spec.ValidationSamplesStart = spec.TrainingSamplesEnd;
-      spec.ValidationSamplesEnd = firstValueIndex + (int)Math.Floor(validTargetRange * 0.75);
+      spec.ValidationSamplesEnd = spec.TrainingSamplesEnd + (int)Math.Floor(validTargetRange * (1 - TrainingSetPercentageSize) / 2.0);
       spec.TestSamplesStart = spec.ValidationSamplesEnd;
       spec.TestSamplesEnd = lastValueIndex;
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification.Networks/3.2/FunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification.Networks/3.2/FunctionLibraryInjector.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification.Networks/3.2/FunctionLibraryInjector.cs	(revision 2843)
@@ -28,11 +28,4 @@
 namespace HeuristicLab.GP.StructureIdentification.Networks {
   public class FunctionLibraryInjector : FunctionLibraryInjectorBase {
-    public const string MINTIMEOFFSET = "MinTimeOffset";
-    public const string MAXTIMEOFFSET = "MaxTimeOffset";
-
-    public const string DIFFERENTIALS_ALLOWED = "Differentials";
-
-    private int minTimeOffset;
-    private int maxTimeOffset;
 
     public override string Description {
@@ -40,34 +33,9 @@
     }
 
-    public FunctionLibraryInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo(MINTIMEOFFSET, "Minimal time offset for all features", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo(MAXTIMEOFFSET, "Maximal time offset for all feature", typeof(IntData), VariableKind.In));
-
-      AddVariable(DIFFERENTIALS_ALLOWED, false);
+    protected override FunctionLibrary CreateFunctionLibrary() {
+      return Create();
     }
 
-    private void AddVariable(string name, bool allowed) {
-      AddVariableInfo(new VariableInfo(name, name + " allowed", typeof(BoolData), Core.VariableKind.New));
-      GetVariableInfo(name).Local = true;
-      AddVariable(new Core.Variable(name, new BoolData(allowed)));
-    }
-
-    public override IOperation Apply(IScope scope) {
-      // try to get minTimeOffset (use 0 as default if not available)
-      IItem minTimeOffsetItem = GetVariableValue(MINTIMEOFFSET, scope, true, false);
-      minTimeOffset = minTimeOffsetItem == null ? 0 : ((IntData)minTimeOffsetItem).Data;
-      // try to get maxTimeOffset (use 0 as default if not available)
-      IItem maxTimeOffsetItem = GetVariableValue(MAXTIMEOFFSET, scope, true, false);
-      maxTimeOffset = maxTimeOffsetItem == null ? 0 : ((IntData)maxTimeOffsetItem).Data;
-
-      return base.Apply(scope);
-    }
-
-    protected override FunctionLibrary CreateFunctionLibrary() {
-      return Create(minTimeOffset, maxTimeOffset);
-    }
-
-    public static FunctionLibrary Create(int minTimeOffset, int maxTimeOffset) {
+    public static FunctionLibrary Create() {
       FunctionLibrary functionLibrary = new FunctionLibrary();
 
@@ -147,7 +115,5 @@
       f2Functions.ForEach(x => functionLibrary.AddFunction(x));
 
-      variable.SetConstraints(minTimeOffset, maxTimeOffset);
-      differential.SetConstraints(minTimeOffset, maxTimeOffset);
-      openPar.SetConstraints(minTimeOffset, maxTimeOffset);
+      openPar.SetConstraints(0, 0);
 
 
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/OffspringSelectionGPTimeSeriesPrognosis.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/OffspringSelectionGPTimeSeriesPrognosis.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/OffspringSelectionGPTimeSeriesPrognosis.cs	(revision 2843)
@@ -35,35 +35,6 @@
     }
 
-    public int MinTimeOffset {
-      get { return GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data; }
-      set { GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data = value; }
-    }
-
-    public int MaxTimeOffset {
-      get { return GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data; }
-      set { GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data = value; }
-    }
-
     protected override IOperator CreateProblemInjector() {
       return DefaultTimeSeriesOperators.CreateProblemInjector();
-    }
-
-    protected override IOperator CreateFunctionLibraryInjector() {
-      CombinedOperator op = new CombinedOperator();
-      op.Name = "FunctionLibraryInjector";
-      SequentialProcessor seq = new SequentialProcessor();
-      DefaultFunctionLibraryInjector funLibInjector = new DefaultFunctionLibraryInjector();
-      seq.AddSubOperator(funLibInjector);
-      seq.AddSubOperator(new ScalingTreeEvaluatorInjector());
-      op.OperatorGraph.AddOperator(seq);
-      op.OperatorGraph.InitialOperator = seq;
-      return op;
-    }
-
-    protected override VariableInjector CreateGlobalInjector() {
-      VariableInjector injector = base.CreateGlobalInjector();
-      injector.AddVariable(new HeuristicLab.Core.Variable("MinTimeOffset", new IntData()));
-      injector.AddVariable(new HeuristicLab.Core.Variable("MaxTimeOffset", new IntData()));
-      return injector;
     }
 
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/StandardGPTimeSeriesPrognosis.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/StandardGPTimeSeriesPrognosis.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification.TimeSeries/3.3/StandardGPTimeSeriesPrognosis.cs	(revision 2843)
@@ -35,39 +35,10 @@
     }
 
-    public int MinTimeOffset {
-      get { return GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data; }
-      set { GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data = value; }
-    }
-
-    public int MaxTimeOffset {
-      get { return GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data; }
-      set { GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data = value; }
-    }
-
     protected override IOperator CreateProblemInjector() {
       return DefaultTimeSeriesOperators.CreateProblemInjector();
     }
 
-    protected override IOperator CreateFunctionLibraryInjector() {
-      CombinedOperator op = new CombinedOperator();
-      op.Name = "FunctionLibraryInjector";
-      SequentialProcessor seq = new SequentialProcessor();
-      DefaultFunctionLibraryInjector funLibInjector = new DefaultFunctionLibraryInjector();
-      seq.AddSubOperator(funLibInjector);
-      seq.AddSubOperator(new ScalingTreeEvaluatorInjector());
-      op.OperatorGraph.AddOperator(seq);
-      op.OperatorGraph.InitialOperator = seq;
-      return op;
-    }
-
     protected override IOperator CreateModelAnalyzerOperator() {
       return DefaultTimeSeriesOperators.CreatePostProcessingOperator();
-    }
-
-    protected override VariableInjector CreateGlobalInjector() {
-      VariableInjector injector = base.CreateGlobalInjector();
-      injector.AddVariable(new HeuristicLab.Core.Variable("MinTimeOffset", new IntData()));
-      injector.AddVariable(new HeuristicLab.Core.Variable("MaxTimeOffset", new IntData()));
-      return injector;
     }
 
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/ArithmeticFunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/ArithmeticFunctionLibraryInjector.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/ArithmeticFunctionLibraryInjector.cs	(revision 2843)
@@ -29,29 +29,6 @@
   [SymbolicRegressionFunctionLibraryInjector]
   public class ArithmeticFunctionLibraryInjector : FunctionLibraryInjectorBase {
-    public const string MINTIMEOFFSET = "MinTimeOffset";
-    public const string MAXTIMEOFFSET = "MaxTimeOffset";
-
-    private int minTimeOffset;
-    private int maxTimeOffset;
-
     public override string Description {
       get { return @"Injects a function library with (+, -, *,  /) symbols."; }
-    }
-
-    public ArithmeticFunctionLibraryInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo(MINTIMEOFFSET, "Minimal time offset for all features", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo(MAXTIMEOFFSET, "Maximal time offset for all feature", typeof(IntData), VariableKind.In));
-    }
-
-    public override IOperation Apply(IScope scope) {
-      // try to get minTimeOffset (use 0 as default if not available)
-      IItem minTimeOffsetItem = GetVariableValue(MINTIMEOFFSET, scope, true, false);
-      minTimeOffset = minTimeOffsetItem == null ? 0 : ((IntData)minTimeOffsetItem).Data;
-      // try to get maxTimeOffset (use 0 as default if not available)
-      IItem maxTimeOffsetItem = GetVariableValue(MAXTIMEOFFSET, scope, true, false);
-      maxTimeOffset = maxTimeOffsetItem == null ? 0 : ((IntData)maxTimeOffsetItem).Data;
-
-      return base.Apply(scope);
     }
 
@@ -78,7 +55,4 @@
       doubleFunctions.ForEach(fun => functionLibrary.AddFunction(fun));
 
-      variable.SetConstraints(minTimeOffset, maxTimeOffset);
-      differential.SetConstraints(minTimeOffset, maxTimeOffset);
-
       return functionLibrary;
     }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/DefaultFunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/DefaultFunctionLibraryInjector.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/DefaultFunctionLibraryInjector.cs	(revision 2843)
@@ -29,29 +29,6 @@
   [SymbolicRegressionFunctionLibraryInjector]
   public class DefaultFunctionLibraryInjector : FunctionLibraryInjectorBase {
-    public const string MINTIMEOFFSET = "MinTimeOffset";
-    public const string MAXTIMEOFFSET = "MaxTimeOffset";
-
-    private int minTimeOffset;
-    private int maxTimeOffset;
-
     public override string Description {
       get { return @"Injects a default function library for regression and classification problems."; }
-    }
-
-    public DefaultFunctionLibraryInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo(MINTIMEOFFSET, "Minimal time offset for all features", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo(MAXTIMEOFFSET, "Maximal time offset for all feature", typeof(IntData), VariableKind.In));
-    }
-
-    public override IOperation Apply(IScope scope) {
-      // try to get minTimeOffset (use 0 as default if not available)
-      IItem minTimeOffsetItem = GetVariableValue(MINTIMEOFFSET, scope, true, false);
-      minTimeOffset = minTimeOffsetItem == null ? 0 : ((IntData)minTimeOffsetItem).Data;
-      // try to get maxTimeOffset (use 0 as default if not available)
-      IItem maxTimeOffsetItem = GetVariableValue(MAXTIMEOFFSET, scope, true, false);
-      maxTimeOffset = maxTimeOffsetItem == null ? 0 : ((IntData)maxTimeOffsetItem).Data;
-
-      return base.Apply(scope);
     }
 
@@ -121,7 +98,4 @@
       booleanFunctions.ForEach(fun => functionLibrary.AddFunction(fun));
 
-      variable.SetConstraints(minTimeOffset, maxTimeOffset);
-      differential.SetConstraints(minTimeOffset, maxTimeOffset);
-
       return functionLibrary;
     }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/SimpleFunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/SimpleFunctionLibraryInjector.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/SimpleFunctionLibraryInjector.cs	(revision 2843)
@@ -29,38 +29,13 @@
   [SymbolicRegressionFunctionLibraryInjector]
   public class SimpleFunctionLibraryInjector : FunctionLibraryInjectorBase {
-    public const string MINTIMEOFFSET = "MinTimeOffset";
-    public const string MAXTIMEOFFSET = "MaxTimeOffset";
-
-    private int minTimeOffset;
-    private int maxTimeOffset;
-
     public override string Description {
       get { return @"Injects a simple function library for regression and classification problems."; }
     }
 
-    public SimpleFunctionLibraryInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo(MINTIMEOFFSET, "Minimal time offset for all features", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo(MAXTIMEOFFSET, "Maximal time offset for all feature", typeof(IntData), VariableKind.In));
+    protected override FunctionLibrary CreateFunctionLibrary() {
+      return Create();
     }
 
-    public override IOperation Apply(IScope scope) {
-      // try to get minTimeOffset (use 0 as default if not available)
-      IItem minTimeOffsetItem = GetVariableValue(MINTIMEOFFSET, scope, true, false);
-      minTimeOffset = minTimeOffsetItem == null ? 0 : ((IntData)minTimeOffsetItem).Data;
-      // try to get maxTimeOffset (use 0 as default if not available)
-      IItem maxTimeOffsetItem = GetVariableValue(MAXTIMEOFFSET, scope, true, false);
-      maxTimeOffset = maxTimeOffsetItem == null ? 0 : ((IntData)maxTimeOffsetItem).Data;
-
-      return base.Apply(scope);
-    }
-
-    protected override FunctionLibrary CreateFunctionLibrary() {
-      return Create(
-        minTimeOffset,
-        maxTimeOffset);
-    }
-
-    public static FunctionLibrary Create(int minTimeOffset, int maxTimeOffset) {
+    public static FunctionLibrary Create() {
       FunctionLibrary functionLibrary = new FunctionLibrary();
 
@@ -111,7 +86,4 @@
       allFunctions.ForEach(x => functionLibrary.AddFunction(x));
 
-      variable.SetConstraints(minTimeOffset, maxTimeOffset);
-      differential.SetConstraints(minTimeOffset, maxTimeOffset);
-
       return functionLibrary;
     }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/UnconstrainedFunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/UnconstrainedFunctionLibraryInjector.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/FunctionLibraryInjectors/UnconstrainedFunctionLibraryInjector.cs	(revision 2843)
@@ -29,29 +29,6 @@
   [SymbolicRegressionFunctionLibraryInjector]
   public class UnconstrainedFunctionLibraryInjector : FunctionLibraryInjectorBase {
-    public const string MINTIMEOFFSET = "MinTimeOffset";
-    public const string MAXTIMEOFFSET = "MaxTimeOffset";
-
-    private int minTimeOffset;
-    private int maxTimeOffset;
-
     public override string Description {
       get { return @"Injects a function library for regression and classification problems."; }
-    }
-
-    public UnconstrainedFunctionLibraryInjector()
-      : base() {
-      AddVariableInfo(new VariableInfo(MINTIMEOFFSET, "Minimal time offset for all features", typeof(IntData), VariableKind.In));
-      AddVariableInfo(new VariableInfo(MAXTIMEOFFSET, "Maximal time offset for all feature", typeof(IntData), VariableKind.In));
-    }
-
-    public override IOperation Apply(IScope scope) {
-      // try to get minTimeOffset (use 0 as default if not available)
-      IItem minTimeOffsetItem = GetVariableValue(MINTIMEOFFSET, scope, true, false);
-      minTimeOffset = minTimeOffsetItem == null ? 0 : ((IntData)minTimeOffsetItem).Data;
-      // try to get maxTimeOffset (use 0 as default if not available)
-      IItem maxTimeOffsetItem = GetVariableValue(MAXTIMEOFFSET, scope, true, false);
-      maxTimeOffset = maxTimeOffsetItem == null ? 0 : ((IntData)maxTimeOffsetItem).Data;
-
-      return base.Apply(scope);
     }
 
@@ -113,16 +90,5 @@
       doubleFunctions.ForEach(fun => functionLibrary.AddFunction(fun));
 
-      variable.SetConstraints(minTimeOffset, maxTimeOffset);
-      differential.SetConstraints(minTimeOffset, maxTimeOffset);
-
       return functionLibrary;
-    }
-
-    private void ConditionalAddFunction(string condName, IFunction fun, List<IFunction> list) {
-      if (GetVariableValue<BoolData>(condName, null, false).Data) list.Add(fun);
-    }
-
-    private void ConditionalAddOperator(string condName, FunctionLibrary functionLib, IFunction op) {
-      if (GetVariableValue<BoolData>(condName, null, false).Data) functionLib.AddFunction(op);
     }
   }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/HeuristicLab.GP.StructureIdentification-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/HeuristicLab.GP.StructureIdentification-3.3.csproj	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/HeuristicLab.GP.StructureIdentification-3.3.csproj	(revision 2843)
@@ -112,4 +112,10 @@
     </Compile>
     <Compile Include="StandardGPRegression.cs" />
+    <Compile Include="Symbols\VariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Symbols\VariableView.Designer.cs">
+      <DependentUpon>VariableView.cs</DependentUpon>
+    </Compile>
     <Compile Include="VariableFrequencyAnalyser.cs" />
     <Compile Include="Symbols\Addition.cs" />
@@ -235,4 +241,7 @@
       <DependentUpon>PredictorView.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Symbols\VariableView.resx">
+      <DependentUpon>VariableView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Differential.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Differential.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Differential.cs	(revision 2843)
@@ -36,4 +36,8 @@
       return new VariableFunctionTree(this);
     }
+
+    public override HeuristicLab.Core.IView CreateView() {
+      return new VariableView(this);
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/Variable.cs	(revision 2843)
@@ -24,4 +24,5 @@
 using HeuristicLab.Random;
 using HeuristicLab.Data;
+using System.Xml;
 
 namespace HeuristicLab.GP.StructureIdentification {
@@ -32,5 +33,30 @@
 
     private int minOffset;
+    public int MinTimeOffset {
+      get {
+        return minOffset;
+      }
+      set {
+        if (value != minOffset) {
+          minOffset = value;
+          SetupInitialization();
+          SetupManipulation();
+        }
+      }
+    }
+
     private int maxOffset;
+    public int MaxTimeOffset {
+      get {
+        return maxOffset;
+      }
+      set {
+        if (value != maxOffset) {
+          maxOffset = value;
+          SetupManipulation();
+          SetupInitialization();
+        }
+      }
+    }
 
     public override string Description {
@@ -116,10 +142,31 @@
     }
 
-    public void SetConstraints(int minSampleOffset, int maxSampleOffset) {
-      this.minOffset = minSampleOffset;
-      this.maxOffset = maxSampleOffset;
-      SetupInitialization();
-      SetupManipulation();
+    public override HeuristicLab.Core.IView CreateView() {
+      return new VariableView(this);
     }
+
+    #region persistence
+    public override object Clone(System.Collections.Generic.IDictionary<System.Guid, object> clonedObjects) {
+      Variable clone = (Variable)base.Clone(clonedObjects);
+      clone.MaxTimeOffset = MaxTimeOffset;
+      clone.MinTimeOffset = MinTimeOffset;
+      return clone;
+    }
+    public override System.Xml.XmlNode GetXmlNode(string name, System.Xml.XmlDocument document, System.Collections.Generic.IDictionary<System.Guid, HeuristicLab.Core.IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      var minTimeOffsetAttr = document.CreateAttribute("MinTimeOffset");
+      minTimeOffsetAttr.Value = MinTimeOffset.ToString();
+      var maxTimeOffsetAttr = document.CreateAttribute("MaxTimeOffset");
+      maxTimeOffsetAttr.Value = MaxTimeOffset.ToString();
+      node.Attributes.Append(minTimeOffsetAttr);
+      node.Attributes.Append(maxTimeOffsetAttr);
+      return node;
+    }
+    public override void Populate(System.Xml.XmlNode node, System.Collections.Generic.IDictionary<System.Guid, HeuristicLab.Core.IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      MinTimeOffset = XmlConvert.ToInt32(node.Attributes["MinTimeOffset"].Value);
+      MaxTimeOffset = XmlConvert.ToInt32(node.Attributes["MaxTimeOffset"].Value);
+    }
+    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.Designer.cs	(revision 2843)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.Designer.cs	(revision 2843)
@@ -0,0 +1,145 @@
+﻿namespace HeuristicLab.GP.StructureIdentification {
+  partial class VariableView {
+    /// <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.label9 = new System.Windows.Forms.Label();
+      this.minTimeOffsetTextBox = new System.Windows.Forms.TextBox();
+      this.maxTimeOffsetTextBox = new System.Windows.Forms.TextBox();
+      this.label10 = new System.Windows.Forms.Label();
+      this.groupBox.SuspendLayout();
+      this.subTreesGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.functionPropertiesErrorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.maxTimeOffsetTextBox);
+      this.groupBox.Controls.Add(this.label10);
+      this.groupBox.Controls.Add(this.minTimeOffsetTextBox);
+      this.groupBox.Controls.Add(this.label9);
+      this.groupBox.Controls.SetChildIndex(this.label9, 0);
+      this.groupBox.Controls.SetChildIndex(this.minTimeOffsetTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label1, 0);
+      this.groupBox.Controls.SetChildIndex(this.minSubTreesTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label2, 0);
+      this.groupBox.Controls.SetChildIndex(this.maxSubTreesTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.nameLabel, 0);
+      this.groupBox.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label4, 0);
+      this.groupBox.Controls.SetChildIndex(this.minTreeHeightTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label3, 0);
+      this.groupBox.Controls.SetChildIndex(this.minTreeSizeTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label5, 0);
+      this.groupBox.Controls.SetChildIndex(this.ticketsTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label7, 0);
+      this.groupBox.Controls.SetChildIndex(this.label8, 0);
+      this.groupBox.Controls.SetChildIndex(this.editInitializerButton, 0);
+      this.groupBox.Controls.SetChildIndex(this.initializerTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.manipulatorTextBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.editManipulatorButton, 0);
+      this.groupBox.Controls.SetChildIndex(this.subTreesGroupBox, 0);
+      this.groupBox.Controls.SetChildIndex(this.label10, 0);
+      this.groupBox.Controls.SetChildIndex(this.maxTimeOffsetTextBox, 0);
+      // 
+      // minSubTreesTextBox
+      // 
+      this.minSubTreesTextBox.Enabled = false;
+      // 
+      // label1
+      // 
+      this.label1.Enabled = false;
+      // 
+      // maxSubTreesTextBox
+      // 
+      this.maxSubTreesTextBox.Enabled = false;
+      // 
+      // label2
+      // 
+      this.label2.Enabled = false;
+      // 
+      // subFunctionsListBox
+      // 
+      this.subFunctionsListBox.Size = new System.Drawing.Size(405, 173);
+      // 
+      // subTreesGroupBox
+      // 
+      this.subTreesGroupBox.Location = new System.Drawing.Point(9, 280);
+      this.subTreesGroupBox.Size = new System.Drawing.Size(417, 228);
+      // 
+      // label9
+      // 
+      this.label9.AutoSize = true;
+      this.label9.Location = new System.Drawing.Point(9, 231);
+      this.label9.Name = "label9";
+      this.label9.Size = new System.Drawing.Size(81, 13);
+      this.label9.TabIndex = 23;
+      this.label9.Text = "Min. time offset:";
+      // 
+      // minTimeOffsetTextBox
+      // 
+      this.minTimeOffsetTextBox.Location = new System.Drawing.Point(126, 228);
+      this.minTimeOffsetTextBox.Name = "minTimeOffsetTextBox";
+      this.minTimeOffsetTextBox.Size = new System.Drawing.Size(100, 20);
+      this.minTimeOffsetTextBox.TabIndex = 24;
+      this.minTimeOffsetTextBox.TextChanged += new System.EventHandler(this.minTimeOffsetTextBox_TextChanged);
+      // 
+      // maxTimeOffsetTextBox
+      // 
+      this.maxTimeOffsetTextBox.Location = new System.Drawing.Point(126, 254);
+      this.maxTimeOffsetTextBox.Name = "maxTimeOffsetTextBox";
+      this.maxTimeOffsetTextBox.Size = new System.Drawing.Size(100, 20);
+      this.maxTimeOffsetTextBox.TabIndex = 26;
+      this.maxTimeOffsetTextBox.TextChanged += new System.EventHandler(this.maxTimeOffsetTextBox_TextChanged);
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(9, 257);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(84, 13);
+      this.label10.TabIndex = 25;
+      this.label10.Text = "Max. time offset:";
+      // 
+      // VariableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "VariableView";
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      this.subTreesGroupBox.ResumeLayout(false);
+      this.subTreesGroupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.functionPropertiesErrorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox maxTimeOffsetTextBox;
+    private System.Windows.Forms.Label label10;
+    private System.Windows.Forms.TextBox minTimeOffsetTextBox;
+    private System.Windows.Forms.Label label9;
+  }
+}
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.cs	(revision 2843)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.cs	(revision 2843)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.GP.StructureIdentification {
+  public partial class VariableView : FunctionView {
+    public Variable Variable {
+      get {
+        return (Variable)Item;
+      }
+      set {
+        Item = value;
+      }
+    }
+    public VariableView()
+      : base() {
+      InitializeComponent();
+    }
+
+    public VariableView(Variable variable)
+      : base() {
+      InitializeComponent();
+      Variable = variable;
+    }
+
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      minTimeOffsetTextBox.Text = Variable.MinTimeOffset.ToString();
+      maxTimeOffsetTextBox.Text = Variable.MaxTimeOffset.ToString();
+    }
+
+    private void minTimeOffsetTextBox_TextChanged(object sender, EventArgs e) {
+      int minTimeOffset;
+      if (int.TryParse(minTimeOffsetTextBox.Text, out minTimeOffset)) {
+        Variable.MinTimeOffset = minTimeOffset;
+        functionPropertiesErrorProvider.SetError(minTimeOffsetTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(minTimeOffsetTextBox, "Invalid value");
+      }
+    }
+
+    private void maxTimeOffsetTextBox_TextChanged(object sender, EventArgs e) {
+      int maxTimeOffset;
+      if (int.TryParse(maxTimeOffsetTextBox.Text, out maxTimeOffset)) {
+        Variable.MaxTimeOffset = maxTimeOffset;
+        functionPropertiesErrorProvider.SetError(maxTimeOffsetTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(maxTimeOffsetTextBox, "Invalid value");
+      }
+
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.resx
===================================================================
--- /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.resx	(revision 2843)
+++ /trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/Symbols/VariableView.resx	(revision 2843)
@@ -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="functionPropertiesErrorProvider.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.GP.Tests/NetworkFunctionLibraryTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.Tests/NetworkFunctionLibraryTest.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.Tests/NetworkFunctionLibraryTest.cs	(revision 2843)
@@ -57,5 +57,5 @@
       MersenneTwister twister = new MersenneTwister();
       Dataset ds = Util.CreateRandomDataset(twister, 1, 20);
-      randomTrees = Util.CreateRandomTrees(twister, ds, FunctionLibraryInjector.Create(-3, 0), N, 1, 100);
+      randomTrees = Util.CreateRandomTrees(twister, ds, FunctionLibraryInjector.Create(), N, 1, 100);
     }
 
Index: /trunk/sources/HeuristicLab.GP.Tests/NetworkToFunctionTransformerTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.Tests/NetworkToFunctionTransformerTest.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.Tests/NetworkToFunctionTransformerTest.cs	(revision 2843)
@@ -330,5 +330,5 @@
       MersenneTwister twister = new MersenneTwister();
       Dataset ds = Util.CreateRandomDataset(twister, 1, 20);
-      IFunctionTree[] randomTrees = Util.CreateRandomTrees(twister, ds, FunctionLibraryInjector.Create(0, 0), 1000, 1, 100);
+      IFunctionTree[] randomTrees = Util.CreateRandomTrees(twister, ds, FunctionLibraryInjector.Create(), 1000, 1, 100);
       foreach (var tree in randomTrees) {
         IEnumerable<IFunctionTree> actualTrees = NetworkToFunctionTransformer_Accessor.Transform(tree, new List<string>() { "a", "b", "c" });
Index: /trunk/sources/HeuristicLab.GP.Tests/SimpleFunctionLibraryTest.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.Tests/SimpleFunctionLibraryTest.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.Tests/SimpleFunctionLibraryTest.cs	(revision 2843)
@@ -56,5 +56,5 @@
       MersenneTwister twister = new MersenneTwister();
       Dataset ds = Util.CreateRandomDataset(twister, 1, 20);
-      randomTrees = Util.CreateRandomTrees(twister, ds, SimpleFunctionLibraryInjector.Create(-3, 0), N, 1, 100);
+      randomTrees = Util.CreateRandomTrees(twister, ds, SimpleFunctionLibraryInjector.Create(), N, 1, 100);
     }
 
Index: /trunk/sources/HeuristicLab.GP.Tests/Util.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.Tests/Util.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP.Tests/Util.cs	(revision 2843)
@@ -153,6 +153,6 @@
       functionLibrary.AddFunction(xor);
 
-      variable.SetConstraints(0, 0);
-      differential.SetConstraints(0, 0);
+      variable.MinTimeOffset = variable.MaxTimeOffset = 0;
+      differential.MinTimeOffset = differential.MaxTimeOffset = 0;
 
       return functionLibrary;
Index: /trunk/sources/HeuristicLab.GP/3.3/BaseClasses/FunctionLibraryInjectorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/BaseClasses/FunctionLibraryInjectorBase.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP/3.3/BaseClasses/FunctionLibraryInjectorBase.cs	(revision 2843)
@@ -33,5 +33,5 @@
 
     public override string Description {
-      get { return @"Descrption is missing."; }
+      get { return @"Description is missing."; }
     }
 
@@ -55,5 +55,5 @@
 
     public override IOperation Apply(IScope scope) {
-      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName(FUNCTIONLIBRARY), functionLibrary));
+      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName(FUNCTIONLIBRARY), (FunctionLibrary)functionLibrary.Clone()));
       return null;
     }
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs	(revision 2843)
@@ -335,28 +335,29 @@
     #endregion
 
-    private System.Windows.Forms.GroupBox groupBox;
-    private System.Windows.Forms.TextBox minSubTreesTextBox;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.TextBox nameTextBox;
-    private System.Windows.Forms.Label nameLabel;
-    private System.Windows.Forms.TextBox maxSubTreesTextBox;
-    private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.TextBox minTreeSizeTextBox;
-    private System.Windows.Forms.Label label3;
-    private System.Windows.Forms.TextBox minTreeHeightTextBox;
-    private System.Windows.Forms.Label label4;
-    private System.Windows.Forms.TextBox ticketsTextBox;
-    private System.Windows.Forms.Label label5;
-    private System.Windows.Forms.ListBox subFunctionsListBox;
-    private System.Windows.Forms.Label label7;
-    private System.Windows.Forms.Button editManipulatorButton;
-    private System.Windows.Forms.TextBox manipulatorTextBox;
-    private System.Windows.Forms.TextBox initializerTextBox;
-    private System.Windows.Forms.Button editInitializerButton;
-    private System.Windows.Forms.Label label8;
-    private System.Windows.Forms.ComboBox argumentComboBox;
-    private System.Windows.Forms.GroupBox subTreesGroupBox;
-    private System.Windows.Forms.Label label6;
-    private System.Windows.Forms.ErrorProvider functionPropertiesErrorProvider;
+    protected System.Windows.Forms.GroupBox groupBox;
+    protected System.Windows.Forms.TextBox minSubTreesTextBox;
+    protected System.Windows.Forms.Label label1;
+    protected System.Windows.Forms.TextBox nameTextBox;
+    protected System.Windows.Forms.Label nameLabel;
+    protected System.Windows.Forms.TextBox maxSubTreesTextBox;
+    protected System.Windows.Forms.Label label2;
+    protected System.Windows.Forms.TextBox minTreeSizeTextBox;
+    protected System.Windows.Forms.Label label3;
+    protected System.Windows.Forms.TextBox minTreeHeightTextBox;
+    protected System.Windows.Forms.Label label4;
+    protected System.Windows.Forms.TextBox ticketsTextBox;
+    protected System.Windows.Forms.Label label5;
+    protected System.Windows.Forms.ListBox subFunctionsListBox;
+    protected System.Windows.Forms.Label label7;
+    protected System.Windows.Forms.Button editManipulatorButton;
+    protected System.Windows.Forms.TextBox manipulatorTextBox;
+    protected System.Windows.Forms.TextBox initializerTextBox;
+    protected System.Windows.Forms.Button editInitializerButton;
+    protected System.Windows.Forms.Label label8;
+    protected System.Windows.Forms.ComboBox argumentComboBox;
+    protected System.Windows.Forms.GroupBox subTreesGroupBox;
+    protected System.Windows.Forms.Label label6;
+    protected System.Windows.Forms.ErrorProvider functionPropertiesErrorProvider;
+
 
   }
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs	(revision 2843)
@@ -30,34 +30,44 @@
 namespace HeuristicLab.GP {
   public partial class FunctionView : ViewBase {
-    private Function function;
+
     private const string ALL_SLOTS = "All";
     private string selectedSlot = ALL_SLOTS;
 
-    public FunctionView() {
+    public Function Function {
+      get {
+        return (Function)Item;
+      }
+      set {
+        Item = value;
+      }
+    }
+
+    public FunctionView()
+      : base() {
       InitializeComponent();
     }
 
     public FunctionView(Function function)
-      : this() {
-      this.function = function;
-      function.Changed += (sender, args) => UpdateControls();
-      Refresh();
+      : base() {
+      InitializeComponent();
+      Function = function;
+      UpdateControls();
     }
 
     protected override void UpdateControls() {
-      nameTextBox.Text = function.Name;
-      minSubTreesTextBox.Text = function.MinSubTrees.ToString();
-      maxSubTreesTextBox.Text = function.MaxSubTrees.ToString();
-      ticketsTextBox.Text = function.Tickets.ToString();
-      minTreeHeightTextBox.Text = function.MinTreeHeight.ToString();
-      minTreeSizeTextBox.Text = function.MinTreeSize.ToString();
-      if (function.Initializer != null) {
-        initializerTextBox.Text = function.Initializer.Name;
+      nameTextBox.Text = Function.Name;
+      minSubTreesTextBox.Text = Function.MinSubTrees.ToString();
+      maxSubTreesTextBox.Text = Function.MaxSubTrees.ToString();
+      ticketsTextBox.Text = Function.Tickets.ToString();
+      minTreeHeightTextBox.Text = Function.MinTreeHeight.ToString();
+      minTreeSizeTextBox.Text = Function.MinTreeSize.ToString();
+      if (Function.Initializer != null) {
+        initializerTextBox.Text = Function.Initializer.Name;
       } else {
         initializerTextBox.Enabled = false;
         editInitializerButton.Enabled = false;
       }
-      if (function.Manipulator != null) {
-        manipulatorTextBox.Text = function.Manipulator.Name;
+      if (Function.Manipulator != null) {
+        manipulatorTextBox.Text = Function.Manipulator.Name;
       } else {
         manipulatorTextBox.Enabled = false;
@@ -67,5 +77,5 @@
       argumentComboBox.Items.Clear();
       argumentComboBox.Items.Add(ALL_SLOTS);
-      for (int i = 0; i < function.MaxSubTrees; i++) {
+      for (int i = 0; i < Function.MaxSubTrees; i++) {
         argumentComboBox.Items.Add(i.ToString());
       }
@@ -75,10 +85,10 @@
 
     private void UpdateAllowedSubFunctionsList() {
-      if (function.MaxSubTrees > 0) {
+      if (Function.MaxSubTrees > 0) {
         subFunctionsListBox.Items.Clear();
         if (selectedSlot == ALL_SLOTS) {
-          IEnumerable<IFunction> functionSet = function.GetAllowedSubFunctions(0);
-          for (int i = 1; i < function.MaxSubTrees; i++) {
-            functionSet = functionSet.Intersect(function.GetAllowedSubFunctions(i));
+          IEnumerable<IFunction> functionSet = Function.GetAllowedSubFunctions(0);
+          for (int i = 1; i < Function.MaxSubTrees; i++) {
+            functionSet = functionSet.Intersect(Function.GetAllowedSubFunctions(i));
           }
           foreach (var subFun in functionSet) {
@@ -87,5 +97,5 @@
         } else {
           int slot = int.Parse(selectedSlot);
-          foreach (var subFun in function.GetAllowedSubFunctions(slot)) {
+          foreach (var subFun in Function.GetAllowedSubFunctions(slot)) {
             subFunctionsListBox.Items.Add(subFun);
           }
@@ -100,5 +110,5 @@
       string name = nameTextBox.Text;
       if (!string.IsNullOrEmpty(name)) {
-        function.Name = name;
+        Function.Name = name;
         functionPropertiesErrorProvider.SetError(nameTextBox, string.Empty);
       } else {
@@ -110,5 +120,5 @@
       int minSubTrees;
       if (int.TryParse(minSubTreesTextBox.Text, out minSubTrees) && minSubTrees >= 0) {
-        function.MinSubTrees = minSubTrees;
+        Function.MinSubTrees = minSubTrees;
         functionPropertiesErrorProvider.SetError(minSubTreesTextBox, string.Empty);
       } else {
@@ -120,5 +130,5 @@
       int maxSubTrees;
       if (int.TryParse(maxSubTreesTextBox.Text, out maxSubTrees) && maxSubTrees >= 0) {
-        function.MaxSubTrees = maxSubTrees;
+        Function.MaxSubTrees = maxSubTrees;
         functionPropertiesErrorProvider.SetError(maxSubTreesTextBox, string.Empty);
       } else {
@@ -130,5 +140,5 @@
       double tickets;
       if (double.TryParse(ticketsTextBox.Text, out tickets) && tickets >= 0) {
-        function.Tickets = tickets;
+        Function.Tickets = tickets;
         functionPropertiesErrorProvider.SetError(ticketsTextBox, string.Empty);
       } else {
@@ -138,9 +148,9 @@
 
     private void editInitializerButton_Click(object sender, EventArgs e) {
-      ControlManager.Manager.ShowControl(function.Initializer.CreateView());
+      ControlManager.Manager.ShowControl(Function.Initializer.CreateView());
     }
 
     private void editManipulatorButton_Click(object sender, EventArgs e) {
-      ControlManager.Manager.ShowControl(function.Manipulator.CreateView());
+      ControlManager.Manager.ShowControl(Function.Manipulator.CreateView());
     }
 
@@ -168,9 +178,9 @@
             Cursor = Cursors.WaitCursor;
             if (selectedSlot == ALL_SLOTS) {
-              for (int slot = 0; slot < function.MaxSubTrees; slot++)
-                function.AddAllowedSubFunction(fun, slot);
+              for (int slot = 0; slot < Function.MaxSubTrees; slot++)
+                Function.AddAllowedSubFunction(fun, slot);
             } else {
               int slot = int.Parse(selectedSlot);
-              function.AddAllowedSubFunction(fun, slot);
+              Function.AddAllowedSubFunction(fun, slot);
             }
           }
@@ -188,7 +198,7 @@
           if (selectedSlot == ALL_SLOTS) {
             List<IFunction> removedSubFunctions = new List<IFunction>(subFunctionsListBox.SelectedItems.Cast<IFunction>());
-            for (int slot = 0; slot < function.MaxSubTrees; slot++) {
+            for (int slot = 0; slot < Function.MaxSubTrees; slot++) {
               foreach (var subFun in removedSubFunctions) {
-                function.RemoveAllowedSubFunction((IFunction)subFun, slot);
+                Function.RemoveAllowedSubFunction((IFunction)subFun, slot);
               }
             }
@@ -197,5 +207,5 @@
             List<IFunction> removedSubFunctions = new List<IFunction>(subFunctionsListBox.SelectedItems.Cast<IFunction>());
             foreach (var subFun in removedSubFunctions) {
-              function.RemoveAllowedSubFunction(subFun, slot);
+              Function.RemoveAllowedSubFunction(subFun, slot);
             }
           }
Index: /trunk/sources/HeuristicLab.LinearRegression/3.2/LinearRegressionOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.LinearRegression/3.2/LinearRegressionOperator.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.LinearRegression/3.2/LinearRegressionOperator.cs	(revision 2843)
@@ -114,5 +114,5 @@
       int p = inputMatrix.GetLength(1);
       // no features allowed -> return constant offset
-      if (p == 0) return new double[] { Statistics.Mean(targetVector) };
+      if (p <= 1) return new double[] { Statistics.Mean(targetVector) };
       double[,] dataset = new double[n, p];
       for (int row = 0; row < n; row++) {
Index: /trunk/sources/HeuristicLab.Modeling/3.2/ITimeSeriesAlgorithm.cs
===================================================================
--- /trunk/sources/HeuristicLab.Modeling/3.2/ITimeSeriesAlgorithm.cs	(revision 2842)
+++ /trunk/sources/HeuristicLab.Modeling/3.2/ITimeSeriesAlgorithm.cs	(revision 2843)
@@ -27,6 +27,4 @@
 namespace HeuristicLab.Modeling {
   public interface ITimeSeriesAlgorithm : IAlgorithm {
-    int MinTimeOffset { get; set; }
-    int MaxTimeOffset { get; set; }
   }
 }
