Index: branches/3.2/sources/HeuristicLab.GP.Interfaces/3.3/IGeneticProgrammingModel.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Interfaces/3.3/IGeneticProgrammingModel.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP.Interfaces/3.3/IGeneticProgrammingModel.cs	(revision 3873)
@@ -28,6 +28,6 @@
   public interface IGeneticProgrammingModel : IItem {
     IFunctionTree FunctionTree { get; set; }
-    int Size { get; set; }
-    int Height { get; set; }
+    int Size { get; }
+    int Height { get; }
   }
 }
Index: branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/ChangeNodeTypeManipulation.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/ChangeNodeTypeManipulation.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/ChangeNodeTypeManipulation.cs	(revision 3873)
@@ -93,7 +93,4 @@
           parent.InsertSubTree(selectedChildIndex, newFunctionTree);
         }
-        // update size and height
-        gpModel.Size = gpModel.Size - oldChildSize + newChildSize;
-        gpModel.Height = gpModel.FunctionTree.GetHeight(); // must recalculate height because we can't know wether the manipulated branch was the deepest branch
         // check if whole tree is ok
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
Index: branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/CutOutNodeManipulation.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/CutOutNodeManipulation.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/CutOutNodeManipulation.cs	(revision 3873)
@@ -84,7 +84,4 @@
         parent.InsertSubTree(childIndex, selectedChild);
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
-        // recalculate the size and height of our tree
-        gpModel.Size = gpModel.FunctionTree.GetSize();
-        gpModel.Height = gpModel.FunctionTree.GetHeight();
         // don't need to schedule initialization operations
         return null;
@@ -101,7 +98,4 @@
         parent.InsertSubTree(childIndex, newFunctionTree);
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
-        // recalculate size and height
-        gpModel.Size = gpModel.FunctionTree.GetSize();
-        gpModel.Height = gpModel.FunctionTree.GetHeight();
         // schedule an initialization operation for the new function-tree
         return Util.CreateInitializationOperation(TreeGardener.GetAllSubTrees(newFunctionTree), scope);
Index: branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/DeleteSubTreeManipulation.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/DeleteSubTreeManipulation.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/DeleteSubTreeManipulation.cs	(revision 3873)
@@ -65,7 +65,4 @@
 
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
-        // recalculate size and height
-        gpModel.Size = gpModel.FunctionTree.GetSize();
-        gpModel.Height = gpModel.FunctionTree.GetHeight();
         // root hasn't changed so don't need to update 'FunctionTree' variable
         return null;
@@ -77,7 +74,4 @@
         parent.InsertSubTree(childIndex, newFunctionTree);
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
-        // recalculate size and height
-        gpModel.Size = gpModel.FunctionTree.GetSize();
-        gpModel.Height = gpModel.FunctionTree.GetHeight();
         // return an initialization operation for the newly created tree
         return Util.CreateInitializationOperation(TreeGardener.GetAllSubTrees(newFunctionTree), scope);
Index: branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/SubstituteSubTreeManipulation.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/SubstituteSubTreeManipulation.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP.Operators/3.3/Manipulation/SubstituteSubTreeManipulation.cs	(revision 3873)
@@ -73,7 +73,4 @@
 
         Debug.Assert(gardener.IsValidTree(gpModel.FunctionTree));
-        // update the values of treeSize and treeHeight
-        gpModel.Size = gpModel.FunctionTree.GetSize();
-        gpModel.Height = gpModel.FunctionTree.GetHeight();
         // the root hasn't changed so we don't need to update 
         // return a CompositeOperation that randomly initializes all nodes of the new subtree
Index: branches/3.2/sources/HeuristicLab.GP.Tests/FunctionTreeTest.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP.Tests/FunctionTreeTest.cs	(revision 3873)
+++ branches/3.2/sources/HeuristicLab.GP.Tests/FunctionTreeTest.cs	(revision 3873)
@@ -0,0 +1,90 @@
+#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 HeuristicLab.GP.StructureIdentification;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using HeuristicLab.GP.Interfaces;
+using System.IO;
+using HeuristicLab.DataAnalysis;
+using System;
+using HeuristicLab.Random;
+using System.Collections.Generic;
+using HeuristicLab.GP.Operators;
+using System.Diagnostics;
+namespace HeuristicLab.GP.Test {
+
+
+  [TestClass()]
+  public class FunctionTreeTest {
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get {
+        return testContextInstance;
+      }
+      set {
+        testContextInstance = value;
+      }
+    }
+
+    [TestMethod()]
+    public void SizeTest() {
+      var importer = new SymbolicExpressionImporter();
+      IFunctionTree tree = importer.Import("(variable 2.0 a 0)");
+      Assert.AreEqual(1, tree.GetSize());
+
+      tree = importer.Import("2.0");
+      Assert.AreEqual(1, tree.GetSize());
+
+      tree = importer.Import("(+ 2.0)");
+      Assert.AreEqual(2, tree.GetSize());
+
+      tree = importer.Import("(+ 2.0 2.0)");
+      Assert.AreEqual(3, tree.GetSize());
+
+      tree = importer.Import("(+ 2.0 (+ 2.0 2.0))");
+      Assert.AreEqual(5, tree.GetSize());
+    }
+
+    [TestMethod()]
+    public void HeightTest() {
+      var importer = new SymbolicExpressionImporter();
+      IFunctionTree tree = importer.Import("(variable 2.0 a 0)");
+      Assert.AreEqual(1, tree.GetHeight());
+
+      tree = importer.Import("2.0");
+      Assert.AreEqual(1, tree.GetHeight());
+
+      tree = importer.Import("(+ 2.0)");
+      Assert.AreEqual(2, tree.GetHeight());
+
+      tree = importer.Import("(+ 2.0 2.0)");
+      Assert.AreEqual(2, tree.GetHeight());
+
+      tree = importer.Import("(+ 2.0 (+ 2.0 2.0))");
+      Assert.AreEqual(3, tree.GetHeight());
+    }
+  }
+}
Index: branches/3.2/sources/HeuristicLab.GP/3.3/GeneticProgrammingModel.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.GP/3.3/GeneticProgrammingModel.cs	(revision 3823)
+++ branches/3.2/sources/HeuristicLab.GP/3.3/GeneticProgrammingModel.cs	(revision 3873)
@@ -36,10 +36,8 @@
       set {
         functionTree = value;
-        Size = functionTree.GetSize();
-        Height = functionTree.GetHeight();
       }
     }
-    public int Size { get; set; }
-    public int Height { get; set; }
+    public int Size { get { return functionTree.GetSize(); } }
+    public int Height { get { return functionTree.GetHeight(); } }
 
     public GeneticProgrammingModel()
@@ -99,5 +97,5 @@
       // check if there is data for the tree node that needs to be restored and restore the data if needed
       var dataNode = fNode.SelectSingleNode("Data");
-      if (dataNode!=null) tree.Populate(dataNode, restoredObjects);
+      if (dataNode != null) tree.Populate(dataNode, restoredObjects);
       nodeIndex++;
       for (int i = 0; i < subTrees; i++) {
