Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame	(revision 6569)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3.4.$WCREV$")]
+  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3.5.$WCREV$")]
   [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Properties/AssemblyInfo.frame
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Properties/AssemblyInfo.frame	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Properties/AssemblyInfo.frame	(revision 6569)
@@ -45,3 +45,3 @@
 
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.4.$WCREV$")]
+[assembly: AssemblyFileVersion("3.3.5.$WCREV$")]
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Tests/Properties/AssemblyInfo.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Tests/Properties/AssemblyInfo.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/Tests/Properties/AssemblyInfo.cs	(revision 6569)
@@ -53,3 +53,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.3.0")]
+[assembly: AssemblyFileVersion("3.3.5.0")]
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin.cs.frame	(revision 6569)
@@ -26,5 +26,5 @@
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.0.$WCREV$")]
+  [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","Provides operators and related classes for the symbolic expression tree encoding.", "3.4.1.$WCREV$")]
   [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Analysis", "3.3")]
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/FullTreeShaker.cs	(revision 6569)
@@ -32,14 +32,14 @@
     private const string ShakingFactorParameterName = "ShakingFactor";
     #region parameter properties
-    public IValueLookupParameter<DoubleValue> ShakingFactorParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters[ShakingFactorParameterName]; }
+    public IValueParameter<DoubleValue> ShakingFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[ShakingFactorParameterName]; }
     }
     #endregion
     #region properties
-    public DoubleValue ShakingFactor {
-      get { return ShakingFactorParameter.ActualValue; }
+    public double ShakingFactor {
+      get { return ShakingFactorParameter.Value.Value; }
+      set { ShakingFactorParameter.Value.Value = value; }
     }
     #endregion
-
     [StorableConstructor]
     private FullTreeShaker(bool deserializing) : base(deserializing) { }
@@ -47,5 +47,5 @@
     public FullTreeShaker()
       : base() {
-      Parameters.Add(new ValueLookupParameter<DoubleValue>(ShakingFactorParameterName, "The shaking factor that should be used for the manipulation of constants (default=1.0).", new DoubleValue(1.0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(ShakingFactorParameterName, "The shaking factor that should be used for the manipulation of constants (default=1.0).", new DoubleValue(1.0)));
     }
 
@@ -57,5 +57,5 @@
       tree.Root.ForEachNodePostfix(node => {
         if (node.HasLocalParameters) {
-          node.ShakeLocalParameters(random, ShakingFactor.Value);
+          node.ShakeLocalParameters(random, ShakingFactor);
         }
       });
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/OnePointShaker.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/OnePointShaker.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Manipulators/OnePointShaker.cs	(revision 6569)
@@ -34,11 +34,12 @@
     private const string ShakingFactorParameterName = "ShakingFactor";
     #region parameter properties
-    public IValueLookupParameter<DoubleValue> ShakingFactorParameter {
-      get { return (IValueLookupParameter<DoubleValue>)Parameters[ShakingFactorParameterName]; }
+    public IValueParameter<DoubleValue> ShakingFactorParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters[ShakingFactorParameterName]; }
     }
     #endregion
     #region properties
-    public DoubleValue ShakingFactor {
-      get { return ShakingFactorParameter.ActualValue; }
+    public double ShakingFactor {
+      get { return ShakingFactorParameter.Value.Value; }
+      set { ShakingFactorParameter.Value.Value = value; }
     }
     #endregion
@@ -48,5 +49,5 @@
     public OnePointShaker()
       : base() {
-      Parameters.Add(new ValueLookupParameter<DoubleValue>(ShakingFactorParameterName, "The shaking factor that should be used for the manipulation of constants (default=1.0).", new DoubleValue(1.0)));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(ShakingFactorParameterName, "The shaking factor that should be used for the manipulation of constants (default=1.0).", new DoubleValue(1.0)));
     }
 
@@ -62,5 +63,5 @@
       if (parametricNodes.Count > 0) {
         var selectedPoint = parametricNodes.SelectRandom(random);
-        selectedPoint.ShakeLocalParameters(random, ShakingFactor.Value);
+        selectedPoint.ShakeLocalParameters(random, ShakingFactor);
       }
     }
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Properties/AssemblyInfo.frame
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Properties/AssemblyInfo.frame	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Properties/AssemblyInfo.frame	(revision 6569)
@@ -45,3 +45,3 @@
 
 [assembly: AssemblyVersion("3.4.0.0")]
-[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.4.1.$WCREV$")]
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs	(revision 6569)
@@ -21,7 +21,9 @@
 
 using System;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
@@ -72,5 +74,4 @@
     }
 
-    [Storable]
     private ProgramRootSymbol programRootSymbol;
     public ProgramRootSymbol ProgramRootSymbol {
@@ -99,5 +100,4 @@
     }
 
-    [Storable]
     private Defun defunSymbol;
     protected Defun DefunSymbol {
@@ -111,8 +111,16 @@
     #endregion
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (ISymbol symbol in symbols.Values)
+        RegisterSymbolEvents(symbol);
+    }
     [StorableConstructor]
     protected SymbolicExpressionGrammar(bool deserializing) : base(deserializing) { }
     protected SymbolicExpressionGrammar(SymbolicExpressionGrammar original, Cloner cloner)
       : base(original, cloner) {
+      foreach (ISymbol symbol in Symbols)
+        RegisterSymbolEvents(symbol);
+
       programRootSymbol = cloner.Clone(original.programRootSymbol);
       startSymbol = cloner.Clone(original.StartSymbol);
@@ -153,4 +161,13 @@
     }
 
+    protected override void AddSymbol(ISymbol symbol) {
+      base.AddSymbol(symbol);
+      RegisterSymbolEvents(symbol);
+    }
+    protected override void RemoveSymbol(ISymbol symbol) {
+      DeregisterSymbolEvents(symbol);
+      base.RemoveSymbol(symbol);
+    }
+
     public event EventHandler ReadOnlyChanged;
     protected virtual void OnReadOnlyChanged() {
@@ -166,4 +183,57 @@
     }
     #endregion
+
+    #region symbol events
+    protected virtual void RegisterSymbolEvents(ISymbol symbol) {
+      symbol.NameChanging += new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
+      symbol.NameChanged += new EventHandler(Symbol_NameChanged);
+    }
+    protected virtual void DeregisterSymbolEvents(ISymbol symbol) {
+      symbol.NameChanging -= new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
+      symbol.NameChanged -= new EventHandler(Symbol_NameChanged);
+    }
+
+    private void Symbol_NameChanging(object sender, CancelEventArgs<string> e) {
+      if (symbols.ContainsKey(e.Value)) e.Cancel = true;
+    }
+    private void Symbol_NameChanged(object sender, EventArgs e) {
+      ISymbol symbol = (ISymbol)sender;
+      string oldName = symbols.Where(x => x.Value == symbol).First().Key;
+      string newName = symbol.Name;
+
+      symbols.Remove(oldName);
+      symbols.Add(newName, symbol);
+
+      var subtreeCount = symbolSubtreeCount[oldName];
+      symbolSubtreeCount.Remove(oldName);
+      symbolSubtreeCount.Add(newName, subtreeCount);
+
+      List<string> allowedChilds;
+      if (allowedChildSymbols.TryGetValue(oldName, out allowedChilds)) {
+        allowedChildSymbols.Remove(oldName);
+        allowedChildSymbols.Add(newName, allowedChilds);
+      }
+
+      for (int i = 0; i < GetMaximumSubtreeCount(symbol); i++) {
+        if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(oldName, i), out allowedChilds)) {
+          allowedChildSymbolsPerIndex.Remove(Tuple.Create(oldName, i));
+          allowedChildSymbolsPerIndex.Add(Tuple.Create(newName, i), allowedChilds);
+        }
+      }
+
+      foreach (var parent in Symbols) {
+        if (allowedChildSymbols.TryGetValue(parent.Name, out allowedChilds))
+          if (allowedChilds.Remove(oldName))
+            allowedChilds.Add(newName);
+
+        for (int i = 0; i < GetMaximumSubtreeCount(parent); i++) {
+          if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, i), out allowedChilds))
+            if (allowedChilds.Remove(oldName)) allowedChilds.Add(newName);
+        }
+      }
+
+      ClearCaches();
+    }
+    #endregion
   }
 }
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammarBase.cs	(revision 6569)
@@ -81,9 +81,4 @@
       cachedMinExpressionDepth = new Dictionary<string, int>();
     }
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      foreach (ISymbol symbol in symbols.Values)
-        RegisterSymbolEvents(symbol);
-    }
 
     protected SymbolicExpressionGrammarBase(SymbolicExpressionGrammarBase original, Cloner cloner)
@@ -93,5 +88,4 @@
       cachedMinExpressionDepth = new Dictionary<string, int>();
 
-
       symbols = original.symbols.ToDictionary(x => x.Key, y => (ISymbol)cloner.Clone(y.Value));
       symbolSubtreeCount = new Dictionary<string, Tuple<int, int>>(original.symbolSubtreeCount);
@@ -104,7 +98,4 @@
       foreach (var element in original.allowedChildSymbolsPerIndex)
         allowedChildSymbolsPerIndex.Add(element.Key, new List<string>(element.Value));
-
-      foreach (ISymbol symbol in symbols.Values)
-        RegisterSymbolEvents(symbol);
     }
 
@@ -122,7 +113,6 @@
 
     #region protected grammar manipulation methods
-    protected void AddSymbol(ISymbol symbol) {
+    protected virtual void AddSymbol(ISymbol symbol) {
       if (ContainsSymbol(symbol)) throw new ArgumentException("Symbol " + symbol + " is already defined.");
-      RegisterSymbolEvents(symbol);
       symbols.Add(symbol.Name, symbol);
       symbolSubtreeCount.Add(symbol.Name, Tuple.Create(0, 0));
@@ -130,56 +120,5 @@
     }
 
-    private void RegisterSymbolEvents(ISymbol symbol) {
-      symbol.NameChanging += new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
-      symbol.NameChanged += new EventHandler(Symbol_NameChanged);
-    }
-    private void DeregisterSymbolEvents(ISymbol symbol) {
-      symbol.NameChanging -= new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
-      symbol.NameChanged -= new EventHandler(Symbol_NameChanged);
-    }
-
-    private void Symbol_NameChanging(object sender, CancelEventArgs<string> e) {
-      if (symbols.ContainsKey(e.Value)) e.Cancel = true;
-    }
-    private void Symbol_NameChanged(object sender, EventArgs e) {
-      ISymbol symbol = (ISymbol)sender;
-      string oldName = symbols.Where(x => x.Value == symbol).First().Key;
-      string newName = symbol.Name;
-
-      symbols.Remove(oldName);
-      symbols.Add(newName, symbol);
-
-      var subtreeCount = symbolSubtreeCount[oldName];
-      symbolSubtreeCount.Remove(oldName);
-      symbolSubtreeCount.Add(newName, subtreeCount);
-
-      List<string> allowedChilds;
-      if (allowedChildSymbols.TryGetValue(oldName, out allowedChilds)) {
-        allowedChildSymbols.Remove(oldName);
-        allowedChildSymbols.Add(newName, allowedChilds);
-      }
-
-      for (int i = 0; i < GetMaximumSubtreeCount(symbol); i++) {
-        if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(oldName, i), out allowedChilds)) {
-          allowedChildSymbolsPerIndex.Remove(Tuple.Create(oldName, i));
-          allowedChildSymbolsPerIndex.Add(Tuple.Create(newName, i), allowedChilds);
-        }
-      }
-
-      foreach (var parent in Symbols) {
-        if (allowedChildSymbols.TryGetValue(parent.Name, out allowedChilds))
-          if (allowedChilds.Remove(oldName))
-            allowedChilds.Add(newName);
-
-        for (int i = 0; i < GetMaximumSubtreeCount(parent); i++) {
-          if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, i), out allowedChilds))
-            if (allowedChilds.Remove(oldName)) allowedChilds.Add(newName);
-        }
-      }
-
-      ClearCaches();
-    }
-
-    protected void RemoveSymbol(ISymbol symbol) {
+    protected virtual void RemoveSymbol(ISymbol symbol) {
       symbols.Remove(symbol.Name);
       allowedChildSymbols.Remove(symbol.Name);
@@ -198,5 +137,4 @@
         }
       }
-      DeregisterSymbolEvents(symbol);
       ClearCaches();
     }
@@ -315,5 +253,5 @@
 
 
-    private void ClearCaches() {
+    protected void ClearCaches() {
       cachedMinExpressionLength.Clear();
       cachedMaxExpressionLength.Clear();
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeGrammar.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeGrammar.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeGrammar.cs	(revision 6569)
@@ -42,4 +42,5 @@
     }
 
+    [Storable]
     private ISymbolicExpressionGrammar grammar;
     public SymbolicExpressionTreeGrammar(ISymbolicExpressionGrammar grammar)
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs	(revision 6569)
@@ -186,5 +186,6 @@
 
     public override string ToString() {
-      return Symbol.Name;
+      if (Symbol != null) return Symbol.Name;
+      return "SymbolicExpressionTreeNode";
     }
 
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Grammars.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Grammars.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Grammars.cs	(revision 6569)
@@ -27,5 +27,9 @@
 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding_3._4.Tests {
   public static class Grammars {
+
+    [StorableClass]
     private class Addition : Symbol {
+      [StorableConstructor]
+      protected Addition(bool deserializing) : base(deserializing) { }
       protected Addition(Addition original, Cloner cloner) : base(original, cloner) { }
       public Addition() : base("Addition", "") { }
@@ -34,5 +38,9 @@
       }
     }
+
+    [StorableClass]
     private class Subtraction : Symbol {
+      [StorableConstructor]
+      protected Subtraction(bool deserializing) : base(deserializing) { }
       protected Subtraction(Subtraction original, Cloner cloner) : base(original, cloner) { }
       public Subtraction() : base("Subtraction", "") { }
@@ -41,5 +49,9 @@
       }
     }
+
+    [StorableClass]
     private class Multiplication : Symbol {
+      [StorableConstructor]
+      protected Multiplication(bool deserializing) : base(deserializing) { }
       protected Multiplication(Multiplication original, Cloner cloner) : base(original, cloner) { }
       public Multiplication() : base("Multiplication", "") { }
@@ -48,5 +60,9 @@
       }
     }
+
+    [StorableClass]
     private class Division : Symbol {
+      [StorableConstructor]
+      protected Division(bool deserializing) : base(deserializing) { }
       protected Division(Division original, Cloner cloner) : base(original, cloner) { }
       public Division() : base("Division", "") { }
@@ -55,5 +71,9 @@
       }
     }
+
+    [StorableClass]
     private class Terminal : Symbol {
+      [StorableConstructor]
+      protected Terminal(bool deserializing) : base(deserializing) { }
       protected Terminal(Terminal original, Cloner cloner) : base(original, cloner) { }
       public Terminal() : base("Terminal", "") { }
@@ -67,4 +87,5 @@
     }
 
+    [StorableClass]
     private class TerminalNode : SymbolicExpressionTreeTerminalNode {
       public override bool HasLocalParameters { get { return true; } }
@@ -94,5 +115,8 @@
     }
 
+    [StorableClass]
     private class SimpleArithmeticGrammar : SymbolicExpressionGrammar {
+      [StorableConstructor]
+      protected SimpleArithmeticGrammar(bool deserializing) : base(deserializing) { }
       protected SimpleArithmeticGrammar(SimpleArithmeticGrammar original, Cloner cloner) : base(original, cloner) { }
       public SimpleArithmeticGrammar()
Index: branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Properties/AssemblyInfo.cs
===================================================================
--- branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Properties/AssemblyInfo.cs	(revision 6350)
+++ branches/QAPAlgorithms/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Tests/Properties/AssemblyInfo.cs	(revision 6569)
@@ -53,3 +53,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.4.0.0")]
-[assembly: AssemblyFileVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.1.0")]
