diff --git a/Config.h b/Config.h
index 01cf7210a47f3682e5e8010311a4f8fc11b0bedd..61a992d91961a77e1d13b7f3963d9bb46b05145a 100644
--- a/Config.h
+++ b/Config.h
@@ -16,7 +16,10 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #pragma once
 
-const int KEY_REPEAT = 'r';
-const int KEY_SPACE  = 32;
-const int KEY_ESC    = 27;
-const int KEY_ESC2   = 'q';
+namespace bgslibrary
+{
+  const int KEY_REPEAT = 'r';
+  const int KEY_SPACE = 32;
+  const int KEY_ESC = 27;
+  const int KEY_ESC2 = 'q';
+}
diff --git a/FrameProcessor.cpp b/FrameProcessor.cpp
index 72cea5b4fcd3dd48cb8c5aaafc13ffab310f867d..9f9bc28b902eca80cb5ca822c86950d96723b7b2 100644
--- a/FrameProcessor.cpp
+++ b/FrameProcessor.cpp
@@ -16,542 +16,569 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "FrameProcessor.h"
 
-FrameProcessor::FrameProcessor() : firstTime(true), frameNumber(0), duration(0), tictoc(""), frameToStop(0)
+namespace bgslibrary
 {
-  std::cout << "FrameProcessor()" << std::endl;
+  FrameProcessor::FrameProcessor() : firstTime(true), frameNumber(0), duration(0), tictoc(""), frameToStop(0)
+  {
+    std::cout << "FrameProcessor()" << std::endl;
 
-  loadConfig();
-  saveConfig();
-}
+    loadConfig();
+    saveConfig();
+  }
 
-FrameProcessor::~FrameProcessor()
-{
-  std::cout << "~FrameProcessor()" << std::endl;
-}
+  FrameProcessor::~FrameProcessor()
+  {
+    std::cout << "~FrameProcessor()" << std::endl;
+  }
 
-void FrameProcessor::init()
-{
-  if(enablePreProcessor)
-    preProcessor = new PreProcessor;
+  void FrameProcessor::init()
+  {
+    if (enablePreProcessor)
+      preProcessor = new PreProcessor;
 
-  if(enableFrameDifferenceBGS)
-    frameDifference = new FrameDifferenceBGS;
+    if (enableFrameDifferenceBGS)
+      frameDifference = new FrameDifferenceBGS;
 
-  if(enableStaticFrameDifferenceBGS)
-    staticFrameDifference = new StaticFrameDifferenceBGS;
+    if (enableStaticFrameDifferenceBGS)
+      staticFrameDifference = new StaticFrameDifferenceBGS;
 
-  if(enableWeightedMovingMeanBGS)
-    weightedMovingMean = new WeightedMovingMeanBGS;
+    if (enableWeightedMovingMeanBGS)
+      weightedMovingMean = new WeightedMovingMeanBGS;
 
-  if(enableWeightedMovingVarianceBGS)
-    weightedMovingVariance = new WeightedMovingVarianceBGS;
+    if (enableWeightedMovingVarianceBGS)
+      weightedMovingVariance = new WeightedMovingVarianceBGS;
 
-  if(enableMixtureOfGaussianV1BGS)
-    mixtureOfGaussianV1BGS = new MixtureOfGaussianV1BGS;
+    if (enableMixtureOfGaussianV1BGS)
+      mixtureOfGaussianV1BGS = new MixtureOfGaussianV1BGS;
 
-  if(enableMixtureOfGaussianV2BGS)
-    mixtureOfGaussianV2BGS = new MixtureOfGaussianV2BGS;
+    if (enableMixtureOfGaussianV2BGS)
+      mixtureOfGaussianV2BGS = new MixtureOfGaussianV2BGS;
 
-  if(enableAdaptiveBackgroundLearning)
-    adaptiveBackgroundLearning = new AdaptiveBackgroundLearning;
+    if (enableAdaptiveBackgroundLearning)
+      adaptiveBackgroundLearning = new AdaptiveBackgroundLearning;
 
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  if(enableGMG)
-    gmg = new GMG;
+    if (enableGMG)
+      gmg = new GMG;
 #endif
 
-  if(enableDPAdaptiveMedianBGS)
-    adaptiveMedian = new DPAdaptiveMedianBGS;
+    if (enableDPAdaptiveMedianBGS)
+      adaptiveMedian = new DPAdaptiveMedianBGS;
 
-  if(enableDPGrimsonGMMBGS)
-    grimsonGMM = new DPGrimsonGMMBGS;
+    if (enableDPGrimsonGMMBGS)
+      grimsonGMM = new DPGrimsonGMMBGS;
 
-  if(enableDPZivkovicAGMMBGS)
-    zivkovicAGMM = new DPZivkovicAGMMBGS;
+    if (enableDPZivkovicAGMMBGS)
+      zivkovicAGMM = new DPZivkovicAGMMBGS;
 
-  if(enableDPMeanBGS)
-    temporalMean = new DPMeanBGS;
+    if (enableDPMeanBGS)
+      temporalMean = new DPMeanBGS;
 
-  if(enableDPWrenGABGS)
-    wrenGA = new DPWrenGABGS;
+    if (enableDPWrenGABGS)
+      wrenGA = new DPWrenGABGS;
 
-  if(enableDPPratiMediodBGS)
-    pratiMediod = new DPPratiMediodBGS;
+    if (enableDPPratiMediodBGS)
+      pratiMediod = new DPPratiMediodBGS;
 
-  if(enableDPEigenbackgroundBGS)
-    eigenBackground = new DPEigenbackgroundBGS;
+    if (enableDPEigenbackgroundBGS)
+      eigenBackground = new DPEigenbackgroundBGS;
 
-  if(enableDPTextureBGS)
-    textureBGS = new DPTextureBGS;
+    if (enableDPTextureBGS)
+      textureBGS = new DPTextureBGS;
 
-  if(enableT2FGMM_UM)
-    type2FuzzyGMM_UM = new T2FGMM_UM;
+    if (enableT2FGMM_UM)
+      type2FuzzyGMM_UM = new T2FGMM_UM;
 
-  if(enableT2FGMM_UV)
-    type2FuzzyGMM_UV = new T2FGMM_UV;
+    if (enableT2FGMM_UV)
+      type2FuzzyGMM_UV = new T2FGMM_UV;
 
-  if(enableT2FMRF_UM)
-    type2FuzzyMRF_UM = new T2FMRF_UM;
+    if (enableT2FMRF_UM)
+      type2FuzzyMRF_UM = new T2FMRF_UM;
 
-  if(enableT2FMRF_UV)
-    type2FuzzyMRF_UV = new T2FMRF_UV;
+    if (enableT2FMRF_UV)
+      type2FuzzyMRF_UV = new T2FMRF_UV;
 
-  if(enableFuzzySugenoIntegral)
-    fuzzySugenoIntegral = new FuzzySugenoIntegral;
+    if (enableFuzzySugenoIntegral)
+      fuzzySugenoIntegral = new FuzzySugenoIntegral;
 
-  if(enableFuzzyChoquetIntegral)
-    fuzzyChoquetIntegral = new FuzzyChoquetIntegral;
-  
-  if(enableLBSimpleGaussian)
-    lbSimpleGaussian = new LBSimpleGaussian;
+    if (enableFuzzyChoquetIntegral)
+      fuzzyChoquetIntegral = new FuzzyChoquetIntegral;
 
-  if(enableLBFuzzyGaussian)
-    lbFuzzyGaussian = new LBFuzzyGaussian;
+    if (enableLBSimpleGaussian)
+      lbSimpleGaussian = new LBSimpleGaussian;
 
-  if(enableLBMixtureOfGaussians)
-    lbMixtureOfGaussians = new LBMixtureOfGaussians;
+    if (enableLBFuzzyGaussian)
+      lbFuzzyGaussian = new LBFuzzyGaussian;
 
-  if(enableLBAdaptiveSOM)
-    lbAdaptiveSOM = new LBAdaptiveSOM;
+    if (enableLBMixtureOfGaussians)
+      lbMixtureOfGaussians = new LBMixtureOfGaussians;
 
-  if(enableLBFuzzyAdaptiveSOM)
-    lbFuzzyAdaptiveSOM = new LBFuzzyAdaptiveSOM;
+    if (enableLBAdaptiveSOM)
+      lbAdaptiveSOM = new LBAdaptiveSOM;
 
-  #if !defined(_WIN32)
-  if(enableLbpMrf)
-    lbpMrf = new LbpMrf;
-  #endif
+    if (enableLBFuzzyAdaptiveSOM)
+      lbFuzzyAdaptiveSOM = new LBFuzzyAdaptiveSOM;
 
-  if(enableMultiLayerBGS)
-    multiLayerBGS = new MultiLayerBGS;
+#if !defined(_WIN32)
+    if (enableLbpMrf)
+      lbpMrf = new LbpMrf;
+#endif
 
-  //if(enablePBAS)
-  //  pixelBasedAdaptiveSegmenter = new PixelBasedAdaptiveSegmenter;
+    if(enableMultiLayerBGS)
+      multiLayerBGS = new MultiLayerBGS;
 
-  if(enableVuMeter)
-    vuMeter = new VuMeter;
+    //if(enablePBAS)
+    //  pixelBasedAdaptiveSegmenter = new PixelBasedAdaptiveSegmenter;
 
-  if(enableKDE)
-    kde = new KDE;
+    if (enableVuMeter)
+      vuMeter = new VuMeter;
 
-  if(enableForegroundMaskAnalysis)
-    foregroundMaskAnalysis = new ForegroundMaskAnalysis;
-}
+    if (enableKDE)
+      kde = new KDE;
 
-void FrameProcessor::process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs)
-{
-  if(tictoc == name)
-    tic(name);
+    if (enableIMBS)
+      imbs = new IndependentMultimodalBGS;
 
-  cv::Mat img_bkgmodel;
-  bgs->process(img_input, img_bgs, img_bkgmodel);
+    if (enableMultiCueBGS)
+      mcbgs = new SJN_MultiCueBGS;
 
-  if(tictoc == name)
-    toc();
-}
+    if (enableForegroundMaskAnalysis)
+      foregroundMaskAnalysis = new ForegroundMaskAnalysis;
+  }
 
-void FrameProcessor::process(const cv::Mat &img_input)
-{
-  frameNumber++;
-
-  if(enablePreProcessor)
-    preProcessor->process(img_input, img_prep);
-  
-  if(enableFrameDifferenceBGS)
-    process("FrameDifferenceBGS", frameDifference, img_prep, img_framediff);
-  
-  if(enableStaticFrameDifferenceBGS)
-    process("StaticFrameDifferenceBGS", staticFrameDifference, img_prep, img_staticfdiff);
-  
-  if(enableWeightedMovingMeanBGS)
-    process("WeightedMovingMeanBGS", weightedMovingMean, img_prep, img_wmovmean);
-  
-  if(enableWeightedMovingVarianceBGS)
-    process("WeightedMovingVarianceBGS", weightedMovingVariance, img_prep, img_movvar);
-  
-  if(enableMixtureOfGaussianV1BGS)
-    process("MixtureOfGaussianV1BGS", mixtureOfGaussianV1BGS, img_prep, img_mog1);
-  
-  if(enableMixtureOfGaussianV2BGS)
-    process("MixtureOfGaussianV2BGS", mixtureOfGaussianV2BGS, img_prep, img_mog2);
-  
-  if(enableAdaptiveBackgroundLearning)
-    process("AdaptiveBackgroundLearning", adaptiveBackgroundLearning, img_prep, img_bkgl_fgmask);
+  void FrameProcessor::process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs)
+  {
+    if (tictoc == name)
+      tic(name);
 
-#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  if(enableGMG)
-    process("GMG", gmg, img_prep, img_gmg);
-#endif
+    cv::Mat img_bkgmodel;
+    bgs->process(img_input, img_bgs, img_bkgmodel);
 
-  if(enableDPAdaptiveMedianBGS)
-    process("DPAdaptiveMedianBGS", adaptiveMedian, img_prep, img_adpmed);
-  
-  if(enableDPGrimsonGMMBGS)
-    process("DPGrimsonGMMBGS", grimsonGMM, img_prep, img_grigmm);
-  
-  if(enableDPZivkovicAGMMBGS)
-    process("DPZivkovicAGMMBGS", zivkovicAGMM, img_prep, img_zivgmm);
-  
-  if(enableDPMeanBGS)
-    process("DPMeanBGS", temporalMean, img_prep, img_tmpmean);
-  
-  if(enableDPWrenGABGS)
-    process("DPWrenGABGS", wrenGA, img_prep, img_wrenga);
-  
-  if(enableDPPratiMediodBGS)
-    process("DPPratiMediodBGS", pratiMediod, img_prep, img_pramed);
-  
-  if(enableDPEigenbackgroundBGS)
-    process("DPEigenbackgroundBGS", eigenBackground, img_prep, img_eigbkg);
-  
-  if(enableDPTextureBGS)
-    process("DPTextureBGS", textureBGS, img_prep, img_texbgs);
-
-  if(enableT2FGMM_UM)
-    process("T2FGMM_UM", type2FuzzyGMM_UM, img_prep, img_t2fgmm_um);
-
-  if(enableT2FGMM_UV)
-    process("T2FGMM_UV", type2FuzzyGMM_UV, img_prep, img_t2fgmm_uv);
-
-  if(enableT2FMRF_UM)
-    process("T2FMRF_UM", type2FuzzyMRF_UM, img_prep, img_t2fmrf_um);
-
-  if(enableT2FMRF_UV)
-    process("T2FMRF_UV", type2FuzzyMRF_UV, img_prep, img_t2fmrf_uv);
-
-  if(enableFuzzySugenoIntegral)
-    process("FuzzySugenoIntegral", fuzzySugenoIntegral, img_prep, img_fsi);
-
-  if(enableFuzzyChoquetIntegral)
-    process("FuzzyChoquetIntegral", fuzzyChoquetIntegral, img_prep, img_fci);
-
-  if(enableLBSimpleGaussian)
-    process("LBSimpleGaussian", lbSimpleGaussian, img_prep, img_lb_sg);
-  
-  if(enableLBFuzzyGaussian)
-    process("LBFuzzyGaussian", lbFuzzyGaussian, img_prep, img_lb_fg);
-
-  if(enableLBMixtureOfGaussians)
-    process("LBMixtureOfGaussians", lbMixtureOfGaussians, img_prep, img_lb_mog);
-
-  if(enableLBAdaptiveSOM)
-    process("LBAdaptiveSOM", lbAdaptiveSOM, img_prep, img_lb_som);
-
-  if(enableLBFuzzyAdaptiveSOM)
-    process("LBFuzzyAdaptiveSOM", lbFuzzyAdaptiveSOM, img_prep, img_lb_fsom);
-
-  #if !defined(_WIN32)
-  if(enableLbpMrf)
-    process("LbpMrf", lbpMrf, img_prep, img_lbp_mrf);
-  #endif
-
-  if(enableMultiLayerBGS)
-  {
-    multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_LEARN);
-    //multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_DETECT);
-    process("MultiLayerBGS", multiLayerBGS, img_prep, img_mlbgs);
+    if (tictoc == name)
+      toc();
   }
-  
-  //if(enablePBAS)
-  //  process("PBAS", pixelBasedAdaptiveSegmenter, img_prep, img_pt_pbas);
-  
-  if(enableVuMeter)
-    process("VuMeter", vuMeter, img_prep, img_vumeter);
-  
-  if(enableKDE)
-    process("KDE", kde, img_prep, img_kde);
-
-  if(enableForegroundMaskAnalysis)
+
+  void FrameProcessor::process(const cv::Mat &img_input)
   {
-    foregroundMaskAnalysis->stopAt = frameToStop;
-    foregroundMaskAnalysis->img_ref_path = imgref;
-
-    foregroundMaskAnalysis->process(frameNumber, "FrameDifferenceBGS", img_framediff);
-    foregroundMaskAnalysis->process(frameNumber, "StaticFrameDifferenceBGS", img_staticfdiff);
-    foregroundMaskAnalysis->process(frameNumber, "WeightedMovingMeanBGS", img_wmovmean);
-    foregroundMaskAnalysis->process(frameNumber, "WeightedMovingVarianceBGS", img_movvar);
-    foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV1BGS", img_mog1);
-    foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV2BGS", img_mog2);
-    foregroundMaskAnalysis->process(frameNumber, "AdaptiveBackgroundLearning", img_bkgl_fgmask);
+    frameNumber++;
+
+    if (enablePreProcessor)
+      preProcessor->process(img_input, img_prep);
+
+    if (enableFrameDifferenceBGS)
+      process("FrameDifferenceBGS", frameDifference, img_prep, img_framediff);
+
+    if (enableStaticFrameDifferenceBGS)
+      process("StaticFrameDifferenceBGS", staticFrameDifference, img_prep, img_staticfdiff);
+
+    if (enableWeightedMovingMeanBGS)
+      process("WeightedMovingMeanBGS", weightedMovingMean, img_prep, img_wmovmean);
+
+    if (enableWeightedMovingVarianceBGS)
+      process("WeightedMovingVarianceBGS", weightedMovingVariance, img_prep, img_movvar);
+
+    if (enableMixtureOfGaussianV1BGS)
+      process("MixtureOfGaussianV1BGS", mixtureOfGaussianV1BGS, img_prep, img_mog1);
+
+    if (enableMixtureOfGaussianV2BGS)
+      process("MixtureOfGaussianV2BGS", mixtureOfGaussianV2BGS, img_prep, img_mog2);
+
+    if (enableAdaptiveBackgroundLearning)
+      process("AdaptiveBackgroundLearning", adaptiveBackgroundLearning, img_prep, img_bkgl_fgmask);
+
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-    foregroundMaskAnalysis->process(frameNumber, "GMG", img_gmg);
+    if (enableGMG)
+      process("GMG", gmg, img_prep, img_gmg);
 #endif
-    foregroundMaskAnalysis->process(frameNumber, "DPAdaptiveMedianBGS", img_adpmed);
-    foregroundMaskAnalysis->process(frameNumber, "DPGrimsonGMMBGS", img_grigmm);
-    foregroundMaskAnalysis->process(frameNumber, "DPZivkovicAGMMBGS", img_zivgmm);
-    foregroundMaskAnalysis->process(frameNumber, "DPMeanBGS", img_tmpmean);
-    foregroundMaskAnalysis->process(frameNumber, "DPWrenGABGS", img_wrenga);
-    foregroundMaskAnalysis->process(frameNumber, "DPPratiMediodBGS", img_pramed);
-    foregroundMaskAnalysis->process(frameNumber, "DPEigenbackgroundBGS", img_eigbkg);
-    foregroundMaskAnalysis->process(frameNumber, "DPTextureBGS", img_texbgs);
-    foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UM", img_t2fgmm_um);
-    foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UV", img_t2fgmm_uv);
-    foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UM", img_t2fmrf_um);
-    foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UV", img_t2fmrf_uv);
-    foregroundMaskAnalysis->process(frameNumber, "FuzzySugenoIntegral", img_fsi);
-    foregroundMaskAnalysis->process(frameNumber, "FuzzyChoquetIntegral", img_fci);
-    foregroundMaskAnalysis->process(frameNumber, "LBSimpleGaussian", img_lb_sg);
-    foregroundMaskAnalysis->process(frameNumber, "LBFuzzyGaussian", img_lb_fg);
-    foregroundMaskAnalysis->process(frameNumber, "LBMixtureOfGaussians", img_lb_mog);
-    foregroundMaskAnalysis->process(frameNumber, "LBAdaptiveSOM", img_lb_som);
-    foregroundMaskAnalysis->process(frameNumber, "LBFuzzyAdaptiveSOM", img_lb_fsom);
-	#if !defined(_WIN32)
-    foregroundMaskAnalysis->process(frameNumber, "LbpMrf", img_lbp_mrf);
-	#endif
-    foregroundMaskAnalysis->process(frameNumber, "MultiLayerBGS", img_mlbgs);
-    //foregroundMaskAnalysis->process(frameNumber, "PBAS", img_pt_pbas);
-    foregroundMaskAnalysis->process(frameNumber, "VuMeter", img_vumeter);
-    foregroundMaskAnalysis->process(frameNumber, "KDE", img_kde);
-  }
 
-  firstTime = false;
-}
+    if (enableDPAdaptiveMedianBGS)
+      process("DPAdaptiveMedianBGS", adaptiveMedian, img_prep, img_adpmed);
 
-void FrameProcessor::finish(void)
-{
-  /*if(enableMultiLayerBGS)
+    if (enableDPGrimsonGMMBGS)
+      process("DPGrimsonGMMBGS", grimsonGMM, img_prep, img_grigmm);
+
+    if (enableDPZivkovicAGMMBGS)
+      process("DPZivkovicAGMMBGS", zivkovicAGMM, img_prep, img_zivgmm);
+
+    if (enableDPMeanBGS)
+      process("DPMeanBGS", temporalMean, img_prep, img_tmpmean);
+
+    if (enableDPWrenGABGS)
+      process("DPWrenGABGS", wrenGA, img_prep, img_wrenga);
+
+    if (enableDPPratiMediodBGS)
+      process("DPPratiMediodBGS", pratiMediod, img_prep, img_pramed);
+
+    if (enableDPEigenbackgroundBGS)
+      process("DPEigenbackgroundBGS", eigenBackground, img_prep, img_eigbkg);
+
+    if (enableDPTextureBGS)
+      process("DPTextureBGS", textureBGS, img_prep, img_texbgs);
+
+    if (enableT2FGMM_UM)
+      process("T2FGMM_UM", type2FuzzyGMM_UM, img_prep, img_t2fgmm_um);
+
+    if (enableT2FGMM_UV)
+      process("T2FGMM_UV", type2FuzzyGMM_UV, img_prep, img_t2fgmm_uv);
+
+    if (enableT2FMRF_UM)
+      process("T2FMRF_UM", type2FuzzyMRF_UM, img_prep, img_t2fmrf_um);
+
+    if (enableT2FMRF_UV)
+      process("T2FMRF_UV", type2FuzzyMRF_UV, img_prep, img_t2fmrf_uv);
+
+    if (enableFuzzySugenoIntegral)
+      process("FuzzySugenoIntegral", fuzzySugenoIntegral, img_prep, img_fsi);
+
+    if (enableFuzzyChoquetIntegral)
+      process("FuzzyChoquetIntegral", fuzzyChoquetIntegral, img_prep, img_fci);
+
+    if (enableLBSimpleGaussian)
+      process("LBSimpleGaussian", lbSimpleGaussian, img_prep, img_lb_sg);
+
+    if (enableLBFuzzyGaussian)
+      process("LBFuzzyGaussian", lbFuzzyGaussian, img_prep, img_lb_fg);
+
+    if (enableLBMixtureOfGaussians)
+      process("LBMixtureOfGaussians", lbMixtureOfGaussians, img_prep, img_lb_mog);
+
+    if (enableLBAdaptiveSOM)
+      process("LBAdaptiveSOM", lbAdaptiveSOM, img_prep, img_lb_som);
+
+    if (enableLBFuzzyAdaptiveSOM)
+      process("LBFuzzyAdaptiveSOM", lbFuzzyAdaptiveSOM, img_prep, img_lb_fsom);
+
+#if !defined(_WIN32)
+    if (enableLbpMrf)
+      process("LbpMrf", lbpMrf, img_prep, img_lbp_mrf);
+#endif
+
+    if(enableMultiLayerBGS)
+    {
+      multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_LEARN);
+      //multiLayerBGS->setStatus(MultiLayerBGS::Status::MLBGS_DETECT);
+      process("MultiLayerBGS", multiLayerBGS, img_prep, img_mlbgs);
+    }
+
+    //if(enablePBAS)
+    //  process("PBAS", pixelBasedAdaptiveSegmenter, img_prep, img_pt_pbas);
+
+    if (enableVuMeter)
+      process("VuMeter", vuMeter, img_prep, img_vumeter);
+
+    if (enableKDE)
+      process("KDE", kde, img_prep, img_kde);
+
+    if (enableIMBS)
+      process("IMBS", imbs, img_prep, img_imbs);
+
+    if (enableMultiCueBGS)
+      process("MultiCueBGS", mcbgs, img_prep, img_mcbgs);
+
+    if (enableForegroundMaskAnalysis)
+    {
+      foregroundMaskAnalysis->stopAt = frameToStop;
+      foregroundMaskAnalysis->img_ref_path = imgref;
+
+      foregroundMaskAnalysis->process(frameNumber, "FrameDifferenceBGS", img_framediff);
+      foregroundMaskAnalysis->process(frameNumber, "StaticFrameDifferenceBGS", img_staticfdiff);
+      foregroundMaskAnalysis->process(frameNumber, "WeightedMovingMeanBGS", img_wmovmean);
+      foregroundMaskAnalysis->process(frameNumber, "WeightedMovingVarianceBGS", img_movvar);
+      foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV1BGS", img_mog1);
+      foregroundMaskAnalysis->process(frameNumber, "MixtureOfGaussianV2BGS", img_mog2);
+      foregroundMaskAnalysis->process(frameNumber, "AdaptiveBackgroundLearning", img_bkgl_fgmask);
+#if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
+      foregroundMaskAnalysis->process(frameNumber, "GMG", img_gmg);
+#endif
+      foregroundMaskAnalysis->process(frameNumber, "DPAdaptiveMedianBGS", img_adpmed);
+      foregroundMaskAnalysis->process(frameNumber, "DPGrimsonGMMBGS", img_grigmm);
+      foregroundMaskAnalysis->process(frameNumber, "DPZivkovicAGMMBGS", img_zivgmm);
+      foregroundMaskAnalysis->process(frameNumber, "DPMeanBGS", img_tmpmean);
+      foregroundMaskAnalysis->process(frameNumber, "DPWrenGABGS", img_wrenga);
+      foregroundMaskAnalysis->process(frameNumber, "DPPratiMediodBGS", img_pramed);
+      foregroundMaskAnalysis->process(frameNumber, "DPEigenbackgroundBGS", img_eigbkg);
+      foregroundMaskAnalysis->process(frameNumber, "DPTextureBGS", img_texbgs);
+      foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UM", img_t2fgmm_um);
+      foregroundMaskAnalysis->process(frameNumber, "T2FGMM_UV", img_t2fgmm_uv);
+      foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UM", img_t2fmrf_um);
+      foregroundMaskAnalysis->process(frameNumber, "T2FMRF_UV", img_t2fmrf_uv);
+      foregroundMaskAnalysis->process(frameNumber, "FuzzySugenoIntegral", img_fsi);
+      foregroundMaskAnalysis->process(frameNumber, "FuzzyChoquetIntegral", img_fci);
+      foregroundMaskAnalysis->process(frameNumber, "LBSimpleGaussian", img_lb_sg);
+      foregroundMaskAnalysis->process(frameNumber, "LBFuzzyGaussian", img_lb_fg);
+      foregroundMaskAnalysis->process(frameNumber, "LBMixtureOfGaussians", img_lb_mog);
+      foregroundMaskAnalysis->process(frameNumber, "LBAdaptiveSOM", img_lb_som);
+      foregroundMaskAnalysis->process(frameNumber, "LBFuzzyAdaptiveSOM", img_lb_fsom);
+#if !defined(_WIN32)
+      foregroundMaskAnalysis->process(frameNumber, "LbpMrf", img_lbp_mrf);
+#endif
+      foregroundMaskAnalysis->process(frameNumber, "MultiLayerBGS", img_mlbgs);
+      //foregroundMaskAnalysis->process(frameNumber, "PBAS", img_pt_pbas);
+      foregroundMaskAnalysis->process(frameNumber, "VuMeter", img_vumeter);
+      foregroundMaskAnalysis->process(frameNumber, "KDE", img_kde);
+      foregroundMaskAnalysis->process(frameNumber, "IMBS", img_imbs);
+      foregroundMaskAnalysis->process(frameNumber, "MultiCueBGS", img_mcbgs);
+    }
+
+    firstTime = false;
+  }
+
+  void FrameProcessor::finish(void)
+  {
+    /*if(enableMultiLayerBGS)
     multiLayerBGS->finish();
 
-  if(enableLBSimpleGaussian)
+    if(enableLBSimpleGaussian)
     lbSimpleGaussian->finish();
-  
-  if(enableLBFuzzyGaussian)
+
+    if(enableLBFuzzyGaussian)
     lbFuzzyGaussian->finish();
 
-  if(enableLBMixtureOfGaussians)
+    if(enableLBMixtureOfGaussians)
     lbMixtureOfGaussians->finish();
 
-  if(enableLBAdaptiveSOM)
+    if(enableLBAdaptiveSOM)
     lbAdaptiveSOM->finish();
 
-  if(enableLBFuzzyAdaptiveSOM)
+    if(enableLBFuzzyAdaptiveSOM)
     lbFuzzyAdaptiveSOM->finish();*/
-  
-  if(enableForegroundMaskAnalysis)
-    delete foregroundMaskAnalysis;
-  
-  if(enableKDE)
-    delete kde;
-  
-  if(enableVuMeter)
-    delete vuMeter;
-  
-  //if(enablePBAS)
-  //  delete pixelBasedAdaptiveSegmenter;
 
-  if(enableMultiLayerBGS)
-    delete multiLayerBGS;
-  
-  if(enableLBFuzzyAdaptiveSOM)
-    delete lbFuzzyAdaptiveSOM;
+    if (enableForegroundMaskAnalysis)
+      delete foregroundMaskAnalysis;
+
+    if (enableMultiCueBGS)
+      delete mcbgs;
+
+    if (enableIMBS)
+      delete imbs;
+
+    if (enableKDE)
+      delete kde;
 
-  if(enableLBAdaptiveSOM)
-    delete lbAdaptiveSOM;
+    if (enableVuMeter)
+      delete vuMeter;
 
-  if(enableLBMixtureOfGaussians)
-    delete lbMixtureOfGaussians;
+    //if(enablePBAS)
+    //  delete pixelBasedAdaptiveSegmenter;
 
-  if(enableLBFuzzyGaussian)
-    delete lbFuzzyGaussian;
+    if (enableMultiLayerBGS)
+      delete multiLayerBGS;
 
-  if(enableLBSimpleGaussian)
-    delete lbSimpleGaussian;
+    if (enableLBFuzzyAdaptiveSOM)
+      delete lbFuzzyAdaptiveSOM;
 
-  #if !defined(_WIN32)
-  if(enableLbpMrf)
-    delete lbpMrf;
-  #endif
+    if (enableLBAdaptiveSOM)
+      delete lbAdaptiveSOM;
 
-  if(enableFuzzyChoquetIntegral)
-    delete fuzzyChoquetIntegral;
+    if (enableLBMixtureOfGaussians)
+      delete lbMixtureOfGaussians;
 
-  if(enableFuzzySugenoIntegral)
-    delete fuzzySugenoIntegral;
+    if (enableLBFuzzyGaussian)
+      delete lbFuzzyGaussian;
+
+    if (enableLBSimpleGaussian)
+      delete lbSimpleGaussian;
+
+#if !defined(_WIN32)
+    if (enableLbpMrf)
+      delete lbpMrf;
+#endif
 
-  if(enableT2FMRF_UV)
-    delete type2FuzzyMRF_UV;
+    if(enableFuzzyChoquetIntegral)
+      delete fuzzyChoquetIntegral;
 
-  if(enableT2FMRF_UM)
-    delete type2FuzzyMRF_UM;
+    if (enableFuzzySugenoIntegral)
+      delete fuzzySugenoIntegral;
 
-  if(enableT2FGMM_UV)
-    delete type2FuzzyGMM_UV;
+    if (enableT2FMRF_UV)
+      delete type2FuzzyMRF_UV;
 
-  if(enableT2FGMM_UM)
-    delete type2FuzzyGMM_UM;
+    if (enableT2FMRF_UM)
+      delete type2FuzzyMRF_UM;
 
-  if(enableDPTextureBGS)
-    delete textureBGS;
+    if (enableT2FGMM_UV)
+      delete type2FuzzyGMM_UV;
 
-  if(enableDPEigenbackgroundBGS)
-    delete eigenBackground;
+    if (enableT2FGMM_UM)
+      delete type2FuzzyGMM_UM;
 
-  if(enableDPPratiMediodBGS)
-    delete pratiMediod;
+    if (enableDPTextureBGS)
+      delete textureBGS;
 
-  if(enableDPWrenGABGS)
-    delete wrenGA;
+    if (enableDPEigenbackgroundBGS)
+      delete eigenBackground;
 
-  if(enableDPMeanBGS)
-    delete temporalMean;
+    if (enableDPPratiMediodBGS)
+      delete pratiMediod;
 
-  if(enableDPZivkovicAGMMBGS)
-    delete zivkovicAGMM;
+    if (enableDPWrenGABGS)
+      delete wrenGA;
 
-  if(enableDPGrimsonGMMBGS)
-    delete grimsonGMM;
+    if (enableDPMeanBGS)
+      delete temporalMean;
 
-  if(enableDPAdaptiveMedianBGS)
-    delete adaptiveMedian;
+    if (enableDPZivkovicAGMMBGS)
+      delete zivkovicAGMM;
+
+    if (enableDPGrimsonGMMBGS)
+      delete grimsonGMM;
+
+    if (enableDPAdaptiveMedianBGS)
+      delete adaptiveMedian;
 
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  if(enableGMG)
-    delete gmg;
+    if (enableGMG)
+      delete gmg;
 #endif
 
-  if(enableAdaptiveBackgroundLearning)
-    delete adaptiveBackgroundLearning;
+    if (enableAdaptiveBackgroundLearning)
+      delete adaptiveBackgroundLearning;
 
-  if(enableMixtureOfGaussianV2BGS)
-    delete mixtureOfGaussianV2BGS;
+    if (enableMixtureOfGaussianV2BGS)
+      delete mixtureOfGaussianV2BGS;
 
-  if(enableMixtureOfGaussianV1BGS)
-    delete mixtureOfGaussianV1BGS;
+    if (enableMixtureOfGaussianV1BGS)
+      delete mixtureOfGaussianV1BGS;
 
-  if(enableWeightedMovingVarianceBGS)
-    delete weightedMovingVariance;
+    if (enableWeightedMovingVarianceBGS)
+      delete weightedMovingVariance;
 
-  if(enableWeightedMovingMeanBGS)
-    delete weightedMovingMean;
+    if (enableWeightedMovingMeanBGS)
+      delete weightedMovingMean;
 
-  if(enableStaticFrameDifferenceBGS)
-    delete staticFrameDifference;
+    if (enableStaticFrameDifferenceBGS)
+      delete staticFrameDifference;
 
-  if(enableFrameDifferenceBGS)
-    delete frameDifference;
+    if (enableFrameDifferenceBGS)
+      delete frameDifference;
 
-  if(enablePreProcessor)
-    delete preProcessor;
-}
+    if (enablePreProcessor)
+      delete preProcessor;
+  }
 
-void FrameProcessor::tic(std::string value)
-{
-  processname = value;
-  duration = static_cast<double>(cv::getTickCount());
-}
+  void FrameProcessor::tic(std::string value)
+  {
+    processname = value;
+    duration = static_cast<double>(cv::getTickCount());
+  }
 
-void FrameProcessor::toc()
-{
-  duration = (static_cast<double>(cv::getTickCount()) - duration)/cv::getTickFrequency();
-  std::cout << processname << "\ttime(sec):" << std::fixed << std::setprecision(6) << duration << std::endl;
-}
+  void FrameProcessor::toc()
+  {
+    duration = (static_cast<double>(cv::getTickCount()) - duration) / cv::getTickFrequency();
+    std::cout << processname << "\ttime(sec):" << std::fixed << std::setprecision(6) << duration << std::endl;
+  }
 
-void FrameProcessor::saveConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_WRITE);
+  void FrameProcessor::saveConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_WRITE);
+
+    cvWriteString(fs, "tictoc", tictoc.c_str());
 
-  cvWriteString(fs, "tictoc", tictoc.c_str());
+    cvWriteInt(fs, "enablePreProcessor", enablePreProcessor);
 
-  cvWriteInt(fs, "enablePreProcessor", enablePreProcessor);
-  
-  cvWriteInt(fs, "enableForegroundMaskAnalysis", enableForegroundMaskAnalysis);
+    cvWriteInt(fs, "enableForegroundMaskAnalysis", enableForegroundMaskAnalysis);
 
-  cvWriteInt(fs, "enableFrameDifferenceBGS", enableFrameDifferenceBGS);
-  cvWriteInt(fs, "enableStaticFrameDifferenceBGS", enableStaticFrameDifferenceBGS);
-  cvWriteInt(fs, "enableWeightedMovingMeanBGS", enableWeightedMovingMeanBGS);
-  cvWriteInt(fs, "enableWeightedMovingVarianceBGS", enableWeightedMovingVarianceBGS);
-  cvWriteInt(fs, "enableMixtureOfGaussianV1BGS", enableMixtureOfGaussianV1BGS);
-  cvWriteInt(fs, "enableMixtureOfGaussianV2BGS", enableMixtureOfGaussianV2BGS);
-  cvWriteInt(fs, "enableAdaptiveBackgroundLearning", enableAdaptiveBackgroundLearning);
+    cvWriteInt(fs, "enableFrameDifferenceBGS", enableFrameDifferenceBGS);
+    cvWriteInt(fs, "enableStaticFrameDifferenceBGS", enableStaticFrameDifferenceBGS);
+    cvWriteInt(fs, "enableWeightedMovingMeanBGS", enableWeightedMovingMeanBGS);
+    cvWriteInt(fs, "enableWeightedMovingVarianceBGS", enableWeightedMovingVarianceBGS);
+    cvWriteInt(fs, "enableMixtureOfGaussianV1BGS", enableMixtureOfGaussianV1BGS);
+    cvWriteInt(fs, "enableMixtureOfGaussianV2BGS", enableMixtureOfGaussianV2BGS);
+    cvWriteInt(fs, "enableAdaptiveBackgroundLearning", enableAdaptiveBackgroundLearning);
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  cvWriteInt(fs, "enableGMG", enableGMG);
+    cvWriteInt(fs, "enableGMG", enableGMG);
 #endif
-  
-  cvWriteInt(fs, "enableDPAdaptiveMedianBGS", enableDPAdaptiveMedianBGS);
-  cvWriteInt(fs, "enableDPGrimsonGMMBGS", enableDPGrimsonGMMBGS);
-  cvWriteInt(fs, "enableDPZivkovicAGMMBGS", enableDPZivkovicAGMMBGS);
-  cvWriteInt(fs, "enableDPMeanBGS", enableDPMeanBGS);
-  cvWriteInt(fs, "enableDPWrenGABGS", enableDPWrenGABGS);
-  cvWriteInt(fs, "enableDPPratiMediodBGS", enableDPPratiMediodBGS);
-  cvWriteInt(fs, "enableDPEigenbackgroundBGS", enableDPEigenbackgroundBGS);
-  cvWriteInt(fs, "enableDPTextureBGS", enableDPTextureBGS);
-
-  cvWriteInt(fs, "enableT2FGMM_UM", enableT2FGMM_UM);
-  cvWriteInt(fs, "enableT2FGMM_UV", enableT2FGMM_UV);
-  cvWriteInt(fs, "enableT2FMRF_UM", enableT2FMRF_UM);
-  cvWriteInt(fs, "enableT2FMRF_UV", enableT2FMRF_UV);
-  cvWriteInt(fs, "enableFuzzySugenoIntegral", enableFuzzySugenoIntegral);
-  cvWriteInt(fs, "enableFuzzyChoquetIntegral", enableFuzzyChoquetIntegral);
-
-  cvWriteInt(fs, "enableLBSimpleGaussian", enableLBSimpleGaussian);
-  cvWriteInt(fs, "enableLBFuzzyGaussian", enableLBFuzzyGaussian);
-  cvWriteInt(fs, "enableLBMixtureOfGaussians", enableLBMixtureOfGaussians);
-  cvWriteInt(fs, "enableLBAdaptiveSOM", enableLBAdaptiveSOM);
-  cvWriteInt(fs, "enableLBFuzzyAdaptiveSOM", enableLBFuzzyAdaptiveSOM);
-
-  #if !defined(_WIN32)
-  cvWriteInt(fs, "enableLbpMrf", enableLbpMrf);
-  #endif
-
-  cvWriteInt(fs, "enableMultiLayerBGS", enableMultiLayerBGS);
-  //cvWriteInt(fs, "enablePBAS", enablePBAS);
-  cvWriteInt(fs, "enableVuMeter", enableVuMeter);
-  cvWriteInt(fs, "enableKDE", enableKDE);
-
-  cvReleaseFileStorage(&fs);
-}
 
-void FrameProcessor::loadConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_READ);
-  
-  tictoc = cvReadStringByName(fs, 0, "tictoc", "");
-
-  enablePreProcessor = cvReadIntByName(fs, 0, "enablePreProcessor", true);
-
-  enableForegroundMaskAnalysis = cvReadIntByName(fs, 0, "enableForegroundMaskAnalysis", false);
-  
-  enableFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableFrameDifferenceBGS", false);
-  enableStaticFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableStaticFrameDifferenceBGS", false);
-  enableWeightedMovingMeanBGS = cvReadIntByName(fs, 0, "enableWeightedMovingMeanBGS", false);
-  enableWeightedMovingVarianceBGS = cvReadIntByName(fs, 0, "enableWeightedMovingVarianceBGS", false);
-  enableMixtureOfGaussianV1BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV1BGS", false);
-  enableMixtureOfGaussianV2BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV2BGS", false);
-  enableAdaptiveBackgroundLearning = cvReadIntByName(fs, 0, "enableAdaptiveBackgroundLearning", false);
+    cvWriteInt(fs, "enableDPAdaptiveMedianBGS", enableDPAdaptiveMedianBGS);
+    cvWriteInt(fs, "enableDPGrimsonGMMBGS", enableDPGrimsonGMMBGS);
+    cvWriteInt(fs, "enableDPZivkovicAGMMBGS", enableDPZivkovicAGMMBGS);
+    cvWriteInt(fs, "enableDPMeanBGS", enableDPMeanBGS);
+    cvWriteInt(fs, "enableDPWrenGABGS", enableDPWrenGABGS);
+    cvWriteInt(fs, "enableDPPratiMediodBGS", enableDPPratiMediodBGS);
+    cvWriteInt(fs, "enableDPEigenbackgroundBGS", enableDPEigenbackgroundBGS);
+    cvWriteInt(fs, "enableDPTextureBGS", enableDPTextureBGS);
+
+    cvWriteInt(fs, "enableT2FGMM_UM", enableT2FGMM_UM);
+    cvWriteInt(fs, "enableT2FGMM_UV", enableT2FGMM_UV);
+    cvWriteInt(fs, "enableT2FMRF_UM", enableT2FMRF_UM);
+    cvWriteInt(fs, "enableT2FMRF_UV", enableT2FMRF_UV);
+    cvWriteInt(fs, "enableFuzzySugenoIntegral", enableFuzzySugenoIntegral);
+    cvWriteInt(fs, "enableFuzzyChoquetIntegral", enableFuzzyChoquetIntegral);
+
+    cvWriteInt(fs, "enableLBSimpleGaussian", enableLBSimpleGaussian);
+    cvWriteInt(fs, "enableLBFuzzyGaussian", enableLBFuzzyGaussian);
+    cvWriteInt(fs, "enableLBMixtureOfGaussians", enableLBMixtureOfGaussians);
+    cvWriteInt(fs, "enableLBAdaptiveSOM", enableLBAdaptiveSOM);
+    cvWriteInt(fs, "enableLBFuzzyAdaptiveSOM", enableLBFuzzyAdaptiveSOM);
+
+#if !defined(_WIN32)
+    cvWriteInt(fs, "enableLbpMrf", enableLbpMrf);
+#endif
+
+    cvWriteInt(fs, "enableMultiLayerBGS", enableMultiLayerBGS);
+    //cvWriteInt(fs, "enablePBAS", enablePBAS);
+    cvWriteInt(fs, "enableVuMeter", enableVuMeter);
+    cvWriteInt(fs, "enableKDE", enableKDE);
+    cvWriteInt(fs, "enableIMBS", enableIMBS);
+    cvWriteInt(fs, "enableMultiCueBGS", enableMultiCueBGS);
+
+    cvReleaseFileStorage(&fs);
+  }
+
+  void FrameProcessor::loadConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/FrameProcessor.xml", 0, CV_STORAGE_READ);
+
+    tictoc = cvReadStringByName(fs, 0, "tictoc", "");
+
+    enablePreProcessor = cvReadIntByName(fs, 0, "enablePreProcessor", true);
+
+    enableForegroundMaskAnalysis = cvReadIntByName(fs, 0, "enableForegroundMaskAnalysis", false);
+
+    enableFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableFrameDifferenceBGS", false);
+    enableStaticFrameDifferenceBGS = cvReadIntByName(fs, 0, "enableStaticFrameDifferenceBGS", false);
+    enableWeightedMovingMeanBGS = cvReadIntByName(fs, 0, "enableWeightedMovingMeanBGS", false);
+    enableWeightedMovingVarianceBGS = cvReadIntByName(fs, 0, "enableWeightedMovingVarianceBGS", false);
+    enableMixtureOfGaussianV1BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV1BGS", false);
+    enableMixtureOfGaussianV2BGS = cvReadIntByName(fs, 0, "enableMixtureOfGaussianV2BGS", false);
+    enableAdaptiveBackgroundLearning = cvReadIntByName(fs, 0, "enableAdaptiveBackgroundLearning", false);
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  enableGMG = cvReadIntByName(fs, 0, "enableGMG", false);
+    enableGMG = cvReadIntByName(fs, 0, "enableGMG", false);
+#endif
+
+    enableDPAdaptiveMedianBGS = cvReadIntByName(fs, 0, "enableDPAdaptiveMedianBGS", false);
+    enableDPGrimsonGMMBGS = cvReadIntByName(fs, 0, "enableDPGrimsonGMMBGS", false);
+    enableDPZivkovicAGMMBGS = cvReadIntByName(fs, 0, "enableDPZivkovicAGMMBGS", false);
+    enableDPMeanBGS = cvReadIntByName(fs, 0, "enableDPMeanBGS", false);
+    enableDPWrenGABGS = cvReadIntByName(fs, 0, "enableDPWrenGABGS", false);
+    enableDPPratiMediodBGS = cvReadIntByName(fs, 0, "enableDPPratiMediodBGS", false);
+    enableDPEigenbackgroundBGS = cvReadIntByName(fs, 0, "enableDPEigenbackgroundBGS", false);
+    enableDPTextureBGS = cvReadIntByName(fs, 0, "enableDPTextureBGS", false);
+
+    enableT2FGMM_UM = cvReadIntByName(fs, 0, "enableT2FGMM_UM", false);
+    enableT2FGMM_UV = cvReadIntByName(fs, 0, "enableT2FGMM_UV", false);
+    enableT2FMRF_UM = cvReadIntByName(fs, 0, "enableT2FMRF_UM", false);
+    enableT2FMRF_UV = cvReadIntByName(fs, 0, "enableT2FMRF_UV", false);
+    enableFuzzySugenoIntegral = cvReadIntByName(fs, 0, "enableFuzzySugenoIntegral", false);
+    enableFuzzyChoquetIntegral = cvReadIntByName(fs, 0, "enableFuzzyChoquetIntegral", false);
+
+    enableLBSimpleGaussian = cvReadIntByName(fs, 0, "enableLBSimpleGaussian", false);
+    enableLBFuzzyGaussian = cvReadIntByName(fs, 0, "enableLBFuzzyGaussian", false);
+    enableLBMixtureOfGaussians = cvReadIntByName(fs, 0, "enableLBMixtureOfGaussians", false);
+    enableLBAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBAdaptiveSOM", false);
+    enableLBFuzzyAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBFuzzyAdaptiveSOM", false);
+
+#if !defined(_WIN32)
+    enableLbpMrf = cvReadIntByName(fs, 0, "enableLbpMrf", false);
 #endif
 
-  enableDPAdaptiveMedianBGS = cvReadIntByName(fs, 0, "enableDPAdaptiveMedianBGS", false);
-  enableDPGrimsonGMMBGS = cvReadIntByName(fs, 0, "enableDPGrimsonGMMBGS", false);
-  enableDPZivkovicAGMMBGS = cvReadIntByName(fs, 0, "enableDPZivkovicAGMMBGS", false);
-  enableDPMeanBGS = cvReadIntByName(fs, 0, "enableDPMeanBGS", false);
-  enableDPWrenGABGS = cvReadIntByName(fs, 0, "enableDPWrenGABGS", false);
-  enableDPPratiMediodBGS = cvReadIntByName(fs, 0, "enableDPPratiMediodBGS", false);
-  enableDPEigenbackgroundBGS = cvReadIntByName(fs, 0, "enableDPEigenbackgroundBGS", false);
-  enableDPTextureBGS = cvReadIntByName(fs, 0, "enableDPTextureBGS", false);
-
-  enableT2FGMM_UM = cvReadIntByName(fs, 0, "enableT2FGMM_UM", false);
-  enableT2FGMM_UV = cvReadIntByName(fs, 0, "enableT2FGMM_UV", false);
-  enableT2FMRF_UM = cvReadIntByName(fs, 0, "enableT2FMRF_UM", false);
-  enableT2FMRF_UV = cvReadIntByName(fs, 0, "enableT2FMRF_UV", false);
-  enableFuzzySugenoIntegral = cvReadIntByName(fs, 0, "enableFuzzySugenoIntegral", false);
-  enableFuzzyChoquetIntegral = cvReadIntByName(fs, 0, "enableFuzzyChoquetIntegral", false);
-
-  enableLBSimpleGaussian = cvReadIntByName(fs, 0, "enableLBSimpleGaussian", false);
-  enableLBFuzzyGaussian = cvReadIntByName(fs, 0, "enableLBFuzzyGaussian", false);
-  enableLBMixtureOfGaussians = cvReadIntByName(fs, 0, "enableLBMixtureOfGaussians", false);
-  enableLBAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBAdaptiveSOM", false);
-  enableLBFuzzyAdaptiveSOM = cvReadIntByName(fs, 0, "enableLBFuzzyAdaptiveSOM", false);
-
-  #if !defined(_WIN32)
-  enableLbpMrf = cvReadIntByName(fs, 0, "enableLbpMrf", false);
-  #endif
-
-  enableMultiLayerBGS = cvReadIntByName(fs, 0, "enableMultiLayerBGS", false);
-  //enablePBAS = cvReadIntByName(fs, 0, "enablePBAS", false);
-  enableVuMeter = cvReadIntByName(fs, 0, "enableVuMeter", false);
-  enableKDE = cvReadIntByName(fs, 0, "enableKDE", false);
-
-  cvReleaseFileStorage(&fs);
+    enableMultiLayerBGS = cvReadIntByName(fs, 0, "enableMultiLayerBGS", false);
+    //enablePBAS = cvReadIntByName(fs, 0, "enablePBAS", false);
+    enableVuMeter = cvReadIntByName(fs, 0, "enableVuMeter", false);
+    enableKDE = cvReadIntByName(fs, 0, "enableKDE", false);
+    enableIMBS = cvReadIntByName(fs, 0, "enableIMBS", false);
+    enableMultiCueBGS = cvReadIntByName(fs, 0, "enableMultiCueBGS", false);
+
+    cvReleaseFileStorage(&fs);
+  }
 }
diff --git a/FrameProcessor.h b/FrameProcessor.h
index 742b7bdb06cac77e92ac2df8c7b742733cead556..91ce08cbeee3e81fe75d4b7d4a87b78308cdb1cb 100644
--- a/FrameProcessor.h
+++ b/FrameProcessor.h
@@ -66,173 +66,186 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 //#include "package_bgs/pt/PixelBasedAdaptiveSegmenter.h"
 #include "package_bgs/av/VuMeter.h"
 #include "package_bgs/ae/KDE.h"
+#include "package_bgs/db/IndependentMultimodalBGS.h"
+#include "package_bgs/sjn/SJN_MultiCueBGS.h"
 
 #include "package_analysis/ForegroundMaskAnalysis.h"
 
-class FrameProcessor : public IFrameProcessor
+namespace bgslibrary
 {
-private:
-  bool firstTime;
-  long frameNumber;
-  std::string processname;
-  double duration;
-  std::string tictoc;
-
-  cv::Mat img_prep;
-  PreProcessor* preProcessor;
-  bool enablePreProcessor;
-  
-  cv::Mat img_framediff;
-  FrameDifferenceBGS* frameDifference;
-  bool enableFrameDifferenceBGS;
-  
-  cv::Mat img_staticfdiff;
-  StaticFrameDifferenceBGS* staticFrameDifference;
-  bool enableStaticFrameDifferenceBGS;
-
-  cv::Mat img_wmovmean;
-  WeightedMovingMeanBGS* weightedMovingMean;
-  bool enableWeightedMovingMeanBGS;
-
-  cv::Mat img_movvar;
-  WeightedMovingVarianceBGS* weightedMovingVariance;
-  bool enableWeightedMovingVarianceBGS;
-
-  cv::Mat img_mog1;
-  MixtureOfGaussianV1BGS* mixtureOfGaussianV1BGS;
-  bool enableMixtureOfGaussianV1BGS;
-
-  cv::Mat img_mog2;
-  MixtureOfGaussianV2BGS* mixtureOfGaussianV2BGS;
-  bool enableMixtureOfGaussianV2BGS;
-
-  cv::Mat img_bkgl_fgmask;
-  AdaptiveBackgroundLearning* adaptiveBackgroundLearning;
-  bool enableAdaptiveBackgroundLearning;
+  class FrameProcessor : public IFrameProcessor
+  {
+  private:
+    bool firstTime;
+    long frameNumber;
+    std::string processname;
+    double duration;
+    std::string tictoc;
+
+    cv::Mat img_prep;
+    PreProcessor* preProcessor;
+    bool enablePreProcessor;
+
+    cv::Mat img_framediff;
+    FrameDifferenceBGS* frameDifference;
+    bool enableFrameDifferenceBGS;
+
+    cv::Mat img_staticfdiff;
+    StaticFrameDifferenceBGS* staticFrameDifference;
+    bool enableStaticFrameDifferenceBGS;
+
+    cv::Mat img_wmovmean;
+    WeightedMovingMeanBGS* weightedMovingMean;
+    bool enableWeightedMovingMeanBGS;
+
+    cv::Mat img_movvar;
+    WeightedMovingVarianceBGS* weightedMovingVariance;
+    bool enableWeightedMovingVarianceBGS;
+
+    cv::Mat img_mog1;
+    MixtureOfGaussianV1BGS* mixtureOfGaussianV1BGS;
+    bool enableMixtureOfGaussianV1BGS;
+
+    cv::Mat img_mog2;
+    MixtureOfGaussianV2BGS* mixtureOfGaussianV2BGS;
+    bool enableMixtureOfGaussianV2BGS;
+
+    cv::Mat img_bkgl_fgmask;
+    AdaptiveBackgroundLearning* adaptiveBackgroundLearning;
+    bool enableAdaptiveBackgroundLearning;
 
 #if CV_MAJOR_VERSION >= 2 && CV_MINOR_VERSION >= 4 && CV_SUBMINOR_VERSION >= 3
-  cv::Mat img_gmg;
-  GMG* gmg;
-  bool enableGMG;
+    cv::Mat img_gmg;
+    GMG* gmg;
+    bool enableGMG;
 #endif
 
-  cv::Mat img_adpmed;
-  DPAdaptiveMedianBGS* adaptiveMedian;
-  bool enableDPAdaptiveMedianBGS;
-
-  cv::Mat img_grigmm;
-  DPGrimsonGMMBGS* grimsonGMM;
-  bool enableDPGrimsonGMMBGS;
-
-  cv::Mat img_zivgmm;
-  DPZivkovicAGMMBGS* zivkovicAGMM;
-  bool enableDPZivkovicAGMMBGS;
-
-  cv::Mat img_tmpmean;
-  DPMeanBGS* temporalMean;
-  bool enableDPMeanBGS;
-
-  cv::Mat img_wrenga;
-  DPWrenGABGS* wrenGA;
-  bool enableDPWrenGABGS;
-
-  cv::Mat img_pramed;
-  DPPratiMediodBGS* pratiMediod;
-  bool enableDPPratiMediodBGS;
-
-  cv::Mat img_eigbkg;
-  DPEigenbackgroundBGS* eigenBackground;
-  bool enableDPEigenbackgroundBGS;
-
-  cv::Mat img_texbgs;
-  DPTextureBGS* textureBGS;
-  bool enableDPTextureBGS;
-
-  cv::Mat img_t2fgmm_um;
-  T2FGMM_UM* type2FuzzyGMM_UM;
-  bool enableT2FGMM_UM;
-
-  cv::Mat img_t2fgmm_uv;
-  T2FGMM_UV* type2FuzzyGMM_UV;
-  bool enableT2FGMM_UV;
-
-  cv::Mat img_t2fmrf_um;
-  T2FMRF_UM* type2FuzzyMRF_UM;
-  bool enableT2FMRF_UM;
-
-  cv::Mat img_t2fmrf_uv;
-  T2FMRF_UV* type2FuzzyMRF_UV;
-  bool enableT2FMRF_UV;
-
-  cv::Mat img_fsi;
-  FuzzySugenoIntegral* fuzzySugenoIntegral;
-  bool enableFuzzySugenoIntegral;
-
-  cv::Mat img_fci;
-  FuzzyChoquetIntegral* fuzzyChoquetIntegral;
-  bool enableFuzzyChoquetIntegral;
-  
-  cv::Mat img_lb_sg;
-  LBSimpleGaussian* lbSimpleGaussian;
-  bool enableLBSimpleGaussian;
-
-  cv::Mat img_lb_fg;
-  LBFuzzyGaussian* lbFuzzyGaussian;
-  bool enableLBFuzzyGaussian;
-
-  cv::Mat img_lb_mog;
-  LBMixtureOfGaussians* lbMixtureOfGaussians;
-  bool enableLBMixtureOfGaussians;
-
-  cv::Mat img_lb_som;
-  LBAdaptiveSOM* lbAdaptiveSOM;
-  bool enableLBAdaptiveSOM;
-
-  cv::Mat img_lb_fsom;
-  LBFuzzyAdaptiveSOM* lbFuzzyAdaptiveSOM;
-  bool enableLBFuzzyAdaptiveSOM;
-
-  #if !defined(_WIN32)
-  cv::Mat img_lbp_mrf;
-  LbpMrf* lbpMrf;
-  bool enableLbpMrf;
-  #endif
-  
-  cv::Mat img_mlbgs;
-  MultiLayerBGS* multiLayerBGS;
-  bool enableMultiLayerBGS;
-
-  //cv::Mat img_pt_pbas;
-  //PixelBasedAdaptiveSegmenter* pixelBasedAdaptiveSegmenter;
-  //bool enablePBAS;
-
-  cv::Mat img_vumeter;
-  VuMeter* vuMeter;
-  bool enableVuMeter;
-
-  cv::Mat img_kde;
-  KDE* kde;
-  bool enableKDE;
-
-  ForegroundMaskAnalysis* foregroundMaskAnalysis;
-  bool enableForegroundMaskAnalysis;
-
-public:
-  FrameProcessor();
-  ~FrameProcessor();
-
-  long frameToStop;
-  std::string imgref;
-
-  void init();
-  void process(const cv::Mat &img_input);
-  void finish(void);
-
-private:
-  void process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs);
-  void tic(std::string value);
-  void toc();
-
-  void saveConfig();
-  void loadConfig();
-};
+    cv::Mat img_adpmed;
+    DPAdaptiveMedianBGS* adaptiveMedian;
+    bool enableDPAdaptiveMedianBGS;
+
+    cv::Mat img_grigmm;
+    DPGrimsonGMMBGS* grimsonGMM;
+    bool enableDPGrimsonGMMBGS;
+
+    cv::Mat img_zivgmm;
+    DPZivkovicAGMMBGS* zivkovicAGMM;
+    bool enableDPZivkovicAGMMBGS;
+
+    cv::Mat img_tmpmean;
+    DPMeanBGS* temporalMean;
+    bool enableDPMeanBGS;
+
+    cv::Mat img_wrenga;
+    DPWrenGABGS* wrenGA;
+    bool enableDPWrenGABGS;
+
+    cv::Mat img_pramed;
+    DPPratiMediodBGS* pratiMediod;
+    bool enableDPPratiMediodBGS;
+
+    cv::Mat img_eigbkg;
+    DPEigenbackgroundBGS* eigenBackground;
+    bool enableDPEigenbackgroundBGS;
+
+    cv::Mat img_texbgs;
+    DPTextureBGS* textureBGS;
+    bool enableDPTextureBGS;
+
+    cv::Mat img_t2fgmm_um;
+    T2FGMM_UM* type2FuzzyGMM_UM;
+    bool enableT2FGMM_UM;
+
+    cv::Mat img_t2fgmm_uv;
+    T2FGMM_UV* type2FuzzyGMM_UV;
+    bool enableT2FGMM_UV;
+
+    cv::Mat img_t2fmrf_um;
+    T2FMRF_UM* type2FuzzyMRF_UM;
+    bool enableT2FMRF_UM;
+
+    cv::Mat img_t2fmrf_uv;
+    T2FMRF_UV* type2FuzzyMRF_UV;
+    bool enableT2FMRF_UV;
+
+    cv::Mat img_fsi;
+    FuzzySugenoIntegral* fuzzySugenoIntegral;
+    bool enableFuzzySugenoIntegral;
+
+    cv::Mat img_fci;
+    FuzzyChoquetIntegral* fuzzyChoquetIntegral;
+    bool enableFuzzyChoquetIntegral;
+
+    cv::Mat img_lb_sg;
+    LBSimpleGaussian* lbSimpleGaussian;
+    bool enableLBSimpleGaussian;
+
+    cv::Mat img_lb_fg;
+    LBFuzzyGaussian* lbFuzzyGaussian;
+    bool enableLBFuzzyGaussian;
+
+    cv::Mat img_lb_mog;
+    LBMixtureOfGaussians* lbMixtureOfGaussians;
+    bool enableLBMixtureOfGaussians;
+
+    cv::Mat img_lb_som;
+    LBAdaptiveSOM* lbAdaptiveSOM;
+    bool enableLBAdaptiveSOM;
+
+    cv::Mat img_lb_fsom;
+    LBFuzzyAdaptiveSOM* lbFuzzyAdaptiveSOM;
+    bool enableLBFuzzyAdaptiveSOM;
+
+#if !defined(_WIN32)
+    cv::Mat img_lbp_mrf;
+    LbpMrf* lbpMrf;
+    bool enableLbpMrf;
+#endif
+
+    cv::Mat img_mlbgs;
+    MultiLayerBGS* multiLayerBGS;
+    bool enableMultiLayerBGS;
+
+    //cv::Mat img_pt_pbas;
+    //PixelBasedAdaptiveSegmenter* pixelBasedAdaptiveSegmenter;
+    //bool enablePBAS;
+
+    cv::Mat img_vumeter;
+    VuMeter* vuMeter;
+    bool enableVuMeter;
+
+    cv::Mat img_kde;
+    KDE* kde;
+    bool enableKDE;
+
+    cv::Mat img_imbs;
+    IndependentMultimodalBGS* imbs;
+    bool enableIMBS;
+
+    cv::Mat img_mcbgs;
+    SJN_MultiCueBGS* mcbgs;
+    bool enableMultiCueBGS;
+
+    ForegroundMaskAnalysis* foregroundMaskAnalysis;
+    bool enableForegroundMaskAnalysis;
+
+  public:
+    FrameProcessor();
+    ~FrameProcessor();
+
+    long frameToStop;
+    std::string imgref;
+
+    void init();
+    void process(const cv::Mat &img_input);
+    void finish(void);
+
+  private:
+    void process(std::string name, IBGS *bgs, const cv::Mat &img_input, cv::Mat &img_bgs);
+    void tic(std::string value);
+    void toc();
+
+    void saveConfig();
+    void loadConfig();
+  };
+}
diff --git a/IFrameProcessor.h b/IFrameProcessor.h
index ef50b1ff9d5b44effdc3d2f44c138417ac83205f..b3a44411ecc1c73011a1664370a593acfb3550d8 100644
--- a/IFrameProcessor.h
+++ b/IFrameProcessor.h
@@ -18,9 +18,12 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <cv.h>
 
-class IFrameProcessor
+namespace bgslibrary
 {
+  class IFrameProcessor
+  {
   public:
-  virtual void process(const cv:: Mat &input) = 0;
-  virtual ~IFrameProcessor(){}
-};
\ No newline at end of file
+    virtual void process(const cv::Mat &input) = 0;
+    virtual ~IFrameProcessor(){}
+  };
+}
diff --git a/Main.cpp b/Main.cpp
index 4e59ee5b2d9d644b8f6989fbf030d9b0f0748e15..3d27e61e7b4d76dfc41fe1cb941854b056e079a0 100644
--- a/Main.cpp
+++ b/Main.cpp
@@ -18,65 +18,68 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include "VideoAnalysis.h"
 #include <iostream>
 
-class Main
+namespace bgslibrary
 {
-private:
-  Main();
-
-public:
-  static void start(int argc, const char **argv)
+  class Main
   {
-    std::cout << "-----------------------------------------" << std::endl;
-    std::cout << "Background Subtraction Library v1.7.0     " << std::endl;
-    std::cout << "http://code.google.com/p/bgslibrary       " << std::endl;
-    std::cout << "by:                                       " << std::endl;
-    std::cout << "Andrews Sobral (andrewssobral@gmail.com)  " << std::endl;
-    std::cout << "-----------------------------------------" << std::endl;
-    std::cout << "Using OpenCV version " << CV_VERSION << std::endl;
-    
-    try
+  private:
+    Main();
+
+  public:
+    static void start(int argc, const char **argv)
     {
-      int key = KEY_ESC;
+      std::cout << "-----------------------------------------" << std::endl;
+      std::cout << "Background Subtraction Library v1.9.0     " << std::endl;
+      std::cout << "http://code.google.com/p/bgslibrary       " << std::endl;
+      std::cout << "by:                                       " << std::endl;
+      std::cout << "Andrews Sobral (andrewssobral@gmail.com)  " << std::endl;
+      std::cout << "-----------------------------------------" << std::endl;
+      std::cout << "Using OpenCV version " << CV_VERSION << std::endl;
 
-      do
+      try
       {
-        VideoAnalysis* videoAnalysis = new VideoAnalysis;
+        int key = KEY_ESC;
 
-        if(videoAnalysis->setup(argc, argv))
+        do
         {
-          videoAnalysis->start();
+          VideoAnalysis* videoAnalysis = new VideoAnalysis;
 
-          std::cout << "Processing finished, enter:" << std::endl;
-          std::cout << "R - Repeat" << std::endl;
-          std::cout << "Q - Quit" << std::endl;
+          if (videoAnalysis->setup(argc, argv))
+          {
+            videoAnalysis->start();
 
-          key = cv::waitKey();
-        }
+            std::cout << "Processing finished, enter:" << std::endl;
+            std::cout << "R - Repeat" << std::endl;
+            std::cout << "Q - Quit" << std::endl;
 
-        cv::destroyAllWindows();
-        delete videoAnalysis;
+            key = cv::waitKey();
+          }
 
-      }while(key == KEY_REPEAT);
-    }
-    catch(const std::exception& ex)
-    {
-      std::cout << "std::exception:" << ex.what() << std::endl;
-      return;
-    }
-    catch(...)
-    {
-      std::cout << "Unknow error" << std::endl;
-      return;
-    }
+          cv::destroyAllWindows();
+          delete videoAnalysis;
+
+        } while (key == KEY_REPEAT);
+      }
+      catch (const std::exception& ex)
+      {
+        std::cout << "std::exception:" << ex.what() << std::endl;
+        return;
+      }
+      catch (...)
+      {
+        std::cout << "Unknow error" << std::endl;
+        return;
+      }
 
 #ifdef WIN32
-    //system("pause");
+      //system("pause");
 #endif
-  }
-};
+    }
+  };
+}
 
 int main(int argc, const char **argv)
 {
-  Main::start(argc, argv);
+  bgslibrary::Main::start(argc, argv);
   return 0;
 }
diff --git a/PreProcessor.cpp b/PreProcessor.cpp
index 834996bb82d44e9498edf4a4ec7b7c54afdcedd3..6f4ebbe964c197f35c21654d6eeb15e85337a40a 100644
--- a/PreProcessor.cpp
+++ b/PreProcessor.cpp
@@ -16,131 +16,134 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "PreProcessor.h"
 
-PreProcessor::PreProcessor() : firstTime(true), equalizeHist(false), gaussianBlur(false)
+namespace bgslibrary
 {
-  std::cout << "PreProcessor()" << std::endl;
-}
-
-PreProcessor::~PreProcessor()
-{
-  std::cout << "~PreProcessor()" << std::endl;
-}
+  PreProcessor::PreProcessor() : firstTime(true), equalizeHist(false), gaussianBlur(false)
+  {
+    std::cout << "PreProcessor()" << std::endl;
+  }
+
+  PreProcessor::~PreProcessor()
+  {
+    std::cout << "~PreProcessor()" << std::endl;
+  }
+
+  void PreProcessor::setEqualizeHist(bool value)
+  {
+    equalizeHist = value;
+  }
+
+  void PreProcessor::setGaussianBlur(bool value)
+  {
+    gaussianBlur = value;
+  }
+
+  cv::Mat PreProcessor::getGrayScale()
+  {
+    return img_gray.clone();
+  }
+
+  void PreProcessor::process(const cv::Mat &img_input, cv::Mat &img_output)
+  {
+    if (img_input.empty())
+      return;
+
+    loadConfig();
+
+    if (firstTime)
+      saveConfig();
+
+    img_input.copyTo(img_output);
+
+    // Converts image from one color space to another
+    // http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-cvtcolor
+    cv::cvtColor(img_input, img_gray, CV_BGR2GRAY);
+    //img_gray.copyTo(img_output);
+
+    // Equalizes the histogram of a grayscale image
+    // http://opencv.willowgarage.com/documentation/cpp/histograms.html#cv-equalizehist
+    if (equalizeHist)
+      cv::equalizeHist(img_output, img_output);
+
+    // Smoothes image using a Gaussian filter
+    // http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html#GaussianBlur
+    if (gaussianBlur)
+      cv::GaussianBlur(img_output, img_output, cv::Size(7, 7), 1.5);
+
+    if (enableShow)
+      cv::imshow("Pre Processor", img_output);
+
+    firstTime = false;
+  }
+
+  void PreProcessor::rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle)
+  {
+    IplImage* image = new IplImage(img_input);
+
+    //IplImage *rotatedImage = cvCreateImage(cvSize(480,320), IPL_DEPTH_8U, image->nChannels);
+    //IplImage *rotatedImage = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, image->nChannels);
+    IplImage* rotatedImage = cvCreateImage(cvSize(image->height, image->width), IPL_DEPTH_8U, image->nChannels);
+
+    CvPoint2D32f center;
+    //center.x = 160;
+    //center.y = 160;
+    center.x = (image->height / 2);
+    center.y = (image->width / 2);
+
+    CvMat* mapMatrix = cvCreateMat(2, 3, CV_32FC1);
+
+    cv2DRotationMatrix(center, angle, 1.0, mapMatrix);
+    cvWarpAffine(image, rotatedImage, mapMatrix, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(0));
+
+    cv::Mat img_rot(rotatedImage);
+    img_rot.copyTo(img_output);
+
+    cvReleaseImage(&image);
+    cvReleaseImage(&rotatedImage);
+    cvReleaseMat(&mapMatrix);
+  }
+
+  void PreProcessor::applyCanny(const cv::Mat &img_input, cv::Mat &img_output)
+  {
+    if (img_input.empty())
+      return;
+
+    //------------------------------------------------------------------
+    // Canny
+    // Finds edges in an image using Canny algorithm.
+    // http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html#cv-canny
+    //------------------------------------------------------------------
+
+    cv::Mat img_canny;
+    cv::Canny(
+      img_input, // image � Single-channel 8-bit input image
+      img_canny,  // edges � The output edge map. It will have the same size and the same type as image
+      100,       // threshold1 � The first threshold for the hysteresis procedure
+      200);      // threshold2 � The second threshold for the hysteresis procedure
+    cv::threshold(img_canny, img_canny, 128, 255, cv::THRESH_BINARY_INV);
+
+    img_canny.copyTo(img_output);
+  }
+
+  void PreProcessor::saveConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_WRITE);
+
+    cvWriteInt(fs, "equalizeHist", equalizeHist);
+    cvWriteInt(fs, "gaussianBlur", gaussianBlur);
+    cvWriteInt(fs, "enableShow", enableShow);
 
-void PreProcessor::setEqualizeHist(bool value)
-{
-  equalizeHist = value;
-}
+    cvReleaseFileStorage(&fs);
+  }
 
-void PreProcessor::setGaussianBlur(bool value)
-{
-  gaussianBlur = value;
-}
+  void PreProcessor::loadConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_READ);
 
-cv::Mat PreProcessor::getGrayScale()
-{
-  return img_gray.clone();
-}
+    equalizeHist = cvReadIntByName(fs, 0, "equalizeHist", false);
+    gaussianBlur = cvReadIntByName(fs, 0, "gaussianBlur", false);
+    enableShow = cvReadIntByName(fs, 0, "enableShow", true);
 
-void PreProcessor::process(const cv::Mat &img_input, cv::Mat &img_output)
-{
-  if(img_input.empty())
-    return;
-
-  loadConfig();
-
-  if(firstTime)
-    saveConfig();
-  
-  img_input.copyTo(img_output);
-  
-  // Converts image from one color space to another
-  // http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-cvtcolor
-  cv::cvtColor(img_input, img_gray, CV_BGR2GRAY);
-  //img_gray.copyTo(img_output);
-
-  // Equalizes the histogram of a grayscale image
-  // http://opencv.willowgarage.com/documentation/cpp/histograms.html#cv-equalizehist
-  if(equalizeHist)
-    cv::equalizeHist(img_output, img_output);
-
-  // Smoothes image using a Gaussian filter
-  // http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html#GaussianBlur
-  if(gaussianBlur)
-    cv::GaussianBlur(img_output, img_output, cv::Size(7,7), 1.5);
-
-  if(enableShow)
-    cv::imshow("Pre Processor", img_output);
-
-  firstTime = false;
+    cvReleaseFileStorage(&fs);
+  }
 }
-
-void PreProcessor::rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle)
-{
-  IplImage* image = new IplImage(img_input); 
-
-  //IplImage *rotatedImage = cvCreateImage(cvSize(480,320), IPL_DEPTH_8U, image->nChannels);
-  //IplImage *rotatedImage = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, image->nChannels);
-  IplImage* rotatedImage = cvCreateImage(cvSize(image->height,image->width), IPL_DEPTH_8U, image->nChannels);
-
-  CvPoint2D32f center;
-  //center.x = 160;
-  //center.y = 160;
-  center.x = (image->height / 2);
-  center.y = (image->width / 2);
-  
-  CvMat* mapMatrix = cvCreateMat(2, 3, CV_32FC1);
-
-  cv2DRotationMatrix(center, angle, 1.0, mapMatrix);
-  cvWarpAffine(image, rotatedImage, mapMatrix, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(0));
-
-  cv::Mat img_rot(rotatedImage);
-  img_rot.copyTo(img_output);
-
-  cvReleaseImage(&image);
-  cvReleaseImage(&rotatedImage);
-  cvReleaseMat(&mapMatrix);
-}
-
-void PreProcessor::applyCanny(const cv::Mat &img_input, cv::Mat &img_output)
-{
-  if(img_input.empty())
-    return;
-
-  //------------------------------------------------------------------
-  // Canny
-  // Finds edges in an image using Canny algorithm.
-  // http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html#cv-canny
-  //------------------------------------------------------------------
-
-  cv::Mat img_canny;
-  cv::Canny(
-    img_input, // image � Single-channel 8-bit input image
-    img_canny,  // edges � The output edge map. It will have the same size and the same type as image
-    100,       // threshold1 � The first threshold for the hysteresis procedure
-    200);      // threshold2 � The second threshold for the hysteresis procedure
-  cv::threshold(img_canny, img_canny, 128, 255, cv::THRESH_BINARY_INV);
-
-  img_canny.copyTo(img_output);
-}
-
-void PreProcessor::saveConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_WRITE);
-
-  cvWriteInt(fs, "equalizeHist", equalizeHist);
-  cvWriteInt(fs, "gaussianBlur", gaussianBlur);
-  cvWriteInt(fs, "enableShow", enableShow);
-
-  cvReleaseFileStorage(&fs);
-}
-
-void PreProcessor::loadConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_READ);
-
-  equalizeHist = cvReadIntByName(fs, 0, "equalizeHist", false);
-  gaussianBlur = cvReadIntByName(fs, 0, "gaussianBlur", false);
-  enableShow = cvReadIntByName(fs, 0, "enableShow", true);
-
-  cvReleaseFileStorage(&fs);
-}
\ No newline at end of file
diff --git a/PreProcessor.h b/PreProcessor.h
index 9a0462366ec4821a1a803050619ccd3f0189b2ed..e00100369cfbf49d480481bab173683f93f9e5fe 100644
--- a/PreProcessor.h
+++ b/PreProcessor.h
@@ -20,30 +20,32 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include <cv.h>
 #include <highgui.h>
 
-class PreProcessor
+namespace bgslibrary
 {
-private:
-  bool firstTime;
-  bool equalizeHist;
-  bool gaussianBlur;
-  cv::Mat img_gray;
-  bool enableShow;
-
-public:
-  PreProcessor();
-  ~PreProcessor();
-
-  void setEqualizeHist(bool value);
-  void setGaussianBlur(bool value);
-  cv::Mat getGrayScale(); 
-
-  void process(const cv::Mat &img_input, cv::Mat &img_output);
-
-  void rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle);
-  void applyCanny(const cv::Mat &img_input, cv::Mat &img_output);
-
-private:
-  void saveConfig();
-  void loadConfig();
-};
-
+  class PreProcessor
+  {
+  private:
+    bool firstTime;
+    bool equalizeHist;
+    bool gaussianBlur;
+    cv::Mat img_gray;
+    bool enableShow;
+
+  public:
+    PreProcessor();
+    ~PreProcessor();
+
+    void setEqualizeHist(bool value);
+    void setGaussianBlur(bool value);
+    cv::Mat getGrayScale();
+
+    void process(const cv::Mat &img_input, cv::Mat &img_output);
+
+    void rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle);
+    void applyCanny(const cv::Mat &img_input, cv::Mat &img_output);
+
+  private:
+    void saveConfig();
+    void loadConfig();
+  };
+}
diff --git a/VideoAnalysis.cpp b/VideoAnalysis.cpp
index 0123933b9f29b21ce42f6142a7ebda87ff7f9de3..604b3ceb10c66407d10be4e160f9f539f9b9e270 100644
--- a/VideoAnalysis.cpp
+++ b/VideoAnalysis.cpp
@@ -16,115 +16,118 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "VideoAnalysis.h"
 
-VideoAnalysis::VideoAnalysis() : use_file(false), use_camera(false), cameraIndex(0), use_comp(false), frameToStop(0)
+namespace bgslibrary
 {
-  std::cout << "VideoAnalysis()" << std::endl;
-}
-
-VideoAnalysis::~VideoAnalysis()
-{
-  std::cout << "~VideoAnalysis()" << std::endl;
-}
-
-bool VideoAnalysis::setup(int argc, const char **argv)
-{
-  bool flag = false;
-  
-  const char* keys =
-  "{hp|help|false|Print help message}"
-  "{uf|use_file|false|Use video file}"
-  "{fn|filename||Specify video file}"
-  "{uc|use_cam|false|Use camera}"
-  "{ca|camera|0|Specify camera index}"
-  "{co|use_comp|false|Use mask comparator}"
-  "{st|stopAt|0|Frame number to stop}"
-  "{im|imgref||Specify image file}"
-  ;
-  cv::CommandLineParser cmd(argc, argv, keys);
-  
-  if(argc <= 1 || cmd.get<bool>("help") == true)
+  VideoAnalysis::VideoAnalysis() : use_file(false), use_camera(false), cameraIndex(0), use_comp(false), frameToStop(0)
   {
-    std::cout << "Usage: " << argv[0] << " [options]" << std::endl;
-    std::cout << "Avaible options:" << std::endl;
-    cmd.printParams();
-    return false;
+    std::cout << "VideoAnalysis()" << std::endl;
   }
 
-  use_file = cmd.get<bool>("use_file");
-  if(use_file)
+  VideoAnalysis::~VideoAnalysis()
   {
-    filename = cmd.get<std::string>("filename");
+    std::cout << "~VideoAnalysis()" << std::endl;
+  }
 
-    if(filename.empty())
+  bool VideoAnalysis::setup(int argc, const char **argv)
+  {
+    bool flag = false;
+
+    const char* keys =
+      "{hp|help|false|Print help message}"
+      "{uf|use_file|false|Use video file}"
+      "{fn|filename||Specify video file}"
+      "{uc|use_cam|false|Use camera}"
+      "{ca|camera|0|Specify camera index}"
+      "{co|use_comp|false|Use mask comparator}"
+      "{st|stopAt|0|Frame number to stop}"
+      "{im|imgref||Specify image file}"
+      ;
+    cv::CommandLineParser cmd(argc, argv, keys);
+
+    if (argc <= 1 || cmd.get<bool>("help") == true)
     {
-      std::cout << "Specify filename"<< std::endl;
+      std::cout << "Usage: " << argv[0] << " [options]" << std::endl;
+      std::cout << "Avaible options:" << std::endl;
+      cmd.printParams();
       return false;
     }
-    
-    flag = true;
-  }
 
-  use_camera = cmd.get<bool>("use_cam");
-  if(use_camera)
-  {
-    cameraIndex = cmd.get<int>("camera");
-    flag = true;
-  }
-
-  if(flag == true)
-  {
-    use_comp = cmd.get<bool>("use_comp");
-    if(use_comp)
+    use_file = cmd.get<bool>("use_file");
+    if (use_file)
     {
-      frameToStop = cmd.get<int>("stopAt");
-      imgref = cmd.get<std::string>("imgref");
+      filename = cmd.get<std::string>("filename");
 
-      if(imgref.empty())
+      if (filename.empty())
       {
-        std::cout << "Specify image reference"<< std::endl;
+        std::cout << "Specify filename" << std::endl;
         return false;
       }
+
+      flag = true;
     }
-  }
 
-  return flag;
-}
+    use_camera = cmd.get<bool>("use_cam");
+    if (use_camera)
+    {
+      cameraIndex = cmd.get<int>("camera");
+      flag = true;
+    }
 
-void VideoAnalysis::start()
-{
-  do
+    if (flag == true)
+    {
+      use_comp = cmd.get<bool>("use_comp");
+      if (use_comp)
+      {
+        frameToStop = cmd.get<int>("stopAt");
+        imgref = cmd.get<std::string>("imgref");
+
+        if (imgref.empty())
+        {
+          std::cout << "Specify image reference" << std::endl;
+          return false;
+        }
+      }
+    }
+
+    return flag;
+  }
+
+  void VideoAnalysis::start()
   {
-    videoCapture = new VideoCapture;
-    frameProcessor = new FrameProcessor;
+    do
+    {
+      videoCapture = new VideoCapture;
+      frameProcessor = new FrameProcessor;
+
+      frameProcessor->init();
+      frameProcessor->frameToStop = frameToStop;
+      frameProcessor->imgref = imgref;
+
+      videoCapture->setFrameProcessor(frameProcessor);
+
+      if (use_file)
+        videoCapture->setVideo(filename);
 
-    frameProcessor->init();
-    frameProcessor->frameToStop = frameToStop;
-    frameProcessor->imgref = imgref;
+      if (use_camera)
+        videoCapture->setCamera(cameraIndex);
 
-    videoCapture->setFrameProcessor(frameProcessor);
+      videoCapture->start();
 
-    if(use_file)
-      videoCapture->setVideo(filename);
-    
-    if(use_camera)
-      videoCapture->setCamera(cameraIndex);
-    
-    videoCapture->start();
+      if (use_file || use_camera)
+        break;
 
-    if(use_file || use_camera)
-      break;
+      frameProcessor->finish();
 
-    frameProcessor->finish();
+      int key = cvWaitKey(500);
+      if (key == KEY_ESC)
+        break;
 
-    int key = cvWaitKey(500);
-    if(key == KEY_ESC)
-      break;
+      delete frameProcessor;
+      delete videoCapture;
+
+    } while (1);
 
     delete frameProcessor;
     delete videoCapture;
-
-  }while(1);
-  
-  delete frameProcessor;
-  delete videoCapture;
-}
\ No newline at end of file
+  }
+}
diff --git a/VideoAnalysis.h b/VideoAnalysis.h
index 74eacf764cc8a49655c23b897ca7b73f76eef4e9..f548a7bfcb50f981780825034dc2a324de077ae2 100644
--- a/VideoAnalysis.h
+++ b/VideoAnalysis.h
@@ -22,24 +22,26 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include "VideoCapture.h"
 #include "FrameProcessor.h"
 
-class VideoAnalysis
+namespace bgslibrary
 {
-private:
-  VideoCapture* videoCapture;
-  FrameProcessor* frameProcessor;
-  bool use_file;
-  std::string filename;
-  bool use_camera;
-  int cameraIndex;
-  bool use_comp;
-  long frameToStop;
-  std::string imgref;
-
-public:
-  VideoAnalysis();
-  ~VideoAnalysis();
-
-  bool setup(int argc, const char **argv);
-  void start();
-};
-
+  class VideoAnalysis
+  {
+  private:
+    VideoCapture* videoCapture;
+    FrameProcessor* frameProcessor;
+    bool use_file;
+    std::string filename;
+    bool use_camera;
+    int cameraIndex;
+    bool use_comp;
+    long frameToStop;
+    std::string imgref;
+
+  public:
+    VideoAnalysis();
+    ~VideoAnalysis();
+
+    bool setup(int argc, const char **argv);
+    void start();
+  };
+}
diff --git a/VideoCapture.cpp b/VideoCapture.cpp
index 895205376a3474c7b03a5e21de923b1352c62332..401fb2729f64bb5d6d376910c186ca6e3f52b7e4 100644
--- a/VideoCapture.cpp
+++ b/VideoCapture.cpp
@@ -16,260 +16,263 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "VideoCapture.h"
 
-namespace VC_ROI
+namespace bgslibrary
 {
-  IplImage* img_input1 = 0;
-  IplImage* img_input2 = 0;
-  int roi_x0 = 0;
-  int roi_y0 = 0;
-  int roi_x1 = 0;
-  int roi_y1 = 0;
-  int numOfRec = 0;
-  int startDraw = 0;
-  bool roi_defined = false;
-  bool use_roi = true;
-  bool disable_event = false;
-
-  void reset(void)
+  namespace VC_ROI
   {
-    disable_event = false;
-    startDraw = false;
-  }
+    IplImage* img_input1 = 0;
+    IplImage* img_input2 = 0;
+    int roi_x0 = 0;
+    int roi_y0 = 0;
+    int roi_x1 = 0;
+    int roi_y1 = 0;
+    int numOfRec = 0;
+    int startDraw = 0;
+    bool roi_defined = false;
+    bool use_roi = true;
+    bool disable_event = false;
+
+    void reset(void)
+    {
+      disable_event = false;
+      startDraw = false;
+    }
 
-  void VideoCapture_on_mouse(int evt, int x, int y, int flag, void* param)
-  {
-    if(use_roi == false || disable_event == true)
-      return;
-    
-    if(evt == CV_EVENT_LBUTTONDOWN)
+    void VideoCapture_on_mouse(int evt, int x, int y, int flag, void* param)
     {
-      if(!startDraw)
+      if (use_roi == false || disable_event == true)
+        return;
+
+      if (evt == CV_EVENT_LBUTTONDOWN)
       {
-        roi_x0 = x;
-        roi_y0 = y;
-        startDraw = 1;
+        if (!startDraw)
+        {
+          roi_x0 = x;
+          roi_y0 = y;
+          startDraw = 1;
+        }
+        else
+        {
+          roi_x1 = x;
+          roi_y1 = y;
+          startDraw = 0;
+          roi_defined = true;
+          disable_event = true;
+        }
       }
-      else
+
+      if (evt == CV_EVENT_MOUSEMOVE && startDraw)
       {
-        roi_x1 = x;
-        roi_y1 = y;
-        startDraw = 0;
-        roi_defined = true;
-        disable_event = true;
+        //redraw ROI selection
+        img_input2 = cvCloneImage(img_input1);
+        cvRectangle(img_input2, cvPoint(roi_x0, roi_y0), cvPoint(x, y), CV_RGB(255, 0, 0), 1);
+        cvShowImage("Input", img_input2);
+        cvReleaseImage(&img_input2);
+        //startDraw = false;
+        //disable_event = true;
       }
     }
-
-    if(evt == CV_EVENT_MOUSEMOVE && startDraw)
-    {
-      //redraw ROI selection
-      img_input2 = cvCloneImage(img_input1);
-      cvRectangle(img_input2, cvPoint(roi_x0,roi_y0), cvPoint(x,y), CV_RGB(255,0,0), 1);
-      cvShowImage("Input", img_input2);
-      cvReleaseImage(&img_input2);
-      //startDraw = false;
-      //disable_event = true;
-    }
   }
-}
 
-VideoCapture::VideoCapture() : key(0), start_time(0), delta_time(0), freq(0), fps(0), frameNumber(0), stopAt(0),
-  useCamera(false), useVideo(false), input_resize_percent(100), showOutput(true), enableFlip(false)
-{
-  std::cout << "VideoCapture()" << std::endl;
-}
+  VideoCapture::VideoCapture() : key(0), start_time(0), delta_time(0), freq(0), fps(0), frameNumber(0), stopAt(0),
+    useCamera(false), useVideo(false), input_resize_percent(100), showOutput(true), enableFlip(false)
+  {
+    std::cout << "VideoCapture()" << std::endl;
+  }
 
-VideoCapture::~VideoCapture()
-{
-  std::cout << "~VideoCapture()" << std::endl;
-}
+  VideoCapture::~VideoCapture()
+  {
+    std::cout << "~VideoCapture()" << std::endl;
+  }
 
-void VideoCapture::setFrameProcessor(IFrameProcessor* frameProcessorPtr)
-{
-  frameProcessor = frameProcessorPtr;
-}
+  void VideoCapture::setFrameProcessor(IFrameProcessor* frameProcessorPtr)
+  {
+    frameProcessor = frameProcessorPtr;
+  }
 
-void VideoCapture::setCamera(int index)
-{
-  useCamera = true;
-  cameraIndex = index;
+  void VideoCapture::setCamera(int index)
+  {
+    useCamera = true;
+    cameraIndex = index;
 
-  useVideo = false;
-}
+    useVideo = false;
+  }
 
-void VideoCapture::setUpCamera()
-{
-  std::cout << "Camera index:" << cameraIndex << std::endl;
-  capture = cvCaptureFromCAM(cameraIndex);
+  void VideoCapture::setUpCamera()
+  {
+    std::cout << "Camera index:" << cameraIndex << std::endl;
+    capture = cvCaptureFromCAM(cameraIndex);
 
-  if(!capture)
-    std::cerr << "Cannot open initialize webcam!\n" << std::endl;
-}
+    if (!capture)
+      std::cerr << "Cannot open initialize webcam!\n" << std::endl;
+  }
 
-void VideoCapture::setVideo(std::string filename)
-{
-  useVideo = true;
-  videoFileName = filename;
+  void VideoCapture::setVideo(std::string filename)
+  {
+    useVideo = true;
+    videoFileName = filename;
 
-  useCamera = false;
-}
+    useCamera = false;
+  }
 
-void VideoCapture::setUpVideo()
-{
-  capture = cvCaptureFromFile(videoFileName.c_str());
+  void VideoCapture::setUpVideo()
+  {
+    capture = cvCaptureFromFile(videoFileName.c_str());
 
-  if(!capture)
-    std::cerr << "Cannot open video file "<< videoFileName << std::endl;
-}
+    if (!capture)
+      std::cerr << "Cannot open video file " << videoFileName << std::endl;
+  }
 
-void VideoCapture::start()
-{
-  loadConfig();
-
-  if(useCamera) setUpCamera();
-  if(useVideo)  setUpVideo();
-  if(!capture)  std::cerr << "Capture error..." << std::endl;
-  
-  int input_fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
-  std::cout << "input->fps:" << input_fps << std::endl;
-
-  IplImage* frame1 = cvQueryFrame(capture);
-  frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent)/100) , (int)((frame1->height*input_resize_percent)/100)), frame1->depth, frame1->nChannels);
-  //cvCreateImage(cvSize(frame1->width/input_resize_factor, frame1->height/input_resize_factor), frame1->depth, frame1->nChannels);
-  std::cout << "input->resize_percent:" << input_resize_percent << std::endl;
-  std::cout << "input->width:" << frame->width << std::endl;
-  std::cout << "input->height:" << frame->height << std::endl;
-
-  double loopDelay = 33.333;
-  if(input_fps > 0)
-    loopDelay = (1./input_fps)*1000.;
-  std::cout << "loopDelay:" << loopDelay << std::endl;
-
-  bool firstTime = true;
-  do
+  void VideoCapture::start()
   {
-    frameNumber++;
+    loadConfig();
+
+    if (useCamera) setUpCamera();
+    if (useVideo)  setUpVideo();
+    if (!capture)  std::cerr << "Capture error..." << std::endl;
 
-    frame1 = cvQueryFrame(capture);
-    if(!frame1) break;
+    int input_fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
+    std::cout << "input->fps:" << input_fps << std::endl;
 
-    cvResize(frame1, frame);
+    IplImage* frame1 = cvQueryFrame(capture);
+    frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent) / 100), (int)((frame1->height*input_resize_percent) / 100)), frame1->depth, frame1->nChannels);
+    //cvCreateImage(cvSize(frame1->width/input_resize_factor, frame1->height/input_resize_factor), frame1->depth, frame1->nChannels);
+    std::cout << "input->resize_percent:" << input_resize_percent << std::endl;
+    std::cout << "input->width:" << frame->width << std::endl;
+    std::cout << "input->height:" << frame->height << std::endl;
 
-    if(enableFlip)
-      cvFlip(frame, frame, 0);
-    
-    if(VC_ROI::use_roi == true && VC_ROI::roi_defined == false && firstTime == true)
+    double loopDelay = 33.333;
+    if (input_fps > 0)
+      loopDelay = (1. / input_fps)*1000.;
+    std::cout << "loopDelay:" << loopDelay << std::endl;
+
+    bool firstTime = true;
+    do
     {
-      VC_ROI::reset();
+      frameNumber++;
 
-      do
-      {
-        cv::Mat img_input(frame);
-        
-        if(showOutput)
-        {
-          cv::imshow("Input", img_input);
+      frame1 = cvQueryFrame(capture);
+      if (!frame1) break;
 
-          std::cout << "Set ROI (press ESC to skip)" << std::endl;
-          VC_ROI::img_input1 = new IplImage(img_input);
-          cvSetMouseCallback("Input", VC_ROI::VideoCapture_on_mouse, NULL);
-          key = cvWaitKey(0);
-          delete VC_ROI::img_input1;
-        }
-        else
-          key = KEY_ESC;
+      cvResize(frame1, frame);
 
-        if(key == KEY_ESC)
-        {
-          std::cout << "ROI disabled" << std::endl;
-          VC_ROI::reset();
-          VC_ROI::use_roi = false;
-          break;
-        }
+      if (enableFlip)
+        cvFlip(frame, frame, 0);
+
+      if (VC_ROI::use_roi == true && VC_ROI::roi_defined == false && firstTime == true)
+      {
+        VC_ROI::reset();
 
-        if(VC_ROI::roi_defined)
+        do
         {
-          std::cout << "ROI defined (" << VC_ROI::roi_x0 << "," << VC_ROI::roi_y0 << "," << VC_ROI::roi_x1 << "," << VC_ROI::roi_y1 << ")" << std::endl;
-          break;
-        }
-        else
-          std::cout << "ROI undefined" << std::endl;
+          cv::Mat img_input(frame);
+
+          if (showOutput)
+          {
+            cv::imshow("Input", img_input);
+
+            std::cout << "Set ROI (press ESC to skip)" << std::endl;
+            VC_ROI::img_input1 = new IplImage(img_input);
+            cvSetMouseCallback("Input", VC_ROI::VideoCapture_on_mouse, NULL);
+            key = cvWaitKey(0);
+            delete VC_ROI::img_input1;
+          }
+          else
+            key = KEY_ESC;
+
+          if (key == KEY_ESC)
+          {
+            std::cout << "ROI disabled" << std::endl;
+            VC_ROI::reset();
+            VC_ROI::use_roi = false;
+            break;
+          }
+
+          if (VC_ROI::roi_defined)
+          {
+            std::cout << "ROI defined (" << VC_ROI::roi_x0 << "," << VC_ROI::roi_y0 << "," << VC_ROI::roi_x1 << "," << VC_ROI::roi_y1 << ")" << std::endl;
+            break;
+          }
+          else
+            std::cout << "ROI undefined" << std::endl;
+
+        } while (1);
+      }
 
-      }while(1);
-    }
+      if (VC_ROI::use_roi == true && VC_ROI::roi_defined == true)
+      {
+        CvRect rect = cvRect(VC_ROI::roi_x0, VC_ROI::roi_y0, VC_ROI::roi_x1 - VC_ROI::roi_x0, VC_ROI::roi_y1 - VC_ROI::roi_y0);
+        cvSetImageROI(frame, rect);
+      }
 
-    if(VC_ROI::use_roi == true && VC_ROI::roi_defined == true)
-    {
-      CvRect rect = cvRect(VC_ROI::roi_x0, VC_ROI::roi_y0, VC_ROI::roi_x1 - VC_ROI::roi_x0, VC_ROI::roi_y1 - VC_ROI::roi_y0);
-      cvSetImageROI(frame, rect);
-    }
+      cv::Mat img_input(frame);
 
-    cv::Mat img_input(frame);
-    
-    if(showOutput)
-      cv::imshow("Input", img_input);
+      if (showOutput)
+        cv::imshow("Input", img_input);
 
-    if(firstTime)
-      saveConfig();
+      if (firstTime)
+        saveConfig();
 
-    start_time = cv::getTickCount();
-    frameProcessor->process(img_input);
-    int64 delta_time = cv::getTickCount() - start_time;
-    freq = cv::getTickFrequency();
-    fps = freq / delta_time;
-    //std::cout << "FPS: " << fps << std::endl;
+      start_time = cv::getTickCount();
+      frameProcessor->process(img_input);
+      int64 delta_time = cv::getTickCount() - start_time;
+      freq = cv::getTickFrequency();
+      fps = freq / delta_time;
+      //std::cout << "FPS: " << fps << std::endl;
 
-    cvResetImageROI(frame);
+      cvResetImageROI(frame);
 
-    key = cvWaitKey(loopDelay);
-    //std::cout << "key: " << key << std::endl;
+      key = cvWaitKey(loopDelay);
+      //std::cout << "key: " << key << std::endl;
 
-    if(key == KEY_SPACE)
-      key = cvWaitKey(0);
+      if (key == KEY_SPACE)
+        key = cvWaitKey(0);
 
-    if(key == KEY_ESC)
-      break;
+      if (key == KEY_ESC)
+        break;
 
-    if(stopAt > 0 && stopAt == frameNumber)
-      key = cvWaitKey(0);
+      if (stopAt > 0 && stopAt == frameNumber)
+        key = cvWaitKey(0);
 
-    firstTime = false;
-  }while(1);
+      firstTime = false;
+    } while (1);
 
-  cvReleaseCapture(&capture);
-}
+    cvReleaseCapture(&capture);
+  }
 
-void VideoCapture::saveConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_WRITE);
-
-  cvWriteInt(fs, "stopAt", stopAt);
-  cvWriteInt(fs, "input_resize_percent", input_resize_percent);
-  cvWriteInt(fs, "enableFlip", enableFlip);
-  cvWriteInt(fs, "use_roi", VC_ROI::use_roi);
-  cvWriteInt(fs, "roi_defined", VC_ROI::roi_defined);
-  cvWriteInt(fs, "roi_x0", VC_ROI::roi_x0);
-  cvWriteInt(fs, "roi_y0", VC_ROI::roi_y0);
-  cvWriteInt(fs, "roi_x1", VC_ROI::roi_x1);
-  cvWriteInt(fs, "roi_y1", VC_ROI::roi_y1);
-  cvWriteInt(fs, "showOutput", showOutput);
-
-  cvReleaseFileStorage(&fs);
-}
+  void VideoCapture::saveConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_WRITE);
+
+    cvWriteInt(fs, "stopAt", stopAt);
+    cvWriteInt(fs, "input_resize_percent", input_resize_percent);
+    cvWriteInt(fs, "enableFlip", enableFlip);
+    cvWriteInt(fs, "use_roi", VC_ROI::use_roi);
+    cvWriteInt(fs, "roi_defined", VC_ROI::roi_defined);
+    cvWriteInt(fs, "roi_x0", VC_ROI::roi_x0);
+    cvWriteInt(fs, "roi_y0", VC_ROI::roi_y0);
+    cvWriteInt(fs, "roi_x1", VC_ROI::roi_x1);
+    cvWriteInt(fs, "roi_y1", VC_ROI::roi_y1);
+    cvWriteInt(fs, "showOutput", showOutput);
+
+    cvReleaseFileStorage(&fs);
+  }
 
-void VideoCapture::loadConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_READ);
-
-  stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
-  input_resize_percent = cvReadIntByName(fs, 0, "input_resize_percent", 100);
-  enableFlip = cvReadIntByName(fs, 0, "enableFlip", false);
-  VC_ROI::use_roi = cvReadIntByName(fs, 0, "use_roi", true);
-  VC_ROI::roi_defined = cvReadIntByName(fs, 0, "roi_defined", false);
-  VC_ROI::roi_x0 = cvReadIntByName(fs, 0, "roi_x0", 0);
-  VC_ROI::roi_y0 = cvReadIntByName(fs, 0, "roi_y0", 0);
-  VC_ROI::roi_x1 = cvReadIntByName(fs, 0, "roi_x1", 0);
-  VC_ROI::roi_y1 = cvReadIntByName(fs, 0, "roi_y1", 0);
-  showOutput = cvReadIntByName(fs, 0, "showOutput", true);
-
-  cvReleaseFileStorage(&fs);
-}
\ No newline at end of file
+  void VideoCapture::loadConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/VideoCapture.xml", 0, CV_STORAGE_READ);
+
+    stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
+    input_resize_percent = cvReadIntByName(fs, 0, "input_resize_percent", 100);
+    enableFlip = cvReadIntByName(fs, 0, "enableFlip", false);
+    VC_ROI::use_roi = cvReadIntByName(fs, 0, "use_roi", true);
+    VC_ROI::roi_defined = cvReadIntByName(fs, 0, "roi_defined", false);
+    VC_ROI::roi_x0 = cvReadIntByName(fs, 0, "roi_x0", 0);
+    VC_ROI::roi_y0 = cvReadIntByName(fs, 0, "roi_y0", 0);
+    VC_ROI::roi_x1 = cvReadIntByName(fs, 0, "roi_x1", 0);
+    VC_ROI::roi_y1 = cvReadIntByName(fs, 0, "roi_y1", 0);
+    showOutput = cvReadIntByName(fs, 0, "showOutput", true);
+
+    cvReleaseFileStorage(&fs);
+  }
+}
diff --git a/VideoCapture.h b/VideoCapture.h
index caf6f6cb91d241a13bd9cac491d45a4ddf3897d2..1a381a8a9f566826fb99b2e39f9655c817756626 100644
--- a/VideoCapture.h
+++ b/VideoCapture.h
@@ -23,41 +23,43 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include "Config.h"
 #include "IFrameProcessor.h"
 
-class VideoCapture
+namespace bgslibrary
 {
-private:
-  IFrameProcessor* frameProcessor;
-  CvCapture* capture;
-  IplImage* frame;
-  int key;
-  int64 start_time;
-  int64 delta_time;
-  double freq;
-  double fps;
-  long frameNumber;
-  long stopAt;
-  bool useCamera;
-  int cameraIndex;
-  bool useVideo;
-  std::string videoFileName;
-  int input_resize_percent;
-  bool showOutput;
-  bool enableFlip;
-
-public:
-  VideoCapture();
-  ~VideoCapture();
-
-  void setFrameProcessor(IFrameProcessor* frameProcessorPtr);
-  void setCamera(int cameraIndex);
-  void setVideo(std::string filename);
-  void start();
-
-private:
-  void setUpCamera();
-  void setUpVideo();
-
-  void saveConfig();
-  void loadConfig();
-};
+  class VideoCapture
+  {
+  private:
+    IFrameProcessor* frameProcessor;
+    CvCapture* capture;
+    IplImage* frame;
+    int key;
+    int64 start_time;
+    int64 delta_time;
+    double freq;
+    double fps;
+    long frameNumber;
+    long stopAt;
+    bool useCamera;
+    int cameraIndex;
+    bool useVideo;
+    std::string videoFileName;
+    int input_resize_percent;
+    bool showOutput;
+    bool enableFlip;
 
+  public:
+    VideoCapture();
+    ~VideoCapture();
+
+    void setFrameProcessor(IFrameProcessor* frameProcessorPtr);
+    void setCamera(int cameraIndex);
+    void setVideo(std::string filename);
+    void start();
+
+  private:
+    void setUpCamera();
+    void setUpVideo();
+
+    void saveConfig();
+    void loadConfig();
+  };
+}
diff --git a/bgslibrary.exe b/bgslibrary.exe
new file mode 100644
index 0000000000000000000000000000000000000000..5cbd4e2099cfd60482da69ac24ddd2acefa48c32
Binary files /dev/null and b/bgslibrary.exe differ
diff --git a/config/FrameProcessor.xml b/config/FrameProcessor.xml
index c76f826ebb87dd91db37552312138bf0f161fce3..9ff1a61df218a26630f1c7db93a9e36d63c7c638 100644
--- a/config/FrameProcessor.xml
+++ b/config/FrameProcessor.xml
@@ -30,9 +30,9 @@
 <enableLBMixtureOfGaussians>0</enableLBMixtureOfGaussians>
 <enableLBAdaptiveSOM>0</enableLBAdaptiveSOM>
 <enableLBFuzzyAdaptiveSOM>0</enableLBFuzzyAdaptiveSOM>
-<enableLbpMrf>0</enableLbpMrf>
 <enableMultiLayerBGS>0</enableMultiLayerBGS>
-<enablePBAS>0</enablePBAS>
 <enableVuMeter>0</enableVuMeter>
 <enableKDE>0</enableKDE>
+<enableIMBS>0</enableIMBS>
+<enableMultiCueBGS>0</enableMultiCueBGS>
 </opencv_storage>
diff --git a/package_analysis/ForegroundMaskAnalysis.cpp b/package_analysis/ForegroundMaskAnalysis.cpp
index 45645a01e3feb98ce478cca89ef9754c29d99f52..4df9ed0c10933c0ad8051538d0e6f8435d46bd7c 100644
--- a/package_analysis/ForegroundMaskAnalysis.cpp
+++ b/package_analysis/ForegroundMaskAnalysis.cpp
@@ -16,86 +16,89 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "ForegroundMaskAnalysis.h"
 
-ForegroundMaskAnalysis::ForegroundMaskAnalysis() : firstTime(true), stopAt(0), showOutput(true), img_ref_path("")
+namespace bgslibrary
 {
-  std::cout << "ForegroundMaskAnalysis()" << std::endl;
-}
-
-ForegroundMaskAnalysis::~ForegroundMaskAnalysis()
-{
-  std::cout << "~ForegroundMaskAnalysis()" << std::endl;
-}
-
-void ForegroundMaskAnalysis::process(const long &frameNumber, const std::string &name, const cv::Mat &img_input)
-{
-  if(img_input.empty())
-    return;
-
-  if(stopAt == 0)
+  ForegroundMaskAnalysis::ForegroundMaskAnalysis() : firstTime(true), stopAt(0), showOutput(true), img_ref_path("")
   {
-    loadConfig();
-
-    if(firstTime)
-      saveConfig();
+    std::cout << "ForegroundMaskAnalysis()" << std::endl;
   }
 
-  if(stopAt == frameNumber && img_ref_path.empty() == false)
+  ForegroundMaskAnalysis::~ForegroundMaskAnalysis()
   {
-    cv::Mat img_ref = cv::imread(img_ref_path, 0);
-
-    if(showOutput)
-      cv::imshow("ForegroundMaskAnalysis", img_ref);
+    std::cout << "~ForegroundMaskAnalysis()" << std::endl;
+  }
 
-    int rn = cv::countNonZero(img_ref);
-    cv::Mat i;
-    cv::Mat u;
+  void ForegroundMaskAnalysis::process(const long &frameNumber, const std::string &name, const cv::Mat &img_input)
+  {
+    if (img_input.empty())
+      return;
 
-    if(rn > 0)
-    {
-      i = img_input & img_ref;
-      u = img_input | img_ref;
-    }
-    else
+    if (stopAt == 0)
     {
-      i = (~img_input) & (~img_ref);
-      u = (~img_input) | (~img_ref);
+      loadConfig();
+
+      if (firstTime)
+        saveConfig();
     }
 
-    int in = cv::countNonZero(i);
-    int un = cv::countNonZero(u);
-    
-    double s = (((double)in) / ((double)un));
-    
-    if(showOutput)
+    if (stopAt == frameNumber && img_ref_path.empty() == false)
     {
-      cv::imshow("A^B", i);
-      cv::imshow("AvB", u);
-    }
+      cv::Mat img_ref = cv::imread(img_ref_path, 0);
+
+      if (showOutput)
+        cv::imshow("ForegroundMaskAnalysis", img_ref);
+
+      int rn = cv::countNonZero(img_ref);
+      cv::Mat i;
+      cv::Mat u;
 
-    std::cout << name << " - Similarity Measure: " << s << " press ENTER to continue" << std::endl;
+      if (rn > 0)
+      {
+        i = img_input & img_ref;
+        u = img_input | img_ref;
+      }
+      else
+      {
+        i = (~img_input) & (~img_ref);
+        u = (~img_input) | (~img_ref);
+      }
 
-    cv::waitKey(0);
+      int in = cv::countNonZero(i);
+      int un = cv::countNonZero(u);
+
+      double s = (((double)in) / ((double)un));
+
+      if (showOutput)
+      {
+        cv::imshow("A^B", i);
+        cv::imshow("AvB", u);
+      }
+
+      std::cout << name << " - Similarity Measure: " << s << " press ENTER to continue" << std::endl;
+
+      cv::waitKey(0);
+    }
+
+    firstTime = false;
   }
 
-  firstTime = false;
-}
+  void ForegroundMaskAnalysis::saveConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_WRITE);
 
-void ForegroundMaskAnalysis::saveConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_WRITE);
+    cvWriteInt(fs, "stopAt", stopAt);
+    cvWriteString(fs, "img_ref_path", img_ref_path.c_str());
 
-  cvWriteInt(fs, "stopAt", stopAt);
-  cvWriteString(fs, "img_ref_path", img_ref_path.c_str());
-  
-  cvReleaseFileStorage(&fs);
-}
+    cvReleaseFileStorage(&fs);
+  }
 
-void ForegroundMaskAnalysis::loadConfig()
-{
-  CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_READ);
-  
-  stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
-  img_ref_path = cvReadStringByName(fs, 0, "img_ref_path", "");
+  void ForegroundMaskAnalysis::loadConfig()
+  {
+    CvFileStorage* fs = cvOpenFileStorage("./config/ForegroundMaskAnalysis.xml", 0, CV_STORAGE_READ);
+
+    stopAt = cvReadIntByName(fs, 0, "stopAt", 0);
+    img_ref_path = cvReadStringByName(fs, 0, "img_ref_path", "");
 
-  cvReleaseFileStorage(&fs);
-}
\ No newline at end of file
+    cvReleaseFileStorage(&fs);
+  }
+}
diff --git a/package_analysis/ForegroundMaskAnalysis.h b/package_analysis/ForegroundMaskAnalysis.h
index d6bfdaea123037b8b9b0d380910c84124a28204c..399da68c211d8fd8f93ef96beecca1452d532a24 100644
--- a/package_analysis/ForegroundMaskAnalysis.h
+++ b/package_analysis/ForegroundMaskAnalysis.h
@@ -21,22 +21,25 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include <cv.h>
 #include <highgui.h>
 
-class ForegroundMaskAnalysis
+namespace bgslibrary
 {
-private:
-  bool firstTime;
-  bool showOutput;
-
-public:
-  ForegroundMaskAnalysis();
-  ~ForegroundMaskAnalysis();
-  
-  long stopAt;
-  std::string img_ref_path;
-
-  void process(const long &frameNumber, const std::string &name, const cv::Mat &img_input);
-
-private:
-  void saveConfig();
-  void loadConfig();
-};
\ No newline at end of file
+  class ForegroundMaskAnalysis
+  {
+  private:
+    bool firstTime;
+    bool showOutput;
+
+  public:
+    ForegroundMaskAnalysis();
+    ~ForegroundMaskAnalysis();
+
+    long stopAt;
+    std::string img_ref_path;
+
+    void process(const long &frameNumber, const std::string &name, const cv::Mat &img_input);
+
+  private:
+    void saveConfig();
+    void loadConfig();
+  };
+}
diff --git a/vs2010/bgslibrary.v12.suo b/vs2010/bgslibrary.v12.suo
index e515299c25c150bf36a9f790adfcab547564d2cf..318f0336bf43288341f2a845a4a0e9b1eff5180c 100644
Binary files a/vs2010/bgslibrary.v12.suo and b/vs2010/bgslibrary.v12.suo differ
diff --git a/vs2010/bgslibrary.vcxproj b/vs2010/bgslibrary.vcxproj
index d9c829d9b13e21605bf2c7884293325a8ef63532..a1bddf6930ec4de042f5c75fd7d7b380ab69bf75 100644
--- a/vs2010/bgslibrary.vcxproj
+++ b/vs2010/bgslibrary.vcxproj
@@ -78,7 +78,12 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="..\Demo.cpp" />
+    <ClCompile Include="..\Demo.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\FrameProcessor.cpp" />
+    <ClCompile Include="..\Main.cpp" />
+    <ClCompile Include="..\package_analysis\ForegroundMaskAnalysis.cpp" />
     <ClCompile Include="..\package_bgs\AdaptiveBackgroundLearning.cpp" />
     <ClCompile Include="..\package_bgs\AdaptiveSelectiveBackgroundLearning.cpp" />
     <ClCompile Include="..\package_bgs\ae\KDE.cpp" />
@@ -145,8 +150,15 @@
     <ClCompile Include="..\package_bgs\tb\T2FMRF_UV.cpp" />
     <ClCompile Include="..\package_bgs\WeightedMovingMeanBGS.cpp" />
     <ClCompile Include="..\package_bgs\WeightedMovingVarianceBGS.cpp" />
+    <ClCompile Include="..\PreProcessor.cpp" />
+    <ClCompile Include="..\VideoAnalysis.cpp" />
+    <ClCompile Include="..\VideoCapture.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\Config.h" />
+    <ClInclude Include="..\FrameProcessor.h" />
+    <ClInclude Include="..\IFrameProcessor.h" />
+    <ClInclude Include="..\package_analysis\ForegroundMaskAnalysis.h" />
     <ClInclude Include="..\package_bgs\AdaptiveBackgroundLearning.h" />
     <ClInclude Include="..\package_bgs\AdaptiveSelectiveBackgroundLearning.h" />
     <ClInclude Include="..\package_bgs\ae\KDE.h" />
@@ -221,6 +233,9 @@
     <ClInclude Include="..\package_bgs\tb\T2FMRF_UV.h" />
     <ClInclude Include="..\package_bgs\WeightedMovingMeanBGS.h" />
     <ClInclude Include="..\package_bgs\WeightedMovingVarianceBGS.h" />
+    <ClInclude Include="..\PreProcessor.h" />
+    <ClInclude Include="..\VideoAnalysis.h" />
+    <ClInclude Include="..\VideoCapture.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
diff --git a/vs2010/bgslibrary.vcxproj.filters b/vs2010/bgslibrary.vcxproj.filters
index 3960cbf0894f8d0f76aaef4d0c665851d1e3f1d5..f91c2cc38b74bc9d99526a9bcdf3c9eccdd53f38 100644
--- a/vs2010/bgslibrary.vcxproj.filters
+++ b/vs2010/bgslibrary.vcxproj.filters
@@ -43,11 +43,14 @@
     <Filter Include="Header Files\package_bgs\tb">
       <UniqueIdentifier>{53f2c4fb-9468-44ce-b76e-e25ea018c084}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Source Files\demo">
+      <UniqueIdentifier>{23f1cd4a-e9b2-4338-a5e7-128f451d3c89}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Header Files\package_analysis">
+      <UniqueIdentifier>{52a9f254-d817-4577-96c2-0b3b0a9527b7}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\Demo.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\package_bgs\AdaptiveBackgroundLearning.cpp">
       <Filter>Header Files\package_bgs</Filter>
     </ClCompile>
@@ -207,12 +210,6 @@
     <ClCompile Include="..\package_bgs\lb\LBSimpleGaussian.cpp">
       <Filter>Header Files\package_bgs\lb</Filter>
     </ClCompile>
-    <ClCompile Include="..\package_bgs\pt\PBAS.cpp">
-      <Filter>Header Files\package_bgs\pt</Filter>
-    </ClCompile>
-    <ClCompile Include="..\package_bgs\pt\PixelBasedAdaptiveSegmenter.cpp">
-      <Filter>Header Files\package_bgs\pt</Filter>
-    </ClCompile>
     <ClCompile Include="..\package_bgs\sjn\SJN_MultiCueBGS.cpp">
       <Filter>Header Files\package_bgs\sjn</Filter>
     </ClCompile>
@@ -252,6 +249,27 @@
     <ClCompile Include="..\package_bgs\tb\T2FMRF_UV.cpp">
       <Filter>Header Files\package_bgs\tb</Filter>
     </ClCompile>
+    <ClCompile Include="..\FrameProcessor.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Main.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\PreProcessor.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\VideoAnalysis.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\VideoCapture.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\Demo.cpp">
+      <Filter>Source Files\demo</Filter>
+    </ClCompile>
+    <ClCompile Include="..\package_analysis\ForegroundMaskAnalysis.cpp">
+      <Filter>Header Files\package_analysis</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\package_bgs\AdaptiveBackgroundLearning.h">
@@ -437,12 +455,6 @@
     <ClInclude Include="..\package_bgs\lb\Types.h">
       <Filter>Header Files\package_bgs\lb</Filter>
     </ClInclude>
-    <ClInclude Include="..\package_bgs\pt\PBAS.h">
-      <Filter>Header Files\package_bgs\pt</Filter>
-    </ClInclude>
-    <ClInclude Include="..\package_bgs\pt\PixelBasedAdaptiveSegmenter.h">
-      <Filter>Header Files\package_bgs\pt</Filter>
-    </ClInclude>
     <ClInclude Include="..\package_bgs\sjn\SJN_MultiCueBGS.h">
       <Filter>Header Files\package_bgs\sjn</Filter>
     </ClInclude>
@@ -482,5 +494,26 @@
     <ClInclude Include="..\package_bgs\tb\T2FMRF_UV.h">
       <Filter>Header Files\package_bgs\tb</Filter>
     </ClInclude>
+    <ClInclude Include="..\Config.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\FrameProcessor.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\IFrameProcessor.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\PreProcessor.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\VideoAnalysis.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\VideoCapture.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\package_analysis\ForegroundMaskAnalysis.h">
+      <Filter>Header Files\package_analysis</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file