diff --git a/libIRDB/src/util/IRDB_Objects.cpp b/libIRDB/src/util/IRDB_Objects.cpp
index 9ac100435cb4d8373454d7ab37232b47ec5ada65..55b0087ec57025bfa4ad95fbd843377e0c78e615 100644
--- a/libIRDB/src/util/IRDB_Objects.cpp
+++ b/libIRDB/src/util/IRDB_Objects.cpp
@@ -107,6 +107,11 @@ bool IRDBObjects_t::FilesAlreadyPresent(set<File_t*> the_files)
 
 int IRDBObjects_t::AddVariant(db_id_t variant_id)
 {
+	if(GetVariant(variant_id) != NULL)
+        {
+            return 1;
+        }
+
         shared_ptr<VariantID_t> the_variant = make_shared<VariantID_t>(variant_id);      
         
         assert(the_variant->IsRegistered()==true);
diff --git a/libIRDB/test/SConscript b/libIRDB/test/SConscript
index c94a07a0ab9fb0c3de4af52ea649f7b54f084908..39df700cd793ffb37f33cfa88429c50bfae29932 100644
--- a/libIRDB/test/SConscript
+++ b/libIRDB/test/SConscript
@@ -17,10 +17,11 @@ if 'build_tools' not in myenv or myenv['build_tools'] is None or int(myenv['buil
 		 $SECURITY_TRANSFORMS_HOME/libEXEIO/include 
 		 $SECURITY_TRANSFORMS_HOME/libehp/include 
 		 $SECURITY_TRANSFORMS_HOME/third_party/elfio-code
+		 $SECURITY_TRANSFORMS_HOME/libtransform/include
 		'''
 
 	LIBPATH="$SECURITY_TRANSFORMS_HOME/lib"
-	LIBS=Split( 'IRDB-cfg IRDB-util ' + env.subst('$BASE_IRDB_LIBS')+ " MEDSannotation ehp")
+	LIBS=Split( 'IRDB-cfg IRDB-util ' + env.subst('$BASE_IRDB_LIBS')+ " MEDSannotation ehp transform")
 
 	myenv=myenv.Clone(CPPPATH=Split(cpppath))
 
@@ -34,8 +35,8 @@ if 'build_tools' not in myenv or myenv['build_tools'] is None or int(myenv['buil
 	Default(install)
 	installed=installed+install
 
-	pgm=myenv.Program("fill_in_cfg.exe",  split_eh_frame+Split("fill_in_cfg_driver.cpp fill_in_cfg.cpp"), LIBPATH=LIBPATH, LIBS=LIBS)
-	install=myenv.Install("$SECURITY_TRANSFORMS_HOME/bin/", pgm)
+	pgm=myenv.SharedLibrary("fill_in_cfg.so",  Split("fill_in_cfg.cpp split_eh_frame.cpp"), LIBPATH=LIBPATH, LIBS=LIBS)
+	install=myenv.Install("$SECURITY_TRANSFORMS_HOME/plugins_install/transform_step_plugins", pgm)
 	Default(install)
 	installed=installed+install
 
diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp
index 676f866442038a6538c28d18453079100525c2f3..f609a7bfc36ac171e9ff7c51c42ee60a748bfb6b 100644
--- a/libIRDB/test/fill_in_cfg.cpp
+++ b/libIRDB/test/fill_in_cfg.cpp
@@ -580,43 +580,47 @@ void PopulateCFG::fill_in_landing_pads(FileIR_t *firp)
 	
 }
 
-PopulateCFG PopulateCFG::Factory
+int PopulateCFG::ParseArgs
         (
         int argc, 
-        char* argv[], 
-        pqxxDB_t* the_pqxx_interface,
-        list<FileIR_t *> the_firp_list
+        char* argv[]
         )
-{
-    bool p_fix_landing_pads = true; // default
-    
+{   
     if(argc<2)
     {
             cerr<<"Usage: fill_in_cfg <id> [--fix-landing-pads | --no-fix-landing-pads]"<<endl;
-            exit(-1);
+            return -1;
     }
+
+    variant_id = atoi(argv[1]);
     
-    for (int i = 0; i < argc; ++i)
+    for (int i = 2; i < argc; ++i)
     {
             if (strcmp("--fix-landing-pads", argv[i]) == 0)
             {
-                    p_fix_landing_pads = true;
+                    fix_landing_pads = true;
             }
             else if (strcmp("--no-fix-landing-pads", argv[i]) == 0)
             {
-                    p_fix_landing_pads = false;
+                    fix_landing_pads = false;
             }
     }
     
-    return PopulateCFG(the_pqxx_interface, the_firp_list, p_fix_landing_pads);
+    return 0;
 }
 
-bool PopulateCFG::execute()
+int PopulateCFG::ExecuteStep(IRDBObjects_t *irdb_objects)
 {
     try 
 	{
-		for( FileIR_t* firp : firp_list)
+		pqxx_interface = irdb_objects->GetDBInterface();
+		irdb_objects->AddVariant(variant_id);
+		shared_ptr<VariantID_t> variant = irdb_objects->GetVariant(variant_id);
+		for(File_t* file : variant->GetFiles())
 		{
+			irdb_objects->AddFileIR(variant_id, file->GetBaseID());
+			shared_ptr<FileIR_t> firp = irdb_objects->GetFileIR(file->GetBaseID());
+
 			assert(firp);
                         cout<<"Filling in cfg for "<<firp->GetFile()->GetURL()<<endl;
 
@@ -630,24 +634,35 @@ bool PopulateCFG::execute()
 			assert(elfiop);
 			elfiop->load(string("readeh_tmp_file.exe"));
 
-			fill_in_cfg(firp);
-			fill_in_scoops(firp);
+			fill_in_cfg(firp.get());
+			fill_in_scoops(firp.get());
 
 			if (fix_landing_pads)
 			{
-				fill_in_landing_pads(firp);
+				fill_in_landing_pads(firp.get());
 			}
 
 			delete elfiop;
-			firp=NULL;
 			elfiop=NULL;
 		}
 	}
 	catch (DatabaseError_t pnide)
 	{
-		cout<<"Unexpected database error: "<<pnide<<endl;
-		return false;
+		cerr<<"Unexpected database error: "<<pnide<<endl;
+		return -1;
         }
+	catch(...)
+	{
+		cerr<<"Unexpected error"<<endl;
+		return -1;
+	}
     
-    return true;
+    return 0;
+}
+
+
+extern "C"
+Transform_SDK::TransformStep_t* TransformStepFactory(void)
+{
+	return new PopulateCFG();
 }
diff --git a/libIRDB/test/fill_in_cfg.hpp b/libIRDB/test/fill_in_cfg.hpp
index abe5abc1239fce2f070e809cc3367731fdf28c32..ac75298bd8640cc60bcb1d7e3479d4712fc9fcc8 100644
--- a/libIRDB/test/fill_in_cfg.hpp
+++ b/libIRDB/test/fill_in_cfg.hpp
@@ -2,20 +2,22 @@
 #define fill_in_cfg_hpp
 
 #include <libIRDB-core.hpp>
+#include <libIRDB-util.hpp>
 #include <stdlib.h>
 #include <map>
 #include <exeio.h>
+#include "transform_step.h"
 
-class PopulateCFG
+class PopulateCFG : public Transform_SDK::TransformStep_t
 {
     public:
-        PopulateCFG(libIRDB::pqxxDB_t* the_pqxx_interface,
-                    std::list<libIRDB::FileIR_t *> the_firp_list,
+        PopulateCFG(libIRDB::pqxxDB_t* p_pqxx_interface = NULL,
+		    libIRDB::db_id_t p_variant_id = 0,
                     bool p_fix_landing_pads = true
             )
             :
-            pqxx_interface(the_pqxx_interface),
-            firp_list(the_firp_list),
+	    pqxx_interface(p_pqxx_interface),
+            variant_id(p_variant_id),
             fix_landing_pads(p_fix_landing_pads)
         {
             odd_target_count = 0;
@@ -25,8 +27,13 @@ class PopulateCFG
        
             elfiop = NULL;
         }
-        static PopulateCFG Factory(int argc, char* argv[], libIRDB::pqxxDB_t*, std::list<libIRDB::FileIR_t *>);
-        bool execute();
+	
+	std::string GetStepName(void)
+	{
+		return std::string("fill_in_cfg");
+	}
+        int ParseArgs(int argc, char* argv[]);
+	int ExecuteStep(libIRDB::IRDBObjects_t*);
     
     private: // methods
         
@@ -68,7 +75,7 @@ class PopulateCFG
         
         // non-optional
         libIRDB::pqxxDB_t* pqxx_interface;
-        std::list<libIRDB::FileIR_t *> firp_list;
+	libIRDB::db_id_t variant_id;        
         bool fix_landing_pads;
         
         EXEIO::exeio *elfiop;
diff --git a/libIRDB/test/fill_in_cfg_driver.cpp b/libIRDB/test/fill_in_cfg_driver.cpp
deleted file mode 100644
index aee0cf8d678c0c0de3dc7d6d09dedf94df87b5fa..0000000000000000000000000000000000000000
--- a/libIRDB/test/fill_in_cfg_driver.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "fill_in_cfg.hpp"
-#include <assert.h>
-
-using namespace std;
-using namespace libIRDB;
-
-int main(int argc, char* argv[])
-{
-	VariantID_t *pidp=NULL;
-	list<FileIR_t *> the_firp_list;
-
-	try 
-	{
-		/* setup the interface to the sql server */
-                pqxxDB_t the_pqxx_interface;
-		BaseObj_t::SetInterface(&the_pqxx_interface);
-
-		pidp=new VariantID_t(atoi(argv[1]));
-
-		assert(pidp->IsRegistered()==true);
-
-		cout<<"New Variant, after reading registration, is: "<<*pidp << endl;
-
-                // setup
-		for(File_t* it : pidp->GetFiles())
-		{
-			File_t* this_file=it;
-			assert(this_file);
-                        
-			// read the db  
-			FileIR_t* firp=new FileIR_t(*pidp, this_file);
-			assert(firp);
-                        the_firp_list.push_back(firp);
-                }
-                
-                // fill_in_cfg for all files
-                PopulateCFG fill_in_cfg = PopulateCFG::Factory(argc, argv, &the_pqxx_interface, the_firp_list);
-                
-                bool success = fill_in_cfg.execute();
-                if(!success)
-                {
-                    cout<<"Unexpected error, skipping changes."<<endl;
-                    exit(-1);
-                }
-                
-                // cleanup
-                for(FileIR_t* the_firp : the_firp_list)
-		{
-                        assert(the_firp);
-                        // write the DB back and commit our changes 
-			the_firp->WriteToDB();
-			delete the_firp;
-		}
-		the_pqxx_interface.Commit();
-	}
-	catch (DatabaseError_t pnide)
-	{
-		cout<<"Unexpected database error: "<<pnide<<endl;
-		exit(-1);
-        }
-
-	assert(pidp);
-
-	delete pidp;
-	pidp=NULL;
-	return 0;
-}
diff --git a/libtransform/include/transform_step.h b/libtransform/include/transform_step.h
index 5624af87da1967a8cd10b256a266cfb5d21a7196..cda4022bd09f5ed34654b7424528e3859d3d44a0 100644
--- a/libtransform/include/transform_step.h
+++ b/libtransform/include/transform_step.h
@@ -14,12 +14,12 @@ namespace Transform_SDK
 			virtual std::string GetStepName(void) = 0;
 
 			// Allows all steps to parse args before any step takes time to execute
-			virtual int ParseArgs(int argc, char* argv[])
+			virtual int ParseArgs(int argc, char* argv[], libIRDB::IRDBObjects_t *irdb_objects)
 			{
 				return 0; // success
 			}
 				
-			virtual int ExecuteStep(libIRDB::IRDB_Objects_t *irdb_objects)
+			virtual int ExecuteStep(libIRDB::IRDBObjects_t *irdb_objects)
 			{
 				return 0; // success
 			}