Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln	(revision 12564)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape.sln	(revision 12565)
@@ -15,6 +15,4 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VRPProblemAnalyzer", "VRPProblemAnalyzer\VRPProblemAnalyzer.csproj", "{683C29F1-9A43-4998-B58A-C477B86B7A64}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.NKNew", "HeuristicLab.Problems.NKNew\HeuristicLab.Problems.NKNew.csproj", "{56D80626-06F1-49AE-A911-3F3A20888968}"
 EndProject
 Global
@@ -100,16 +98,4 @@
 		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x86.ActiveCfg = Release|x86
 		{683C29F1-9A43-4998-B58A-C477B86B7A64}.Release|x86.Build.0 = Release|x86
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|x64.ActiveCfg = Debug|x64
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|x64.Build.0 = Debug|x64
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|x86.ActiveCfg = Debug|x86
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Debug|x86.Build.0 = Debug|x86
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|Any CPU.Build.0 = Release|Any CPU
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|x64.ActiveCfg = Release|x64
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|x64.Build.0 = Release|x64
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|x86.ActiveCfg = Release|x86
-		{56D80626-06F1-49AE-A911-3F3A20888968}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/HeuristicLab.Problems.NK.csproj
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/HeuristicLab.Problems.NK.csproj	(revision 12564)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/HeuristicLab.Problems.NK.csproj	(revision 12565)
@@ -123,4 +123,5 @@
     <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Operators-3.3">
@@ -138,4 +139,8 @@
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
       <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Binary-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Problems.Binary-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Random-3.3">
@@ -160,6 +165,6 @@
     <Compile Include="InteractionInitializers\SortedRandomInteractionsInitializer.cs" />
     <Compile Include="InteractionInitializers\IInteractionInitializer.cs" />
-    <Compile Include="INKEvaluator.cs" />
     <Compile Include="INKMoveEvaluator.cs" />
+    <Compile Include="NKLandscape.cs" />
     <Compile Include="WeightInitializers\ExponentialDistributionWeightsInitializer.cs" />
     <Compile Include="WeightInitializers\ReverseLinearWeightsInitializer.cs" />
@@ -169,6 +174,4 @@
     <Compile Include="WeightInitializers\IWeightsInitializer.cs" />
     <Compile Include="NKBitFlipMoveEvaluator.cs" />
-    <Compile Include="NKEvaluatator.cs" />
-    <Compile Include="NKLandscape.cs" />
     <Compile Include="HeuristicLabProblemsNKPlugin.cs" />
     <Compile Include="NKMoveEvaluator.cs" />
Index: anches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/INKEvaluator.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/INKEvaluator.cs	(revision 12564)
+++ 	(revision )
@@ -1,5 +1,0 @@
-﻿using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.NK {
-  public interface INKEvaluator : ISingleObjectiveEvaluator { }
-}
Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKBitFlipMoveEvaluator.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKBitFlipMoveEvaluator.cs	(revision 12564)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKBitFlipMoveEvaluator.cs	(revision 12565)
@@ -1,4 +1,3 @@
 ﻿using System.Collections.Generic;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -7,5 +6,4 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System;
 
 namespace HeuristicLab.Problems.NK {
@@ -20,11 +18,11 @@
     public LookupParameter<BinaryVector> MovedBinaryVectorParameter {
       get { return (LookupParameter<BinaryVector>)Parameters["MovedBinaryVector"]; }
-    }    
-
-    private NKEvaluator NKEvaluator = new NKEvaluator();
+    }
 
     [StorableConstructor]
     protected NKBitFlipMoveEvaluator(bool deserializing) : base(deserializing) { }
-    protected NKBitFlipMoveEvaluator(NKBitFlipMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+
+    protected NKBitFlipMoveEvaluator(NKBitFlipMoveEvaluator original, Cloner cloner)
+      : base(original, cloner) { }
     public NKBitFlipMoveEvaluator()
       : base() {
@@ -46,5 +44,5 @@
 
       List<int> affectedFitnessComponents = new List<int>();
-      for (int c = 0; c<interactions.Columns; c++)
+      for (int c = 0; c < interactions.Columns; c++)
         if (interactions[move.Index, c])
           affectedFitnessComponents.Add(c);
@@ -52,15 +50,15 @@
       MovedBinaryVectorParameter.ActualValue = moved;
       moved[move.Index] = !moved[move.Index];
-      if (affectedFitnessComponents.Count*2 > interactions.Columns) {
+      if (affectedFitnessComponents.Count * 2 > interactions.Columns) {
         double[] f_i;
-        moveQuality = NKEvaluator.Evaluate(moved, interactions, weights, seed, out f_i);
+        moveQuality = NKLandscape.Evaluate(moved, interactions, weights, seed, out f_i);
       } else {
-        long x = NKEvaluator.Encode(binaryVector);
-        long y = NKEvaluator.Encode(moved);
-        long[] g = NKEvaluator.Encode(interactions);
-        double[] w = NKEvaluator.Normalize(weights);
+        long x = NKLandscape.Encode(binaryVector);
+        long y = NKLandscape.Encode(moved);
+        long[] g = NKLandscape.Encode(interactions);
+        double[] w = NKLandscape.Normalize(weights);
         foreach (var c in affectedFitnessComponents) {
-          moveQuality -= w[c%w.Length] * NKEvaluator.F_i(x, c, g[c], seed);
-          moveQuality += w[c%w.Length] * NKEvaluator.F_i(y, c, g[c], seed);
+          moveQuality -= w[c % w.Length] * NKLandscape.F_i(x, c, g[c], seed);
+          moveQuality += w[c % w.Length] * NKLandscape.F_i(y, c, g[c], seed);
         }
       }
Index: anches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKEvaluatator.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKEvaluatator.cs	(revision 12564)
+++ 	(revision )
@@ -1,157 +1,0 @@
-﻿
-using System;
-using System.Security.Cryptography;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Threading;
-namespace HeuristicLab.Problems.NK {
-
-  [Item("NK Landscape Evaluator", "Evaluates 'points' on an NK Landscape.")]
-  [StorableClass]
-  public class NKEvaluator : SingleSuccessorOperator, INKEvaluator {
-
-    #region Parameters
-
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public LookupParameter<DoubleArray> F_iParameter {
-      get { return (LookupParameter<DoubleArray>)Parameters["F_i"]; }
-    }
-    public ILookupParameter<BinaryVector> BinaryVectorParameter {
-      get { return (ILookupParameter<BinaryVector>)Parameters["BinaryVector"]; }
-    }
-    public LookupParameter<BoolMatrix> GeneInteractionsParameter {
-      get { return (LookupParameter<BoolMatrix>)Parameters["GeneInteractions"]; }
-    }
-    public LookupParameter<IntValue> InteractionSeedParameter {
-      get { return (LookupParameter<IntValue>)Parameters["InteractionSeed"]; }
-    }
-    public LookupParameter<DoubleArray> WeightsParameter {
-      get { return (LookupParameter<DoubleArray>)Parameters["Weights"]; }
-    }
-    public ValueLookupParameter<BoolValue> StoreComponentsParameter {
-      get { return (ValueLookupParameter<BoolValue>)Parameters["StoreComponents"]; }
-    }
-
-    #endregion
-
-    #region ParameterValues
-    private double Quality {
-      set { QualityParameter.ActualValue = new DoubleValue(value); }
-    }
-    private BinaryVector BinaryVector {
-      get { return BinaryVectorParameter.ActualValue; }
-    }
-    private BoolMatrix GeneInteractions {
-      get { return GeneInteractionsParameter.ActualValue; }
-    }
-    private int InteractionSeed {
-      get { return InteractionSeedParameter.ActualValue.Value; }
-    }
-    private DoubleArray Weights {
-      get { return WeightsParameter.ActualValue; }
-    }
-    private bool StoreComponents {
-      get {
-        IParameter param;
-        return Parameters.TryGetValue("StoreComponents", out param)
-          && ((ValueLookupParameter<BoolValue>)param).ActualValue.Value == true;
-      }
-    }
-    #endregion
-
-    private ThreadLocal<HashAlgorithm> hashAlgorithm;
-
-    [StorableConstructor]
-    protected NKEvaluator(bool deserializing) : base(deserializing) {
-      hashAlgorithm = new ThreadLocal<HashAlgorithm>(() => HashAlgorithm.Create("MD5"));
-    }
-    protected NKEvaluator(NKEvaluator original, Cloner cloner) : base(original, cloner) {
-      hashAlgorithm = new ThreadLocal<HashAlgorithm>(() => HashAlgorithm.Create("MD5"));
-    }
-    public NKEvaluator() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the OneMax solution."));
-      Parameters.Add(new LookupParameter<DoubleArray>("F_i", "Fitness component functions."));
-      Parameters.Add(new LookupParameter<BinaryVector>("BinaryVector", "The solution given in path representation which should be evaluated."));
-      Parameters.Add(new LookupParameter<BoolMatrix>("GeneInteractions", "Matrix indicating gene interactions."));
-      Parameters.Add(new LookupParameter<IntValue>("InteractionSeed", "Seed used for randomly generting gene interactions."));
-      Parameters.Add(new LookupParameter<DoubleArray>("Weights", "The weights for the component functions. If shorter, will be repeated."));
-      Parameters.Add(new ValueLookupParameter<BoolValue>("StoreComponents", "Inject values of component functions into the scope (F_i)", new BoolValue(false)));
-      hashAlgorithm = new ThreadLocal<HashAlgorithm>(() => HashAlgorithm.Create("MD5"));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new NKEvaluator(this, cloner);
-    }
-
-    public long Hash(long x) {
-      return BitConverter.ToInt64(hashAlgorithm.Value.ComputeHash(BitConverter.GetBytes(x), 0, 8), 0);
-    }
-
-    public double F_i(long x, long i, long g_i, long seed) {
-      return Math.Abs((double)Hash((x & g_i) ^ Hash(g_i ^ Hash(i ^ seed))))/long.MaxValue;
-    }
-
-    public double F(long x, long[] g, double[] w, long seed, ref double[] f_i) {
-      double value = 0;
-      for (int i = 0; i<g.Length; i++) {
-        f_i[i] = F_i(x, i, g[i], seed);
-        value += w[i%w.Length] * f_i[i];
-      }
-      return value;
-    }
-
-    public long Encode(BinaryVector v) {
-      long x = 0;
-      for (int i = 0; i<64 && i<v.Length; i++) {
-        x |= (v[i] ? (long)1 : (long)0) << i;
-      }
-      return x;
-    }
-
-    public static long[] Encode(BoolMatrix m) {
-      long[] x = new long[m.Columns];
-      for (int c = 0; c<m.Columns; c++) {
-        x[c] = 0;
-        for (int r = 0; r<64 && r<m.Rows; r++) {
-          x[c] |= (m[r, c] ? (long)1 : (long)0) << r;
-        }
-      }
-      return x;
-    }
-
-    public static double[] Normalize(DoubleArray weights) {
-      double sum = 0;
-      double[] w = new double[weights.Length];
-      foreach (var v in weights) {
-        sum += Math.Abs(v);
-      }
-      for (int i = 0; i<weights.Length; i++) {
-        w[i] = Math.Abs(weights[i])/sum;
-      }
-      return w;
-    }
-
-    public sealed override IOperation Apply() {
-      double[] f_i;
-      Quality = Evaluate(BinaryVector, GeneInteractions, Weights, InteractionSeed, out f_i);
-      if (StoreComponents)
-        F_iParameter.ActualValue = new DoubleArray(f_i);
-      return base.Apply();
-    }
-
-    public double Evaluate(BinaryVector vector, BoolMatrix interactions, DoubleArray weights, int seed, out double[] f_i) {
-      long x = Encode(vector);
-      long[] g = Encode(interactions);
-      double[] w = Normalize(weights);
-      f_i = new double[interactions.Columns];
-      return F(x, g, w, (long)seed, ref f_i);
-    }
-  }
-}
Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKLandscape.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKLandscape.cs	(revision 12564)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Problems.NK/NKLandscape.cs	(revision 12565)
@@ -1,13 +1,13 @@
 ﻿using System;
-using System.Collections.Generic;
 using System.Linq;
+using System.Security.Cryptography;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Binary;
 using HeuristicLab.Problems.NK.WeightInitializers;
 using HeuristicLab.Random;
@@ -18,12 +18,10 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class NKLandscape : SingleObjectiveHeuristicOptimizationProblem<INKEvaluator, IBinaryVectorCreator>, IStorableContent {
-
-    public string Filename { get; set; }
-
-    #region Parameter Properties
-    public ValueParameter<IntValue> LengthParameter {
-      get { return (ValueParameter<IntValue>)Parameters["Length"]; }
-    }
+  public sealed class NKLandscape : BinaryProblem {
+    public override bool Maximization {
+      get { return false; }
+    }
+
+    #region Parameters
     public ValueParameter<BoolMatrix> GeneInteractionsParameter {
       get { return (ValueParameter<BoolMatrix>)Parameters["GeneInteractions"]; }
@@ -50,20 +48,40 @@
 
     #region Properties
-    public IntValue Length {
-      get { return LengthParameter.Value; }
-      set { LengthParameter.Value = value; }
-    }
     public IInteractionInitializer InteractionInitializer {
       get { return InteractionInitializerParameter.Value; }
     }
-    [Storable(AllowOneWay = true)]
-    private List<IOperator> operators {
-      set {
-        Operators.AddRange(value);
-      }
-    }
-    #endregion
-
-    private static MersenneTwister random = new MersenneTwister();
+    public BoolMatrix GeneInteractions {
+      get { return GeneInteractionsParameter.Value; }
+    }
+    public DoubleArray Weights {
+      get { return WeightsParameter.Value; }
+    }
+    public IntValue InteractionSeed {
+      get { return InteractionSeedParameter.Value; }
+    }
+    #endregion
+
+    [ThreadStatic]
+    private static MersenneTwister random;
+    public static MersenneTwister Random {
+      get {
+        if (random == null) {
+          random = new MersenneTwister();
+        }
+        return random;
+      }
+    }
+
+    [ThreadStatic]
+    private static HashAlgorithm hashAlgorithm;
+
+    public static HashAlgorithm HashAlgorithm {
+      get {
+        if (hashAlgorithm == null) {
+          hashAlgorithm = HashAlgorithm.Create("MD5");
+        }
+        return hashAlgorithm;
+      }
+    }
 
     [StorableConstructor]
@@ -71,11 +89,10 @@
     private NKLandscape(NKLandscape original, Cloner cloner)
       : base(original, cloner) {
-      AttachEventHandlers();
+      RegisterEventHandlers();
     }
     public NKLandscape()
       : base() {
-      Parameters.Add(new ValueParameter<IntValue>("Length", "The length of the BinaryVector.", new IntValue(10)));
       Parameters.Add(new ValueParameter<BoolMatrix>("GeneInteractions", "Every column gives the participating genes for each fitness component"));
-      Parameters.Add(new ValueParameter<IntValue>("InteractionSeed", "The seed used for the hash function to generate interaction tables.", new IntValue(random.Next())));
+      Parameters.Add(new ValueParameter<IntValue>("InteractionSeed", "The seed used for the hash function to generate interaction tables.", new IntValue(Random.Next())));
       Parameters.Add(new ValueParameter<IntValue>("NrOfFitnessComponents", "Number of fitness component functions. (nr of columns in the interaction column)", new IntValue(10)));
       Parameters.Add(new ValueParameter<IntValue>("NrOfInteractions", "Number of genes interacting with each other. (nr of True values per column in the interaction matrix)", new IntValue(3)));
@@ -84,15 +101,9 @@
       Parameters.Add(new OptionalConstrainedValueParameter<IWeightsInitializer>("WeightsInitializer", "Operator to initialize weights distribution"));
 
-      SolutionCreator = new RandomBinaryVectorCreator();
-      Evaluator = new NKEvaluator();
-
       InitializeInteractionInitializerParameter();
       InitializeWeightsInitializerParameter();
 
-      ParameterizeSolutionCreator();
-      ParameterizeEvaluator();
-
       InitializeOperators();
-      AttachEventHandlers();
+      RegisterEventHandlers();
       InitializeInteractions();
     }
@@ -115,35 +126,7 @@
 
     #region Events
-    protected override void OnSolutionCreatorChanged() {
-      SolutionCreator.BinaryVectorParameter.ActualNameChanged += SolutionCreator_BinaryVectorParameter_ActualNameChanged;
-      ParameterizeSolutionCreator();
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-      ParameterizeOperators();
-      base.OnSolutionCreatorChanged();
-    }
-    private void SolutionCreator_BinaryVectorParameter_ActualNameChanged(object sender, EventArgs e) {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-      ParameterizeOperators();
-    }
-    protected override void OnEvaluatorChanged() {
-      ParameterizeEvaluator();
-      ParameterizeAnalyzer();
-      base.OnEvaluatorChanged();
-    }
-    void LengthParameter_ValueChanged(object sender, EventArgs e) {
-      ParameterizeSolutionCreator();
-      LengthParameter.Value.ValueChanged += new EventHandler(Length_ValueChanged);
-      BestKnownQualityParameter.Value.Value = Length.Value;
-    }
-    void Length_ValueChanged(object sender, EventArgs e) {
-      NrOfFitnessComponentsParameter.Value = new IntValue(Length.Value);
-    }
-    void OneBitflipMoveParameter_ActualNameChanged(object sender, EventArgs e) {
-      string name = ((ILookupParameter<OneBitflipMove>)sender).ActualName;
-      foreach (IOneBitflipMoveOperator op in Operators.OfType<IOneBitflipMoveOperator>()) {
-        op.OneBitflipMoveParameter.ActualName = name;
-      }
+    protected override void LengthParameter_ValueChanged(object sender, EventArgs e) {
+      BestKnownQualityParameter.Value = new DoubleValue(Length);
+      NrOfFitnessComponentsParameter.Value = new IntValue(Length);
     }
     #endregion
@@ -152,25 +135,14 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      if (!Parameters.ContainsKey("InteractionInitializer")) {
-        Parameters.Add(new OptionalConstrainedValueParameter<IInteractionInitializer>("InteractionInitializer", "Initialized the interaction between bits and fitness components"));
-        InitializeInteractionInitializerParameter();
-      }
-      if (!Parameters.ContainsKey("WeightsInitializer")) {
-        Parameters.Add(new OptionalConstrainedValueParameter<IWeightsInitializer>("WeightsInitializer", "Operator to initialize weights distribution"));
-        InitializeWeightsInitializerParameter();
-      }
-      AttachEventHandlers();
-    }
-
-    private void AttachEventHandlers() {
-      SolutionCreator.BinaryVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_BinaryVectorParameter_ActualNameChanged);
-      LengthParameter.ValueChanged += new EventHandler(LengthParameter_ValueChanged);
-      LengthParameter.Value.ValueChanged += new EventHandler(Length_ValueChanged);
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
       NrOfInteractionsParameter.ValueChanged += InteractionParameterChanged;
       NrOfInteractionsParameter.Value.ValueChanged += InteractionParameterChanged;
       NrOfFitnessComponentsParameter.ValueChanged += InteractionParameterChanged;
       NrOfFitnessComponentsParameter.Value.ValueChanged += InteractionParameterChanged;
-      InteractionInitializerParameter.ValueChanged += new EventHandler(InteractionInitializerParameter_ValueChanged);
-      WeightsInitializerParameter.ValueChanged += new EventHandler(WeightsInitializerParameter_ValueChanged);
+      InteractionInitializerParameter.ValueChanged += InteractionInitializerParameter_ValueChanged;
+      WeightsInitializerParameter.ValueChanged += WeightsInitializerParameter_ValueChanged;
     }
 
@@ -187,47 +159,8 @@
     }
 
-    private void ParameterizeSolutionCreator() {
-      SolutionCreator.LengthParameter.ActualName = LengthParameter.Name;
-    }
-
-    private void ParameterizeEvaluator() {
-      if (Evaluator is NKEvaluator)
-        ((NKEvaluator)Evaluator).BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-    }
-    private void ParameterizeAnalyzer() {
-      //BestOneMaxSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
-      //BestOneMaxSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
-      //BestOneMaxSolutionAnalyzer.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-      //BestOneMaxSolutionAnalyzer.ResultsParameter.ActualName = "Results";
-    }
-
     private void InitializeOperators() {
-      ParameterizeAnalyzer();
-      foreach (IBinaryVectorOperator op in ApplicationManager.Manager.GetInstances<IBinaryVectorOperator>()) {
-        if (!(op is ISingleObjectiveMoveEvaluator) || (op is INKMoveEvaluator)) {
-          Operators.Add(op);
-        }
-      }
-      ParameterizeOperators();
-      InitializeMoveGenerators();
-    }
-    private void InitializeMoveGenerators() {
-      foreach (IOneBitflipMoveOperator op in Operators.OfType<IOneBitflipMoveOperator>()) {
-        if (op is IMoveGenerator) {
-          op.OneBitflipMoveParameter.ActualNameChanged += new EventHandler(OneBitflipMoveParameter_ActualNameChanged);
-        }
-      }
-    }
-    private void ParameterizeOperators() {
-      foreach (IBinaryVectorCrossover op in Operators.OfType<IBinaryVectorCrossover>()) {
-        op.ParentsParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-        op.ChildParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-      }
-      foreach (IBinaryVectorManipulator op in Operators.OfType<IBinaryVectorManipulator>()) {
-        op.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-      }
-      foreach (IBinaryVectorMoveOperator op in Operators.OfType<IBinaryVectorMoveOperator>()) {
-        op.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
-      }
+      NKBitFlipMoveEvaluator nkEvaluator = new NKBitFlipMoveEvaluator();
+      Encoding.ConfigureOperator(nkEvaluator);
+      Operators.Add(nkEvaluator);
     }
 
@@ -235,8 +168,7 @@
       if (InteractionInitializer != null)
         GeneInteractionsParameter.Value = InteractionInitializer.InitializeInterations(
-          Length.Value,
+          Length,
           NrOfFitnessComponentsParameter.Value.Value,
-          NrOfInteractionsParameter.Value.Value,
-          random);
+          NrOfInteractionsParameter.Value.Value, Random);
     }
 
@@ -249,4 +181,67 @@
     #endregion
 
+    #region Evaluation function
+    public static long Hash(long x) {
+      return BitConverter.ToInt64(HashAlgorithm.ComputeHash(BitConverter.GetBytes(x), 0, 8), 0);
+    }
+
+    public static double F_i(long x, long i, long g_i, long seed) {
+      return Math.Abs((double)Hash((x & g_i) ^ Hash(g_i ^ Hash(i ^ seed)))) / long.MaxValue;
+    }
+
+    public static double F(long x, long[] g, double[] w, long seed, ref double[] f_i) {
+      double value = 0;
+      for (int i = 0; i < g.Length; i++) {
+        f_i[i] = F_i(x, i, g[i], seed);
+        value += w[i % w.Length] * f_i[i];
+      }
+      return value;
+    }
+
+    public static long Encode(BinaryVector v) {
+      long x = 0;
+      for (int i = 0; i < 64 && i < v.Length; i++) {
+        x |= (v[i] ? (long)1 : (long)0) << i;
+      }
+      return x;
+    }
+
+    public static long[] Encode(BoolMatrix m) {
+      long[] x = new long[m.Columns];
+      for (int c = 0; c < m.Columns; c++) {
+        x[c] = 0;
+        for (int r = 0; r < 64 && r < m.Rows; r++) {
+          x[c] |= (m[r, c] ? (long)1 : (long)0) << r;
+        }
+      }
+      return x;
+    }
+
+    public static double[] Normalize(DoubleArray weights) {
+      double sum = 0;
+      double[] w = new double[weights.Length];
+      foreach (var v in weights) {
+        sum += Math.Abs(v);
+      }
+      for (int i = 0; i < weights.Length; i++) {
+        w[i] = Math.Abs(weights[i]) / sum;
+      }
+      return w;
+    }
+
+    public static double Evaluate(BinaryVector vector, BoolMatrix interactions, DoubleArray weights, int seed, out double[] f_i) {
+      long x = Encode(vector);
+      long[] g = Encode(interactions);
+      double[] w = Normalize(weights);
+      f_i = new double[interactions.Columns];
+      return F(x, g, w, (long)seed, ref f_i);
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      double[] f_i;//not used atm
+      double quality = Evaluate(vector, GeneInteractions, Weights, InteractionSeed.Value, out f_i);
+      return quality;
+    }
+    #endregion
   }
 }
