Index: branches/ParallelEngine/HeuristicLab.Parameters/3.3/LookupParameter.cs
===================================================================
--- branches/ParallelEngine/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 5175)
+++ branches/ParallelEngine/HeuristicLab.Parameters/3.3/LookupParameter.cs	(revision 5178)
@@ -52,12 +52,6 @@
     }
     public new T ActualValue {
-      get {
-        if (cachedActualValue == null) cachedActualValue = GetActualValue();
-        return (T)cachedActualValue;
-      }
-      set {
-        cachedActualValue = value;
-        SetActualValue(value);
-      }
+      get { return (T)base.ActualValue; }
+      set { base.ActualValue = value; }
     }
 
Index: branches/ParallelEngine/HeuristicLab.Parameters/3.3/Parameter.cs
===================================================================
--- branches/ParallelEngine/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 5175)
+++ branches/ParallelEngine/HeuristicLab.Parameters/3.3/Parameter.cs	(revision 5178)
@@ -25,4 +25,6 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using System.Threading;
 
 namespace HeuristicLab.Parameters {
@@ -53,24 +55,55 @@
       get { return dataType; }
     }
-    protected IItem cachedActualValue;
+    protected Dictionary<int, IItem> cachedActualValues;
     public IItem ActualValue {
       get {
-        if (cachedActualValue == null) cachedActualValue = GetActualValue();
-        return cachedActualValue;
+        int id = Thread.CurrentThread.ManagedThreadId;
+        IItem value = null;
+        lock (cachedActualValues) {
+          cachedActualValues.TryGetValue(id, out value);
+        }
+        if (value == null) {
+          value = GetActualValue();
+          lock (cachedActualValues) {
+            if (cachedActualValues.ContainsKey(id)) cachedActualValues[id] = value;
+            else cachedActualValues.Add(id, value);
+          }
+        }
+        return value;
       }
       set {
-        cachedActualValue = value;
+        int id = Thread.CurrentThread.ManagedThreadId;
+        lock (cachedActualValues) {
+          if (cachedActualValues.ContainsKey(id)) cachedActualValues[id] = value;
+          else cachedActualValues.Add(id, value);
+        }
         SetActualValue(value);
       }
     }
-    [Storable]
-    private IExecutionContext executionContext;
+    private Dictionary<int, IExecutionContext> executionContexts;
     public IExecutionContext ExecutionContext {
-      get { return executionContext; }
+      get {
+        int id = Thread.CurrentThread.ManagedThreadId;
+        IExecutionContext context = null;
+        lock (executionContexts) {
+          executionContexts.TryGetValue(id, out context);
+        }
+        return context;
+      }
       set {
-        if (value != executionContext) {
-          executionContext = value;
-          cachedActualValue = null;
-          OnExecutionContextChanged();
+        IExecutionContext context = null;
+        int id = Thread.CurrentThread.ManagedThreadId;
+        lock (executionContexts) {
+          executionContexts.TryGetValue(id, out context);
+          if (value != context) {
+            if (context == null) executionContexts.Add(id, value);
+            else if (value == null) {
+              executionContexts.Remove(id);
+              lock (cachedActualValues) cachedActualValues.Remove(id);
+            } else {
+              executionContexts[id] = value;
+              lock (cachedActualValues) cachedActualValues.Remove(id);
+            }
+          }
         }
       }
@@ -78,13 +111,22 @@
 
     [StorableConstructor]
-    protected Parameter(bool deserializing) : base(deserializing) { }
+    protected Parameter(bool deserializing) : base(deserializing) {
+      cachedActualValues = new Dictionary<int, IItem>();
+      executionContexts = new Dictionary<int, IExecutionContext>();
+    }
     protected Parameter(Parameter original, Cloner cloner)
       : base(original, cloner) {
       dataType = original.dataType;
-      executionContext = cloner.Clone(original.executionContext);
+      cachedActualValues = new Dictionary<int, IItem>();
+      executionContexts = new Dictionary<int, IExecutionContext>();
+      foreach (var item in original.executionContexts) {
+        executionContexts.Add(item.Key, cloner.Clone(item.Value));
+      }
     }
     protected Parameter()
       : base("Anonymous") {
       dataType = typeof(IItem);
+      cachedActualValues = new Dictionary<int, IItem>();
+      executionContexts = new Dictionary<int, IExecutionContext>();
     }
     protected Parameter(string name, Type dataType)
@@ -92,4 +134,6 @@
       if (dataType == null) throw new ArgumentNullException();
       this.dataType = dataType;
+      cachedActualValues = new Dictionary<int, IItem>();
+      executionContexts = new Dictionary<int, IExecutionContext>();
     }
     protected Parameter(string name, string description, Type dataType)
@@ -97,4 +141,6 @@
       if (dataType == null) throw new ArgumentNullException();
       this.dataType = dataType;
+      cachedActualValues = new Dictionary<int, IItem>();
+      executionContexts = new Dictionary<int, IExecutionContext>();
     }
 
@@ -105,6 +151,4 @@
     protected abstract IItem GetActualValue();
     protected abstract void SetActualValue(IItem value);
-
-    protected virtual void OnExecutionContextChanged() { }
   }
 }
