diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f0dcb97c07c4e58cbb0cb1e2e488c2b0488936b0..f228608b48e6f91dc38fba6632eb1a8a54684490 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -217,7 +217,6 @@ SET(SRCS
     node_base.cpp
     problem.cpp
     processor_base.cpp
-    processor_factory.cpp
     processor_imu.cpp
     processor_odom_2D.cpp
     processor_odom_3D.cpp
diff --git a/src/processor_factory.cpp b/src/processor_factory.cpp
deleted file mode 100644
index 956051d496ecd81c0b7523778d0da31901780646..0000000000000000000000000000000000000000
--- a/src/processor_factory.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * \file processor_factory.cpp
- *
- *  Created on: May 4, 2016
- *      \author: jsola
- */
-
-#include "processor_factory.h"
-
-#include <iostream>
-#include <iomanip>
-
-namespace wolf
-{
-
-bool ProcessorFactory::registerCreator(const std::string& _processor_type, CreateProcessorCallback createFn)
-{
-    bool reg = callbacks_.insert(CallbackMap::value_type(_processor_type, createFn)).second;
-    if (reg)
-        std::cout << std::setw(22) << std::left << "ProcessorFactory" << " : registered " << _processor_type << std::endl;
-    else
-        std::cout << "ProcessorFactory  : processor " << _processor_type << " already registered. Skipping. " << std::endl;
-
-    return reg;
-}
-
-bool ProcessorFactory::unregisterCreator(const std::string& _processor_type)
-{
-    return callbacks_.erase(_processor_type) == 1;
-}
-
-ProcessorBase* ProcessorFactory::create(const std::string& _processor_type, const std::string& _name, const ProcessorParamsBase* _params)
-{
-    CallbackMap::const_iterator creator_callback_it = callbacks_.find(_processor_type);
-    if (creator_callback_it == callbacks_.end())
-    {
-        // not found
-        throw std::runtime_error("Unknown Processor type");
-    }
-    // Invoke the creation function
-    return (creator_callback_it->second)(_name, _params);
-}
-
-ProcessorFactory& ProcessorFactory::get() // Unique point of access;
-{
-    static ProcessorFactory instance_; // Guaranteed to be destroyed.
-                                        // Instantiated on first use.
-    return instance_;
-}
-
-} /* namespace wolf */
diff --git a/src/processor_factory.h b/src/processor_factory.h
index 620fe1854d822a12abb2314dec895ff9312f2a5b..1684e39d6b49006b41f4ebaaadcfc13998620bd3 100644
--- a/src/processor_factory.h
+++ b/src/processor_factory.h
@@ -16,6 +16,7 @@ struct ProcessorParamsBase;
 
 // wolf
 #include "wolf.h"
+#include "factory.h"
 
 // std
 #include <string>
@@ -166,32 +167,18 @@ namespace wolf
  *
  * You can also check the code in the example file ````src/examples/test_wolf_factories.cpp````.
  */
-class ProcessorFactory
-{
-    public:
-        typedef ProcessorBase* (*CreateProcessorCallback)(const std::string& _unique_name, const ProcessorParamsBase* _params);
-    private:
-        typedef std::map<std::string, CreateProcessorCallback> CallbackMap;
-    public:
-        bool registerCreator(const std::string& _processor_type, CreateProcessorCallback createFn);
-        bool unregisterCreator(const std::string& _processor_type);
-        ProcessorBase* create(const std::string& _processor_type, const std::string& _unique_name, const ProcessorParamsBase* _params = nullptr);
-    private:
-        CallbackMap callbacks_;
 
-        // Singleton ---------------------------------------------------
-        // This class is a singleton. The code below guarantees this.
-        // See: http://stackoverflow.com/questions/1008019/c-singleton-design-pattern
-    public:
-        static ProcessorFactory& get(); // Unique point of access
+typedef Factory<ProcessorBase, const std::string&, const ProcessorParamsBase*> ProcessorFactory;
+
+template<>
+inline std::string ProcessorFactory::getClass()
+{
+  return "ProcessorFactory";
+}
 
-    public: // see http://stackoverflow.com/questions/1008019/c-singleton-design-pattern
-        ProcessorFactory(const ProcessorFactory&) = delete;
-        void operator=(ProcessorFactory const&) = delete;
-    private:
-        ProcessorFactory() { }
-        ~ProcessorFactory() { }
-};
+#define WOLF_REGISTER_PROCESSOR(ProcessorType, ProcessorName) \
+  namespace wolf{ namespace{ const bool ProcessorName##Registered = \
+    ProcessorFactory::get().registerCreator(ProcessorType, ProcessorName::create); }};\
 
 } /* namespace wolf */
 
diff --git a/src/processor_imu.cpp b/src/processor_imu.cpp
index 5e3bd8ade0f3cc01e76b6dd4d4d2bfb2d05755c5..1b5c88586d30ffe83ffa27d91f19494dc4f71fa7 100644
--- a/src/processor_imu.cpp
+++ b/src/processor_imu.cpp
@@ -41,9 +41,5 @@ ProcessorBase* ProcessorIMU::create(const std::string& _unique_name, const Proce
 
 // Register in the SensorFactory
 #include "processor_factory.h"
-namespace wolf {
-namespace
-{
-const bool registered_prc_imu = ProcessorFactory::get().registerCreator("IMU", ProcessorIMU::create);
-}
-} // namespace wolf
+
+WOLF_REGISTER_PROCESSOR("IMU", ProcessorIMU)