Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/EventLogManager.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/EventLogManager.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/EventLogManager.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/PluginManager.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/PluginManager.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/PluginManager.cs	(revision 15973)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs
===================================================================
--- branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs	(revision 15651)
+++ branches/2522_RefactorPluginInfrastructure/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs	(revision 15973)
@@ -1,5 +1,5 @@
 ﻿#region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -37,5 +37,5 @@
   public class TaskManager {
     private static readonly ReaderWriterLockSlim slaveTasksLocker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-    private readonly Dictionary<Guid, SnapshotInfo> slaveTasks;
+    private readonly Dictionary<Guid, Tuple<SlaveTask, DateTime>> slaveTasks;
     private readonly ILog log;
     private readonly PluginManager pluginManager;
@@ -43,5 +43,4 @@
     private readonly CancellationToken ct;
     private readonly AutoResetEvent waitHandle;
-    private readonly WcfService wcfService;
     private readonly TimeSpan checkpointInterval;
     private readonly TimeSpan checkpointCheckInterval;
@@ -70,10 +69,9 @@
       this.pluginManager = pluginCache;
       this.log = log;
-      this.slaveTasks = new Dictionary<Guid, SnapshotInfo>();
+      this.slaveTasks = new Dictionary<Guid, Tuple<SlaveTask, DateTime>>();
 
       cts = new CancellationTokenSource();
       ct = cts.Token;
       waitHandle = new AutoResetEvent(true);
-      wcfService = WcfService.Instance;
       checkpointInterval = Settings.Default.CheckpointInterval;
       checkpointCheckInterval = Settings.Default.CheckpointCheckInterval;
@@ -85,22 +83,11 @@
     private void Checkpointing() {
       while (!ct.IsCancellationRequested) {
-        slaveTasksLocker.EnterWriteLock();
+        slaveTasksLocker.EnterUpgradeableReadLock();
         try {
           foreach (var entry in slaveTasks) {
-            var taskId = entry.Key;
-            var snapshotInfo = entry.Value;
-
-            if (DateTime.Now - snapshotInfo.LastSnapshot <= checkpointInterval) continue;
-
-            var task = wcfService.GetTask(taskId);
-            var snapshot = snapshotInfo.Task.GetTaskDataSnapshot();
-
-            if (snapshot == null) continue;
-
-            slaveTasks[taskId].LastSnapshot = snapshot.Item2;
-            var slaveId = ConfigManager.Instance.GetClientInfo().Id;
-            wcfService.UpdateTaskData(task, snapshot.Item1, slaveId, TaskState.Calculating);
+            if (DateTime.Now - entry.Value.Item2 > checkpointInterval)
+              PauseTaskAsync(entry.Key);
           }
-        } finally { slaveTasksLocker.ExitWriteLock(); }
+        } finally { slaveTasksLocker.ExitUpgradeableReadLock(); }
         waitHandle.WaitOne(checkpointCheckInterval);
       }
@@ -146,5 +133,5 @@
       try {
         if (!slaveTasks.ContainsKey(taskId)) throw new TaskNotRunningException(taskId);
-        SlaveTask slaveTask = slaveTasks[taskId].Task;
+        SlaveTask slaveTask = slaveTasks[taskId].Item1;
         slaveTask.PauseTask();
       }
@@ -156,5 +143,5 @@
       try {
         if (!slaveTasks.ContainsKey(taskId)) throw new TaskNotRunningException(taskId);
-        SlaveTask slaveTask = slaveTasks[taskId].Task;
+        SlaveTask slaveTask = slaveTasks[taskId].Item1;
         slaveTask.StopTask();
       }
@@ -167,5 +154,5 @@
       try {
         if (!slaveTasks.ContainsKey(taskId)) throw new TaskNotRunningException(taskId);
-        slaveTask = slaveTasks[taskId].Task;
+        slaveTask = slaveTasks[taskId].Item1;
         if (!slaveTask.IsPrepared) throw new AppDomainNotCreatedException();
         RemoveSlaveTask(taskId, slaveTask);
@@ -181,5 +168,5 @@
       try {
         foreach (var slaveTask in slaveTasks.Values) {
-          slaveTask.Task.PauseTask();
+          slaveTask.Item1.PauseTask();
         }
       }
@@ -191,5 +178,5 @@
       try {
         foreach (var slaveTask in slaveTasks.Values) {
-          slaveTask.Task.StopTask();
+          slaveTask.Item1.StopTask();
         }
       }
@@ -201,5 +188,5 @@
       try {
         foreach (var slaveTask in slaveTasks.Values.ToArray()) {
-          AbortTask(slaveTask.Task.TaskId);
+          AbortTask(slaveTask.Item1.TaskId);
         }
       }
@@ -212,5 +199,5 @@
       slaveTasksLocker.EnterWriteLock();
       try {
-        slaveTasks.Add(task.Id, new SnapshotInfo { Task = slaveTask, LastSnapshot = task.DateCreated.GetValueOrDefault() });
+        slaveTasks.Add(task.Id, Tuple.Create(slaveTask, DateTime.Now));
         RegisterSlaveTaskEvents(slaveTask);
       }
@@ -247,5 +234,5 @@
       slaveTasksLocker.EnterUpgradeableReadLock();
       try {
-        slaveTask = slaveTasks[e.Value].Task;
+        slaveTask = slaveTasks[e.Value].Item1;
       }
       finally { slaveTasksLocker.ExitUpgradeableReadLock(); }
@@ -259,5 +246,5 @@
       slaveTasksLocker.EnterUpgradeableReadLock();
       try {
-        slaveTask = slaveTasks[e.Value].Task;
+        slaveTask = slaveTasks[e.Value].Item1;
         RemoveSlaveTask(e.Value, slaveTask);
       }
@@ -281,5 +268,5 @@
       slaveTasksLocker.EnterUpgradeableReadLock();
       try {
-        slaveTask = slaveTasks[e.Value].Task;
+        slaveTask = slaveTasks[e.Value].Item1;
         RemoveSlaveTask(e.Value, slaveTask);
       }
@@ -303,5 +290,5 @@
       slaveTasksLocker.EnterUpgradeableReadLock();
       try {
-        slaveTask = slaveTasks[e.Value].Task;
+        slaveTask = slaveTasks[e.Value].Item1;
         RemoveSlaveTask(e.Value, slaveTask);
       }
@@ -353,12 +340,7 @@
       slaveTasksLocker.EnterReadLock();
       try {
-        return slaveTasks.ToDictionary(x => x.Key, x => x.Value.Task.ExecutionTime);
+        return slaveTasks.ToDictionary(x => x.Key, x => x.Value.Item1.ExecutionTime);
       }
       finally { slaveTasksLocker.ExitReadLock(); }
-    }
-
-    private sealed class SnapshotInfo {
-      public SlaveTask Task { get; set; }
-      public DateTime LastSnapshot { get; set; }
     }
   }
