Index: branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/CPLEX/CplexSolver.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/CPLEX/CplexSolver.cs	(revision 15704)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/CPLEX/CplexSolver.cs	(revision 15713)
@@ -68,5 +68,15 @@
         opl.AddDataSource(dataSource);
         opl.Generate();
-        cplex.Solve();
+        if (cplex.Solve()) {
+          var obj = cplex.ObjValue;
+          if (double.IsNaN(Context.BestQuality) || obj < Context.BestQuality)
+            Context.BestQuality = obj;
+          IResult result;
+          if (Results.TryGetValue("BestQuality", out result))
+            ((DoubleValue)result.Value).Value = Context.BestQuality;
+          else Results.Add(new Result("BestQuality", new DoubleValue(Context.BestQuality)));
+
+          Context.RunOperator(Analyzer, CancellationToken.None);
+        }
         cplex.End();
       }
Index: branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPBinarySolver.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPBinarySolver.cs	(revision 15704)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPBinarySolver.cs	(revision 15713)
@@ -89,7 +89,16 @@
 
       if (curObj >= prevObj) return;
-      prevObj = curObj;
-      Context.BestQuality = curObj;
-           
+      UpdateSolution(curObj);
+
+      Context.RunOperator(Analyzer, CancellationToken.None);
+
+      if (StoppingCriterion()) localSolver.Stop();
+    }
+
+    private void UpdateSolution(double obj) {
+      IResult result;
+      prevObj = obj;
+      Context.BestQuality = obj;
+
       if (Results.TryGetValue("BestQuality", out result))
         ((DoubleValue)result.Value).Value = Context.BestQuality;
@@ -116,8 +125,4 @@
         result.Value = Context.BestSolution;
       else Results.Add(new Result("BestSolution", Context.BestSolution));
-
-      Context.RunOperator(Analyzer, CancellationToken.None);
-
-      if (StoppingCriterion()) localSolver.Stop();
     }
 
@@ -213,4 +218,8 @@
         localSolver.Solve();
 
+        var curObj = obj.GetDoubleValue();
+        if (curObj < prevObj)
+          UpdateSolution(curObj);
+
         localSolver.RemoveCallback(LSCallbackType.IterationTicked, LocalSolverOnIterationTicked);
       } finally {
Index: branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPIntegerSolver.cs
===================================================================
--- branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPIntegerSolver.cs	(revision 15704)
+++ branches/1614_GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/LocalSolverNet/GQAPIntegerSolver.cs	(revision 15713)
@@ -88,7 +88,16 @@
 
       if (curObj >= prevObj) return;
-      prevObj = curObj;
-      Context.BestQuality = curObj;
-           
+      UpdateSolution(curObj);
+
+      Context.RunOperator(Analyzer, CancellationToken.None);
+
+      if (StoppingCriterion()) localSolver.Stop();
+    }
+
+    private void UpdateSolution(double obj) {
+      IResult result;
+      prevObj = obj;
+      Context.BestQuality = obj;
+
       if (Results.TryGetValue("BestQuality", out result))
         ((DoubleValue)result.Value).Value = Context.BestQuality;
@@ -110,8 +119,4 @@
         result.Value = Context.BestSolution;
       else Results.Add(new Result("BestSolution", Context.BestSolution));
-
-      Context.RunOperator(Analyzer, CancellationToken.None);
-
-      if (StoppingCriterion()) localSolver.Stop();
     }
 
@@ -184,4 +189,10 @@
 
         localSolver.Solve();
+
+        var curObj = obj.GetDoubleValue();
+        if (curObj < prevObj)
+          UpdateSolution(curObj);
+
+        localSolver.RemoveCallback(LSCallbackType.IterationTicked, LocalSolverOnIterationTicked);
       } finally {
         localSolver.Dispose();
