diff --git a/CEP/BB/BBS/src/BBSrun.cc b/CEP/BB/BBS/src/BBSrun.cc
index 4395e80bf94da275dc1ca054d8098e59b5cf3958..c73f1f9d760cc8a005bd7963818710a1012d941b 100644
--- a/CEP/BB/BBS/src/BBSrun.cc
+++ b/CEP/BB/BBS/src/BBSrun.cc
@@ -55,6 +55,9 @@ void predict (Prediffer& prediffer, const MSDesc& msd,
   while (time < endTime) {
     prediffer.setWorkDomain (startChan, endChan, time, timeStep);
     prediffer.setStepProp (stepProp);
+#ifdef EXPR_GRAPH
+    prediffer.writeExpressionGraph("expr_graph.dot", 0);
+#endif    
     prediffer.writePredictedData();
     time += timeStep;
   }
@@ -74,6 +77,20 @@ void subtract (Prediffer& prediffer, const MSDesc& msd,
   }
 }
 
+void correct(Prediffer &prediffer, const MSDesc& msd,
+           const StepProp& stepProp,
+           double timeStep, int startChan, int endChan)
+{
+  double time = msd.startTime;
+  double endTime = msd.endTime;
+  while (time < endTime) {
+    prediffer.setWorkDomain (startChan, endChan, time, timeStep);
+    prediffer.setStepProp (stepProp);
+    prediffer.correctData();
+    time += timeStep;
+  }
+}
+
 void solve (Prediffer& prediffer, const MSDesc& msd,
 	const ParmDBMeta &historyPDM,
         const StepProp& stepProp,
@@ -215,14 +232,15 @@ bool doIt (const string& parsetName)
               calcUVW);
   // Set strategy.
   StrategyProp stratProp;
-  stratProp.setAntennas (antennas);
-  stratProp.setCorr (corrs);
-  stratProp.setInColumn (columnNameIn);
+  stratProp.setAntennas(antennas);
+  stratProp.setCorr(corrs);
+  stratProp.setInColumn(columnNameIn);
   ASSERT (prediffer.setStrategyProp (stratProp));
   // Fill step properties.
   StepProp stepProp;
   stepProp.setModel (StringUtil::split(instrumentModel,'.'));
   stepProp.setOutColumn (columnNameOut);
+  stepProp.setCorr(corrs);
   try {
     if (operation == "solve") {
       ASSERT (nrSolveInterval.size()==2);
@@ -250,8 +268,13 @@ bool doIt (const string& parsetName)
       cout << "output column name     : " << columnNameOut << endl;
       subtract (prediffer, msd, stepProp,
         timeDomainSize, startChan, endChan);
+    } else if (operation == "correct") {
+      cout << "input column name      : " << columnNameIn << endl;
+      cout << "output column name     : " << columnNameOut << endl;
+      correct (prediffer, msd, stepProp,
+        timeDomainSize, startChan, endChan);
     } else {
-      cout << "Only operations solve, predict, and subtract are valid" << endl;
+      cout << "Only operations predict, subtract, correct, and solve are valid" << endl;
       return 1;
     }
   }
@@ -275,6 +298,11 @@ bool doIt (const string& parsetName)
 
 int main (int argc, const char* argv[])
 {
+    INIT_LOGGER("BBSrun");
+    
+#ifdef EXPR_GRAPH
+  std::cout << "EXPR_GRAPH defined..." << std::endl;
+#endif  
   try {
     if (argc < 2) {
       cout << "Run as: BBSrun parset-name" << endl;
diff --git a/CEP/BB/BBS/src/Makefile.am b/CEP/BB/BBS/src/Makefile.am
index 6933becc0ec581e7d36d83d3548289a7031cb46e..1f59e1821762c006f0a0341288a017e00dafaccc 100644
--- a/CEP/BB/BBS/src/Makefile.am
+++ b/CEP/BB/BBS/src/Makefile.am
@@ -10,7 +10,8 @@ SolveProp.h		\
 StepProp.h		\
 StrategyProp.h		\
 ParmWriter.h		\
-BBSTestLogger.h
+BBSTestLogger.h     \
+BBSKernelProcessControl.h
 
 pkginclude_MNSdir = $(pkgincludedir)/MNS
 pkginclude_MNS_HEADERS = \
@@ -77,6 +78,7 @@ StrategyProp.cc		\
 ParmData.cc		\
 ParmWriter.cc		\
 BBSTestLogger.cc	\
+BBSKernelProcessControl.cc  \
 MNS/MeqBaseDFTPS.cc \
 MNS/MeqBaseLinPS.cc \
 MNS/MeqDFTPS.cc \
@@ -120,10 +122,14 @@ MNS/MeqStation.cc \
 MNS/MeqStatUVW.cc \
 MNS/MeqTabular.cc 
 
-bin_PROGRAMS = BBSrun
+bin_PROGRAMS = BBSrun BBSKernel
 
 BBSrun_SOURCES = BBSrun.cc
 BBSrun_LDADD = libbbs.la
 BBSrun_DEPENDENCIES = libbbs.la $(LOFAR_DEPEND)
 
+BBSKernel_SOURCES = BBSKernel.cc
+BBSKernel_LDADD = libbbs.la
+BBSKernel_DEPENDENCIES = libbbs.la $(LOFAR_DEPEND)
+
 include $(top_srcdir)/Makefile.common
diff --git a/CEP/BB/BBSKernel/src/BBSrun.cc b/CEP/BB/BBSKernel/src/BBSrun.cc
index 4395e80bf94da275dc1ca054d8098e59b5cf3958..c73f1f9d760cc8a005bd7963818710a1012d941b 100644
--- a/CEP/BB/BBSKernel/src/BBSrun.cc
+++ b/CEP/BB/BBSKernel/src/BBSrun.cc
@@ -55,6 +55,9 @@ void predict (Prediffer& prediffer, const MSDesc& msd,
   while (time < endTime) {
     prediffer.setWorkDomain (startChan, endChan, time, timeStep);
     prediffer.setStepProp (stepProp);
+#ifdef EXPR_GRAPH
+    prediffer.writeExpressionGraph("expr_graph.dot", 0);
+#endif    
     prediffer.writePredictedData();
     time += timeStep;
   }
@@ -74,6 +77,20 @@ void subtract (Prediffer& prediffer, const MSDesc& msd,
   }
 }
 
+void correct(Prediffer &prediffer, const MSDesc& msd,
+           const StepProp& stepProp,
+           double timeStep, int startChan, int endChan)
+{
+  double time = msd.startTime;
+  double endTime = msd.endTime;
+  while (time < endTime) {
+    prediffer.setWorkDomain (startChan, endChan, time, timeStep);
+    prediffer.setStepProp (stepProp);
+    prediffer.correctData();
+    time += timeStep;
+  }
+}
+
 void solve (Prediffer& prediffer, const MSDesc& msd,
 	const ParmDBMeta &historyPDM,
         const StepProp& stepProp,
@@ -215,14 +232,15 @@ bool doIt (const string& parsetName)
               calcUVW);
   // Set strategy.
   StrategyProp stratProp;
-  stratProp.setAntennas (antennas);
-  stratProp.setCorr (corrs);
-  stratProp.setInColumn (columnNameIn);
+  stratProp.setAntennas(antennas);
+  stratProp.setCorr(corrs);
+  stratProp.setInColumn(columnNameIn);
   ASSERT (prediffer.setStrategyProp (stratProp));
   // Fill step properties.
   StepProp stepProp;
   stepProp.setModel (StringUtil::split(instrumentModel,'.'));
   stepProp.setOutColumn (columnNameOut);
+  stepProp.setCorr(corrs);
   try {
     if (operation == "solve") {
       ASSERT (nrSolveInterval.size()==2);
@@ -250,8 +268,13 @@ bool doIt (const string& parsetName)
       cout << "output column name     : " << columnNameOut << endl;
       subtract (prediffer, msd, stepProp,
         timeDomainSize, startChan, endChan);
+    } else if (operation == "correct") {
+      cout << "input column name      : " << columnNameIn << endl;
+      cout << "output column name     : " << columnNameOut << endl;
+      correct (prediffer, msd, stepProp,
+        timeDomainSize, startChan, endChan);
     } else {
-      cout << "Only operations solve, predict, and subtract are valid" << endl;
+      cout << "Only operations predict, subtract, correct, and solve are valid" << endl;
       return 1;
     }
   }
@@ -275,6 +298,11 @@ bool doIt (const string& parsetName)
 
 int main (int argc, const char* argv[])
 {
+    INIT_LOGGER("BBSrun");
+    
+#ifdef EXPR_GRAPH
+  std::cout << "EXPR_GRAPH defined..." << std::endl;
+#endif  
   try {
     if (argc < 2) {
       cout << "Run as: BBSrun parset-name" << endl;
diff --git a/CEP/BB/BBSKernel/src/Makefile.am b/CEP/BB/BBSKernel/src/Makefile.am
index 6933becc0ec581e7d36d83d3548289a7031cb46e..1f59e1821762c006f0a0341288a017e00dafaccc 100644
--- a/CEP/BB/BBSKernel/src/Makefile.am
+++ b/CEP/BB/BBSKernel/src/Makefile.am
@@ -10,7 +10,8 @@ SolveProp.h		\
 StepProp.h		\
 StrategyProp.h		\
 ParmWriter.h		\
-BBSTestLogger.h
+BBSTestLogger.h     \
+BBSKernelProcessControl.h
 
 pkginclude_MNSdir = $(pkgincludedir)/MNS
 pkginclude_MNS_HEADERS = \
@@ -77,6 +78,7 @@ StrategyProp.cc		\
 ParmData.cc		\
 ParmWriter.cc		\
 BBSTestLogger.cc	\
+BBSKernelProcessControl.cc  \
 MNS/MeqBaseDFTPS.cc \
 MNS/MeqBaseLinPS.cc \
 MNS/MeqDFTPS.cc \
@@ -120,10 +122,14 @@ MNS/MeqStation.cc \
 MNS/MeqStatUVW.cc \
 MNS/MeqTabular.cc 
 
-bin_PROGRAMS = BBSrun
+bin_PROGRAMS = BBSrun BBSKernel
 
 BBSrun_SOURCES = BBSrun.cc
 BBSrun_LDADD = libbbs.la
 BBSrun_DEPENDENCIES = libbbs.la $(LOFAR_DEPEND)
 
+BBSKernel_SOURCES = BBSKernel.cc
+BBSKernel_LDADD = libbbs.la
+BBSKernel_DEPENDENCIES = libbbs.la $(LOFAR_DEPEND)
+
 include $(top_srcdir)/Makefile.common