diff --git a/pge/src/main/java/org/apache/oodt/cas/pge/PGETask.java b/pge/src/main/java/org/apache/oodt/cas/pge/PGETask.java
index 906b0e5..d55c532 100644
--- a/pge/src/main/java/org/apache/oodt/cas/pge/PGETask.java
+++ b/pge/src/main/java/org/apache/oodt/cas/pge/PGETask.java
@@ -20,10 +20,11 @@
 import org.apache.oodt.cas.metadata.SerializableMetadata;
 import org.apache.oodt.cas.workflow.structs.WorkflowTaskConfiguration;
 import org.apache.oodt.cas.workflow.structs.exceptions.WorkflowTaskInstanceException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.logging.Logger;
 
 import static org.apache.oodt.cas.pge.util.GenericPgeObjectFactory.createPGETaskInstance;
 
@@ -37,7 +38,7 @@
  */
 public class PGETask {
 
-    private static final Logger LOGGER = Logger.getLogger(PGETask.class.getName());
+    private static final Logger logger = LoggerFactory.getLogger(PGETask.class);
 
     private Metadata metadata;
 
@@ -51,8 +52,7 @@
     public void run(String pgeTaskInstanceClasspath)
             throws
         WorkflowTaskInstanceException {
-        PGETaskInstance pgeTaskInst = createPGETaskInstance(
-                pgeTaskInstanceClasspath, LOGGER);
+        PGETaskInstance pgeTaskInst = createPGETaskInstance(pgeTaskInstanceClasspath, logger);
         pgeTaskInst.run(this.metadata, this.wftConfig);
     }
 
diff --git a/pge/src/main/java/org/apache/oodt/cas/pge/PGETaskInstance.java b/pge/src/main/java/org/apache/oodt/cas/pge/PGETaskInstance.java
index 2e266e7..2609df1 100644
--- a/pge/src/main/java/org/apache/oodt/cas/pge/PGETaskInstance.java
+++ b/pge/src/main/java/org/apache/oodt/cas/pge/PGETaskInstance.java
@@ -57,6 +57,8 @@
 import org.apache.oodt.cas.workflow.util.ScriptFile;
 import org.apache.oodt.commons.exceptions.CommonsException;
 import org.apache.oodt.commons.exec.ExecUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.support.FileSystemXmlApplicationContext;
 
 import java.io.File;
@@ -71,8 +73,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.FileHandler;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.logging.SimpleFormatter;
 import java.util.regex.Pattern;
 
@@ -96,7 +96,14 @@
  */
 public class PGETaskInstance implements WorkflowTaskInstance {
 
-   protected Logger logger = Logger.getLogger(PGETaskInstance.class.getName());
+   protected Logger logger = LoggerFactory.getLogger(PGETaskInstance.class);
+
+   /**
+    * This JUL logger is kept for now to avoid large scale changes in logging dependencies.
+    * Should be removed in future with an alternative to address the logging dependencies.
+    */
+   protected java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(PGETaskInstance.class.getName());
+
    private WorkflowManagerClient wmClient;
    private String workflowInstId;
    protected PgeMetadata pgeMetadata;
@@ -106,12 +113,18 @@
 
    @Override
    public void run(Metadata metadata, WorkflowTaskConfiguration config) throws WorkflowTaskInstanceException {
+      logger.debug("Starting PGE Task instance...");
       try {
          // Initialize CAS-PGE.
          pgeMetadata = createPgeMetadata(metadata, config);
          pgeConfig = createPgeConfig();
          runPropertyAdders();
-         logger = createLogger(); // use workflow ID specific logger from now on
+         workflowInstId = getWorkflowInstanceId();
+
+         // use workflow ID specific logger from now on
+         logger = LoggerFactory.getLogger(PGETaskInstance.class.getName() + "." + workflowInstId);
+         logger.debug("Workflow instance ID is [{}]", workflowInstId);
+         julLogger = createLogger();
 
          // Write out PgeMetadata.
          dumpMetadataIfRequested();
@@ -135,30 +148,27 @@
          // Commit dynamic metadata.
          updateDynamicMetadata();
       } catch (Exception e) {
-         logger.log(Level.SEVERE, "PGETask FAILED!!! : " + e.getMessage(), e);
-         throw new WorkflowTaskInstanceException("PGETask FAILED!!! : "
-               + e.getMessage(), e);
+         logger.error("PGETask FAILED!!! Error occurred when running", e);
+         throw new WorkflowTaskInstanceException("PGETask FAILED!!! : " + e.getMessage(), e);
       }
    }
 
    protected void updateStatus(String status) throws Exception {
       logger.info("Updating status to workflow as [" + status + "]");
       if (!getWorkflowManagerClient().updateWorkflowInstanceStatus(workflowInstId, status)) {
-         throw new PGEException(
-               "Failed to update workflow status : client returned false");
+         throw new PGEException("Failed to update workflow status : client returned false");
       }
    }
 
-   protected Logger createLogger() throws IOException, PGEException {
+   protected java.util.logging.Logger createLogger() throws IOException, PGEException {
       File logDir = new File(pgeConfig.getExeDir(), "logs");
       if (!(logDir.exists() || logDir.mkdirs())) {
          throw new PGEException("mkdirs for logs directory return false");
       }
 
-      Logger logger = Logger.getLogger(PGETaskInstance.class.getName()
-            + "." + workflowInstId);
-      FileHandler handler = new FileHandler(
-            new File(logDir, createLogFileName()).getAbsolutePath());
+      java.util.logging.Logger logger = java.util.logging.Logger.getLogger(PGETaskInstance.class.getName() + "." + workflowInstId);
+      // TODO Need to find an alternative way to add a dynamic handler to write workflowInstance logs to a separate file
+      FileHandler handler = new FileHandler(new File(logDir, createLogFileName()).getAbsolutePath());
       handler.setEncoding("UTF-8");
       handler.setFormatter(new SimpleFormatter());
       logger.addHandler(handler);
@@ -170,14 +180,14 @@
       if (filenamePattern != null) {
          return filenamePattern;
       } else {
-         return pgeMetadata.getMetadata(NAME) + "." + System.currentTimeMillis()
-            + ".log";
+         return pgeMetadata.getMetadata(NAME) + "." + System.currentTimeMillis() + ".log";
       }
    }
 
-   protected PgeMetadata createPgeMetadata(Metadata dynMetadata,
-         WorkflowTaskConfiguration config) {
-      logger.info("Converting workflow configuration to static metadata...");
+   protected PgeMetadata createPgeMetadata(Metadata dynMetadata, WorkflowTaskConfiguration config) {
+      logger.info("Converting workflow configuration to static metadata");
+      logger.debug("PGE Metadata Config: {}", config.getProperties().entrySet());
+      logger.debug("PGE Metadata Dynamic Metadata: {}", dynMetadata.getMap());
       Metadata staticMetadata = new Metadata();
       for (Object objKey : config.getProperties().keySet()) {
          String key = (String) objKey;
@@ -187,36 +197,30 @@
                   Splitter.on(",").trimResults()
                   .omitEmptyStrings()
                   .split(config.getProperty(key)));
-            logger.finest("Adding static metadata: key = [" + key
-                  + "] value = " + values);
+            logger.debug("Adding static metadata: key = [{}] value = {}", key, values);
             staticMetadata.addMetadata(key, values);
          } else {
             String value = config.getProperty(key);
-            logger.finest("Adding static metadata: key = [" + key
-                  + "] value = [" + value + "]");
+            logger.debug("Adding static metadata: key = [{}] value = {}", key, value);
             staticMetadata.addMetadata(key, value);
          }
       }
+
       logger.info("Loading workflow context metadata...");
       for (String key : dynMetadata.getAllKeys()) {
-         logger.finest(
-               "Adding dynamic metadata: key = [" + key + "] value = "
-                     + dynMetadata.getAllMetadata(key));
+         logger.debug("Adding dynamic metadata: key = [{}] value = {}", key, dynMetadata.getAllMetadata(key));
       }
       return new PgeMetadata(staticMetadata, dynMetadata);
    }
 
    protected PgeConfig createPgeConfig() throws Exception {
       logger.info("Create PgeConfig...");
-      String pgeConfigBuilderClass = pgeMetadata
-            .getMetadata(PGE_CONFIG_BUILDER);
+      String pgeConfigBuilderClass = pgeMetadata.getMetadata(PGE_CONFIG_BUILDER);
       if (pgeConfigBuilderClass != null) {
-         logger.info("Using PgeConfigBuilder: " + pgeConfigBuilderClass);
-         return createPgeConfigBuilder(pgeConfigBuilderClass, logger)
-               .build(pgeMetadata);
+         logger.info("Using PgeConfigBuilder: {}", pgeConfigBuilderClass);
+         return createPgeConfigBuilder(pgeConfigBuilderClass, logger).build(pgeMetadata);
       } else {
-         logger.info("Using default PgeConfigBuilder: "
-               + XmlFilePgeConfigBuilder.class.getCanonicalName());
+         logger.info("Using default PgeConfigBuilder: {}", XmlFilePgeConfigBuilder.class.getCanonicalName());
          return new XmlFilePgeConfigBuilder().build(pgeMetadata);
       }
    }
@@ -224,8 +228,7 @@
    protected void runPropertyAdders() throws PGEException {
       try {
          logger.info("Loading/Running property adders...");
-         List<String> propertyAdders = pgeMetadata
-               .getAllMetadata(PROPERTY_ADDERS);
+         List<String> propertyAdders = pgeMetadata.getAllMetadata(PROPERTY_ADDERS);
          if (propertyAdders != null) {
             for (String propertyAdder : propertyAdders) {
                runPropertyAdder(loadPropertyAdder(propertyAdder));
@@ -234,22 +237,19 @@
             logger.info("No property adders specified");
          }
       } catch (Exception e) {
-         throw new PGEException("Failed to instanciate/run Property Adders : "
-               + e.getMessage(), e);
+         logger.error("Error occurred when running property adders", e);
+         throw new PGEException("Failed to instantiate/run Property Adders : " + e.getMessage(), e);
       }
    }
 
-   protected ConfigFilePropertyAdder loadPropertyAdder(
-         String propertyAdderClasspath) {
-      logger.fine("Loading property adder: " + propertyAdderClasspath);
+   protected ConfigFilePropertyAdder loadPropertyAdder(String propertyAdderClasspath) {
+      logger.debug("Loading property adder: {}", propertyAdderClasspath);
       return createConfigFilePropertyAdder(propertyAdderClasspath, logger);
    }
 
    protected void runPropertyAdder(ConfigFilePropertyAdder propAdder) {
-      logger.info("Running property adder: "
-            + propAdder.getClass().getCanonicalName());
-      propAdder.addConfigProperties(pgeMetadata,
-            pgeConfig.getPropertyAdderCustomArgs());
+      logger.info("Running property adder: {}", propAdder.getClass().getCanonicalName());
+      propAdder.addConfigProperties(pgeMetadata, pgeConfig.getPropertyAdderCustomArgs());
    }
 
    protected WorkflowManagerClient getWorkflowManagerClient() throws MalformedURLException {
@@ -265,9 +265,8 @@
 
    protected String getWorkflowInstanceId() {
       String instanceId = pgeMetadata.getMetadata(CoreMetKeys.WORKFLOW_INST_ID);
-      logger.info("Workflow instanceId is [" + instanceId + "]");
-      Validate.notNull(instanceId, "Must specify "
-            + CoreMetKeys.WORKFLOW_INST_ID);
+      logger.debug("Workflow instanceId is [{}]", instanceId);
+      Validate.notNull(instanceId, "Must specify " + CoreMetKeys.WORKFLOW_INST_ID);
       return instanceId;
    }
 
@@ -290,24 +289,22 @@
    }
 
    protected void createExeDir() throws PGEException {
-      logger.info("Creating PGE execution working directory: ["
-            + pgeConfig.getExeDir() + "]");
+      logger.info("Creating PGE execution working directory: [{}]", pgeConfig.getExeDir());
       File executionDir = new File(pgeConfig.getExeDir());
       if (!(executionDir.exists() || executionDir.mkdirs())) {
-         throw new PGEException("mkdirs returned false for creating ["
-               + pgeConfig.getExeDir() + "]");
+         logger.warn("Unable to create execution working directory: {}", pgeConfig.getExeDir());
+         throw new PGEException("mkdirs returned false for creating [" + pgeConfig.getExeDir() + "]");
       }
    }
 
    protected void createOuputDirsIfRequested() throws PGEException {
       for (OutputDir outputDir : pgeConfig.getOuputDirs()) {
          if (outputDir.isCreateBeforeExe()) {
-            logger.info("Creating PGE file ouput directory: ["
-                  + outputDir.getPath() + "]");
+            logger.info("Creating PGE file ouput directory: [{}]", outputDir.getPath());
             File dir = new File(outputDir.getPath());
             if (!(dir.exists() || dir.mkdirs())) {
-               throw new PGEException("mkdir returned false for creating ["
-                     + outputDir.getPath() + "]");
+               logger.warn("Unable to create output dirs: {}", outputDir.getPath());
+               throw new PGEException("mkdir returned false for creating [" + outputDir.getPath() + "]");
             }
          }
       }
@@ -319,8 +316,7 @@
       if (pgeConfig.getFileStagingInfo() != null) {
          FileStager fileStager = getFileStager();
          logger.info("Starting file staging...");
-         fileStager.stageFiles(
-               pgeConfig.getFileStagingInfo(), pgeMetadata, logger);
+         fileStager.stageFiles(pgeConfig.getFileStagingInfo(), pgeMetadata, logger);
       } else {
          logger.info("No files to stage.");
       }
@@ -329,7 +325,7 @@
    protected FileStager getFileStager() {
       String fileStagerClass = pgeMetadata.getMetadata(FILE_STAGER);
       if (fileStagerClass != null) {
-         logger.info("Loading FileStager [" + fileStagerClass + "]");
+         logger.info("Loading FileStager [{}]", fileStagerClass);
          return createFileStager(fileStagerClass, logger);
       } else {
          logger.info("Using default FileStager ["
@@ -350,38 +346,33 @@
    protected void createDynamicConfigFile(DynamicConfigFile dynamicConfigFile)
        throws PGEException, IOException {
       Validate.notNull(dynamicConfigFile, "dynamicConfigFile cannot be null");
-      logger.fine("Starting creation of sci pge config file ["
-            + dynamicConfigFile.getFilePath() + "]...");
+      logger.debug("Starting creation of sci pge config file: {}", dynamicConfigFile.getFilePath());
 
       // Create parent directory if it doesn't exist.
-      File parentDir = new File(dynamicConfigFile.getFilePath())
-            .getParentFile();
+      File parentDir = new File(dynamicConfigFile.getFilePath()).getParentFile();
       if (!(parentDir.exists() || parentDir.mkdirs())) {
+         logger.warn("Unable to create directory({}) with sci pge config file", dynamicConfigFile.getFilePath());
          throw new PGEException("Failed to create directory where sci pge config file ["
                + dynamicConfigFile.getFilePath() + "] was to be written");
       }
 
       // Load writer and write file.
-      logger.fine("Loading writer class for sci pge config file ["
-            + dynamicConfigFile.getFilePath() + "]...");
-      SciPgeConfigFileWriter writer = createSciPgeConfigFileWriter(
-            dynamicConfigFile.getWriterClass(), logger);
-      logger.fine("Loaded writer [" + writer.getClass().getCanonicalName()
-            + "] for sci pge config file [" + dynamicConfigFile.getFilePath()
-            + "]...");
-      logger.info("Writing sci pge config file [" + dynamicConfigFile.getFilePath()
-                  + "]...");
+      logger.debug("Loading writer class for sci pge config file [{}]", dynamicConfigFile.getFilePath());
+      SciPgeConfigFileWriter writer = createSciPgeConfigFileWriter(dynamicConfigFile.getWriterClass(), logger);
+      logger.debug("Loaded writer [{}] for sci pge config file [{}]",
+              writer.getClass().getCanonicalName(),dynamicConfigFile.getFilePath());
+      logger.info("Writing sci pge config file [{}]", dynamicConfigFile.getFilePath());
       File configFile = writer.createConfigFile(dynamicConfigFile.getFilePath(),
-            pgeMetadata.asMetadata(), dynamicConfigFile.getArgs());
+              pgeMetadata.asMetadata(), dynamicConfigFile.getArgs());
       if (!configFile.exists()) {
-         throw new PGEException("Writer failed to create config file ["
-               + configFile + "], exists returned false");
+         logger.warn("Failed to create config file '{}'. File doesn't exist", configFile);
+         throw new PGEException("Writer failed to create config file [" + configFile + "], exists returned false");
       }
    }
 
    protected ScriptFile buildPgeRunScript() {
-      logger.fine("Creating PGE run script for shell [" + pgeConfig.getShellType()
-                  + "] with contents " + pgeConfig.getExeCmds());
+      logger.debug("Creating PGE run script for shell [{}] with contents: {}",
+              pgeConfig.getShellType(), pgeConfig.getExeCmds());
       ScriptFile sf = new ScriptFile(pgeConfig.getShellType());
       sf.setCommands(pgeConfig.getExeCmds());
       return sf;
@@ -389,13 +380,13 @@
 
    protected File getScriptPath() {
       File script = new File(pgeConfig.getExeDir(), getPgeScriptName());
-      logger.fine("Script file with be written to [" + script + "]");
+      logger.debug("Script file with be written to [{}]", script);
       return script;
    }
 
    protected String getPgeScriptName() {
       String pgeScriptName = "sciPgeExeScript_" + pgeMetadata.getMetadata(NAME);
-      logger.fine("Generated script file name [" + pgeScriptName + "]");
+      logger.debug("Generated script file name [{}]", pgeScriptName);
       return pgeScriptName;
    }
 
@@ -403,7 +394,7 @@
       ScriptFile sf = null;
       try {
          long startTime = System.currentTimeMillis();
-         logger.info("PGE start time [" + new Date(startTime) + "]");
+         logger.info("PGE start time [{}]", new Date(startTime));
 
          // create script to run
          sf = buildPgeRunScript();
@@ -411,69 +402,67 @@
 
          // run script and evaluate whether success or failure
          updateStatus(RUNNING_PGE.getWorkflowStatusName());
-         logger.info("Starting execution of PGE...");
+         logger.debug("Starting execution of PGE: {}", sf.getCommands());
          if (!wasPgeSuccessful(ExecUtils.callProgram(
-               pgeConfig.getShellType() + " " + getScriptPath(), logger,
+               pgeConfig.getShellType() + " " + getScriptPath(), julLogger,
                new File(pgeConfig.getExeDir()).getAbsoluteFile()))) {
+            logger.error("PGE didn't finish successfully: {}", sf);
             throw new RuntimeException("Pge didn't finish successfully");
          } else {
-            logger.info(
-                  "Successfully completed running: '" + sf.getCommands() + "'");
+            logger.info("Successfully completed running script file: '{}'", sf);
          }
 
          long endTime = System.currentTimeMillis();
-         logger.info("PGE end time [" + new Date(startTime) + "]");
+         logger.info("PGE end time [{}]", new Date(startTime));
 
          long runTime = endTime - startTime;
-         logger.info("PGE runtime in millis [" + runTime + "]");
+         logger.info("PGE runtime in millis [{}]", runTime);
 
          pgeMetadata.replaceMetadata(PGE_RUNTIME, Long.toString(runTime));
-
-      } catch (WorkflowException e) {
-        throw new PGEException("Exception when executing PGE commands '" + (sf.getCommands()) + "' : " + e.getMessage(), e);
-      } catch (IOException e) {
-        throw new PGEException("Exception when executing PGE commands '" + (sf.getCommands()) + "' : " + e.getMessage(), e);
+      } catch (WorkflowException | IOException e) {
+         logger.error("Error when executing PGE commands: {}", sf);
+        throw new PGEException("Exception when executing PGE commands '" +
+                (sf.getCommands()) + "' : " + e.getMessage(), e);
       }
    }
 
    protected boolean wasPgeSuccessful(int returnCode) {
       return returnCode == 0;
    }
-   
+
    protected void processOutput() throws IOException {
-     for (final OutputDir outputDir : this.pgeConfig.getOuputDirs()) {
+      logger.debug("Processing output");
+      for (final OutputDir outputDir : this.pgeConfig.getOuputDirs()) {
          File[] createdFiles = new File(outputDir.getPath()).listFiles();
-       if (createdFiles != null) {
-         for (File createdFile : createdFiles) {
-             Metadata outputMetadata = new Metadata();
-             for (RegExprOutputFiles regExprFiles : outputDir
-                     .getRegExprOutputFiles()) {
-                 if (Pattern.matches(regExprFiles.getRegExp(), createdFile
-                         .getName())) {
+         if (createdFiles != null) {
+            for (File createdFile : createdFiles) {
+               Metadata outputMetadata = new Metadata();
+               for (RegExprOutputFiles regExprFiles : outputDir
+                       .getRegExprOutputFiles()) {
+                  if (Pattern.matches(regExprFiles.getRegExp(), createdFile
+                          .getName())) {
                      try {
-                         PcsMetFileWriter writer = (PcsMetFileWriter) Class
-                                 .forName(regExprFiles.getConverterClass())
-                                 .newInstance();
-                         outputMetadata.replaceMetadata(this.getMetadataForFile(
-                 (regExprFiles.getRenamingConv() != null)
-               ? createdFile = this.renameFile(createdFile, regExprFiles.getRenamingConv())
-               : createdFile, writer, regExprFiles.getArgs()));
+                        PcsMetFileWriter writer = (PcsMetFileWriter) Class
+                                .forName(regExprFiles.getConverterClass())
+                                .newInstance();
+                        outputMetadata.replaceMetadata(this.getMetadataForFile(
+                                (regExprFiles.getRenamingConv() != null)
+                                        ? createdFile = this.renameFile(createdFile, regExprFiles.getRenamingConv())
+                                        : createdFile, writer, regExprFiles.getArgs()));
                      } catch (Exception e) {
-                         logger.severe(
-                                 "Failed to create metadata file for '"
-                                         + createdFile + "' : "
-                                         + e.getMessage());
+                        logger.error("Failed to create metadata file for '{}'", createdFile, e);
                      }
-                 }
-             }
-             if (outputMetadata.getAllKeys().size() > 0) {
-               this.writeFromMetadata(outputMetadata, createdFile.getAbsolutePath()
-                                                      + "." + this.pgeMetadata.getMetadata(MET_FILE_EXT));
-             }
+                  }
+               }
+
+               if (outputMetadata.getAllKeys().size() > 0) {
+                  this.writeFromMetadata(outputMetadata, createdFile.getAbsolutePath()
+                          + "." + this.pgeMetadata.getMetadata(MET_FILE_EXT));
+               }
+            }
          }
-       }
-     }
- }
+      }
+   }
 
 	protected File renameFile(File file, PathUtilsNamingConvention renamingConv)
         throws NamingConventionException {
@@ -496,29 +485,28 @@
 				.writeMetadataToXmlStream(new FileOutputStream(toMetFilePath));
 	}
 
-	protected ProductCrawler createProductCrawler()
-        throws MalformedURLException, IllegalAccessException, CrawlerActionException, MetExtractionException,
-        InstantiationException, FileNotFoundException, ClassNotFoundException {
-     /* create a ProductCrawler based on whether or not the output dir specifies a MIME_EXTRACTOR_REPO */
+   protected ProductCrawler createProductCrawler()
+           throws MalformedURLException, IllegalAccessException, CrawlerActionException, MetExtractionException,
+           InstantiationException, FileNotFoundException, ClassNotFoundException {
+      /* create a ProductCrawler based on whether or not the output dir specifies a MIME_EXTRACTOR_REPO */
       logger.info("Configuring ProductCrawler...");
       ProductCrawler crawler;
-      if (pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO) != null && 
-    		  !pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO).equals("")){
-          crawler = new AutoDetectProductCrawler();
-          ((AutoDetectProductCrawler)crawler).
-            setMimeExtractorRepo(pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO));    	  
-      }
-      else{
-    	  crawler = new StdProductCrawler();
+      if (pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO) != null &&
+              !pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO).equals("")) {
+         crawler = new AutoDetectProductCrawler();
+         ((AutoDetectProductCrawler) crawler).
+                 setMimeExtractorRepo(pgeMetadata.getMetadata(MIME_EXTRACTOR_REPO));
+      } else {
+         crawler = new StdProductCrawler();
       }
 
       crawler.setClientTransferer(pgeMetadata
-            .getMetadata(INGEST_CLIENT_TRANSFER_SERVICE_FACTORY));
+              .getMetadata(INGEST_CLIENT_TRANSFER_SERVICE_FACTORY));
       crawler.setFilemgrUrl(pgeMetadata.getMetadata(INGEST_FILE_MANAGER_URL));
       String crawlerConfigFile = pgeMetadata.getMetadata(CRAWLER_CONFIG_FILE);
       if (!Strings.isNullOrEmpty(crawlerConfigFile)) {
          crawler.setApplicationContext(
-               new FileSystemXmlApplicationContext(crawlerConfigFile));
+                 new FileSystemXmlApplicationContext(crawlerConfigFile));
          List<String> actionIds = pgeMetadata.getAllMetadata(ACTION_IDS);
          if (actionIds != null) {
             crawler.setActionIds(actionIds);
@@ -526,14 +514,12 @@
       }
       crawler.setRequiredMetadata(pgeMetadata.getAllMetadata(REQUIRED_METADATA));
       crawler.setCrawlForDirs(Boolean.parseBoolean(pgeMetadata
-            .getMetadata(CRAWLER_CRAWL_FOR_DIRS)));
+              .getMetadata(CRAWLER_CRAWL_FOR_DIRS)));
       crawler.setNoRecur(!Boolean.parseBoolean(
-            pgeMetadata.getMetadata(CRAWLER_RECUR)));
-      logger.fine(
-            "Passing Workflow Metadata to CAS-Crawler as global metadata . . .");
+              pgeMetadata.getMetadata(CRAWLER_RECUR)));
+      logger.debug("Passing Workflow Metadata to CAS-Crawler as global metadata . . .");
       crawler.setGlobalMetadata(pgeMetadata.asMetadata(PgeMetadata.Type.DYNAMIC));
-      logger.fine("Created ProductCrawler ["
-            + crawler.getClass().getCanonicalName() + "]");
+      logger.debug("Created ProductCrawler [{}]", crawler.getClass().getCanonicalName());
       return crawler;
    }
 
@@ -566,7 +552,7 @@
    }
 
    protected void verifyIngests(ProductCrawler crawler) throws PGEException {
-      logger.info("Verifying ingests successful...");
+      logger.debug("Verifying ingests successful...");
       boolean ingestsSuccess = true;
       String exceptionMsg = "";
       for (IngestStatus status : crawler.getIngestStatus()) {
@@ -577,12 +563,13 @@
                   + status.getResult() + "',msg='" + status.getMessage() + "']";
             ingestsSuccess = false;
          } else if (!status.getResult().equals(IngestStatus.Result.SUCCESS)) {
-            logger.warning("Product was not ingested [file='"
-                  + status.getProduct().getAbsolutePath() + "',result='"
-                  + status.getResult() + "',msg='" + status.getMessage() + "']");
+            logger.warn("Product was not ingested [file='{}', result='{}', msg='{}'",
+                    status.getProduct().getAbsolutePath(), status.getResult(),status.getMessage());
          }
       }
+
       if (!ingestsSuccess) {
+         logger.error("Ingest wasn't successful: {}", exceptionMsg);
          throw new PGEException(exceptionMsg);
       } else {
          logger.info("Ingests were successful");
@@ -590,6 +577,7 @@
    }
 
    protected void updateDynamicMetadata() throws Exception {
+      logger.debug("Updating dynamic metadata ...");
       pgeMetadata.commitMarkedDynamicMetadataKeys();
       getWorkflowManagerClient()
               .updateMetadataForWorkflow(workflowInstId, pgeMetadata.asMetadata(PgeMetadata.Type.DYNAMIC));
@@ -600,6 +588,7 @@
    }
 
    public void setWorkflowInstId(String workflowInstId) {
+      logger.debug("Set workflow instance ID: {}", workflowInstId);
       this.workflowInstId = workflowInstId;
    }
 
@@ -609,8 +598,10 @@
 
    @Override
    public void finalize() throws IOException {
+      logger.debug("Finalizing ...");
       if (wmClient != null) {
          wmClient.close();
+         logger.debug("Workflow manager client closed");
       }
    }
 }
diff --git a/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileManagerFileStager.java b/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileManagerFileStager.java
index dbf6602..4cbd275 100644
--- a/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileManagerFileStager.java
+++ b/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileManagerFileStager.java
@@ -32,6 +32,7 @@
 //Google imports
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
+import org.slf4j.Logger;
 
 //JDK imports
 import java.io.File;
@@ -39,8 +40,6 @@
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * A {@link FileStager} which uses a FileManager {@link DataTransferer}.
@@ -53,8 +52,7 @@
    public void stageFile(URI stageFile, File destDir,
          PgeMetadata pgeMetadata, Logger logger) throws IOException, DataTransferException, InstantiationException {
       DataTransfer dataTransferer = createDataTransfer(pgeMetadata, logger);
-      logger.log(Level.INFO, "Using DataTransfer ["
-               + dataTransferer.getClass().getCanonicalName() + "]");
+      logger.info("Using DataTransfer [{}]", dataTransferer.getClass().getCanonicalName());
       setFileManagerUrl(dataTransferer, pgeMetadata, logger);
       dataTransferer.retrieveProduct(createProduct(stageFile), destDir);
    }
@@ -67,7 +65,7 @@
                .getDataTransferServiceFromFactory(pgeMetadata
                      .getMetadata(QUERY_CLIENT_TRANSFER_SERVICE_FACTORY));
       } else {
-         logger.log(Level.INFO, "Using default DataTransferer");
+         logger.info("Using default DataTransferer");
          return new RemoteDataTransferFactory().createDataTransfer();
       }
    }
@@ -79,9 +77,8 @@
       if (filemgrUrl != null) {
          dataTransferer.setFileManagerUrl(new URL(filemgrUrl));
       } else {
-         logger.log(Level.WARNING, "Metadata field [" + QUERY_FILE_MANAGER_URL
-               + "] was not set, if DataTranferer requires filemgr server,"
-               + " your transfers will fail");
+         logger.warn("Metadata field [{}] was not set, if DataTranferer requires filemgr server, your transfers will fail",
+                 QUERY_FILE_MANAGER_URL);
       }
    }
 
diff --git a/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileStager.java b/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileStager.java
index ab98823..28bb24c 100644
--- a/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileStager.java
+++ b/pge/src/main/java/org/apache/oodt/cas/pge/staging/FileStager.java
@@ -30,6 +30,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
+import org.slf4j.Logger;
 
 import java.io.File;
 import java.io.IOException;
@@ -38,8 +39,6 @@
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.oodt.cas.pge.metadata.PgeTaskMetKeys.QUERY_FILE_MANAGER_URL;
 
@@ -51,36 +50,26 @@
  */
 public abstract class FileStager {
 
-   public void stageFiles(FileStagingInfo fileStagingInfo,
-         PgeMetadata pgeMetadata, Logger logger)
+   public void stageFiles(FileStagingInfo fileStagingInfo, PgeMetadata pgeMetadata, Logger logger)
        throws PGEException, CatalogException, URISyntaxException, IOException, ConnectionException,
        InstantiationException, DataTransferException {
-      logger.log(Level.INFO, "Creating staging directory ["
-            + fileStagingInfo.getStagingDir() + "]");
+      logger.info("Creating staging directory [{}]", fileStagingInfo.getStagingDir());
       new File(fileStagingInfo.getStagingDir()).mkdirs();
       for (String file : fileStagingInfo.getFilePaths()) {
          File fileHandle = new File(file);
          if (fileStagingInfo.isForceStaging() || !fileHandle.exists()) {
-            logger.log(Level.INFO, "Staging file [" + file
-                  + "] to directory ["
-                  + fileStagingInfo.getStagingDir() + "]");
-            stageFile(asURI(file), new File(fileStagingInfo.getStagingDir()),
-                  pgeMetadata, logger);
+            logger.info("Staging file [{}] to directory [{}]", file,  fileStagingInfo.getStagingDir());
+            stageFile(asURI(file), new File(fileStagingInfo.getStagingDir()), pgeMetadata, logger);
          }
       }
       if (!fileStagingInfo.getProductIds().isEmpty()) {
          FileManagerClient fmClient = createFileManagerClient(pgeMetadata);
          for (String productId : fileStagingInfo.getProductIds()) {
-            logger.log(Level.INFO, "Staging product [" + productId
-                  + "] to directory ["
-                  + fileStagingInfo.getStagingDir() + "]");
+            logger.info("Staging product [{}] to directory [{}]", productId, fileStagingInfo.getStagingDir());
             for (URI uri : getProductReferences(productId, fmClient)) {
-               logger.log(Level.INFO, "Staging product [" + productId
-                     + "] reference [" + uri
-                     + "] to directory ["
-                     + fileStagingInfo.getStagingDir() + "]");
-               stageFile(uri, new File(fileStagingInfo.getStagingDir()),
-                     pgeMetadata, logger);
+               logger.info("Staging product [{}] reference [{}] to directory [{}]",
+                       productId, uri, fileStagingInfo.getStagingDir());
+               stageFile(uri, new File(fileStagingInfo.getStagingDir()), pgeMetadata, logger);
             }
          }
       }
diff --git a/pge/src/main/java/org/apache/oodt/cas/pge/util/GenericPgeObjectFactory.java b/pge/src/main/java/org/apache/oodt/cas/pge/util/GenericPgeObjectFactory.java
index d6e31dd..272c657 100644
--- a/pge/src/main/java/org/apache/oodt/cas/pge/util/GenericPgeObjectFactory.java
+++ b/pge/src/main/java/org/apache/oodt/cas/pge/util/GenericPgeObjectFactory.java
@@ -16,18 +16,12 @@
  */
 package org.apache.oodt.cas.pge.util;
 
-
-//OODT imports
 import org.apache.oodt.cas.pge.ConfigFilePropertyAdder;
 import org.apache.oodt.cas.pge.PGETaskInstance;
 import org.apache.oodt.cas.pge.config.PgeConfigBuilder;
 import org.apache.oodt.cas.pge.staging.FileStager;
 import org.apache.oodt.cas.pge.writers.SciPgeConfigFileWriter;
 
-//JDK imports
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 
 /**
  * Factory for creating {@link Object}s.
@@ -38,66 +32,48 @@
 
    private GenericPgeObjectFactory() {}
 
-   public static PGETaskInstance createPGETaskInstance(
-         String clazz, Logger logger) {
+   public static PGETaskInstance createPGETaskInstance(String clazz, org.slf4j.Logger logger) {
       try {
          return (PGETaskInstance) Class.forName(clazz).newInstance();
       } catch (Exception e) {
-         logger.log(Level.SEVERE, "Failed to create PGETaskInstance ["
-               + clazz + "] : " + e.getMessage(), e);
+         logger.error("Failed to create PGETaskInstance [{}]", clazz, e);
          return null;
       }
    }
 
-   public static PgeConfigBuilder createPgeConfigBuilder(
-         String clazz, Logger logger) {
+   public static PgeConfigBuilder createPgeConfigBuilder(String clazz, org.slf4j.Logger logger) {
       try {
          return (PgeConfigBuilder) Class.forName(clazz).newInstance();
-      } catch (InstantiationException e) {
-         logger.log(Level.SEVERE, "Failed to create PgeConfigBuilder ["
-                                  + clazz + "] : " + e.getMessage(), e);
-         return null;
-      } catch (IllegalAccessException e) {
-         logger.log(Level.SEVERE, "Failed to create PgeConfigBuilder ["
-                                  + clazz + "] : " + e.getMessage(), e);
-         return null;
-      } catch (ClassNotFoundException e) {
-         logger.log(Level.SEVERE, "Failed to create PgeConfigBuilder ["
-                                  + clazz + "] : " + e.getMessage(), e);
+      } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
+         logger.error("Failed to create PgeConfigBuilder [{}] : ", clazz, e);
          return null;
       }
 
    }
 
-   public static ConfigFilePropertyAdder createConfigFilePropertyAdder(
-         String clazz, Logger logger) {
+   public static ConfigFilePropertyAdder createConfigFilePropertyAdder(String clazz, org.slf4j.Logger logger) {
       try {
          return (ConfigFilePropertyAdder) Class.forName(clazz).newInstance();
       } catch (Exception e) {
-         logger.log(Level.SEVERE, "Failed to create ConfigFilePropertyAdder ["
-               + clazz + "] : " + e.getMessage(), e);
+         logger.error("Failed to create ConfigFilePropertyAdder [{}]", clazz, e);
          return null;
       }
    }
 
-   public static FileStager createFileStager(
-         String clazz, Logger logger) {
+   public static FileStager createFileStager(String clazz, org.slf4j.Logger logger) {
       try {
          return (FileStager) Class.forName(clazz).newInstance();
       } catch (Exception e) {
-         logger.log(Level.SEVERE, "Failed to create FileStager ["
-               + clazz + "] : " + e.getMessage(), e);
+         logger.error("Failed to create FileStager [{}]", clazz, e);
          return null;
       }
    }
 
-   public static SciPgeConfigFileWriter createSciPgeConfigFileWriter(
-         String clazz, Logger logger) {
+   public static SciPgeConfigFileWriter createSciPgeConfigFileWriter(String clazz, org.slf4j.Logger logger) {
       try {
          return (SciPgeConfigFileWriter) Class.forName(clazz).newInstance();
       } catch (Exception e) {
-         logger.log(Level.SEVERE, "Failed to create SciPgeConfigFileWriter ["
-               + clazz + "] : " + e.getMessage(), e);
+         logger.error("Failed to create SciPgeConfigFileWriter [{}]", clazz, e);
          return null;
       }
    }
diff --git a/pge/src/test/java/org/apache/oodt/cas/pge/TestPGETaskInstance.java b/pge/src/test/java/org/apache/oodt/cas/pge/TestPGETaskInstance.java
index db60792..2378849 100644
--- a/pge/src/test/java/org/apache/oodt/cas/pge/TestPGETaskInstance.java
+++ b/pge/src/test/java/org/apache/oodt/cas/pge/TestPGETaskInstance.java
@@ -189,15 +189,15 @@
       PGETaskInstance pgeTask1 = createTestInstance();
       PGETaskInstance pgeTask2 = createTestInstance();
 
-      pgeTask1.logger.log(Level.INFO, "pge1 message1");
-      pgeTask1.logger.log(Level.INFO, "pge1 message2");
-      pgeTask2.logger.log(Level.SEVERE, "pge2 message1");
-      pgeTask1.logger.log(Level.INFO, "pge1 message3");
+      pgeTask1.julLogger.log(Level.INFO, "pge1 message1");
+      pgeTask1.julLogger.log(Level.INFO, "pge1 message2");
+      pgeTask2.julLogger.log(Level.SEVERE, "pge2 message1");
+      pgeTask1.julLogger.log(Level.INFO, "pge1 message3");
 
-      for (Handler handler : pgeTask1.logger.getHandlers()) {
+      for (Handler handler : pgeTask1.julLogger.getHandlers()) {
          handler.flush();
       }
-      for (Handler handler : pgeTask2.logger.getHandlers()) {
+      for (Handler handler : pgeTask2.julLogger.getHandlers()) {
          handler.flush();
       }
       File logDir = new File(pgeTask1.pgeConfig.getExeDir() + "/logs");
@@ -586,17 +586,17 @@
             Lists.newArrayList(precondsFailIngestStatus));
       replay(pc);
 
-      pgeTask.logger = createMock(Logger.class);
-      pgeTask.logger.info("Verifying ingests successful...");
-      pgeTask.logger.warning(
+      pgeTask.julLogger = createMock(Logger.class);
+      pgeTask.julLogger.info("Verifying ingests successful...");
+      pgeTask.julLogger.warning(
             "Product was not ingested [file='/tmp/dir1',result='PRECONDS_FAILED',msg='Preconditions failed']");
-      pgeTask.logger.info("Ingests were successful");
-      replay(pgeTask.logger);
+      pgeTask.julLogger.info("Ingests were successful");
+      replay(pgeTask.julLogger);
 
       pgeTask.verifyIngests(pc);
 
       verify(pc);
-      verify(pgeTask.logger);
+      verify(pgeTask.julLogger);
 
       // Test case success.
       pc = createMock(AutoDetectProductCrawler.class);
@@ -618,15 +618,15 @@
             Lists.newArrayList(successIngestStatus));
       replay(pc);
 
-      pgeTask.logger = createMock(Logger.class);
-      pgeTask.logger.info("Verifying ingests successful...");
-      pgeTask.logger.info("Ingests were successful");
-      replay(pgeTask.logger);
+      pgeTask.julLogger = createMock(Logger.class);
+      pgeTask.julLogger.info("Verifying ingests successful...");
+      pgeTask.julLogger.info("Ingests were successful");
+      replay(pgeTask.julLogger);
 
       pgeTask.verifyIngests(pc);
 
       verify(pc);
-      verify(pgeTask.logger);
+      verify(pgeTask.julLogger);
    }
 
    private PGETaskInstance createTestInstance() throws Exception {
@@ -642,7 +642,7 @@
       pgeTask.pgeConfig = new PgeConfig();
       File exeDir = new File(createTmpDir(), workflowInstId);
       pgeTask.pgeConfig.setExeDir(exeDir.getAbsolutePath());
-      pgeTask.logger = pgeTask.createLogger();
+      pgeTask.julLogger = pgeTask.createLogger();
       return pgeTask;
    }
 
