diff --git a/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h b/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h
index 7609cf92940f43e56bbb91f13e4e20f85de9315e..3ddec86d287f2dcc5dd42be486ce4958ec530445 100644
--- a/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h
+++ b/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h
@@ -30,6 +30,7 @@
 //# Includes
 #include <PLC/ProcessControl.h>
 #include <APS/ParameterSet.h>
+#include <BBSControl/BBSStructs.h>
 
 namespace LOFAR
 {
@@ -99,13 +100,15 @@ namespace LOFAR
       // Receive a BlobStreamable object, e.g., a BBSStatus.
       BlobStreamable* recvObject();
 
-
       // Parameter set for this process controller.
       ACC::APS::ParameterSet itsParameterSet;
 
       // Prediffer
       Prediffer* itsPrediffer;
 
+      // Work domain size
+      DomainSize itsWorkDomainSize;
+
       // History database.
       LOFAR::ParmDB::ParmDB* itsHistory;
 
diff --git a/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h b/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h
index 7609cf92940f43e56bbb91f13e4e20f85de9315e..3ddec86d287f2dcc5dd42be486ce4958ec530445 100644
--- a/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h
+++ b/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h
@@ -30,6 +30,7 @@
 //# Includes
 #include <PLC/ProcessControl.h>
 #include <APS/ParameterSet.h>
+#include <BBSControl/BBSStructs.h>
 
 namespace LOFAR
 {
@@ -99,13 +100,15 @@ namespace LOFAR
       // Receive a BlobStreamable object, e.g., a BBSStatus.
       BlobStreamable* recvObject();
 
-
       // Parameter set for this process controller.
       ACC::APS::ParameterSet itsParameterSet;
 
       // Prediffer
       Prediffer* itsPrediffer;
 
+      // Work domain size
+      DomainSize itsWorkDomainSize;
+
       // History database.
       LOFAR::ParmDB::ParmDB* itsHistory;
 
diff --git a/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc b/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc
index d77963561252dda4694599f56b2e1088a40c89cd..16037d7fa92c15d0193a5c4936779773fb917915 100644
--- a/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc
+++ b/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc
@@ -275,10 +275,12 @@ namespace BBS
                                          0,
                                          false);
 
-            // Set data selection and work domain.
-            DomainSize workDomainSize = strategy->domainSize();
-            return (itsPrediffer->setSelection(strategy->stations(), strategy->correlation())
-                    && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval));
+            // Store work domain size.
+            itsWorkDomainSize = strategy->domainSize();
+
+            // Select stations and correlations.
+            return itsPrediffer->setSelection(strategy->stations(), strategy->correlation());
+//                    && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval));
 //                    && itsPrediffer->setWorkDomain(-1, -1, 0, 1e12));
 //                    && itsPrediffer->setWorkDomain(4, 59, 0, 1e12));
         }
@@ -293,40 +295,75 @@ namespace BBS
     bool BBSKernelProcessControl::handle(const BBSStep* bs)
     {
         LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
-        
+        ASSERT(itsPrediffer);
+
+        const MSDesc &descriptor = itsPrediffer->getMSDescriptor();
+
+        LOG_DEBUG_STR("MS descriptor:" << endl << descriptor);
+
+        double startFreq = descriptor.startFreq[0];
+        double endFreq = descriptor.endFreq[0];
+
+        /*
+            (Some?) Westerbork measurement sets store the channels
+            in reverse order. In this case, start and end frequency
+            need to be exchanged.
+        */
+        if(startFreq > endFreq)
         {
-            const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs);
-            if(step)
-            {
-                return doHandle(step);
-            }
+            double tmp;
+            tmp = startFreq;
+            startFreq = endFreq;
+            endFreq = tmp;
         }
-                
+
+        double startTime = descriptor.startTime;
+        double endTime = descriptor.endTime;
+        double time = startTime;
+
+        bool result = true;
+        while(result && (time < endTime))
         {
-            const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs);
-            if(step)
+            ASSERT(itsPrediffer->setWorkDomain(startFreq, endFreq, time, time + itsWorkDomainSize.timeInterval));
+
+            result = false;
+
             {
-                return doHandle(step);
+                const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
-        }
-        
-        {
-            const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs);
-            if(step)
+                    
             {
-                return doHandle(step);
+                const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
-        }
-        
-        {
-            const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs);
-            if(step)
+            
             {
-                return doHandle(step);
+                const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
+            
+            {
+                const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
+            }
+
+            time += itsWorkDomainSize.timeInterval;
         }
         
-        return false;
+        return result;
     }
 
 
@@ -351,7 +388,8 @@ namespace BBS
         context.sources = step->sources();        
         context.instrumentModel = step->instrumentModels();
     }
-    
+
+
     bool BBSKernelProcessControl::sendObject(const BlobStreamable& bs)
     {
       LOG_TRACE_LIFETIME(TRACE_LEVEL_FLOW, "");
diff --git a/CEP/BB/BBSControl/src/KernelProcessControl.cc b/CEP/BB/BBSControl/src/KernelProcessControl.cc
index d77963561252dda4694599f56b2e1088a40c89cd..16037d7fa92c15d0193a5c4936779773fb917915 100644
--- a/CEP/BB/BBSControl/src/KernelProcessControl.cc
+++ b/CEP/BB/BBSControl/src/KernelProcessControl.cc
@@ -275,10 +275,12 @@ namespace BBS
                                          0,
                                          false);
 
-            // Set data selection and work domain.
-            DomainSize workDomainSize = strategy->domainSize();
-            return (itsPrediffer->setSelection(strategy->stations(), strategy->correlation())
-                    && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval));
+            // Store work domain size.
+            itsWorkDomainSize = strategy->domainSize();
+
+            // Select stations and correlations.
+            return itsPrediffer->setSelection(strategy->stations(), strategy->correlation());
+//                    && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval));
 //                    && itsPrediffer->setWorkDomain(-1, -1, 0, 1e12));
 //                    && itsPrediffer->setWorkDomain(4, 59, 0, 1e12));
         }
@@ -293,40 +295,75 @@ namespace BBS
     bool BBSKernelProcessControl::handle(const BBSStep* bs)
     {
         LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
-        
+        ASSERT(itsPrediffer);
+
+        const MSDesc &descriptor = itsPrediffer->getMSDescriptor();
+
+        LOG_DEBUG_STR("MS descriptor:" << endl << descriptor);
+
+        double startFreq = descriptor.startFreq[0];
+        double endFreq = descriptor.endFreq[0];
+
+        /*
+            (Some?) Westerbork measurement sets store the channels
+            in reverse order. In this case, start and end frequency
+            need to be exchanged.
+        */
+        if(startFreq > endFreq)
         {
-            const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs);
-            if(step)
-            {
-                return doHandle(step);
-            }
+            double tmp;
+            tmp = startFreq;
+            startFreq = endFreq;
+            endFreq = tmp;
         }
-                
+
+        double startTime = descriptor.startTime;
+        double endTime = descriptor.endTime;
+        double time = startTime;
+
+        bool result = true;
+        while(result && (time < endTime))
         {
-            const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs);
-            if(step)
+            ASSERT(itsPrediffer->setWorkDomain(startFreq, endFreq, time, time + itsWorkDomainSize.timeInterval));
+
+            result = false;
+
             {
-                return doHandle(step);
+                const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
-        }
-        
-        {
-            const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs);
-            if(step)
+                    
             {
-                return doHandle(step);
+                const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
-        }
-        
-        {
-            const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs);
-            if(step)
+            
             {
-                return doHandle(step);
+                const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
             }
+            
+            {
+                const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs);
+                if(step)
+                {
+                    result = doHandle(step);
+                }
+            }
+
+            time += itsWorkDomainSize.timeInterval;
         }
         
-        return false;
+        return result;
     }
 
 
@@ -351,7 +388,8 @@ namespace BBS
         context.sources = step->sources();        
         context.instrumentModel = step->instrumentModels();
     }
-    
+
+
     bool BBSKernelProcessControl::sendObject(const BlobStreamable& bs)
     {
       LOG_TRACE_LIFETIME(TRACE_LEVEL_FLOW, "");