Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionLibrary.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionLibrary.cs	(revision 2700)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionLibrary.cs	(revision 2701)
@@ -42,4 +42,5 @@
       if (!functions.Contains(fun)) {
         functions.Add(fun);
+        fun.Changed += new EventHandler(fun_Changed);
         OnChanged();
       }
@@ -48,4 +49,5 @@
     public void RemoveFunction(IFunction fun) {
       functions.Remove(fun);
+      fun.Changed -= new EventHandler(fun_Changed);
 
       // remove the operator from the allowed sub-functions of all functions
@@ -55,4 +57,8 @@
         }
       }
+      OnChanged();
+    }
+
+    void fun_Changed(object sender, EventArgs e) {
       OnChanged();
     }
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.Designer.cs	(revision 2700)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.Designer.cs	(revision 2701)
@@ -47,4 +47,12 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.functionsTabPage = new System.Windows.Forms.TabPage();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.availableFunctionsGroupBox = new System.Windows.Forms.GroupBox();
+      this.functionsListView = new System.Windows.Forms.ListView();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addButton = new System.Windows.Forms.Button();
+      this.functionDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.functionDetailsPanel = new System.Windows.Forms.Panel();
+      this.functionsComboBox = new System.Windows.Forms.ComboBox();
       this.initializationTabPage = new System.Windows.Forms.TabPage();
       this.initSplitContainer = new System.Windows.Forms.SplitContainer();
@@ -55,9 +63,11 @@
       this.mutationListView = new System.Windows.Forms.ListView();
       this.mutationVariableView = new HeuristicLab.Core.VariableView();
-      this.addButton = new System.Windows.Forms.Button();
-      this.removeButton = new System.Windows.Forms.Button();
-      this.functionsListView = new System.Windows.Forms.ListView();
       this.tabControl.SuspendLayout();
       this.functionsTabPage.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.availableFunctionsGroupBox.SuspendLayout();
+      this.functionDetailsGroupBox.SuspendLayout();
       this.initializationTabPage.SuspendLayout();
       this.initSplitContainer.Panel1.SuspendLayout();
@@ -84,7 +94,5 @@
       // functionsTabPage
       // 
-      this.functionsTabPage.Controls.Add(this.functionsListView);
-      this.functionsTabPage.Controls.Add(this.removeButton);
-      this.functionsTabPage.Controls.Add(this.addButton);
+      this.functionsTabPage.Controls.Add(this.splitContainer);
       this.functionsTabPage.Location = new System.Drawing.Point(4, 22);
       this.functionsTabPage.Name = "functionsTabPage";
@@ -94,4 +102,102 @@
       this.functionsTabPage.Text = "Functions";
       this.functionsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.availableFunctionsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.functionDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(663, 529);
+      this.splitContainer.SplitterDistance = 230;
+      this.splitContainer.TabIndex = 4;
+      // 
+      // availableFunctionsGroupBox
+      // 
+      this.availableFunctionsGroupBox.Controls.Add(this.functionsListView);
+      this.availableFunctionsGroupBox.Controls.Add(this.removeButton);
+      this.availableFunctionsGroupBox.Controls.Add(this.addButton);
+      this.availableFunctionsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.availableFunctionsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.availableFunctionsGroupBox.Name = "availableFunctionsGroupBox";
+      this.availableFunctionsGroupBox.Size = new System.Drawing.Size(230, 529);
+      this.availableFunctionsGroupBox.TabIndex = 5;
+      this.availableFunctionsGroupBox.TabStop = false;
+      this.availableFunctionsGroupBox.Text = "Available functions:";
+      // 
+      // functionsListView
+      // 
+      this.functionsListView.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.functionsListView.Location = new System.Drawing.Point(6, 19);
+      this.functionsListView.MultiSelect = false;
+      this.functionsListView.Name = "functionsListView";
+      this.functionsListView.Size = new System.Drawing.Size(218, 475);
+      this.functionsListView.TabIndex = 3;
+      this.functionsListView.UseCompatibleStateImageBehavior = false;
+      this.functionsListView.View = System.Windows.Forms.View.List;
+      this.functionsListView.SelectedIndexChanged += new System.EventHandler(this.functionsListView_SelectedIndexChanged);
+      this.functionsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.functionsListView_ItemDrag);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(87, 500);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addButton
+      // 
+      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addButton.Location = new System.Drawing.Point(6, 500);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_Click);
+      // 
+      // functionDetailsGroupBox
+      // 
+      this.functionDetailsGroupBox.Controls.Add(this.functionDetailsPanel);
+      this.functionDetailsGroupBox.Controls.Add(this.functionsComboBox);
+      this.functionDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.functionDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.functionDetailsGroupBox.Name = "functionDetailsGroupBox";
+      this.functionDetailsGroupBox.Size = new System.Drawing.Size(429, 529);
+      this.functionDetailsGroupBox.TabIndex = 8;
+      this.functionDetailsGroupBox.TabStop = false;
+      this.functionDetailsGroupBox.Text = "Function details:";
+      // 
+      // functionDetailsPanel
+      // 
+      this.functionDetailsPanel.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.functionDetailsPanel.Location = new System.Drawing.Point(6, 46);
+      this.functionDetailsPanel.Name = "functionDetailsPanel";
+      this.functionDetailsPanel.Size = new System.Drawing.Size(417, 477);
+      this.functionDetailsPanel.TabIndex = 7;
+      // 
+      // functionsComboBox
+      // 
+      this.functionsComboBox.FormattingEnabled = true;
+      this.functionsComboBox.Location = new System.Drawing.Point(6, 19);
+      this.functionsComboBox.Name = "functionsComboBox";
+      this.functionsComboBox.Size = new System.Drawing.Size(178, 21);
+      this.functionsComboBox.TabIndex = 0;
+      this.functionsComboBox.SelectedIndexChanged += new System.EventHandler(this.functionsComboBox_SelectedIndexChanged);
       // 
       // initializationTabPage
@@ -194,38 +300,4 @@
       this.mutationVariableView.Variable = null;
       // 
-      // addButton
-      // 
-      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.addButton.Location = new System.Drawing.Point(6, 506);
-      this.addButton.Name = "addButton";
-      this.addButton.Size = new System.Drawing.Size(75, 23);
-      this.addButton.TabIndex = 1;
-      this.addButton.Text = "Add...";
-      this.addButton.UseVisualStyleBackColor = true;
-      this.addButton.Click += new System.EventHandler(this.addButton_Click);
-      // 
-      // removeButton
-      // 
-      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.removeButton.Location = new System.Drawing.Point(87, 506);
-      this.removeButton.Name = "removeButton";
-      this.removeButton.Size = new System.Drawing.Size(75, 23);
-      this.removeButton.TabIndex = 2;
-      this.removeButton.Text = "Remove";
-      this.removeButton.UseVisualStyleBackColor = true;
-      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
-      // 
-      // functionsListView
-      // 
-      this.functionsListView.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.functionsListView.Location = new System.Drawing.Point(3, 6);
-      this.functionsListView.Name = "functionsListView";
-      this.functionsListView.Size = new System.Drawing.Size(660, 494);
-      this.functionsListView.TabIndex = 3;
-      this.functionsListView.UseCompatibleStateImageBehavior = false;
-      this.functionsListView.SelectedIndexChanged += new System.EventHandler(this.functionsListView_SelectedIndexChanged);
-      // 
       // FunctionLibraryEditor
       // 
@@ -237,4 +309,9 @@
       this.tabControl.ResumeLayout(false);
       this.functionsTabPage.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.availableFunctionsGroupBox.ResumeLayout(false);
+      this.functionDetailsGroupBox.ResumeLayout(false);
       this.initializationTabPage.ResumeLayout(false);
       this.initSplitContainer.Panel1.ResumeLayout(false);
@@ -264,4 +341,9 @@
     private System.Windows.Forms.Button addButton;
     private System.Windows.Forms.ListView functionsListView;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.Panel functionDetailsPanel;
+    private System.Windows.Forms.ComboBox functionsComboBox;
+    private System.Windows.Forms.GroupBox availableFunctionsGroupBox;
+    private System.Windows.Forms.GroupBox functionDetailsGroupBox;
   }
 }
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.cs	(revision 2700)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionLibraryEditor.cs	(revision 2701)
@@ -48,5 +48,9 @@
     protected override void UpdateControls() {
       base.UpdateControls();
+      functionsListView.Clear();
+      functionsComboBox.Items.Clear();
       foreach (IFunction fun in FunctionLibrary.Functions) {
+        functionsListView.Items.Add(CreateListViewItem(fun));
+        functionsComboBox.Items.Add(fun);
         if (fun.Manipulator != null) {
           mutationListView.Items.Add(CreateListViewItem(fun));
@@ -82,6 +86,4 @@
       if (chooseFunctionDialog.ShowDialog(this) == DialogResult.OK) {
         FunctionLibrary.AddFunction((IFunction)chooseFunctionDialog.Item);
-        functionsListView.Items.Add(CreateListViewItem((IFunction)chooseFunctionDialog.Item));
-        functionsListView.Sort();
       }
     }
@@ -89,13 +91,16 @@
     private void removeButton_Click(object sender, EventArgs e) {
       // delete from the end of the list
-      IEnumerable<int> removeIndices = functionsListView.SelectedIndices.OfType<int>().OrderBy(x => 1.0 / x);
+      List<int> removeIndices = functionsListView.SelectedIndices.OfType<int>().OrderBy(x => 1.0 / x).ToList();
       foreach (int selectedIndex in removeIndices) {
-        FunctionLibrary.RemoveFunction((IFunction)functionsListView.Items[selectedIndex].Tag);
-        functionsListView.Items.RemoveAt(selectedIndex);
+        FunctionLibrary.RemoveFunction((IFunction)functionsListView.Items[selectedIndex].Tag);        
       }
     }
 
     private void functionsListView_SelectedIndexChanged(object sender, EventArgs e) {
-      removeButton.Enabled = functionsListView.SelectedIndices.Count > 0;
+      if (functionsListView.SelectedIndices.Count > 0) {
+        removeButton.Enabled = true;
+      } else {
+        removeButton.Enabled = false;
+      }
     }
 
@@ -107,4 +112,23 @@
       return item;
     }
+
+    private void functionsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem item = (ListViewItem)e.Item;
+      IFunction fun = (IFunction)item.Tag;
+      DataObject data = new DataObject();
+      data.SetData("IFunction", fun);
+      data.SetData("DragSource", functionsListView);
+      DoDragDrop(data, DragDropEffects.Link);
+    }
+
+    private void functionsComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (functionsComboBox.SelectedItem != null) {
+        IFunction selectedFun = (IFunction)functionsComboBox.SelectedItem;
+        Control funView = (Control)selectedFun.CreateView();
+        funView.Dock = DockStyle.Fill;
+        functionDetailsPanel.Controls.Clear();
+        functionDetailsPanel.Controls.Add(funView);
+      }
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs	(revision 2701)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionView.Designer.cs	(revision 2701)
@@ -0,0 +1,362 @@
+#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;
+namespace HeuristicLab.GP {
+  partial class FunctionView {
+    /// <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.groupBox = new System.Windows.Forms.GroupBox();
+      this.subTreesGroupBox = new System.Windows.Forms.GroupBox();
+      this.label6 = new System.Windows.Forms.Label();
+      this.argumentComboBox = new System.Windows.Forms.ComboBox();
+      this.subFunctionsListBox = new System.Windows.Forms.ListBox();
+      this.editManipulatorButton = new System.Windows.Forms.Button();
+      this.manipulatorTextBox = new System.Windows.Forms.TextBox();
+      this.initializerTextBox = new System.Windows.Forms.TextBox();
+      this.editInitializerButton = new System.Windows.Forms.Button();
+      this.label8 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.ticketsTextBox = new System.Windows.Forms.TextBox();
+      this.label5 = new System.Windows.Forms.Label();
+      this.minTreeSizeTextBox = new System.Windows.Forms.TextBox();
+      this.label3 = new System.Windows.Forms.Label();
+      this.minTreeHeightTextBox = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.maxSubTreesTextBox = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.minSubTreesTextBox = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.functionPropertiesErrorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.groupBox.SuspendLayout();
+      this.subTreesGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.functionPropertiesErrorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.subTreesGroupBox);
+      this.groupBox.Controls.Add(this.editManipulatorButton);
+      this.groupBox.Controls.Add(this.manipulatorTextBox);
+      this.groupBox.Controls.Add(this.initializerTextBox);
+      this.groupBox.Controls.Add(this.editInitializerButton);
+      this.groupBox.Controls.Add(this.label8);
+      this.groupBox.Controls.Add(this.label7);
+      this.groupBox.Controls.Add(this.ticketsTextBox);
+      this.groupBox.Controls.Add(this.label5);
+      this.groupBox.Controls.Add(this.minTreeSizeTextBox);
+      this.groupBox.Controls.Add(this.label3);
+      this.groupBox.Controls.Add(this.minTreeHeightTextBox);
+      this.groupBox.Controls.Add(this.label4);
+      this.groupBox.Controls.Add(this.maxSubTreesTextBox);
+      this.groupBox.Controls.Add(this.label2);
+      this.groupBox.Controls.Add(this.minSubTreesTextBox);
+      this.groupBox.Controls.Add(this.label1);
+      this.groupBox.Controls.Add(this.nameTextBox);
+      this.groupBox.Controls.Add(this.nameLabel);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(432, 514);
+      this.groupBox.TabIndex = 0;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Function";
+      // 
+      // subTreesGroupBox
+      // 
+      this.subTreesGroupBox.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.subTreesGroupBox.Controls.Add(this.label6);
+      this.subTreesGroupBox.Controls.Add(this.argumentComboBox);
+      this.subTreesGroupBox.Controls.Add(this.subFunctionsListBox);
+      this.subTreesGroupBox.Location = new System.Drawing.Point(9, 228);
+      this.subTreesGroupBox.Name = "subTreesGroupBox";
+      this.subTreesGroupBox.Size = new System.Drawing.Size(417, 280);
+      this.subTreesGroupBox.TabIndex = 22;
+      this.subTreesGroupBox.TabStop = false;
+      this.subTreesGroupBox.Text = "Allowed sub trees:";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(6, 22);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(76, 13);
+      this.label6.TabIndex = 23;
+      this.label6.Text = "n-th Argument:";
+      // 
+      // argumentComboBox
+      // 
+      this.argumentComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.argumentComboBox.FormattingEnabled = true;
+      this.argumentComboBox.Location = new System.Drawing.Point(88, 19);
+      this.argumentComboBox.Name = "argumentComboBox";
+      this.argumentComboBox.Size = new System.Drawing.Size(129, 21);
+      this.argumentComboBox.TabIndex = 20;
+      this.argumentComboBox.SelectedIndexChanged += new System.EventHandler(this.argumentComboBox_SelectedIndexChanged);
+      // 
+      // subFunctionsListBox
+      // 
+      this.subFunctionsListBox.AllowDrop = true;
+      this.subFunctionsListBox.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.subFunctionsListBox.FormattingEnabled = true;
+      this.subFunctionsListBox.Location = new System.Drawing.Point(6, 46);
+      this.subFunctionsListBox.Name = "subFunctionsListBox";
+      this.subFunctionsListBox.Size = new System.Drawing.Size(405, 225);
+      this.subFunctionsListBox.TabIndex = 12;
+      this.subFunctionsListBox.DragOver += new System.Windows.Forms.DragEventHandler(this.subFunctionsListBox_DragOver);
+      this.subFunctionsListBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.subFunctionsListBox_DragDrop);
+      this.subFunctionsListBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.subFunctionsListBox_DragEnter);
+      this.subFunctionsListBox.KeyUp += new System.Windows.Forms.KeyEventHandler(this.subFunctionsListBox_KeyUp);
+      // 
+      // editManipulatorButton
+      // 
+      this.editManipulatorButton.Location = new System.Drawing.Point(232, 199);
+      this.editManipulatorButton.Name = "editManipulatorButton";
+      this.editManipulatorButton.Size = new System.Drawing.Size(75, 23);
+      this.editManipulatorButton.TabIndex = 19;
+      this.editManipulatorButton.Text = "Edit...";
+      this.editManipulatorButton.UseVisualStyleBackColor = true;
+      this.editManipulatorButton.Click += new System.EventHandler(this.editManipulatorButton_Click);
+      // 
+      // manipulatorTextBox
+      // 
+      this.manipulatorTextBox.Location = new System.Drawing.Point(126, 201);
+      this.manipulatorTextBox.Name = "manipulatorTextBox";
+      this.manipulatorTextBox.ReadOnly = true;
+      this.manipulatorTextBox.Size = new System.Drawing.Size(100, 20);
+      this.manipulatorTextBox.TabIndex = 18;
+      // 
+      // initializerTextBox
+      // 
+      this.initializerTextBox.Location = new System.Drawing.Point(126, 175);
+      this.initializerTextBox.Name = "initializerTextBox";
+      this.initializerTextBox.ReadOnly = true;
+      this.initializerTextBox.Size = new System.Drawing.Size(100, 20);
+      this.initializerTextBox.TabIndex = 17;
+      // 
+      // editInitializerButton
+      // 
+      this.editInitializerButton.Location = new System.Drawing.Point(232, 173);
+      this.editInitializerButton.Name = "editInitializerButton";
+      this.editInitializerButton.Size = new System.Drawing.Size(75, 23);
+      this.editInitializerButton.TabIndex = 16;
+      this.editInitializerButton.Text = "Edit...";
+      this.editInitializerButton.UseVisualStyleBackColor = true;
+      this.editInitializerButton.Click += new System.EventHandler(this.editInitializerButton_Click);
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(6, 204);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(65, 13);
+      this.label8.TabIndex = 15;
+      this.label8.Text = "Manipulator:";
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(6, 178);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(50, 13);
+      this.label7.TabIndex = 14;
+      this.label7.Text = "Initializer:";
+      // 
+      // ticketsTextBox
+      // 
+      this.ticketsTextBox.Location = new System.Drawing.Point(126, 97);
+      this.ticketsTextBox.Name = "ticketsTextBox";
+      this.ticketsTextBox.Size = new System.Drawing.Size(100, 20);
+      this.ticketsTextBox.TabIndex = 11;
+      this.ticketsTextBox.TextChanged += new System.EventHandler(this.ticketsTextBox_TextChanged);
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(6, 100);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(45, 13);
+      this.label5.TabIndex = 10;
+      this.label5.Text = "Tickets:";
+      // 
+      // minTreeSizeTextBox
+      // 
+      this.minTreeSizeTextBox.Location = new System.Drawing.Point(126, 149);
+      this.minTreeSizeTextBox.Name = "minTreeSizeTextBox";
+      this.minTreeSizeTextBox.ReadOnly = true;
+      this.minTreeSizeTextBox.Size = new System.Drawing.Size(100, 20);
+      this.minTreeSizeTextBox.TabIndex = 9;
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(6, 152);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(72, 13);
+      this.label3.TabIndex = 8;
+      this.label3.Text = "Min. tree size:";
+      // 
+      // minTreeHeightTextBox
+      // 
+      this.minTreeHeightTextBox.Location = new System.Drawing.Point(126, 123);
+      this.minTreeHeightTextBox.Name = "minTreeHeightTextBox";
+      this.minTreeHeightTextBox.ReadOnly = true;
+      this.minTreeHeightTextBox.Size = new System.Drawing.Size(100, 20);
+      this.minTreeHeightTextBox.TabIndex = 7;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(4, 126);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(83, 13);
+      this.label4.TabIndex = 6;
+      this.label4.Text = "Min. tree height:";
+      // 
+      // maxSubTreesTextBox
+      // 
+      this.maxSubTreesTextBox.Location = new System.Drawing.Point(126, 71);
+      this.maxSubTreesTextBox.Name = "maxSubTreesTextBox";
+      this.maxSubTreesTextBox.Size = new System.Drawing.Size(100, 20);
+      this.maxSubTreesTextBox.TabIndex = 5;
+      this.maxSubTreesTextBox.TextChanged += new System.EventHandler(this.maxSubTreesTextBox_TextChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(6, 74);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(79, 13);
+      this.label2.TabIndex = 4;
+      this.label2.Text = "Max. sub trees:";
+      // 
+      // minSubTreesTextBox
+      // 
+      this.minSubTreesTextBox.Location = new System.Drawing.Point(126, 45);
+      this.minSubTreesTextBox.Name = "minSubTreesTextBox";
+      this.minSubTreesTextBox.Size = new System.Drawing.Size(100, 20);
+      this.minSubTreesTextBox.TabIndex = 3;
+      this.minSubTreesTextBox.TextChanged += new System.EventHandler(this.minSubTreesTextBox_TextChanged);
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(6, 48);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(76, 13);
+      this.label1.TabIndex = 2;
+      this.label1.Text = "Min. sub trees:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Location = new System.Drawing.Point(126, 19);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(100, 20);
+      this.nameTextBox.TabIndex = 1;
+      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(6, 22);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 0;
+      this.nameLabel.Text = "Name:";
+      // 
+      // functionPropertiesErrorProvider
+      // 
+      this.functionPropertiesErrorProvider.ContainerControl = this;
+      // 
+      // FunctionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox);
+      this.Name = "FunctionView";
+      this.Size = new System.Drawing.Size(432, 514);
+      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.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;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs	(revision 2701)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionView.cs	(revision 2701)
@@ -0,0 +1,197 @@
+#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.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.GP.Interfaces;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.GP {
+  public partial class FunctionView : ViewBase {
+    private Function function;
+    private const string ALL_SLOTS = "All";
+    private string selectedSlot = ALL_SLOTS;
+
+    public FunctionView() {
+      InitializeComponent();
+    }
+
+    public FunctionView(Function function)
+      : this() {
+      this.function = function;
+      function.Changed += (sender, args) => UpdateControls();
+      Refresh();
+    }
+
+    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;
+      } else {
+        initializerTextBox.Enabled = false;
+        editInitializerButton.Enabled = false;
+      }
+      if (function.Manipulator != null) {
+        manipulatorTextBox.Text = function.Manipulator.Name;
+      } else {
+        manipulatorTextBox.Enabled = false;
+        editManipulatorButton.Enabled = false;
+      }
+
+      argumentComboBox.Items.Clear();
+      argumentComboBox.Items.Add(ALL_SLOTS);
+      for (int i = 0; i < function.MaxSubTrees; i++) {
+        argumentComboBox.Items.Add(i.ToString());
+      }
+
+      UpdateAllowedSubFunctionsList();
+    }
+
+    private void UpdateAllowedSubFunctionsList() {
+      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));
+          }
+          foreach (var subFun in functionSet) {
+            subFunctionsListBox.Items.Add(subFun);
+          }
+        } else {
+          int slot = int.Parse(selectedSlot);
+          foreach (var subFun in function.GetAllowedSubFunctions(slot)) {
+            subFunctionsListBox.Items.Add(subFun);
+          }
+        }
+      } else {
+        // no subfunctions allowed
+        subTreesGroupBox.Enabled = false;
+      }
+    }
+
+    private void nameTextBox_TextChanged(object sender, EventArgs e) {
+      string name = nameTextBox.Text;
+      if (!string.IsNullOrEmpty(name)) {
+        function.Name = name;
+        functionPropertiesErrorProvider.SetError(nameTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(nameTextBox, "Name can't be empty.");
+      }
+    }
+
+    private void minSubTreesTextBox_TextChanged(object sender, EventArgs e) {
+      int minSubTrees;
+      if (int.TryParse(minSubTreesTextBox.Text, out minSubTrees) && minSubTrees >= 0) {
+        function.MinSubTrees = minSubTrees;
+        functionPropertiesErrorProvider.SetError(minSubTreesTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(minSubTreesTextBox, "Min sub-trees must be 0 or a positive integer.");
+      }
+    }
+
+    private void maxSubTreesTextBox_TextChanged(object sender, EventArgs e) {
+      int maxSubTrees;
+      if (int.TryParse(maxSubTreesTextBox.Text, out maxSubTrees) && maxSubTrees >= 0) {
+        function.MaxSubTrees = maxSubTrees;
+        functionPropertiesErrorProvider.SetError(maxSubTreesTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(maxSubTreesTextBox, "Max sub-trees must be 0 or a positive integer and larger or equal min sub-trees.");
+      }
+    }
+
+    private void ticketsTextBox_TextChanged(object sender, EventArgs e) {
+      double tickets;
+      if (double.TryParse(ticketsTextBox.Text, out tickets) && tickets >= 0) {
+        function.Tickets = tickets;
+        functionPropertiesErrorProvider.SetError(ticketsTextBox, string.Empty);
+      } else {
+        functionPropertiesErrorProvider.SetError(ticketsTextBox, "Number of tickets must be 0 or a positive real value.");
+      }
+    }
+
+    private void editInitializerButton_Click(object sender, EventArgs e) {
+      ControlManager.Manager.ShowControl(function.Initializer.CreateView());
+    }
+
+    private void editManipulatorButton_Click(object sender, EventArgs e) {
+      ControlManager.Manager.ShowControl(function.Manipulator.CreateView());
+    }
+
+    private void argumentComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      selectedSlot = argumentComboBox.Text;
+      UpdateAllowedSubFunctionsList();
+    }
+
+    private void subFunctionsListBox_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IFunction"))
+        e.Effect = DragDropEffects.Link;
+    }
+    private void subFunctionsListBox_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IFunction"))
+        e.Effect = DragDropEffects.Link;
+    }
+
+    private void subFunctionsListBox_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IFunction")) {
+          IFunction fun = (IFunction)e.Data.GetData("IFunction");
+          if (selectedSlot == ALL_SLOTS) {
+            for (int slot = 0; slot < function.MaxSubTrees; slot++)
+              function.AddAllowedSubFunction(fun, slot);
+          } else {
+            int slot = int.Parse(selectedSlot);
+            function.AddAllowedSubFunction(fun, slot);
+          }
+        }
+      }
+    }
+
+    private void subFunctionsListBox_KeyUp(object sender, KeyEventArgs e) {
+      if (subFunctionsListBox.SelectedItems.Count > 0 && e.KeyCode == Keys.Delete) {
+
+        if (selectedSlot == ALL_SLOTS) {
+          for (int slot = 0; slot < function.MaxSubTrees; slot++) {
+            foreach (var subFun in subFunctionsListBox.SelectedItems) {
+              function.RemoveAllowedSubFunction((IFunction)subFun, slot);
+            }
+          }
+        } else {
+          int slot = int.Parse(selectedSlot);
+          foreach (var subFun in subFunctionsListBox.SelectedItems) {
+            function.RemoveAllowedSubFunction((IFunction)subFun, slot);
+          }
+        }
+
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.GP/3.3/FunctionView.resx
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/FunctionView.resx	(revision 2701)
+++ /trunk/sources/HeuristicLab.GP/3.3/FunctionView.resx	(revision 2701)
@@ -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/3.3/HeuristicLab.GP-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.GP/3.3/HeuristicLab.GP-3.3.csproj	(revision 2700)
+++ /trunk/sources/HeuristicLab.GP/3.3/HeuristicLab.GP-3.3.csproj	(revision 2701)
@@ -83,10 +83,16 @@
   <ItemGroup>
     <Compile Include="BaseClasses\BinaryFunction.cs" />
+    <Compile Include="BaseClasses\Function.cs" />
     <Compile Include="BaseClasses\FunctionLibraryInjectorBase.cs" />
+    <Compile Include="BaseClasses\FunctionTree.cs" />
     <Compile Include="BaseClasses\TerminalTreeNode.cs" />
-    <Compile Include="BaseClasses\FunctionBase.cs" />
-    <Compile Include="BaseClasses\FunctionTreeBase.cs" />
     <Compile Include="BaseClasses\Terminal.cs" />
     <Compile Include="BaseClasses\UnaryFunction.cs" />
+    <Compile Include="FunctionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="FunctionView.Designer.cs">
+      <DependentUpon>FunctionView.cs</DependentUpon>
+    </Compile>
     <Compile Include="GeneticProgrammingModelView.cs">
       <SubType>UserControl</SubType>
@@ -132,4 +138,7 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="FunctionView.resx">
+      <DependentUpon>FunctionView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="GeneticProgrammingModelView.resx">
       <DependentUpon>GeneticProgrammingModelView.cs</DependentUpon>
