diff --git a/DDCond/src/plugins/ConditionsPlugins.cpp b/DDCond/src/plugins/ConditionsPlugins.cpp
index 4ebd8e704f66476f7e98538060214e2dd73e6bd9..11741e63e2d5d7aed700a88ac4d7a0ee22ad0160 100644
--- a/DDCond/src/plugins/ConditionsPlugins.cpp
+++ b/DDCond/src/plugins/ConditionsPlugins.cpp
@@ -13,6 +13,7 @@
 
 // Framework include files
 #include "DD4hep/LCDD.h"
+#include "DD4hep/Plugins.h"
 #include "DD4hep/Printout.h"
 #include "DD4hep/Conditions.h"
 #include "DD4hep/DetFactoryHelper.h"
@@ -70,16 +71,30 @@ DECLARE_APPLY(DD4hep_ConditionsManagerInstaller,ddcond_install_cond_mgr)
  *  \date    01/04/2016
  */
 static int ddcond_conditions_pool_processor(lcdd_t& lcdd, bool process_pool, bool process_conditions, int argc, char** argv)   {
+  Condition::Processor* processor = 0;
+  if ( argc < 2 )   {
+    except("CondPoolProcessor","++ No processor creator name given!");
+  }
+  for(int i=0; i<argc; ++i)  {
+    if ( 0 == ::strncmp(argv[i],"-processor",3) )  {
+      vector<char*> args;
+      for(int j=2; j<argc && argv[j]; ++j) args.push_back(argv[j]);
+      args.push_back(0);
+      string fac = argv[++i];
+      processor = (Condition::Processor*)PluginService::Create<void*>(fac,&lcdd,int(args.size()),&args[0]);
+      break;
+    }
+  }
+  if ( !processor )  {
+    except("CondPoolProcessor","++ Found arguments in plugin call, "
+           "but could not make any sense of them....");
+  }
+
   typedef std::vector<const IOVType*> _T;
   typedef ConditionsIOVPool::Elements _E;
   typedef RangeConditions _R;
+  dd4hep_ptr<Condition::Processor> proc(processor);
   ConditionsManager manager = ConditionsManager::from(lcdd);
-    
-  if ( argc < 1 )   {
-    except("CondPoolProcessor","++ No processor functor given!");
-  }
-
-  Condition::Processor* processor = (Condition::Processor*)argv[0];
   const _T types = manager.iovTypesUsed();
   for( _T::const_iterator i = types.begin(); i != types.end(); ++i )    {
     const IOVType* type = *i;
@@ -100,7 +115,7 @@ static int ddcond_conditions_pool_processor(lcdd_t& lcdd, bool process_pool, boo
             _R rc;
             cp->select_all(rc);
             for(_R::const_iterator ic=rc.begin(); ic!=rc.end(); ++ic)  {
-              if ( processor )  {  (*processor)(*ic); }
+              if ( proc.get() )  {  (*proc)(*ic); }
             }
           }
         }
@@ -125,16 +140,20 @@ DECLARE_APPLY(DD4hep_ConditionsPoolProcessor,ddcond_conditions_pool_process)
  *  \date    01/04/2016
  */
 static int ddcond_conditions_pool_print(lcdd_t& lcdd, bool print_conditions, int argc, char** argv)   {
-  ConditionsPrinter default_printer("");
-  Condition::Processor* printer = &default_printer;
   if ( argc > 0 )   {
-    //for(int i=0; i<argc; ++i)  {
-      //printout(INFO,"","arg[%d]=%s",i,argv[i]);
-    //}
-    printer = (Condition::Processor*)argv[0];
+    for(int i=0; i<argc; ++i)  {
+      if ( 0 == ::strncmp(argv[i],"-processor",3) )  {
+        vector<char*> args;
+        for(int j=i; j<argc && argv[j]; ++j) args.push_back(argv[j]);
+        args.push_back(0);
+        return ddcond_conditions_pool_processor(lcdd,true,print_conditions,int(args.size()-1),&args[0]);
+      }
+    }
+    printout(WARNING,"DDCondProcessor","++ Found arguments in plugin call, "
+             "but could not make any sense of them....");
   }
-  const void* args[] = {printer,0};
-  return ddcond_conditions_pool_processor(lcdd,true,print_conditions,1,(char**)args);
+  const void* args[] = { "-processor", "DD4hepConditionsPrinter", 0};
+  return ddcond_conditions_pool_processor(lcdd,true,print_conditions,2,(char**)args);
 }
 
 static int ddcond_dump_pools(LCDD& lcdd, int argc, char** argv)   {
diff --git a/DDCore/include/DD4hep/ConditionsPrinter.h b/DDCore/include/DD4hep/ConditionsPrinter.h
index ad49991b4463255dfccd2935588b11ff5fe0c7ec..fe12c7a6fb1cf7ddf83577d94604296633a43c11 100644
--- a/DDCore/include/DD4hep/ConditionsPrinter.h
+++ b/DDCore/include/DD4hep/ConditionsPrinter.h
@@ -61,7 +61,6 @@ namespace DD4hep {
       virtual int operator()(DetElement de, UserPool* user_pool, bool recurse);
     };
 
-  } /* End namespace Conditions    */
-} /* End namespace DD4hep    */
-
+  }    /* End namespace Conditions  */
+}      /* End namespace DD4hep      */
 #endif /* DD4HEP_DDCOND_CONDITIONSPRINTER_H  */
diff --git a/DDCore/src/plugins/StandardPlugins.cpp b/DDCore/src/plugins/StandardPlugins.cpp
index 8b3c74e7c93d785f2dea2d94a77caa35138e56f4..e3b8119164822d850956f448d73f9e5ac1634f51 100644
--- a/DDCore/src/plugins/StandardPlugins.cpp
+++ b/DDCore/src/plugins/StandardPlugins.cpp
@@ -530,3 +530,27 @@ DECLARE_APPLY(DD4hepDetectorTypes,detectortype_cache)
 #include "DD4hep/SurfaceInstaller.h"
 typedef SurfaceInstaller TestSurfacesPlugin;
 DECLARE_SURFACE_INSTALLER(TestSurfaces,TestSurfacesPlugin)
+
+#include "DD4hep/ConditionsPrinter.h"
+/// Basic entry point to instantiate the basic DD4hep conditions printer
+/**
+ *  Factory: DD4hepConditionsPrinter
+ *
+ *  \author  M.Frank
+ *  \version 1.0
+ *  \date    17/11/2016
+ */
+static void* create_conditions_printer(Geometry::LCDD& /* lcdd */, int argc,char** argv)  {
+  string prefix = "";
+  int flags = 0;
+  for(int i=0; i<argc && argv[i]; ++i)  {
+    if ( 0 == ::strncmp("-prefix",argv[i],4) )
+      prefix = argv[++i];
+    else if ( 0 == ::strncmp("-flags",argv[i],2) )
+      flags = ::atol(argv[++i]);
+  }
+  if ( flags )
+    return new Conditions::ConditionsPrinter(prefix,flags);
+  return new Conditions::ConditionsPrinter(prefix);
+}
+DECLARE_LCDD_CONSTRUCTOR(DD4hepConditionsPrinter,create_conditions_printer)
diff --git a/DDDB/src/DDDBConditionPrinter.cpp b/DDDB/src/DDDBConditionPrinter.cpp
index 9b3da26c7ded82ec7bdc5a8e660753061caaeac0..573ee61f04e286669f1d1217b4ab3f8baeaca9c8 100644
--- a/DDDB/src/DDDBConditionPrinter.cpp
+++ b/DDDB/src/DDDBConditionPrinter.cpp
@@ -20,6 +20,7 @@
 
 // Framework includes
 #include "DD4hep/Printout.h"
+#include "DD4hep/Factories.h"
 #include "DDDB/DDDBConversion.h"
 #include "DDDB/DDDBConditionPrinter.h"
 
@@ -104,3 +105,19 @@ int ConditionPrinter::operator()(Condition cond)    {
   }
   return 1;
 }
+
+/// Plugin function
+static void* create_dddb_conditions_printer(Geometry::LCDD& /* lcdd */, int argc,char** argv)  {
+  string prefix = "";
+  int flags = 0;
+  for(int i=0; i<argc && argv[i]; ++i)  {
+    if ( 0 == ::strncmp("-prefix",argv[i],4) )
+      prefix = argv[++i];
+    else if ( 0 == ::strncmp("-flags",argv[i],2) )
+      flags = ::atol(argv[++i]);
+  }
+  if ( flags )
+    return new DDDB::ConditionPrinter(prefix,flags);
+  return new DDDB::ConditionPrinter(prefix);
+}
+DECLARE_LCDD_CONSTRUCTOR(DDDB_ConditionsPrinter,create_dddb_conditions_printer)
diff --git a/DDDB/src/DDDBPlugins.cpp b/DDDB/src/DDDBPlugins.cpp
index 02cc0f8c6438f80afe38043b8fd711d851979c54..861a475aab903158398b1087a42c63eac2d51cc9 100644
--- a/DDDB/src/DDDBPlugins.cpp
+++ b/DDDB/src/DDDBPlugins.cpp
@@ -35,17 +35,12 @@ using namespace std;
 using namespace DD4hep;
 using DD4hep::Geometry::LCDD;
 
-/// Anonymous namespace for plugins
-namespace  {
-
-  /// Plugin function
-  long dddb_dump_conditions(LCDD& lcdd, int , char** ) {
-    DDDB::ConditionPrinter prt;
-    const void* args[] = { &prt, 0};
-    lcdd.apply("DD4hep_ConditionsDump", 1, (char**)args);
-    return 1;
-  }
-} /* End anonymous namespace  */
+/// Plugin function
+static long dddb_dump_conditions(LCDD& lcdd, int , char** ) {
+  const void* args[] = { "-processor", "DDDB_ConditionsPrinter", "-prefix", "DDDB", 0};
+  lcdd.apply("DD4hep_ConditionsDump", 4, (char**)args);
+  return 1;
+}
 
 DECLARE_APPLY(DDDB_ConditionsDump,dddb_dump_conditions)
 //==========================================================================