diff --git a/Demo.cpp b/Demo.cpp
index f48654d679050c189ea901e6b186816227797d21..762d2ae741d6cfea22d9b441e42c4b8c792c0700 100644
--- a/Demo.cpp
+++ b/Demo.cpp
@@ -15,18 +15,16 @@ You should have received a copy of the GNU General Public License
 along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include <iostream>
+#include <vector>
 #include <opencv2/opencv.hpp>
-using namespace cv;
 
 #include "package_bgs/bgslibrary.h"
 
-using namespace ibgs;
-
 int main(int argc, char **argv)
 {
   std::cout << "Using OpenCV " << CV_MAJOR_VERSION << "." << CV_MINOR_VERSION << "." << CV_SUBMINOR_VERSION << std::endl;
 
-  VideoCapture capture;
+  cv::VideoCapture capture;
 
   if (argc > 1)
   {
@@ -43,76 +41,57 @@ int main(int argc, char **argv)
   }
 
   /* Background Subtraction Methods */
-  IBGS *bgs;
-
-  bgs = new FrameDifference;
-  //bgs = new StaticFrameDifference;
-  //bgs = new WeightedMovingMean;
-  //bgs = new WeightedMovingVariance;
-  //bgs = new MixtureOfGaussianV1; // only on OpenCV 2.x
-  //bgs = new MixtureOfGaussianV2;
-  //bgs = new AdaptiveBackgroundLearning;
-  //bgs = new AdaptiveSelectiveBackgroundLearning;
-  //bgs = new GMG; // only on OpenCV 2.x
-  //bgs = new KNN; // only on OpenCV 3.x
-  //bgs = new DPAdaptiveMedian;
-  //bgs = new DPGrimsonGMM;
-  //bgs = new DPZivkovicAGMM;
-  //bgs = new DPMean;
-  //bgs = new DPWrenGA;
-  //bgs = new DPPratiMediod;
-  //bgs = new DPEigenbackground;
-  //bgs = new DPTexture;
-  //bgs = new T2FGMM_UM;
-  //bgs = new T2FGMM_UV;
-  //bgs = new T2FMRF_UM;
-  //bgs = new T2FMRF_UV;
-  //bgs = new FuzzySugenoIntegral;
-  //bgs = new FuzzyChoquetIntegral;
-  //bgs = new MultiLayer;
-  //bgs = new PixelBasedAdaptiveSegmenter;
-  //bgs = new LBSimpleGaussian;
-  //bgs = new LBFuzzyGaussian;
-  //bgs = new LBMixtureOfGaussians;
-  //bgs = new LBAdaptiveSOM;
-  //bgs = new LBFuzzyAdaptiveSOM;
-  //bgs = new LBP_MRF;
-  //bgs = new VuMeter;
-  //bgs = new KDE;
-  //bgs = new IndependentMultimodal;
-  //bgs = new MultiCue;
-  //bgs = new SigmaDelta;
-  //bgs = new SuBSENSE;
-  //bgs = new LOBSTER;
-  //bgs = new PAWCS;
-  //bgs = new TwoPoints;
-  //bgs = new ViBe;
-  //bgs = new CodeBook;
-
-  int key = 0;
-  cv::Mat img_input;
-  while (key != 'q')
-  {
-    capture >> img_input;
-    if (img_input.empty()) break;
-
-    cv::imshow("input", img_input);
-
-    cv::Mat img_mask;
-    cv::Mat img_bkgmodel;
-    bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image
+  auto algorithmsName = BGS_Factory::Instance()->GetRegisteredAlgorithmsName();
 
-    //if(!img_mask.empty())
-    //  cv::imshow("Foreground", img_mask);
-    //  do something
-
-    key = cvWaitKey(33);
+  auto key = 0;
+  for (const std::string& algorithmName : algorithmsName)
+  {
+    std::cout << "Running " << algorithmName << std::endl;
+    auto bgs = BGS_Factory::Instance()->Create(algorithmName);
+
+    cv::Mat img_input;
+    
+    capture.set(CV_CAP_PROP_POS_FRAMES, 0); // Set index to 0 (start frame)
+    auto frame_counter = 0;
+    std::cout << "Press 's' to stop:" << std::endl;
+    while (key != 's')
+    {
+      // Capture frame-by-frame
+      capture >> img_input;
+      frame_counter += 1;
+
+      if (img_input.empty()) break;
+
+      cv::imshow("input", img_input);
+
+      cv::Mat img_mask;
+      cv::Mat img_bkgmodel;
+      try
+      {
+        bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image
+
+        //if(!img_mask.empty())
+        //  cv::imshow("Foreground", img_mask);
+        //  do something
+      }
+      catch (std::exception& e)
+      {
+        std::cout << "Exception occurred" << std::endl;
+        std::cout << e.what() << std::endl;
+      }
+
+      key = cv::waitKey(33);
+    }
+
+    std::cout << "Press 'q' to exit, or anything else to move to the next algorithm:" << std::endl;
+    key = cv::waitKey(0);
+    if (key == 'q')
+      break;
+
+    cv::destroyAllWindows();
   }
 
-  delete bgs;
-
   capture.release();
-  cvDestroyAllWindows();
 
   return 0;
 }
diff --git a/Demo2.cpp b/Demo2.cpp
index 75c906beedcd2be7de7a66377bb501234ee8d960..ad95e73b70497f495b762c47a89f68e838ed7f31 100644
--- a/Demo2.cpp
+++ b/Demo2.cpp
@@ -15,6 +15,7 @@ You should have received a copy of the GNU General Public License
 along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include <iostream>
+#include <vector>
 #include <opencv2/opencv.hpp>
 
 #include "package_bgs/bgslibrary.h"
@@ -24,84 +25,58 @@ int main(int argc, char **argv)
   std::cout << "Using OpenCV " << CV_MAJOR_VERSION << "." << CV_MINOR_VERSION << "." << CV_SUBMINOR_VERSION << std::endl;
 
   /* Background Subtraction Methods */
-  IBGS *bgs;
-
-  bgs = new FrameDifference;
-  //bgs = new StaticFrameDifference;
-  //bgs = new WeightedMovingMean;
-  //bgs = new WeightedMovingVariance;
-  //bgs = new MixtureOfGaussianV1; // only on OpenCV 2.x
-  //bgs = new MixtureOfGaussianV2;
-  //bgs = new AdaptiveBackgroundLearning;
-  //bgs = new AdaptiveSelectiveBackgroundLearning;
-  //bgs = new GMG; // only on OpenCV 2.x
-  //bgs = new KNN; // only on OpenCV 3.x
-  //bgs = new DPAdaptiveMedian;
-  //bgs = new DPGrimsonGMM;
-  //bgs = new DPZivkovicAGMM;
-  //bgs = new DPMean;
-  //bgs = new DPWrenGA;
-  //bgs = new DPPratiMediod;
-  //bgs = new DPEigenbackground;
-  //bgs = new DPTexture;
-  //bgs = new T2FGMM_UM;
-  //bgs = new T2FGMM_UV;
-  //bgs = new T2FMRF_UM;
-  //bgs = new T2FMRF_UV;
-  //bgs = new FuzzySugenoIntegral;
-  //bgs = new FuzzyChoquetIntegral;
-  //bgs = new MultiLayer;
-  //bgs = new PixelBasedAdaptiveSegmenter;
-  //bgs = new LBSimpleGaussian;
-  //bgs = new LBFuzzyGaussian;
-  //bgs = new LBMixtureOfGaussians;
-  //bgs = new LBAdaptiveSOM;
-  //bgs = new LBFuzzyAdaptiveSOM;
-  //bgs = new LBP_MRF;
-  //bgs = new VuMeter;
-  //bgs = new KDE;
-  //bgs = new IndependentMultimodal;
-  //bgs = new MultiCue;
-  //bgs = new SigmaDelta;
-  //bgs = new SuBSENSE;
-  //bgs = new LOBSTER;
-  //bgs = new PAWCS;
-  //bgs = new TwoPoints;
-  //bgs = new ViBe;
-  //bgs = new CodeBook;
-
-  int frameNumber = 1;
-  int key = 0;
-  while (key != 'q')
+  auto algorithmsName = BGS_Factory::Instance()->GetRegisteredAlgorithmsName();
+
+  auto key = 0;
+  for (const std::string& algorithmName : algorithmsName)
   {
-    std::stringstream ss;
-    ss << frameNumber;
-    std::string fileName = "dataset/frames/" + ss.str() + ".png";
-    std::cout << "reading " << fileName << std::endl;
+    std::cout << "Running " << algorithmName << std::endl;
+    auto bgs = BGS_Factory::Instance()->Create(algorithmName);
 
-    cv::Mat img_input = cv::imread(fileName, CV_LOAD_IMAGE_COLOR);
+    auto frame_counter = 0;
+    std::cout << "Press 's' to stop:" << std::endl;
+    while (key != 's')
+    {
+      // Capture frame-by-frame
+      frame_counter++;
+      std::stringstream ss;
+      ss << frame_counter;
+      std::string fileName = "dataset/frames/" + ss.str() + ".png";
+      std::cout << "reading " << fileName << std::endl;
 
-    if (img_input.empty())
-      break;
+      cv::Mat img_input = cv::imread(fileName, CV_LOAD_IMAGE_COLOR);
+
+      if (img_input.empty())
+        break;
 
-    cv::imshow("input", img_input);
+      cv::imshow("input", img_input);
 
-    cv::Mat img_mask;
-    cv::Mat img_bkgmodel;
-    bgs->process(img_input, img_mask, img_bkgmodel);
-    // by default, "bgs->process(.)" automatically shows the foreground mask image
-    // or set "bgs->setShowOutput(false)" to disable
+      cv::Mat img_mask;
+      cv::Mat img_bkgmodel;
+      try
+      {
+        bgs->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask image
 
-    //if(!img_mask.empty())
-    //  cv::imshow("Foreground", img_mask);
-    //  do something
+        //if(!img_mask.empty())
+        //  cv::imshow("Foreground", img_mask);
+        //  do something
+      }
+      catch (std::exception& e)
+      {
+        std::cout << "Exception occurred" << std::endl;
+        std::cout << e.what() << std::endl;
+      }
+
+      key = cv::waitKey(33);
+    }
+
+    std::cout << "Press 'q' to exit, or anything else to move to the next algorithm:" << std::endl;
+    key = cv::waitKey(0);
+    if (key == 'q')
+      break;
 
-    key = cvWaitKey(33);
-    frameNumber++;
+    cv::destroyAllWindows();
   }
-  cvWaitKey(0);
-  delete bgs;
-  cvDestroyAllWindows();
 
   return 0;
 }
diff --git a/package_bgs/AdaptiveBackgroundLearning.h b/package_bgs/AdaptiveBackgroundLearning.h
index 3cfc686296ecdda4f582cbf5e1795032273d23fc..d18114ba336c67902b5de8d590fde4df0de1447d 100644
--- a/package_bgs/AdaptiveBackgroundLearning.h
+++ b/package_bgs/AdaptiveBackgroundLearning.h
@@ -43,5 +43,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<AdaptiveBackgroundLearning> register_AdaptiveBackgroundLearning("AdaptiveBackgroundLearning");
   }
 }
diff --git a/package_bgs/AdaptiveSelectiveBackgroundLearning.h b/package_bgs/AdaptiveSelectiveBackgroundLearning.h
index 24da44c7e025c848d5761f84eb9a95c6c96e23f5..5f9c98f16c60c04492a65afb2c880b32ed30a8bc 100644
--- a/package_bgs/AdaptiveSelectiveBackgroundLearning.h
+++ b/package_bgs/AdaptiveSelectiveBackgroundLearning.h
@@ -43,5 +43,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<AdaptiveSelectiveBackgroundLearning> register_AdaptiveSelectiveBackgroundLearning("AdaptiveSelectiveBackgroundLearning");
   }
 }
diff --git a/package_bgs/CodeBook.h b/package_bgs/CodeBook.h
index ec224ab1eda74360f09d19c06046595c8da57117..316600d6f284179468a982cf9fa52de36e948fcd 100644
--- a/package_bgs/CodeBook.h
+++ b/package_bgs/CodeBook.h
@@ -64,5 +64,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<CodeBook> register_CodeBook("CodeBook");
   }
 }
diff --git a/package_bgs/DPAdaptiveMedian.h b/package_bgs/DPAdaptiveMedian.h
index 7d2b7fa88bb173e2dc08413660c74a507bf7e0bd..990f04863382a2fbecbc1b9a61e47377c0ba8340 100644
--- a/package_bgs/DPAdaptiveMedian.h
+++ b/package_bgs/DPAdaptiveMedian.h
@@ -49,5 +49,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPAdaptiveMedian> register_DPAdaptiveMedian("DPAdaptiveMedian");
   }
 }
diff --git a/package_bgs/DPEigenbackground.h b/package_bgs/DPEigenbackground.h
index f84fee765028a7d1c12e55e44dd1239843b5f159..d96255918da2360330788af7ad75e0a4ef87bdce 100644
--- a/package_bgs/DPEigenbackground.h
+++ b/package_bgs/DPEigenbackground.h
@@ -51,5 +51,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPEigenbackground> register_DPEigenbackground("DPEigenbackground");
   }
 }
diff --git a/package_bgs/DPGrimsonGMM.h b/package_bgs/DPGrimsonGMM.h
index dcc05eb1b3b79c46f207898b0668508670eb6d3d..954261ff14f44bcf65489d72bac41317f689d391 100644
--- a/package_bgs/DPGrimsonGMM.h
+++ b/package_bgs/DPGrimsonGMM.h
@@ -51,5 +51,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPGrimsonGMM> register_DPGrimsonGMM("DPGrimsonGMM");
   }
 }
diff --git a/package_bgs/DPMean.h b/package_bgs/DPMean.h
index 60299680675ba0c711055109e2ed59eebde018c5..ad63762e14035552d8db372d83004e25332b6534 100644
--- a/package_bgs/DPMean.h
+++ b/package_bgs/DPMean.h
@@ -51,5 +51,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPMean> register_DPMean("DPMean");
   }
 }
diff --git a/package_bgs/DPPratiMediod.h b/package_bgs/DPPratiMediod.h
index d37a77abd018547f519dcd244b96e970a590bdc1..d71acccad9117d069fb93ec8793cd7d564a52511 100644
--- a/package_bgs/DPPratiMediod.h
+++ b/package_bgs/DPPratiMediod.h
@@ -52,5 +52,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPPratiMediod> register_DPPratiMediod("DPPratiMediod");
   }
 }
diff --git a/package_bgs/DPTexture.h b/package_bgs/DPTexture.h
index 3cfdcea4c0bb499c323f4ef6b0cb0e218eaf3fdf..38321e4628aca716de3f77710b045741da748f95 100644
--- a/package_bgs/DPTexture.h
+++ b/package_bgs/DPTexture.h
@@ -55,5 +55,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPTexture> register_DPTextured("DPTexture");
   }
 }
diff --git a/package_bgs/DPWrenGA.h b/package_bgs/DPWrenGA.h
index e4b0b5fffbb22de9dbc1edcbc8d24929576b69fc..d7086928b4464aa5080e7f4350aa94f982677961 100644
--- a/package_bgs/DPWrenGA.h
+++ b/package_bgs/DPWrenGA.h
@@ -51,5 +51,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPWrenGA> register_DPWrenGA("DPWrenGA");
   }
 }
diff --git a/package_bgs/DPZivkovicAGMM.h b/package_bgs/DPZivkovicAGMM.h
index f35504bff012f395bfa86ad5b304442fcb2fc08b..25f4d4d53f299383e8f2574b2519e67b6050404a 100644
--- a/package_bgs/DPZivkovicAGMM.h
+++ b/package_bgs/DPZivkovicAGMM.h
@@ -51,5 +51,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<DPZivkovicAGMM> register_DPZivkovicAGMM("DPZivkovicAGMM");
   }
 }
diff --git a/package_bgs/FrameDifference.h b/package_bgs/FrameDifference.h
index 07bed8ed5e36fa42a53e81b95ea9624349f820a6..74c22dbfb4db09d40f426aeae0ad041f10e30478 100644
--- a/package_bgs/FrameDifference.h
+++ b/package_bgs/FrameDifference.h
@@ -38,6 +38,8 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<FrameDifference> register_FrameDifference("FrameDifference");
   }
 }
 
diff --git a/package_bgs/FuzzyChoquetIntegral.h b/package_bgs/FuzzyChoquetIntegral.h
index 25681b0c49f4e86efbd35440410b06ba90c25e81..000e031b9df96dd60580a6b7789c0cddf4fc0e6a 100644
--- a/package_bgs/FuzzyChoquetIntegral.h
+++ b/package_bgs/FuzzyChoquetIntegral.h
@@ -49,5 +49,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<FuzzyChoquetIntegral> register_FuzzyChoquetIntegral("FuzzyChoquetIntegral");
   }
 }
diff --git a/package_bgs/FuzzySugenoIntegral.h b/package_bgs/FuzzySugenoIntegral.h
index 70bde1591ea4338b1955edf81e72d4089e1d7342..1cd913f4b4112433be34495cf0f5cfb3356d9595 100644
--- a/package_bgs/FuzzySugenoIntegral.h
+++ b/package_bgs/FuzzySugenoIntegral.h
@@ -49,5 +49,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<FuzzySugenoIntegral> register_FuzzySugenoIntegral("FuzzySugenoIntegral");
   }
 }
diff --git a/package_bgs/GMG.h b/package_bgs/GMG.h
index 0ff89c75a40cba67dfe3b0738b061dcf4f2adf92..40473a59223c02bb5fe15c43e2a8a3fa18d58583 100644
--- a/package_bgs/GMG.h
+++ b/package_bgs/GMG.h
@@ -43,6 +43,8 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<GMG> register_GMG("GMG");
   }
 }
 
diff --git a/package_bgs/IBGS.h b/package_bgs/IBGS.h
index 37a079bca371ddf492df133d793e16ddf9608661..eb9858d5d83b425efaa72ab3523e6b5ecd0740ba 100644
--- a/package_bgs/IBGS.h
+++ b/package_bgs/IBGS.h
@@ -19,6 +19,11 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 #include <iostream>
 #include <fstream>
 #include <list>
+#include <memory>
+#include <string>
+#include <functional>
+#include <map>
+
 #include <opencv2/opencv.hpp>
 #include <opencv2/imgproc/types_c.h>
 #include <opencv2/imgproc/imgproc_c.h>
@@ -79,7 +84,62 @@ namespace bgslibrary
       virtual void saveConfig() = 0;
       virtual void loadConfig() = 0;
     };
+
+    class BGS_Factory
+    {
+    public:
+      static BGS_Factory* BGS_Factory::Instance()
+      {
+        static BGS_Factory factory;
+        return &factory;
+      }
+
+      std::shared_ptr<IBGS> BGS_Factory::Create(std::string name)
+      {
+        IBGS* instance = nullptr;
+
+        // find name in the registry and call factory method.
+        auto it = factoryFunctionRegistry.find(name);
+        if (it != factoryFunctionRegistry.end())
+          instance = it->second();
+
+        // wrap instance in a shared ptr and return
+        if (instance != nullptr)
+          return std::shared_ptr<IBGS>(instance);
+        else
+          return nullptr;
+      }
+
+      std::vector<std::string> BGS_Factory::GetRegisteredAlgorithmsName()
+      {
+        std::vector<std::string> algorithmsName;
+        for (auto it = factoryFunctionRegistry.begin(); it != factoryFunctionRegistry.end(); ++it) {
+          algorithmsName.push_back(it->first);
+        }
+        return algorithmsName;
+      }
+
+      void BGS_Factory::RegisterFactoryFunction(std::string name,
+        std::function<IBGS*(void)> classFactoryFunction)
+      {
+        // register the class factory function
+        factoryFunctionRegistry[name] = classFactoryFunction;
+      }
+      
+    private:
+      std::map<std::string, std::function<IBGS*(void)>> factoryFunctionRegistry;
+    };
+
+    template<class T>
+    class BGS_Register
+    {
+    public:
+      BGS_Register(std::string className)
+      {
+        // register the class factory function
+        BGS_Factory::Instance()->RegisterFactoryFunction(className,
+          [](void) -> IBGS* { return new T(); });
+      }
+    };
   }
 }
-
-namespace ibgs = bgslibrary::algorithms;
diff --git a/package_bgs/IndependentMultimodal.h b/package_bgs/IndependentMultimodal.h
index 4e2e3a38e4e71bf65e729e91f3c27717e07e48eb..04eb774471ead5fbcdbc630892ef60c656b43364 100644
--- a/package_bgs/IndependentMultimodal.h
+++ b/package_bgs/IndependentMultimodal.h
@@ -39,5 +39,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<IndependentMultimodal> register_IndependentMultimodal("IndependentMultimodal");
   }
 }
diff --git a/package_bgs/KDE.h b/package_bgs/KDE.h
index e77996fd485456e1fce78df60697bf6254cacd3b..1589b697aa001c764d21bdcefb52e0a8d7043036 100644
--- a/package_bgs/KDE.h
+++ b/package_bgs/KDE.h
@@ -53,5 +53,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<KDE> register_KDE("KDE");
   }
 }
diff --git a/package_bgs/KNN.h b/package_bgs/KNN.h
index 9e79d934224591afd85278dd7806fbd2f35d361c..c732901113e2e55b51f3c7793d1fe34a2c0fc223 100644
--- a/package_bgs/KNN.h
+++ b/package_bgs/KNN.h
@@ -51,6 +51,8 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<KNN> register_KNN("KNN");
   }
 }
 
diff --git a/package_bgs/LBAdaptiveSOM.h b/package_bgs/LBAdaptiveSOM.h
index 7671ae1df9ff0540e2c74e3da8d53c5d58cceccd..25e782bca84659ea55ca8ffbe00fce460017bdf8 100644
--- a/package_bgs/LBAdaptiveSOM.h
+++ b/package_bgs/LBAdaptiveSOM.h
@@ -46,5 +46,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBAdaptiveSOM> register_LBAdaptiveSOM("LBAdaptiveSOM");
   }
 }
diff --git a/package_bgs/LBFuzzyAdaptiveSOM.h b/package_bgs/LBFuzzyAdaptiveSOM.h
index 6a4a85c0007951b3a82b6f11941e669d16430332..4a59e4cffdc0d4d42dd917839a09cc4c72964234 100644
--- a/package_bgs/LBFuzzyAdaptiveSOM.h
+++ b/package_bgs/LBFuzzyAdaptiveSOM.h
@@ -46,5 +46,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBFuzzyAdaptiveSOM> register_LBFuzzyAdaptiveSOM("LBFuzzyAdaptiveSOM");
   }
 }
diff --git a/package_bgs/LBFuzzyGaussian.h b/package_bgs/LBFuzzyGaussian.h
index 53c26679d55f1d7720b1eabbce8486f609e7c15d..3954fdb393c52f6f887efc2401ce22ca48433f21 100644
--- a/package_bgs/LBFuzzyGaussian.h
+++ b/package_bgs/LBFuzzyGaussian.h
@@ -45,5 +45,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBFuzzyGaussian> register_LBFuzzyGaussian("LBFuzzyGaussian");
   }
 }
diff --git a/package_bgs/LBMixtureOfGaussians.h b/package_bgs/LBMixtureOfGaussians.h
index 8d4cb5619d42f85a74491cea340615f869b72d9a..6de35d8b26824cb29e34c24288e025ac188c8fea 100644
--- a/package_bgs/LBMixtureOfGaussians.h
+++ b/package_bgs/LBMixtureOfGaussians.h
@@ -45,6 +45,8 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBMixtureOfGaussians> register_LBMixtureOfGaussians("LBMixtureOfGaussians");
   }
 }
 
diff --git a/package_bgs/LBP_MRF.h b/package_bgs/LBP_MRF.h
index a6e5c05b984d6ee3c8beb6cc97f94804a8de506d..0479ddd7f32d15b7116dee55cfc44bade3301fb8 100644
--- a/package_bgs/LBP_MRF.h
+++ b/package_bgs/LBP_MRF.h
@@ -39,5 +39,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBP_MRF> register_LBP_MRF("LBP_MRF");
   }
 }
diff --git a/package_bgs/LBSimpleGaussian.h b/package_bgs/LBSimpleGaussian.h
index 5c829234f86933736682ca4d41e9fa4f12bf550c..4a9b2af27acafd989871447106656de7f0cdfba5 100644
--- a/package_bgs/LBSimpleGaussian.h
+++ b/package_bgs/LBSimpleGaussian.h
@@ -44,5 +44,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LBSimpleGaussian> register_LBSimpleGaussian("LBSimpleGaussian");
   }
 }
diff --git a/package_bgs/LOBSTER.h b/package_bgs/LOBSTER.h
index 4b96ec97ba59df72ada70abb2879ff6a3b8336fb..8f0de189365a01f360e9a1a0d9688e76f9abc5e8 100644
--- a/package_bgs/LOBSTER.h
+++ b/package_bgs/LOBSTER.h
@@ -44,5 +44,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<LOBSTER> register_LOBSTER("LOBSTER");
   }
 }
diff --git a/package_bgs/MixtureOfGaussianV1.h b/package_bgs/MixtureOfGaussianV1.h
index e18dbdbeae973b8d8e6c4b73504a5bea94050c5e..edf8b6db6f01c0aec6be591de67806e76375ed1e 100644
--- a/package_bgs/MixtureOfGaussianV1.h
+++ b/package_bgs/MixtureOfGaussianV1.h
@@ -47,6 +47,8 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<MixtureOfGaussianV1> register_MixtureOfGaussianV1("MixtureOfGaussianV1");
   }
 }
 
diff --git a/package_bgs/MixtureOfGaussianV2.h b/package_bgs/MixtureOfGaussianV2.h
index ff4816dd0617fd5c0d095bda08a36df25443f769..c359f2017193e5e98335085dc3a1ae278ba016a2 100644
--- a/package_bgs/MixtureOfGaussianV2.h
+++ b/package_bgs/MixtureOfGaussianV2.h
@@ -48,5 +48,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<MixtureOfGaussianV2> register_MixtureOfGaussianV2("MixtureOfGaussianV2");
   }
 }
diff --git a/package_bgs/MultiCue.h b/package_bgs/MultiCue.h
index 44524e0ab11c7b192cb4a26e0f5875f58749fa9a..47403a5b9bddf36c577ad09ea65b33425027c6cf 100644
--- a/package_bgs/MultiCue.h
+++ b/package_bgs/MultiCue.h
@@ -250,5 +250,7 @@ namespace bgslibrary
       short** g_aCReferredIndex;					//To handle cache-book
       short** g_aCContinuousCnt;					//To handle cache-book
     };
+
+    static BGS_Register<MultiCue> register_MultiCue("MultiCue");
   }
 }
diff --git a/package_bgs/MultiLayer.h b/package_bgs/MultiLayer.h
index 78388816e39eb2f9ffd425ab619c419bf7e9f6a6..86da5926eb3e6980502661d20ad564b897540a76 100644
--- a/package_bgs/MultiLayer.h
+++ b/package_bgs/MultiLayer.h
@@ -95,5 +95,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<MultiLayer> register_MultiLayer("MultiLayer");
   }
 }
diff --git a/package_bgs/PAWCS.h b/package_bgs/PAWCS.h
index 173bcf6917a2c6c253ca933538609be416feee63..bf378918820c98de2fcaf9a5b401face7da1d8f7 100644
--- a/package_bgs/PAWCS.h
+++ b/package_bgs/PAWCS.h
@@ -44,5 +44,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<PAWCS> register_PAWCS("PAWCS");
   }
 }
diff --git a/package_bgs/PixelBasedAdaptiveSegmenter.h b/package_bgs/PixelBasedAdaptiveSegmenter.h
index 36dd0ad03a206ff7858dafe0279e3ed280a0f6d4..acafc90767e12db7407016fe8f41103afb6b06d5 100644
--- a/package_bgs/PixelBasedAdaptiveSegmenter.h
+++ b/package_bgs/PixelBasedAdaptiveSegmenter.h
@@ -54,5 +54,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<PixelBasedAdaptiveSegmenter> register_PixelBasedAdaptiveSegmenter("PixelBasedAdaptiveSegmenter");
   }
 }
diff --git a/package_bgs/SigmaDelta.h b/package_bgs/SigmaDelta.h
index c7b1a2c660323a11672fb399a092b81139392d2a..5dd8a576e85f8426d554a6450f6d472b9875a057 100644
--- a/package_bgs/SigmaDelta.h
+++ b/package_bgs/SigmaDelta.h
@@ -45,5 +45,7 @@ namespace bgslibrary
       void loadConfig();
       void applyParams();
     };
+
+    static BGS_Register<SigmaDelta> register_SigmaDelta("SigmaDelta");
   }
 }
diff --git a/package_bgs/StaticFrameDifference.h b/package_bgs/StaticFrameDifference.h
index 8c8474c6ed065178f1275e23baa826caaab5fb36..9fcb093819231b9bfd72a208cbff9c5ffcb901a3 100644
--- a/package_bgs/StaticFrameDifference.h
+++ b/package_bgs/StaticFrameDifference.h
@@ -38,5 +38,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<StaticFrameDifference> register_StaticFrameDifference("StaticFrameDifference");
   }
 }
diff --git a/package_bgs/SuBSENSE.h b/package_bgs/SuBSENSE.h
index 9ac9aa6f2fcbe04592b1abf5682245885238d07a..ff172095fab01b2f7bbc72c097042992b3cc4187 100644
--- a/package_bgs/SuBSENSE.h
+++ b/package_bgs/SuBSENSE.h
@@ -45,5 +45,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<SuBSENSE> register_SuBSENSE("SuBSENSE");
   }
 }
diff --git a/package_bgs/T2FGMM_UM.h b/package_bgs/T2FGMM_UM.h
index c58aeb756e40f43ba838901d5ff691df25338666..e8b4166ff59ee2d6e204378f9dd0b2cb48adae55 100644
--- a/package_bgs/T2FGMM_UM.h
+++ b/package_bgs/T2FGMM_UM.h
@@ -53,5 +53,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<T2FGMM_UM> register_T2FGMM_UM("T2FGMM_UM");
   }
 }
diff --git a/package_bgs/T2FGMM_UV.h b/package_bgs/T2FGMM_UV.h
index 6102f3a21c99939d0b71316768378b01e7e983f9..a8dab79db96d08b0a682a2c50742cbeb0b003695 100644
--- a/package_bgs/T2FGMM_UV.h
+++ b/package_bgs/T2FGMM_UV.h
@@ -53,5 +53,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<T2FGMM_UV> register_T2FGMM_UV("T2FGMM_UV");
   }
 }
diff --git a/package_bgs/T2FMRF_UM.h b/package_bgs/T2FMRF_UM.h
index 01f6014c44dfb33526f0c9e97646d52ccad8cb48..8d324f4edb77088407412288ecad52dca3b96f16 100644
--- a/package_bgs/T2FMRF_UM.h
+++ b/package_bgs/T2FMRF_UM.h
@@ -60,5 +60,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<T2FMRF_UM> register_T2FMRF_UM("T2FMRF_UM");
   }
 }
diff --git a/package_bgs/T2FMRF_UV.h b/package_bgs/T2FMRF_UV.h
index 1c6917185365563acdc11d0aec41556ddd0ab429..8fd461144a12282f964d51fcf4ca50ea2699d9ed 100644
--- a/package_bgs/T2FMRF_UV.h
+++ b/package_bgs/T2FMRF_UV.h
@@ -60,5 +60,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<T2FMRF_UV> register_T2FMRF_UV("T2FMRF_UV");
   }
 }
diff --git a/package_bgs/TwoPoints.h b/package_bgs/TwoPoints.h
index b42c2311a09c07d7ef3c4146f7c2cccc65769742..67176bc59894dca365c33d26ca97e2dd6b50c8d4 100644
--- a/package_bgs/TwoPoints.h
+++ b/package_bgs/TwoPoints.h
@@ -42,5 +42,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<TwoPoints> register_TwoPoints("TwoPoints");
   }
 }
diff --git a/package_bgs/ViBe.h b/package_bgs/ViBe.h
index c8014cbc15b99175947ed1115f3bd8b4144249d4..dbe0e8ff5dffe318d9cb55ac71bf7f94c4c305c3 100644
--- a/package_bgs/ViBe.h
+++ b/package_bgs/ViBe.h
@@ -48,5 +48,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<ViBe> register_ViBe("ViBe");
   }
 }
diff --git a/package_bgs/VuMeter.h b/package_bgs/VuMeter.h
index fefd3ec724e3d57455abc2657540c498468bc468..3912e320c80f624c792d2b270219bf10994fbfa0 100644
--- a/package_bgs/VuMeter.h
+++ b/package_bgs/VuMeter.h
@@ -48,5 +48,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<VuMeter> register_VuMeter("VuMeter");
   }
 }
diff --git a/package_bgs/WeightedMovingMean.h b/package_bgs/WeightedMovingMean.h
index 4a1a3c5fddb5c68c5c4eb8025f2427b143ff6b3a..7f3eefdb44c54e8081e9b7170237bbb51774cdc4 100644
--- a/package_bgs/WeightedMovingMean.h
+++ b/package_bgs/WeightedMovingMean.h
@@ -41,5 +41,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<WeightedMovingMean> register_WeightedMovingMean("WeightedMovingMean");
   }
 }
diff --git a/package_bgs/WeightedMovingVariance.h b/package_bgs/WeightedMovingVariance.h
index 79198b4a9e2fadd0c21f701e0b45e67a9b3dc488..791fd7735d816c111d24feafd6ea24ecf272f14d 100644
--- a/package_bgs/WeightedMovingVariance.h
+++ b/package_bgs/WeightedMovingVariance.h
@@ -42,5 +42,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<WeightedMovingVariance> register_WeightedMovingVariance("WeightedMovingVariance");
   }
 }
diff --git a/package_bgs/_template_/Amber.h b/package_bgs/_template_/Amber.h
index 37f0f8deca5fc5c0d32ce8614bd0820be1f3dfd2..b66fa90972d21936c99b214f4dec04119e1f924a 100644
--- a/package_bgs/_template_/Amber.h
+++ b/package_bgs/_template_/Amber.h
@@ -41,5 +41,7 @@ namespace bgslibrary
       void saveConfig();
       void loadConfig();
     };
+
+    static BGS_Register<Amber> register_Amber("Amber");
   }
 }
diff --git a/package_bgs/_template_/MyBGS.h b/package_bgs/_template_/MyBGS.h
index dea2a2fa3bbc2163a9afc822351f8c2f9bcbfb3e..e3ff7c5c7b011dbb43d7a5cb48143a7cce0cc442 100644
--- a/package_bgs/_template_/MyBGS.h
+++ b/package_bgs/_template_/MyBGS.h
@@ -39,5 +39,7 @@ namespace bgslibrary
       void saveConfig() {}
       void loadConfig() {}
     };
+
+    static BGS_Register<MyBGS> register_MyBGS("MyBGS");
   }
 }
diff --git a/package_bgs/bgslibrary.cpp b/package_bgs/bgslibrary.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0334f6c40b45faa333a281200c383c2b452bd508
--- /dev/null
+++ b/package_bgs/bgslibrary.cpp
@@ -0,0 +1,18 @@
+/*
+This file is part of BGSLibrary.
+
+BGSLibrary is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+BGSLibrary is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "bgslibrary.h"
diff --git a/package_bgs/bgslibrary.h b/package_bgs/bgslibrary.h
index e95a06d25688d79b257ebb971034f1e82d406e07..be452367aaea003902290a321a8db7ce3f1c513c 100644
--- a/package_bgs/bgslibrary.h
+++ b/package_bgs/bgslibrary.h
@@ -16,6 +16,8 @@ along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
 #pragma once
 
+#include "IBGS.h"
+
 #include "FrameDifference.h"
 #include "StaticFrameDifference.h"
 #include "WeightedMovingMean.h"