Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs	(revision 18062)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs	(revision 18063)
@@ -13,7 +13,8 @@
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 
-namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.SingleObjective {
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
   [StorableType("7464E84B-65CC-440A-91F0-9FA920D730F9")]
-  [Item(Name = "StructuredSymbolicRegressionSingleObjectiveProblem", Description = "A problem with a structural definition and unfixed subfunctions.")]
+  [Item(Name = "Structured Symbolic Regression Single Objective Problem (single-objective)", Description = "A problem with a structural definition and unfixed subfunctions.")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 150)]
   public class StructuredSymbolicRegressionSingleObjectiveProblem : SingleObjectiveBasicProblem<MultiEncoding>, IRegressionProblem, IProblemInstanceConsumer<RegressionProblemData> {
 
@@ -22,4 +23,5 @@
     private const string StructureDefinitionParameterName = "Structure Definition";
     private const string GrammarParameterName = "Grammar";
+    private const string StructureTemplateParameterName = "Structure Template";
 
     #endregion
@@ -28,4 +30,5 @@
     public IValueParameter<IRegressionProblemData> ProblemDataParameter => (IValueParameter<IRegressionProblemData>)Parameters[ProblemDataParameterName];
     public IFixedValueParameter<StringValue> StructureDefinitionParameter => (IFixedValueParameter<StringValue>)Parameters[StructureDefinitionParameterName];
+    public IFixedValueParameter<StructureTemplate> StructureTemplateParameter => (IFixedValueParameter<StructureTemplate>)Parameters[StructureTemplateParameterName];
     public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName]; // könnte auch weg?
     #endregion
@@ -43,4 +46,8 @@
       get => StructureDefinitionParameter.Value.Value;
       set => StructureDefinitionParameter.Value.Value = value;
+    }
+
+    public StructureTemplate StructureTemplate {
+      get => StructureTemplateParameter.Value;
     }
 
@@ -71,4 +78,5 @@
       Parameters.Add(new ValueParameter<RegressionProblemData>(ProblemDataParameterName, problemData));
       Parameters.Add(new FixedValueParameter<StringValue>(StructureDefinitionParameterName, new StringValue("e^f(x)/F(y)")));
+      Parameters.Add(new FixedValueParameter<StructureTemplate>(StructureTemplateParameterName, new StructureTemplate()));
       Parameters.Add(new ValueParameter<ISymbolicDataAnalysisGrammar>(GrammarParameterName, grammar));
       var parser = new InfixExpressionParser();
@@ -78,10 +86,8 @@
     }
 
-    public StructuredSymbolicRegressionSingleObjectiveProblem(StructuredSymbolicRegressionSingleObjectiveProblem original, Cloner cloner) {
-    }
+    public StructuredSymbolicRegressionSingleObjectiveProblem(StructuredSymbolicRegressionSingleObjectiveProblem original, Cloner cloner) { }
 
     [StorableConstructor]
-    protected StructuredSymbolicRegressionSingleObjectiveProblem(StorableConstructorFlag _) : base(_) {
-    }
+    protected StructuredSymbolicRegressionSingleObjectiveProblem(StorableConstructorFlag _) : base(_) { }
 
     public override IDeepCloneable Clone(Cloner cloner) =>
@@ -97,5 +103,6 @@
 
     public override double Evaluate(Individual individual, IRandom random) {
-      foreach(var kvp in individual.Values) {
+      Console.WriteLine(StructureTemplate.Template);
+      foreach (var kvp in individual.Values) {
         if(kvp.Value is SymbolicExpressionTree tree) {
           foreach(var n in tree.IterateNodesPrefix()) {
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj	(revision 18062)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.Views-3.4.csproj	(revision 18063)
@@ -122,4 +122,16 @@
       <DependentUpon>InteractiveSymbolicExpressionTreeChart.cs</DependentUpon>
     </Compile>
+    <Compile Include="StructureTemplate\StructureTemplateView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StructureTemplate\StructureTemplateView.Designer.cs">
+      <DependentUpon>StructureTemplateView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StructureTemplate\SubFunctionListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StructureTemplate\SubFunctionListView.Designer.cs">
+      <DependentUpon>SubFunctionListView.cs</DependentUpon>
+    </Compile>
     <Compile Include="SymbolicDataAnalysisModelMathView.cs">
       <SubType>UserControl</SubType>
@@ -304,4 +316,9 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="StructureTemplate\StructureTemplateView.resx">
+      <DependentUpon>StructureTemplateView.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.Designer.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.Designer.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.Designer.cs	(revision 18063)
@@ -0,0 +1,155 @@
+﻿
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+  partial class StructureTemplateView {
+    /// <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.expressionInput = new System.Windows.Forms.TextBox();
+      this.parseButton = new System.Windows.Forms.Button();
+      this.errorLabel = new System.Windows.Forms.Label();
+      this.symRegTreeChart = new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.GraphicalSymbolicExpressionTreeView();
+      this.templateStructureGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.subFunctionListView = new HeuristicLab.Problems.DataAnalysis.Symbolic.Views.SubFunctionListView();
+      this.templateStructureGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // expressionInput
+      // 
+      this.expressionInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.expressionInput.Location = new System.Drawing.Point(6, 19);
+      this.expressionInput.Name = "expressionInput";
+      this.expressionInput.Size = new System.Drawing.Size(288, 20);
+      this.expressionInput.TabIndex = 1;
+      this.expressionInput.TextChanged += new System.EventHandler(this.expressionInput_TextChanged);
+      // 
+      // parseButton
+      // 
+      this.parseButton.Location = new System.Drawing.Point(6, 45);
+      this.parseButton.Name = "parseButton";
+      this.parseButton.Size = new System.Drawing.Size(143, 23);
+      this.parseButton.TabIndex = 3;
+      this.parseButton.Text = "Parse";
+      this.parseButton.UseVisualStyleBackColor = true;
+      this.parseButton.Click += new System.EventHandler(this.parseButton_Click);
+      // 
+      // errorLabel
+      // 
+      this.errorLabel.AutoSize = true;
+      this.errorLabel.Location = new System.Drawing.Point(155, 50);
+      this.errorLabel.Name = "errorLabel";
+      this.errorLabel.Size = new System.Drawing.Size(54, 13);
+      this.errorLabel.TabIndex = 4;
+      this.errorLabel.Text = "errorLabel";
+      // 
+      // symRegTreeChart
+      // 
+      this.symRegTreeChart.AllowDrop = true;
+      this.symRegTreeChart.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.symRegTreeChart.Caption = "Graphical SymbolicExpressionTree View";
+      this.symRegTreeChart.Content = null;
+      this.symRegTreeChart.Location = new System.Drawing.Point(6, 74);
+      this.symRegTreeChart.Name = "symRegTreeChart";
+      this.symRegTreeChart.ReadOnly = false;
+      this.symRegTreeChart.Size = new System.Drawing.Size(288, 320);
+      this.symRegTreeChart.TabIndex = 6;
+      // 
+      // templateStructureGroupBox
+      // 
+      this.templateStructureGroupBox.Controls.Add(this.symRegTreeChart);
+      this.templateStructureGroupBox.Controls.Add(this.parseButton);
+      this.templateStructureGroupBox.Controls.Add(this.errorLabel);
+      this.templateStructureGroupBox.Controls.Add(this.expressionInput);
+      this.templateStructureGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.templateStructureGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.templateStructureGroupBox.Name = "templateStructureGroupBox";
+      this.templateStructureGroupBox.Size = new System.Drawing.Size(300, 400);
+      this.templateStructureGroupBox.TabIndex = 8;
+      this.templateStructureGroupBox.TabStop = false;
+      this.templateStructureGroupBox.Text = "Template Structure";
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Margin = new System.Windows.Forms.Padding(0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.templateStructureGroupBox);
+      this.splitContainer.Panel1MinSize = 5;
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.subFunctionListView);
+      this.splitContainer.Panel2MinSize = 5;
+      this.splitContainer.Size = new System.Drawing.Size(600, 400);
+      this.splitContainer.SplitterDistance = 300;
+      this.splitContainer.TabIndex = 10;
+      // 
+      // subFunctionListView
+      // 
+      this.subFunctionListView.Caption = "View";
+      this.subFunctionListView.Content = null;
+      this.subFunctionListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.subFunctionListView.Location = new System.Drawing.Point(0, 0);
+      this.subFunctionListView.Name = "subFunctionListView";
+      this.subFunctionListView.ReadOnly = false;
+      this.subFunctionListView.Size = new System.Drawing.Size(296, 400);
+      this.subFunctionListView.TabIndex = 7;
+      // 
+      // StructureTemplateView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "StructureTemplateView";
+      this.Size = new System.Drawing.Size(600, 400);
+      this.templateStructureGroupBox.ResumeLayout(false);
+      this.templateStructureGroupBox.PerformLayout();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+    private System.Windows.Forms.TextBox expressionInput;
+    private System.Windows.Forms.Button parseButton;
+    private System.Windows.Forms.Label errorLabel;
+    private Encodings.SymbolicExpressionTreeEncoding.Views.GraphicalSymbolicExpressionTreeView symRegTreeChart;
+    private SubFunctionListView subFunctionListView;
+    private System.Windows.Forms.GroupBox templateStructureGroupBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+  }
+}
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.cs	(revision 18063)
@@ -0,0 +1,55 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+
+  [View("StructureTemplate View")]
+  [Content(typeof(StructureTemplate), true)]
+  public partial class StructureTemplateView : AsynchronousContentView {
+    public new StructureTemplate Content {
+      get => (StructureTemplate)base.Content;
+      set => base.Content = value;
+    }
+
+
+    public StructureTemplateView() {
+      InitializeComponent();
+      errorLabel.Text = "";
+    }
+
+    private void parseButton_Click(object sender, EventArgs e) {
+      if(!string.IsNullOrEmpty(expressionInput.Text)) {
+        try {
+          Content.Template = expressionInput.Text;
+          symRegTreeChart.Content = Content.Tree;
+
+          var subFunctionList = new ItemList<SubFunction>();
+          foreach (var func in Content.SubFunctions)
+            subFunctionList.Add(func);
+          subFunctionListView.Content = subFunctionList.AsReadOnly();
+
+          errorLabel.Text = "Template structure successfully parsed.";
+          errorLabel.ForeColor = Color.DarkGreen;
+        } catch (Exception ex) {
+          errorLabel.Text = ex.Message;
+          errorLabel.ForeColor = Color.DarkRed;
+        }
+      }
+    }
+
+    private void expressionInput_TextChanged(object sender, EventArgs e) {
+      errorLabel.Text = "Unparsed changes! Press parse button to save changes.";
+      errorLabel.ForeColor = Color.DarkOrange;
+    }
+
+  }
+}
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.resx
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.resx	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/StructureTemplateView.resx	(revision 18063)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.Designer.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.Designer.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.Designer.cs	(revision 18063)
@@ -0,0 +1,33 @@
+﻿
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+  partial class SubFunctionListView {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/StructureTemplate/SubFunctionListView.cs	(revision 18063)
@@ -0,0 +1,18 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
+  public partial class SubFunctionListView : ItemListView<SubFunction> {
+    public SubFunctionListView() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 18062)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj	(revision 18063)
@@ -180,4 +180,6 @@
     <Compile Include="IntervalUtil.cs" />
     <Compile Include="Selectors\DiversitySelector.cs" />
+    <Compile Include="StructureTemplate\StructureTemplate.cs" />
+    <Compile Include="StructureTemplate\SubFunction.cs" />
     <Compile Include="SymbolicDataAnalysisExpressionTreeAverageSimilarityCalculator.cs" />
     <Compile Include="SymbolicDataAnalysisExpressionTreeSimplificationOperator.cs" />
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/StructureTemplate.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/StructureTemplate.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/StructureTemplate.cs	(revision 18063)
@@ -0,0 +1,61 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Core;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StorableType("E3C038DB-C6AA-457D-9F65-AF16C44CCE22")]
+  [Item("StructureTemplate", "Structure Template")]
+  public class StructureTemplate : Item {
+
+    [Storable]
+    private string template = "";
+    public string Template {
+      get => template; 
+      set {
+        if(template != value) {
+          template = value;
+          tree = Parser.Parse(template);
+          subFunctions = GetSubFunctions(Tree);
+        }
+      } 
+    }
+
+    [Storable]
+    private ISymbolicExpressionTree tree;
+    public ISymbolicExpressionTree Tree => tree;
+
+    [Storable]
+    private IEnumerable<SubFunction> subFunctions;
+    public IEnumerable<SubFunction> SubFunctions => subFunctions;
+
+    protected InfixExpressionParser Parser { get; set; } = new InfixExpressionParser();
+
+
+    #region Constructors
+    public StructureTemplate() { }
+
+    [StorableConstructor]
+    protected StructureTemplate(StorableConstructorFlag _) : base(_) { }
+
+    protected StructureTemplate(StructureTemplate original, Cloner cloner) { }
+    #endregion
+
+    #region Cloning
+    public override IDeepCloneable Clone(Cloner cloner) =>
+      new StructureTemplate(this, cloner);
+    #endregion
+
+    private IEnumerable<SubFunction> GetSubFunctions(ISymbolicExpressionTree tree) {
+      int count = 1;
+      foreach (var node in tree.IterateNodesPrefix())
+        if (node.Symbol is SubFunctionSymbol)
+          yield return new SubFunction() { Name = $"f{count++}" };
+    }
+  }
+}
Index: /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/SubFunction.cs
===================================================================
--- /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/SubFunction.cs	(revision 18063)
+++ /branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/StructureTemplate/SubFunction.cs	(revision 18063)
@@ -0,0 +1,63 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Core;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
+  [StorableType("598B5DCB-95AC-465A-920B-E1E6DACFFA4B")]
+  public class SubFunction : ParameterizedNamedItem {
+    #region Constants
+    private const string GrammarParameterName = "Grammar";
+    private const string MaximumSymbolicExpressionTreeDepthParameterName = "MaximumSymbolicExpressionTreeDepth";
+    private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName];
+    public IFixedValueParameter<IntValue> MaximumSymbolicExpressionTreeDepthParameter => (IFixedValueParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeDepthParameterName];
+    public IFixedValueParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter => (IFixedValueParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeLengthParameterName];
+    #endregion
+
+    #region Properties
+    public ISymbolicDataAnalysisGrammar Grammar {
+      get => GrammarParameter.Value;
+      set => GrammarParameter.Value = value;
+    }
+
+    public int MaximumSymbolicExpressionTreeDepth {
+      get => MaximumSymbolicExpressionTreeDepthParameter.Value.Value;
+      set => MaximumSymbolicExpressionTreeDepthParameter.Value.Value = value;
+    }
+
+    public int MaximumSymbolicExpressionTreeLength {
+      get => MaximumSymbolicExpressionTreeLengthParameter.Value.Value;
+      set => MaximumSymbolicExpressionTreeLengthParameter.Value.Value = value;
+    }
+    #endregion
+
+    #region Constructors
+    public SubFunction() {
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisGrammar>(GrammarParameterName, new LinearScalingGrammar()));
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumSymbolicExpressionTreeDepthParameterName, new IntValue(10)));
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, new IntValue(30)));
+    }
+
+    protected SubFunction(SubFunction original, Cloner cloner) { }
+
+    [StorableConstructor]
+    protected SubFunction(StorableConstructorFlag _) : base(_) {}
+    #endregion
+
+    #region Cloning
+    public override IDeepCloneable Clone(Cloner cloner) =>
+      new SubFunction(this, cloner);
+    #endregion
+  }
+}
