diff --git a/policy-core/pom.xml b/policy-core/pom.xml
index 4d504a6..22ce98e 100644
--- a/policy-core/pom.xml
+++ b/policy-core/pom.xml
@@ -58,17 +58,6 @@
        <artifactId>policy-utils</artifactId>
        <version>${project.version}</version>  
      </dependency>
-     <dependency>
-      <groupId>org.openecomp.policy.common</groupId>
-      <artifactId>ECOMP-Logging</artifactId>
-      <version>${common-modules.version}</version>  
-    </dependency>
-    <dependency>
-      <groupId>org.mariadb.jdbc</groupId>
-      <artifactId>mariadb-java-client</artifactId>
-      <version>1.2.3</version>
-      <scope>runtime</scope>
-    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
diff --git a/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicyContainer.java b/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicyContainer.java
index 26a8055..1b7941d 100644
--- a/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicyContainer.java
+++ b/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicyContainer.java
@@ -20,12 +20,10 @@
 
 package org.openecomp.policy.drools.core;
 
-import java.io.IOException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.kie.api.KieBase;
@@ -36,12 +34,9 @@
 import org.kie.api.builder.Results;
 import org.kie.api.runtime.KieContainer;
 import org.kie.api.runtime.KieSession;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
-import org.openecomp.policy.common.logging.flexlogger.PropertyUtil;
 import org.openecomp.policy.drools.properties.Startable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This class is a wrapper around 'KieContainer', which adds the ability
@@ -50,7 +45,7 @@
 public class PolicyContainer implements Startable
 {
 	// get an instance of logger 
-  private static Logger  logger = FlexLogger.getLogger(PolicyContainer.class);	
+  private static Logger logger = LoggerFactory.getLogger(PolicyContainer.class);	
   // 'KieServices' singleton
   static private KieServices kieServices = KieServices.Factory.get();
 
@@ -80,9 +75,6 @@
   // (it can block for a long time)
   private boolean scannerStarted = false;
 
-  // Used to set relative pathing to config files for unit test environment
-  public static boolean isUnitTesting = false;
-
   /**
    * uses 'groupId', 'artifactId' and 'version', and fetches the associated
    * artifact and remaining dependencies from the Maven repository to create
@@ -528,7 +520,7 @@
 		catch (Exception e)
 		  {
 			// sometimes the scanner initialization fails for some reason
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "main", "startServer");
+			logger.error("startScanner error", e);
 		  }
 	  }
   }
@@ -752,10 +744,7 @@
 		  }
 		catch (Exception e)
 		  {
-			e.printStackTrace();
-			logger.error(MessageCodes.EXCEPTION_ERROR, e,
-							   "activate",
-							   "PolicyContainer.start()");
+			logger.error("PolicyContainer.start() error in activate", e);
 		  }
 	  }
   }
@@ -774,10 +763,7 @@
 		  }
 		catch (Exception e)
 		  {
-			e.printStackTrace();
-			logger.error(MessageCodes.EXCEPTION_ERROR, e,
-							   "deactivate",
-							   "PolicyContainer.stop()");
+			logger.error("PolicyContainer.start() error in deactivate", e);
 		  }
 	  }
   }
@@ -796,23 +782,8 @@
    */
   public static void globalInit(String args[])
   {
-	  
-	/*
-	 * When JUnit testing, working directory should be
-	 * "../policy-management". In test environment, command line argument
-	 * should specify the relative path from this directory to the config
-	 * directory ("src/test/server/config")
-	 */
 	String configDir = "config";
-	if (isUnitTesting) {
-		configDir = "src/test/server/config";
-	} 
-	System.out.println("PolicyContainer.main: configDir=" + configDir);
-	
-	logger.info("Calling initlogger");
-	
-	initlogger(configDir);
-	logger.info("initlogger returned");
+	logger.info("PolicyContainer.main: configDir=" + configDir);
 
 	// invoke 'globalInit' on all of the features
 	for (PolicySessionFeatureAPI feature :
@@ -829,25 +800,6 @@
 		  }
 	  }
   }
-
-  /**
-   * Read in the logger properties
-   */
-  private static void initlogger(String configDir){
-		try {
-			Properties properties =
-					  PropertyUtil.getProperties(configDir + "/policyLogger.properties");			
-			try {
-				
-				PolicyLogger.init(properties);
-				
-			} catch (Exception e) {
-				logger.error(MessageCodes.MISS_PROPERTY_ERROR, e, "initlogger");
-			}
-		} catch (IOException e1) {
-			logger.error(MessageCodes.MISS_PROPERTY_ERROR, e1, "initlogger");
-		}
-  }
 	
   /**
    * Fetch the adjunct object associated with a given feature
diff --git a/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicySession.java b/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicySession.java
index 4d717f5..ebfcb02 100644
--- a/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicySession.java
+++ b/policy-core/src/main/java/org/openecomp/policy/drools/core/PolicySession.java
@@ -36,10 +36,10 @@
 import org.kie.api.event.rule.RuleFlowGroupDeactivatedEvent;
 import org.kie.api.event.rule.RuleRuntimeEventListener;
 import org.kie.api.runtime.KieSession;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
 import org.openecomp.policy.drools.core.jmx.PdpJmx;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 
 /**
  * This class is a wrapper around 'KieSession', which adds the following:
@@ -52,7 +52,7 @@
   implements AgendaEventListener, RuleRuntimeEventListener
 {
 	// get an instance of logger 
-  private static Logger  logger = FlexLogger.getLogger(PolicySession.class);		
+  private static Logger  logger = LoggerFactory.getLogger(PolicySession.class);		
   // name of the 'PolicySession' and associated 'KieSession'
   private String name;
 
@@ -526,7 +526,7 @@
 		}
 	  catch (Exception e)
 		{
-		  logger.error(MessageCodes.EXCEPTION_ERROR, e, "stopThread", "thread.join");
+		  logger.error("stopThread in thread.join error");
 		}
 	}
 
@@ -567,7 +567,7 @@
 			}
 		  catch (Throwable e)
 			{
-			  logger.error(MessageCodes.EXCEPTION_ERROR, e, "startThread", "kieSession.fireUntilHalt");						
+			  logger.error("startThread error in kieSession.fireUntilHalt", e);						
 			}
 		}
 	  logger.info("fireUntilHalt() returned");
diff --git a/policy-core/src/main/java/org/openecomp/policy/drools/core/jmx/PdpJmxListener.java b/policy-core/src/main/java/org/openecomp/policy/drools/core/jmx/PdpJmxListener.java
index 4b48da0..87354bf 100644
--- a/policy-core/src/main/java/org/openecomp/policy/drools/core/jmx/PdpJmxListener.java
+++ b/policy-core/src/main/java/org/openecomp/policy/drools/core/jmx/PdpJmxListener.java
@@ -30,13 +30,12 @@
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectName;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PdpJmxListener {
 
-	public static final Logger logger = FlexLogger.getLogger(PdpJmxListener.class);
+	public static final Logger logger = LoggerFactory.getLogger(PdpJmxListener.class);
 	
 	public static void stop() {
 		final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
@@ -44,7 +43,9 @@
 			server.unregisterMBean(new ObjectName("PolicyEngine:type=PdpJmx"));
 		} catch (MBeanRegistrationException | InstanceNotFoundException
 				| MalformedObjectNameException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PdpJmxListener.stop()", "Could not unregister PolicyEngine:type=PdpJmx MBean with the MBean server");
+			logger.error("PdpJmxListener.stop(): " + 
+				         "Could not unregister PolicyEngine:type=PdpJmx MBean " +
+					     "with the MBean server", e);
 		}
 		
 	}
@@ -56,7 +57,9 @@
 			server.registerMBean(PdpJmx.getInstance(), new ObjectName("PolicyEngine:type=PdpJmx"));
 		} catch (InstanceAlreadyExistsException | MBeanRegistrationException
 				| NotCompliantMBeanException | MalformedObjectNameException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PdpJmxListener.start()", "Could not register PolicyEngine:type=PdpJmx MBean with the MBean server");
+			logger.error("PdpJmxListener.start(): " + 
+			             "Could not unregister PolicyEngine:type=PdpJmx MBean " +
+				         "with the MBean server", e);
 		}
 		
 	}
diff --git a/policy-endpoints/pom.xml b/policy-endpoints/pom.xml
index de95eb9..18d338c 100644
--- a/policy-endpoints/pom.xml
+++ b/policy-endpoints/pom.xml
@@ -67,6 +67,10 @@
 					<groupId>org.slf4j</groupId>
 					<artifactId>slf4j-log4j12</artifactId>
 				</exclusion>	
+				<exclusion>
+					<groupId>log4j</groupId>
+					<artifactId>log4j</artifactId>
+				</exclusion>	
 			</exclusions>
 		</dependency>	
 
@@ -155,6 +159,11 @@
 			<artifactId>commons-collections4</artifactId>
 			<version>4.1</version>
 		</dependency>
+		
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+		</dependency> 
 
 		<dependency>
 			<groupId>org.openecomp.policy.drools-pdp</groupId>
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/Topic.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/Topic.java
index d38bab5..54f49fd 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/Topic.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/Topic.java
@@ -27,7 +27,7 @@
  */
 public interface Topic {
 	
-	public static final String NETWORK_LOGGER = "networkLogger";
+	public static final String NETWORK_LOGGER = "network";
 	
 	/**
 	 * Underlying Communication infrastructure Types
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/TopicEndpoint.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/TopicEndpoint.java
index b3f236f..fa73ecb 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/TopicEndpoint.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/TopicEndpoint.java
@@ -28,9 +28,8 @@
 import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSource;
 import org.openecomp.policy.drools.event.comm.bus.UebTopicSink;
 import org.openecomp.policy.drools.event.comm.bus.UebTopicSource;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.properties.Lockable;
 import org.openecomp.policy.drools.properties.Startable;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -239,8 +238,10 @@
  * implementations according to the communication infrastructure that are supported
  */
 class ProxyTopicEndpointManager implements TopicEndpoint {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(ProxyTopicEndpointManager.class);
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(ProxyTopicEndpointManager.class);
 	/**
 	 * Is this element locked?
 	 */
@@ -386,7 +387,7 @@
 				success = endpoint.start() && success;
 			} catch (Exception e) {
 				success = false;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, endpoint.toString(), this.toString());
+				logger.error("Problem starting endpoint: {}", endpoint, e);
 			}
 		}
 		
@@ -417,7 +418,7 @@
 				success = endpoint.stop() && success;
 			} catch (Exception e) {
 				success = false;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, endpoint.toString(), this.toString());
+				logger.error("Problem stopping endpoint: {}", endpoint, e);
 			}
 		}
 		
@@ -532,7 +533,7 @@
 				if (uebSource != null)
 					sources.add(uebSource);
 			} catch (Exception e) {
-				logger.info("No UEB source for topic: " + topic);
+				logger.info("No UEB source for topic: {}", topic);
 			}
 			
 			try {
@@ -540,7 +541,7 @@
 				if (dmaapSource != null)
 					sources.add(dmaapSource);
 			} catch (Exception e) {
-				logger.info("No DMAAP source for topic: " + topic);
+				logger.info("No DMAAP source for topic: {}", topic);
 			}
 		}
 		return sources;
@@ -564,7 +565,7 @@
 				if (uebSink != null)
 					sinks.add(uebSink);
 			} catch (Exception e) {
-				logger.info("No UEB sink for topic: " + topic);
+				logger.info("No UEB sink for topic: {}", topic);
 			}
 			
 			try {
@@ -572,7 +573,7 @@
 				if (dmaapSink != null)
 					sinks.add(dmaapSink);
 			} catch (Exception e) {
-				logger.info("No DMAAP sink for topic: " + topic);
+				logger.info("No DMAAP sink for topic: {}", topic);
 			}
 		}
 		return sinks;
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSinkFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSinkFactory.java
index 4c96f9b..8b8ca53 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSinkFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSinkFactory.java
@@ -27,8 +27,8 @@
 import java.util.Map;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.event.comm.bus.internal.InlineDmaapTopicSink;
 import org.openecomp.policy.drools.properties.PolicyProperties;
 
@@ -171,8 +171,10 @@
  * Factory of DMAAP Reader Topics indexed by topic name
  */
 class IndexedDmaapTopicSinkFactory implements DmaapTopicSinkFactory {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(IndexedDmaapTopicSinkFactory.class);	
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(IndexedDmaapTopicSinkFactory.class);	
 	
 	/**
 	 * DMAAP Topic Name Index
@@ -279,7 +281,7 @@
 		
 		String writeTopics = properties.getProperty(PolicyProperties.PROPERTY_DMAAP_SINK_TOPICS);
 		if (writeTopics == null || writeTopics.isEmpty()) {
-			logger.warn("No topic for DMAAP Sink " + properties);
+			logger.info("{}: no topic for DMaaP Sink", this);
 			return new ArrayList<DmaapTopicSink>();
 		}
 		
@@ -377,7 +379,7 @@
 					dme2AdditionalProps.put(DME2_SESSION_STICKINESS_REQUIRED_PROPERTY, dme2SessionStickinessRequired);
 
 				if (servers == null || servers.isEmpty()) {
-					logger.error("No DMaaP servers or DME2 ServiceName provided");
+					logger.error("{}: no DMaaP servers or DME2 ServiceName provided", this);
 					continue;
 				}
 				
@@ -486,5 +488,12 @@
 				 new ArrayList<DmaapTopicSink>(this.dmaapTopicWriters.values());
 		 return writers;
 	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("IndexedDmaapTopicSinkFactory []");
+		return builder.toString();
+	}
 	
 }
\ No newline at end of file
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSourceFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSourceFactory.java
index a54cb6f..89793d2 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSourceFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/DmaapTopicSourceFactory.java
@@ -28,8 +28,8 @@
 import java.util.Properties;
 
 import org.openecomp.policy.drools.event.comm.bus.internal.SingleThreadedDmaapTopicSource;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.properties.PolicyProperties;
 
 /**
@@ -208,10 +208,13 @@
  */
 
 class IndexedDmaapTopicSourceFactory implements DmaapTopicSourceFactory {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(IndexedDmaapTopicSourceFactory.class);		
 	/**
-	 * UEB Topic Name Index
+	 * Logger 
+	 */
+	private static Logger logger = LoggerFactory.getLogger(IndexedDmaapTopicSourceFactory.class);	
+	
+	/**
+	 * DMaaP Topic Name Index
 	 */
 	protected HashMap<String, DmaapTopicSource> dmaapTopicSources =
 			new HashMap<String, DmaapTopicSource>();
@@ -318,7 +321,7 @@
 		
 		String readTopics = properties.getProperty(PolicyProperties.PROPERTY_DMAAP_SOURCE_TOPICS);
 		if (readTopics == null || readTopics.isEmpty()) {
-			logger.warn("No topic for UEB Source " + properties);
+			logger.info("{}: no topic for DMaaP Source", this);
 			return new ArrayList<DmaapTopicSource>();
 		}
 		List<String> readTopicList = new ArrayList<String>(Arrays.asList(readTopics.split("\\s*,\\s*")));		
@@ -426,7 +429,7 @@
 				
 				if (servers == null || servers.isEmpty()) {
 
-					logger.error("No DMaaP servers or DME2 ServiceName provided");
+					logger.error("{}: no DMaaP servers or DME2 ServiceName provided", this);
 					continue;
 				}
 				
@@ -435,7 +438,8 @@
 					try {
 						fetchTimeout = Integer.parseInt(fetchTimeoutString);
 					} catch (NumberFormatException nfe) {
-						logger.warn("Fetch Timeout in invalid format for topic " + topic + ": " + fetchTimeoutString);
+						logger.warn("{}: fetch timeout {} is in invalid format for topic {} ", 
+								    this, fetchTimeoutString, topic);
 					}
 				}
 					
@@ -447,7 +451,8 @@
 					try {
 						fetchLimit = Integer.parseInt(fetchLimitString);
 					} catch (NumberFormatException nfe) {
-						logger.warn("Fetch Limit in invalid format for topic " + topic + ": " + fetchLimitString);
+						logger.warn("{}: fetch limit {} is in invalid format for topic {} ", 
+							        this, fetchLimitString, topic);
 					}
 				}
 				
@@ -582,6 +587,12 @@
 			this.dmaapTopicSources.clear();
 		}
 	}
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("IndexedDmaapTopicSourceFactory []");
+		return builder.toString();
+	}
 	
 }
 
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSinkFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSinkFactory.java
index 4dc38f1..0469c4a 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSinkFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSinkFactory.java
@@ -27,8 +27,8 @@
 import java.util.Properties;
 
 import org.openecomp.policy.drools.event.comm.bus.internal.InlineUebTopicSink;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.properties.PolicyProperties;
 
 /**
@@ -120,8 +120,11 @@
  * Factory of UEB Reader Topics indexed by topic name
  */
 class IndexedUebTopicSinkFactory implements UebTopicSinkFactory {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(IndexedUebTopicSinkFactory.class);		
+	/**
+	 * Logger 
+	 */
+	private static Logger logger = LoggerFactory.getLogger(IndexedUebTopicSinkFactory.class);	
+	
 	/**
 	 * UEB Topic Name Index
 	 */
@@ -184,7 +187,7 @@
 		
 		String writeTopics = properties.getProperty(PolicyProperties.PROPERTY_UEB_SINK_TOPICS);
 		if (writeTopics == null || writeTopics.isEmpty()) {
-			logger.warn("No topic for UEB Sink " + properties);
+			logger.info("{}: no topic for UEB Sink", this);
 			return new ArrayList<UebTopicSink>();
 		}
 		
@@ -201,7 +204,7 @@
 				                                        topic + 
 				                                        PolicyProperties.PROPERTY_TOPIC_SERVERS_SUFFIX);
 				if (servers == null || servers.isEmpty()) {
-					logger.error("No UEB servers provided in " + properties);
+					logger.error("{}: no UEB servers configured for sink {}", this, topic);
 					continue;
 				}
 				
@@ -319,5 +322,13 @@
 				 new ArrayList<UebTopicSink>(this.uebTopicSinks.values());
 		 return writers;
 	}
+
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("IndexedUebTopicSinkFactory []");
+		return builder.toString();
+	}
 	
 }
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSourceFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSourceFactory.java
index 474d4a8..77b894d 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSourceFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/UebTopicSourceFactory.java
@@ -27,8 +27,8 @@
 import java.util.Properties;
 
 import org.openecomp.policy.drools.event.comm.bus.internal.SingleThreadedUebTopicSource;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.properties.PolicyProperties;
 
 /**
@@ -144,8 +144,11 @@
  * Factory of UEB Source Topics indexed by topic name
  */
 class IndexedUebTopicSourceFactory implements UebTopicSourceFactory {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(IndexedUebTopicSourceFactory.class);	
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(IndexedUebTopicSourceFactory.class);	
+	
 	/**
 	 * UEB Topic Name Index
 	 */
@@ -203,7 +206,7 @@
 		
 		String readTopics = properties.getProperty(PolicyProperties.PROPERTY_UEB_SOURCE_TOPICS);
 		if (readTopics == null || readTopics.isEmpty()) {
-			logger.warn("No topic for UEB Source " + properties);
+			logger.info("{}: no topic for UEB Source", this);
 			return new ArrayList<UebTopicSource>();
 		}
 		List<String> readTopicList = new ArrayList<String>(Arrays.asList(readTopics.split("\\s*,\\s*")));		
@@ -221,7 +224,7 @@
                                                         PolicyProperties.PROPERTY_TOPIC_SERVERS_SUFFIX);
 				
 				if (servers == null || servers.isEmpty()) {
-					logger.error("No UEB servers provided in " + properties);
+					logger.error("{}: no UEB servers configured for sink {}", this, topic);
 					continue;
 				}
 				
@@ -251,7 +254,8 @@
 					try {
 						fetchTimeout = Integer.parseInt(fetchTimeoutString);
 					} catch (NumberFormatException nfe) {
-						logger.warn("Fetch Timeout in invalid format for topic " + topic + ": " + fetchTimeoutString);
+						logger.warn("{}: fetch timeout {} is in invalid format for topic {} ", 
+							        this, fetchTimeoutString, topic);
 					}
 				}
 					
@@ -263,7 +267,8 @@
 					try {
 						fetchLimit = Integer.parseInt(fetchLimitString);
 					} catch (NumberFormatException nfe) {
-						logger.warn("Fetch Limit in invalid format for topic " + topic + ": " + fetchLimitString);
+						logger.warn("{}: fetch limit {} is in invalid format for topic {} ", 
+						            this, fetchLimitString, topic);
 					}
 				}
 				
@@ -388,5 +393,12 @@
 			this.uebTopicSources.clear();
 		}
 	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("IndexedUebTopicSourceFactory []");
+		return builder.toString();
+	}
 	
 }
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusConsumer.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusConsumer.java
index 6ea2157..d8eb80b 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusConsumer.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusConsumer.java
@@ -27,9 +27,10 @@
 import java.util.Map;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
 import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSinkFactory;
 import org.openecomp.policy.drools.properties.PolicyProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.att.nsa.cambria.client.CambriaClientBuilders;
 import com.att.nsa.cambria.client.CambriaConsumer;
@@ -62,6 +63,7 @@
 	 * Cambria based consumer
 	 */
 	public static class CambriaConsumerWrapper implements BusConsumer {
+		
 		/**
 		 * Cambria client
 		 */
@@ -154,7 +156,9 @@
 	/**
 	 * MR based consumer
 	 */
-	public abstract class DmaapConsumerWrapper implements BusConsumer {
+	public abstract class DmaapConsumerWrapper implements BusConsumer {	
+		
+		private static Logger logger = LoggerFactory.getLogger(DmaapConsumerWrapper.class);
 		
 		protected int fetchTimeout;
 		protected Object closeCondition = new Object();
@@ -206,19 +210,30 @@
 		 */
 		public Iterable<String> fetch() throws Exception {
 			MRConsumerResponse response = this.consumer.fetchWithReturnConsumerResponse();
-
-			if (PolicyLogger.isDebugEnabled() && response != null)
-				PolicyLogger.debug(DmaapConsumerWrapper.class.getName(), "DMaaP consumer received " + response.getResponseCode() + ": " + response.getResponseMessage());
-
-			if (response.getResponseCode() == null || !response.getResponseCode().equals("200")) {
-				if (response.getResponseCode() == null)
-					PolicyLogger.error(DmaapConsumerWrapper.class.getName(), "DMaaP consumer received response code null"); 
-				else
-					PolicyLogger.error(DmaapConsumerWrapper.class.getName(), "DMaaP consumer received " + response.getResponseCode() + ": " + response.getResponseMessage());
+			if (response == null) {
+				logger.warn("{}: DMaaP NULL response received", this);
 				
 				synchronized (closeCondition) {
 					closeCondition.wait(fetchTimeout);
 				}
+				return new ArrayList<String>();
+			} else {
+				logger.debug("DMaaP consumer received {} : {}" + 
+		                      response.getResponseCode(), 
+					          response.getResponseMessage());
+				
+				if (response.getResponseCode() == null || 
+					!response.getResponseCode().equals("200")) {
+					
+					logger.error("DMaaP consumer received: {} : {}", 
+							     response.getResponseCode(), 
+							     response.getResponseMessage());
+					
+					synchronized (closeCondition) {
+						closeCondition.wait(fetchTimeout);
+					}
+					/* fall through */
+				}
 			}
 			
 			if (response.getActualMessages() == null)
@@ -257,6 +272,9 @@
 	 * MR based consumer
 	 */
 	public static class DmaapAafConsumerWrapper extends DmaapConsumerWrapper {
+		
+		private static Logger logger = LoggerFactory.getLogger(DmaapAafConsumerWrapper.class);
+		
 		private Properties props;
 		
 		/**
@@ -306,7 +324,7 @@
 			}
 
 			this.consumer.setProps(props);
-			PolicyLogger.info(DmaapConsumerWrapper.class.getName(), "CREATION: " + this);
+			logger.info("{}: CREATION", this);
 		}
 		
 		@Override
@@ -327,6 +345,9 @@
 	}
 	
 	public static class DmaapDmeConsumerWrapper extends DmaapConsumerWrapper {
+		
+		private static Logger logger = LoggerFactory.getLogger(DmaapDmeConsumerWrapper.class);
+		
 		private Properties props;
 		
 		public DmaapDmeConsumerWrapper(List<String> servers, String topic, 
@@ -425,7 +446,7 @@
 			MRClientFactory.prop = props;
 			this.consumer.setProps(props);
 			
-			PolicyLogger.info(DmaapConsumerWrapper.class.getName(), "CREATION: " + this);
+			logger.info("{}: CREATION", this);
 		}
 	}
 }
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusPublisher.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusPublisher.java
index b5595b2..54e0bcb 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusPublisher.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/BusPublisher.java
@@ -28,9 +28,9 @@
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
 import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSinkFactory;
 import org.openecomp.policy.drools.properties.PolicyProperties;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.att.nsa.cambria.client.CambriaBatchingPublisher;
@@ -62,6 +62,8 @@
 	 * Cambria based library publisher
 	 */
 	public static class CambriaPublisherWrapper implements BusPublisher {
+		
+		private static Logger logger = LoggerFactory.getLogger(CambriaPublisherWrapper.class);
 
 		/**
 		 * The actual Cambria publisher
@@ -111,10 +113,8 @@
 			try {
 				this.publisher.send(partitionId, message);
 			} catch (Exception e) {
-				PolicyLogger.warn(CambriaPublisherWrapper.class.getName(), 
-		                          "SEND of " + message + " IN " +
-		                          this + " cannot be performed because of " + 
-						          e.getMessage());
+				logger.warn("{}: SEND of {} cannot be performed because of {}",
+						    this, message, e.getMessage(), e);
 				return false;
 			}
 			return true;			
@@ -125,16 +125,13 @@
 		 */
 		@Override
 		public void close() {
-			if (PolicyLogger.isInfoEnabled())
-				PolicyLogger.info(CambriaPublisherWrapper.class.getName(), 
-				                  "CREATION: " + this);
+			logger.info("{}: CLOSE", this);
 			
 			try {
 				this.publisher.close();
 			} catch (Exception e) {
-				PolicyLogger.warn(CambriaPublisherWrapper.class.getName(), 
-				                  "CLOSE on " + this + " FAILED because of " + 
-								  e.getMessage());
+				logger.warn("{}: CLOSE FAILED because of {}", 
+						    this, e.getMessage(),e);
 			}
 		}
 		
@@ -155,6 +152,9 @@
 	 * DmaapClient library wrapper
 	 */
 	public abstract class DmaapPublisherWrapper implements BusPublisher {
+		
+		private static Logger logger = LoggerFactory.getLogger(DmaapPublisherWrapper.class);
+		
 		/**
 		 * MR based Publisher
 		 */		
@@ -175,9 +175,9 @@
 				                     String password, boolean useHttps) throws IllegalArgumentException {
 
 			
-			if (topic == null || topic.isEmpty()) {
+			if (topic == null || topic.isEmpty())
 				throw new IllegalArgumentException("No topic for DMaaP");
-			}
+
 			
 			if (protocol == ProtocolTypeConstants.AAF_AUTH) {
 				if (servers == null || servers.isEmpty())
@@ -215,7 +215,6 @@
 												build();
 				
 				this.publisher.setProtocolFlag(ProtocolTypeConstants.DME2.getValue());
-				
 			}
 			
 			this.publisher.logTo(LoggerFactory.getLogger(MRSimplerBatchPublisher.class.getName()));
@@ -225,14 +224,10 @@
 			
 			props = new Properties();
 						
-			if(useHttps){
-				
+			if (useHttps) {				
 				props.setProperty("Protocol", "https");
-			}
-			else{
-				
+			} else {			
 				props.setProperty("Protocol", "http");
-				
 			}
 
 			props.setProperty("contenttype", "application/json");
@@ -246,13 +241,7 @@
 			if (protocol == ProtocolTypeConstants.AAF_AUTH)
 				this.publisher.setHost(servers.get(0));
 			
-			if (PolicyLogger.isInfoEnabled()) {
-				PolicyLogger.info(DmaapPublisherWrapper.class.getName(), 
-						          "CREATION: " + this);
-				PolicyLogger.info(DmaapPublisherWrapper.class.getName(), 
-						"BusPublisher.DmaapPublisherWrapper using Protocol: " + protocol.getValue());
-			}
-			
+			logger.info("{}: CREATION: using protocol {}", this, protocol.getValue());
 		}
 
 		/**
@@ -260,16 +249,13 @@
 		 */
 		@Override
 		public void close() {
-			if (PolicyLogger.isInfoEnabled())
-				PolicyLogger.info(DmaapPublisherWrapper.class.getName(), 
-				                  "CREATION: " + this);
+			logger.info("{}: CLOSE", this);
 			
 			try {
 				this.publisher.close(1, TimeUnit.SECONDS);
 			} catch (Exception e) {
-				PolicyLogger.warn(DmaapPublisherWrapper.class.getName(), 
-				                  "CLOSE: " + this + " because of " + 
-								  e.getMessage());
+				logger.warn("{}: CLOSE FAILED because of {}",
+						    this, e.getMessage(), e);
 			}
 		}
 		
@@ -285,15 +271,13 @@
 			this.publisher.setPubResponse(new MRPublisherResponse());
 			this.publisher.send(partitionId, message);
 			MRPublisherResponse response = this.publisher.sendBatchWithResponse();
-			if (PolicyLogger.isDebugEnabled() && response != null) {
-				PolicyLogger.debug(DmaapPublisherWrapper.class.getName(),
-						"DMaaP publisher received " + response.getResponseCode() + ": "
-						+ response.getResponseMessage());
-				
+			if (response != null) {
+				logger.debug("DMaaP publisher received {} : {}",
+						     response.getResponseCode(), 
+						     response.getResponseMessage());
 			}
 
 			return true;
-			
 		}
 		
 		@Override
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineBusTopicSink.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineBusTopicSink.java
index a78de71..6403774 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineBusTopicSink.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineBusTopicSink.java
@@ -23,11 +23,9 @@
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.log4j.Logger;
-
 import org.openecomp.policy.drools.event.comm.bus.BusTopicSink;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 
 /**
  * Transport Agnostic Bus Topic Sink to carry out the core functionality
@@ -37,16 +35,10 @@
 public abstract class InlineBusTopicSink extends BusTopicBase implements BusTopicSink {
 	
 	/**
-	 * logger 
+	 * loggers
 	 */
-	private static org.openecomp.policy.common.logging.flexlogger.Logger logger = 
-										FlexLogger.getLogger(InlineBusTopicSink.class);
-	
-	/**
-	 * Not to be converted to PolicyLogger.
-	 * This will contain all in/out traffic and only that in a single file in a concise format.
-	 */
-	protected static final Logger networkLogger = Logger.getLogger(NETWORK_LOGGER);
+	private static Logger logger = LoggerFactory.getLogger(InlineBusTopicSink.class);
+	private static final Logger netLogger = LoggerFactory.getLogger(NETWORK_LOGGER);
 	
 	/**
 	 * The partition key to publish to
@@ -109,8 +101,7 @@
 	@Override
 	public boolean start() throws IllegalStateException {
 		
-		if (logger.isInfoEnabled())
-			logger.info("START: " + this);
+		logger.info("{}: starting", this);
 		
 		synchronized(this) {
 			
@@ -144,11 +135,11 @@
 			try {
 				publisherCopy.close();
 			} catch (Exception e) {
-				logger.warn(MessageCodes.EXCEPTION_ERROR, e, "PUBLISHER.CLOSE", this.toString());
-				e.printStackTrace();
+				logger.warn("{}: cannot stop publisher because of {}", 
+						    this, e.getMessage(), e);
 			}
 		} else {
-			logger.warn("No publisher to close: " + this);
+			logger.warn("{}: there is no publisher", this);
 			return false;
 		}
 		
@@ -161,8 +152,7 @@
 	@Override
 	public boolean lock() {
 		
-		if (logger.isInfoEnabled())
-			logger.info("LOCK: " + this);	
+		logger.info("{}: locking", this);	
 		
 		synchronized (this) {
 			if (this.locked)
@@ -180,8 +170,7 @@
 	@Override
 	public boolean unlock() {
 		
-		if (logger.isInfoEnabled())
-			logger.info("UNLOCK: " + this);
+		logger.info("{}: unlocking", this);
 		
 		synchronized(this) {
 			if (!this.locked)
@@ -193,9 +182,8 @@
 		try {
 			return this.start();
 		} catch (Exception e) {
-			logger.warn("can't start after unlocking " + this + 
-					     " because of " + e.getMessage());
-			e.printStackTrace();
+			logger.warn("{}: cannot start after unlocking because of {}", 
+					    this, e.getMessage(), e);
 			return false;
 		}
 	}
@@ -235,17 +223,12 @@
 				this.recentEvents.add(message);
 			}
 			
-			if (networkLogger.isInfoEnabled()) {
-				networkLogger.info("[OUT|" + this.getTopicCommInfrastructure() + "|" + 
-			                       this.topic + "]:" + 
-			                       message);
-			}
+			netLogger.info("[OUT|{}|{}]{}{}", this.getTopicCommInfrastructure(), 
+			               this.topic, System.lineSeparator(), message);
 			
 			publisher.send(this.partitionId, message);
 		} catch (Exception e) {
-			logger.error("can't start after unlocking " + this + 
-				         " because of " + e.getMessage());
-			e.printStackTrace();
+			logger.warn("{}: cannot send because of {}", this, e.getMessage(), e);
 			return false;
 		}
 		
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineDmaapTopicSink.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineDmaapTopicSink.java
index f5a3dc1..a78dd0f 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineDmaapTopicSink.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineDmaapTopicSink.java
@@ -23,8 +23,8 @@
 import java.util.List;
 import java.util.Map;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSink;
 
@@ -35,7 +35,7 @@
 public class InlineDmaapTopicSink extends InlineBusTopicSink implements DmaapTopicSink {
 	
 	protected static Logger logger = 
-			FlexLogger.getLogger(InlineDmaapTopicSink.class);
+			LoggerFactory.getLogger(InlineDmaapTopicSink.class);
 	
 	protected final String userName;
 	protected final String password;
@@ -128,8 +128,8 @@
 						                               this.partner, this.latitude, this.longitude,
 						                               this.additionalProps, this.useHttps);
 		}
-		if (logger.isInfoEnabled())
-			logger.info("DMAAP SINK TOPIC created " + this);
+		
+		logger.info("{}: DMAAP SINK created", this);
 	}
 
 	/**
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineUebTopicSink.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineUebTopicSink.java
index c93e0f2..3b091f5 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineUebTopicSink.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/InlineUebTopicSink.java
@@ -24,7 +24,7 @@
 
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.bus.UebTopicSink;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This implementation publishes events for the associated UEB topic,
@@ -35,8 +35,8 @@
 	/**
 	 * logger 
 	 */
-	private static org.openecomp.policy.common.logging.flexlogger.Logger logger = 
-										FlexLogger.getLogger(InlineUebTopicSink.class);
+	private static org.slf4j.Logger logger = 
+										LoggerFactory.getLogger(InlineUebTopicSink.class);
 	
 	/**
 	 * Argument-based UEB Topic Writer instantiation
@@ -74,8 +74,7 @@
 						                                 this.apiKey, 
 						                                 this.apiSecret,
 						                                 this.useHttps);
-		if (logger.isInfoEnabled())
-			logger.info("UEB SINK TOPIC created " + this);
+		logger.info("{}: UEB SINK created", this);
 	}
 	
 	@Override
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedBusTopicSource.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedBusTopicSource.java
index d3be916..85da3f0 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedBusTopicSource.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedBusTopicSource.java
@@ -24,12 +24,11 @@
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import org.openecomp.policy.drools.event.comm.TopicListener;
 import org.openecomp.policy.drools.event.comm.bus.BusTopicSource;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
 
 /**
  * This topic source implementation specializes in reading messages
@@ -39,12 +38,12 @@
        extends BusTopicBase
        implements Runnable, BusTopicSource {
 	   
-	private String className = SingleThreadedBusTopicSource.class.getName();
 	/**
 	 * Not to be converted to PolicyLogger.
 	 * This will contain all instract /out traffic and only that in a single file in a concise format.
 	 */
-	protected static final Logger networkLogger = Logger.getLogger(NETWORK_LOGGER);
+	private static Logger logger = LoggerFactory.getLogger(InlineBusTopicSink.class);
+	private static final Logger netLogger = LoggerFactory.getLogger(NETWORK_LOGGER);
 	
 	/**
 	 * Bus consumer group
@@ -165,7 +164,7 @@
 	public void register(TopicListener topicListener) 
 		throws IllegalArgumentException {		
 		
-		PolicyLogger.info(className,"REGISTER: " + topicListener + " INTO " + this);
+		logger.info("{}: registering {}", this, topicListener);
 		
 		synchronized(this) {
 			if (topicListener == null)
@@ -185,8 +184,8 @@
 		try {
 			this.start();
 		} catch (Exception e) {
-			PolicyLogger.info(className, "new registration of " + topicListener +  
-					          ",but can't start source because of " + e.getMessage());
+			logger.warn("{}: cannot start after registration of because of: {}",
+		                this, topicListener, e.getMessage(), e);
 		}
 	}
 
@@ -196,7 +195,7 @@
 	@Override
 	public void unregister(TopicListener topicListener) {
 		
-		PolicyLogger.info(className, "UNREGISTER: " + topicListener + " FROM " + this);
+		logger.info("{}: unregistering {}", this, topicListener);
 		
 		boolean stop = false;
 		synchronized (this) {
@@ -217,7 +216,8 @@
 	 */
 	@Override
 	public boolean lock() {	
-		PolicyLogger.info(className, "LOCK: " + this);
+
+		logger.info("{}: locking", this);
 		
 		synchronized (this) {
 			if (this.locked)
@@ -233,8 +233,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public boolean unlock() {
-		PolicyLogger.info(className, "UNLOCK: " + this);
+	public boolean unlock() {		
+		logger.info("{}: unlocking", this);
 		
 		synchronized(this) {
 			if (!this.locked)
@@ -246,8 +246,7 @@
 		try {
 			return this.start();
 		} catch (Exception e) {
-			PolicyLogger.warn("can't start after unlocking " + this + 
-					          " because of " + e.getMessage());
+			logger.warn("{}: cannot after unlocking because of {}", this, e.getMessage(), e);
 			return false;
 		}
 	}
@@ -256,19 +255,16 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public boolean start() throws IllegalStateException {
-		
-		PolicyLogger.info(className, "START: " + this);
+	public boolean start() throws IllegalStateException {		
+		logger.info("{}: starting", this);
 		
 		synchronized(this) {
 			
-			if (alive) {
+			if (alive)
 				return true;
-			}
 			
-			if (locked) {
+			if (locked)
 				throw new IllegalStateException(this + " is locked.");
-			}
 			
 			if (this.busPollerThread == null || 
 				!this.busPollerThread.isAlive() || 
@@ -281,7 +277,7 @@
 					this.busPollerThread.setName(this.getTopicCommInfrastructure() + "-source-" + this.getTopic());
 					busPollerThread.start();
 				} catch (Exception e) {
-					e.printStackTrace();
+					logger.warn("{}: cannot start because of {}", this, e.getMessage(), e);
 					throw new IllegalStateException(e);
 				}
 			}
@@ -295,7 +291,7 @@
 	 */
 	@Override
 	public boolean stop() {
-		PolicyLogger.info(className, "STOP: " + this);
+		logger.info("{}: stopping", this);
 		
 		synchronized(this) {
 			BusConsumer consumerCopy = this.consumer;
@@ -307,7 +303,7 @@
 				try {
 					consumerCopy.close();
 				} catch (Exception e) {
-					PolicyLogger.warn(MessageCodes.EXCEPTION_ERROR, e, "CONSUMER.CLOSE", this.toString());
+					logger.warn("{}: stop failed because of {}", this, e.getMessage(), e);
 				}
 			}
 		}
@@ -341,8 +337,8 @@
 			try {
 				topicListener.onTopicEvent(this.getTopicCommInfrastructure(), this.topic, message);
 			} catch (Exception e) {
-				PolicyLogger.warn(this.className, "ERROR notifying " + topicListener.toString() + 
-						          " because of " + e.getMessage() + " @ " + this.toString());
+				logger.warn("{}: notification error @ {} because of {}", 
+						    this, topicListener, e.getMessage(), e);
 				success = false;
 			}
 		}
@@ -372,24 +368,21 @@
 						this.recentEvents.add(event);
 					}
 					
-					if (networkLogger.isInfoEnabled()) {
-						networkLogger.info("IN[" + this.getTopicCommInfrastructure() + "|" + 
-						                   this.topic + "]:" + 
-						                   event);
-					}
+					netLogger.info("[IN|{}|{}]{}{}",
+						           this.getTopicCommInfrastructure(), this.topic, 
+						           System.lineSeparator(), event);
 					
-					PolicyLogger.info(className, this.topic + " <-- " + event);
 					broadcast(event);
 					
 					if (!this.alive)
 						break;
 				}
 			} catch (Exception e) {
-				PolicyLogger.error( MessageCodes.EXCEPTION_ERROR, className, e, "CONSUMER.FETCH", this.toString());
+				logger.error("{}: cannot fetch because of ", this, e.getMessage(), e);
 			}
 		}
 		
-		PolicyLogger.warn(this.className, "Exiting: " + this);
+		logger.info("{}: exiting thread", this);
 	}
 	
 	/**
@@ -397,8 +390,6 @@
 	 */
 	@Override
 	public boolean offer(String event) {
-		PolicyLogger.info(className, "OFFER: " + event + " TO " + this);
-		
 		if (!this.alive) {
 			throw new IllegalStateException(this + " is not alive.");
 		}
@@ -407,11 +398,8 @@
 			this.recentEvents.add(event);
 		}
 		
-		if (networkLogger.isInfoEnabled()) {
-			networkLogger.info("IN[" + this.getTopicCommInfrastructure() + "|" + 
-			                    this.topic + "]:" + 
-			                    event);
-		}
+		netLogger.info("[IN|{}|{}]{}{}",this.getTopicCommInfrastructure(),this.topic, 
+				       System.lineSeparator(), event);
 		
 		
 		return broadcast(event);
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
index 2ced5bc..7e3e315 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
@@ -23,22 +23,23 @@
 import java.util.List;
 import java.util.Map;
 
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.bus.DmaapTopicSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This topic reader implementation specializes in reading messages
  * over DMAAP topic and notifying its listeners
  */
 public class SingleThreadedDmaapTopicSource extends SingleThreadedBusTopicSource
-                                            implements DmaapTopicSource, Runnable {
-	
+                                            implements DmaapTopicSource, Runnable {	
 
+	private static Logger logger = LoggerFactory.getLogger(SingleThreadedDmaapTopicSource.class);
+	
 	protected boolean allowSelfSignedCerts;
 	protected final String userName;
 	protected final String password;
-	private String className = SingleThreadedDmaapTopicSource.class.getName();
 	
 	protected String environment = null;
 	protected String aftEnvironment = null;
@@ -98,7 +99,7 @@
 		try {
 			this.init();
 		} catch (Exception e) {
-			e.printStackTrace();
+			logger.error("ERROR during init of topic {}", this.topic);
 			throw new IllegalArgumentException(e);
 		}
 	}
@@ -135,7 +136,7 @@
 		try {
 			this.init();
 		} catch (Exception e) {
-			e.printStackTrace();
+			logger.warn("dmaap-source: cannot create topic {} because of {}", topic, e.getMessage(), e);
 			throw new IllegalArgumentException(e);
 		}
 	}
@@ -154,29 +155,29 @@
 								                           this.consumerGroup, this.consumerInstance,
 								                           this.fetchTimeout, this.fetchLimit,
 								                           this.useHttps, this.allowSelfSignedCerts);
-			} else if ((this.environment == null    || this.environment.isEmpty()) &&
-					   (this.aftEnvironment == null || this.aftEnvironment.isEmpty()) &&
-					   (this.latitude == null	   || this.latitude.isEmpty()) &&
-					   (this.longitude == null	   || this.longitude.isEmpty()) &&
-					   (this.partner == null 	   || this.partner.isEmpty())) {
-				this.consumer =
-						new BusConsumer.DmaapAafConsumerWrapper(this.servers, this.topic, 
-								                            this.apiKey, this.apiSecret,
-								                            this.userName, this.password,
-								                            this.consumerGroup, this.consumerInstance,
-								                            this.fetchTimeout, this.fetchLimit, this.useHttps);
-			} else {
-				this.consumer =
-						new BusConsumer.DmaapDmeConsumerWrapper(this.servers, this.topic, 
-								                            this.apiKey, this.apiSecret,
-								                            this.userName, this.password,
-								                            this.consumerGroup, this.consumerInstance,
-								                            this.fetchTimeout, this.fetchLimit,
-								                            this.environment, this.aftEnvironment, this.partner,
-								                            this.latitude, this.longitude, this.additionalProps, this.useHttps);
-			}
+		} else if ((this.environment == null    || this.environment.isEmpty()) &&
+				   (this.aftEnvironment == null || this.aftEnvironment.isEmpty()) &&
+				   (this.latitude == null	   || this.latitude.isEmpty()) &&
+				   (this.longitude == null	   || this.longitude.isEmpty()) &&
+				   (this.partner == null 	   || this.partner.isEmpty())) {
+			this.consumer =
+					new BusConsumer.DmaapAafConsumerWrapper(this.servers, this.topic, 
+							                            this.apiKey, this.apiSecret,
+							                            this.userName, this.password,
+							                            this.consumerGroup, this.consumerInstance,
+							                            this.fetchTimeout, this.fetchLimit, this.useHttps);
+		} else {
+			this.consumer =
+					new BusConsumer.DmaapDmeConsumerWrapper(this.servers, this.topic, 
+							                            this.apiKey, this.apiSecret,
+							                            this.userName, this.password,
+							                            this.consumerGroup, this.consumerInstance,
+							                            this.fetchTimeout, this.fetchLimit,
+							                            this.environment, this.aftEnvironment, this.partner,
+							                            this.latitude, this.longitude, this.additionalProps, this.useHttps);
+		}
 			
-		PolicyLogger.info(className, "CREATION: " + this);
+		logger.info("{}: INITTED", this);
 	}
 	
 	/**
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/HttpClientFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/HttpClientFactory.java
index 53a8c2b..15586b6 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/HttpClientFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/HttpClientFactory.java
@@ -27,6 +27,8 @@
 
 import org.openecomp.policy.drools.http.client.internal.JerseyClient;
 import org.openecomp.policy.drools.properties.PolicyProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public interface HttpClientFactory {
 	
@@ -50,6 +52,11 @@
 
 class IndexedHttpClientFactory implements HttpClientFactory {
 	
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(IndexedHttpClientFactory.class);
+	
 	protected HashMap<String, HttpClient> clients = new HashMap<String, HttpClient>();
 
 	@Override
@@ -105,7 +112,7 @@
 				}
 				port = Integer.parseInt(servicePortString);
 			} catch (NumberFormatException nfe) {
-				nfe.printStackTrace();
+				logger.error("http-client-factory: cannot parse port {}", servicePortString, nfe);
 				continue;
 			}
 			
@@ -135,7 +142,7 @@
 								   userName, password, managed);
 				clientList.add(client);
 			} catch (Exception e) {
-				e.printStackTrace();
+				logger.error("http-client-factory: cannot build client {}", clientName, e);
 			}
 		}
 		
@@ -166,7 +173,7 @@
 		try {
 			client.shutdown();
 		} catch (IllegalStateException e) {
-			e.printStackTrace();
+			logger.error("http-client-factory: cannot shutdown client {}", client, e);
 		}
 	}
 
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/internal/JerseyClient.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/internal/JerseyClient.java
index 4fa59dc..f041b07 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/internal/JerseyClient.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/client/internal/JerseyClient.java
@@ -35,11 +35,18 @@
 
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.openecomp.policy.drools.http.client.HttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
 public class JerseyClient implements HttpClient {
 	
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(JerseyClient.class); 
+	
 	protected final String name;
 	protected final boolean https;
 	protected final boolean selfSignedCerts;
@@ -156,7 +163,8 @@
 		try {
 			this.client.close();
 		} catch (Exception e) {
-			e.printStackTrace();
+			logger.warn("{}: cannot close because of {}", this, 
+				        e.getMessage(), e);
 		}
 	}
 
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/HttpServletServerFactory.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/HttpServletServerFactory.java
index 40f5c9a..83f4b3d 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/HttpServletServerFactory.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/HttpServletServerFactory.java
@@ -25,8 +25,8 @@
 import java.util.List;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 import org.openecomp.policy.drools.http.server.internal.JettyJerseyServer;
 import org.openecomp.policy.drools.properties.PolicyProperties;
 
@@ -95,7 +95,7 @@
 	/**
 	 * logger
 	 */
-	protected static Logger logger = FlexLogger.getLogger(IndexedHttpServletServerFactory.class);	
+	protected static Logger logger = LoggerFactory.getLogger(IndexedHttpServletServerFactory.class);	
 	
 	/**
 	 * servers index
@@ -126,7 +126,7 @@
 		
 		String serviceNames = properties.getProperty(PolicyProperties.PROPERTY_HTTP_SERVER_SERVICES);
 		if (serviceNames == null || serviceNames.isEmpty()) {
-			logger.warn("No topic for HTTP Service " + properties);
+			logger.warn("No topic for HTTP Service: {}", properties);
 			return serviceList;
 		}
 		
@@ -142,13 +142,13 @@
 			try {
 				if (servicePortString == null || servicePortString.isEmpty()) {
 					if (logger.isWarnEnabled())
-						logger.warn("No HTTP port for service in " + serviceName);
+						logger.warn("No HTTP port for service in {}", serviceName);
 					continue;
 				}
 				servicePort = Integer.parseInt(servicePortString);
 			} catch (NumberFormatException nfe) {
 				if (logger.isWarnEnabled())
-					logger.warn("No HTTP port for service in " + serviceName);
+					logger.warn("No HTTP port for service in {}", serviceName);
 				continue;
 			}
 			
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyJerseyServer.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyJerseyServer.java
index 5bc320e..c60a62c 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyJerseyServer.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyJerseyServer.java
@@ -24,8 +24,8 @@
 import java.util.HashMap;
 
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 
 import io.swagger.jersey.config.JerseyJaxrsConfig;
 
@@ -67,7 +67,7 @@
 	/**
 	 * Logger
 	 */
-	protected static Logger logger = FlexLogger.getLogger(JettyJerseyServer.class);
+	protected static Logger logger = LoggerFactory.getLogger(JettyJerseyServer.class);
 	
 	/**
 	 * Container for servlets
@@ -112,7 +112,7 @@
 			try {
 				hostname = InetAddress.getLocalHost().getHostName();
 			} catch (UnknownHostException e) {
-				logger.warn("can't resolve connector's hostname: " + this);
+				logger.warn("{}: can't resolve connector's hostname: ", this);
 				hostname = "localhost";
 			}
 		}
@@ -125,7 +125,7 @@
 		swaggerServlet.setInitOrder(2);
 		
         if (logger.isDebugEnabled())
-        	logger.debug(this + "Swagger Servlet has been attached: " + swaggerServlet.dump());
+        	logger.debug("{}: Swagger Servlet has been attached: {}", this, swaggerServlet.dump());
 	}	
 	
 	/**
@@ -165,7 +165,7 @@
 		String initClasses = 
 				jerseyServlet.getInitParameter(JERSEY_INIT_CLASSNAMES_PARAM_NAME);
 		if (initClasses != null && !initClasses.isEmpty())
-			logger.warn("Both packages and classes are used in Jetty+Jersey Configuration: " + restPackage);
+			logger.warn("Both packages and classes are used in Jetty+Jersey Configuration: {}", restPackage);
 		
 		String initPackages = 
 				jerseyServlet.getInitParameter(JERSEY_INIT_PACKAGES_PARAM_NAME);
@@ -188,7 +188,7 @@
         jerseyServlet.setInitParameter(JERSEY_INIT_PACKAGES_PARAM_NAME,  initPackages);
         
         if (logger.isDebugEnabled())
-        	logger.debug(this + "Added REST Package: " + jerseyServlet.dump());
+        	logger.debug("{}: added REST package: {}", this, jerseyServlet.dump());
 	}
 	
 	@Override
@@ -206,7 +206,7 @@
 		String initPackages = 
 				jerseyServlet.getInitParameter(JERSEY_INIT_PACKAGES_PARAM_NAME);
 		if (initPackages != null && !initPackages.isEmpty())
-			logger.warn("Both classes and packages are used in Jetty+Jersey Configuration: " + restClass);
+			logger.warn("Both classes and packages are used in Jetty+Jersey Configuration: {}", restClass);
 		
 		String initClasses = 
 				jerseyServlet.getInitParameter(JERSEY_INIT_CLASSNAMES_PARAM_NAME);
@@ -228,7 +228,7 @@
         jerseyServlet.setInitParameter(JERSEY_INIT_CLASSNAMES_PARAM_NAME, initClasses);
         
         if (logger.isDebugEnabled())
-        	logger.debug(this + "Added REST Class: " + jerseyServlet.dump());
+        	logger.debug("{}: added REST class: {}", this, jerseyServlet.dump());
 	}
 	
 	@Override
diff --git a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyServletServer.java b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyServletServer.java
index 74360e8..009ad30 100644
--- a/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyServletServer.java
+++ b/policy-endpoints/src/main/java/org/openecomp/policy/drools/http/server/internal/JettyServletServer.java
@@ -28,11 +28,9 @@
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.util.security.Constraint;
 import org.eclipse.jetty.util.security.Credential;
-
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
 import org.openecomp.policy.drools.http.server.HttpServletServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
@@ -41,7 +39,7 @@
  */
 public abstract class JettyServletServer implements HttpServletServer, Runnable {
 	
-	private static Logger logger = FlexLogger.getLogger(JettyServletServer.class);
+	private static Logger logger = LoggerFactory.getLogger(JettyServletServer.class);
 
 	protected final String name;
 
@@ -141,25 +139,27 @@
 	 */
 	@Override
 	public void run() {
-        try {        	
-        	if (logger.isInfoEnabled())
-        		logger.info(this + " STARTING " + this.jettyServer.dump());
+        try {
+        	logger.info("{}: STARTING", this);
         	
             this.jettyServer.start();
             
+            if (logger.isInfoEnabled()) 
+            	logger.info("{}: STARTED: {}", this, this.jettyServer.dump());
+            
         	synchronized(this.startCondition) {
         		this.startCondition.notifyAll();
         	}
         	
             this.jettyServer.join();
         } catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e,  
-	                    "Error found while running management server", this.toString());
+			logger.error("{}: error found while bringing up server", this, e);
 		} 
 	}
 	
 	@Override
 	public boolean waitedStart(long maxWaitTime) throws IllegalArgumentException {
+		logger.info("{}: WAITED-START", this);
 		
 		if (maxWaitTime < 0)
 			throw new IllegalArgumentException("max-wait-time cannot be negative");
@@ -184,15 +184,13 @@
 					long endTs = System.currentTimeMillis();
 					pendingWaitTime = pendingWaitTime - (endTs - startTs);
 					
-					if (logger.isInfoEnabled())
-						logger.info(this + "Pending time is " + pendingWaitTime + 
-								    " ms.");
+					logger.info("{}: pending time is {} ms.", this, pendingWaitTime);
 					
 					if (pendingWaitTime <= 0)
 						return false;
 					
 				} catch (InterruptedException e) {
-					logger.warn("waited-start has been interrupted");
+					logger.warn("{}: waited-start has been interrupted", this);
 					return false;			
 				}
 			}
@@ -206,8 +204,7 @@
 	 */
 	@Override
 	public boolean start() throws IllegalStateException {
-		if (logger.isDebugEnabled())
-			logger.debug(this + "START");
+		logger.info("{}: STARTING", this);
 		
 		synchronized(this) {			
 			if (jettyThread == null || 
@@ -227,7 +224,7 @@
 	 */
 	@Override
 	public boolean stop() throws IllegalStateException {
-		logger.info(this + "STOP");
+		logger.info("{}: STOPPING", this);
 		
 		synchronized(this) {
 			if (jettyThread == null) {
@@ -241,16 +238,13 @@
 			try {
 				this.connector.stop();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e,  
-				           "Error while stopping management server", this.toString());
-				e.printStackTrace();
+				logger.error("{}: error while stopping management server", this, e);
 			}
 			
 			try {
 				this.jettyServer.stop();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e,  
-						           "Error while stopping management server", this.toString());
+				logger.error("{}: error while stopping management server", this, e);
 				return false;
 			}
 			
@@ -265,7 +259,7 @@
 	 */
 	@Override
 	public void shutdown() throws IllegalStateException {
-		logger.info(this + "SHUTDOWN");
+		logger.info("{}: SHUTTING DOWN", this);
 		
 		this.stop();
 		
@@ -278,15 +272,14 @@
 			try {
 				jettyThreadCopy.join(1000L);
 			} catch (InterruptedException e) {
-				logger.warn(MessageCodes.EXCEPTION_ERROR, e,  
-				                  "Error while shutting down management server", this.toString());
+				logger.warn("{}: error while shutting down management server", this);
 			}
 			if (!jettyThreadCopy.isInterrupted()) {
 				try {
 					jettyThreadCopy.interrupt();
 				} catch(Exception e) {
 					// do nothing
-					logger.warn("exception while shutting down (OK)");
+					logger.warn("{}: exception while shutting down (OK)", this);
 				}
 			}
 		}
diff --git a/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpClientTest.java b/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpClientTest.java
index cd149f7..df57fcf 100644
--- a/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpClientTest.java
+++ b/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpClientTest.java
@@ -31,12 +31,16 @@
 import org.openecomp.policy.drools.http.client.HttpClient;
 import org.openecomp.policy.drools.http.server.HttpServletServer;
 import org.openecomp.policy.drools.properties.PolicyProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class HttpClientTest {
 	
+	private static Logger logger = LoggerFactory.getLogger(HttpClientTest.class);
+	
 	@Test
 	public void testHttpNoAuthClient() throws Exception {		
-		System.out.println("-- testHttpNoAuthClient() --");
+		logger.info("-- testHttpNoAuthClient() --");
 
 		HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
 		server.addServletPackage("/*", this.getClass().getPackage().getName());
@@ -57,7 +61,7 @@
 	
 	@Test
 	public void testHttpAuthClient() throws Exception {		
-		System.out.println("-- testHttpAuthClient() --");
+		logger.info("-- testHttpAuthClient() --");
 
 		HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
 		server.setBasicAuthentication("x", "y", null);
@@ -79,7 +83,7 @@
 	
 	@Test
 	public void testHttpAuthClient401() throws Exception {		
-		System.out.println("-- testHttpAuthClient401() --");
+		logger.info("-- testHttpAuthClient401() --");
 
 		HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
 		server.setBasicAuthentication("x", "y", null);
@@ -98,7 +102,7 @@
 	
   //@Test 
    public void testHttpAuthClientHttps() throws Exception {                             
-		System.out.println("-- testHttpAuthClientHttps() --");
+	   logger.info("-- testHttpAuthClientHttps() --");
 
 		HttpClient client = HttpClient.factory.build("testHttpAuthClientHttps", true, true, "somehost.somewhere.com",
 				9091, "pap/test", "testpap", "alpha123", true);
@@ -116,7 +120,7 @@
     
     //@Test
     public void testHttpAuthClientProps() throws Exception {
-		System.out.println("-- testHttpAuthClientProps() --");
+    	logger.info("-- testHttpAuthClientProps() --");
 		
 		Properties httpProperties = new Properties();
 		
diff --git a/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpServerTest.java b/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpServerTest.java
index 6a36981..931d968 100644
--- a/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpServerTest.java
+++ b/policy-endpoints/src/test/java/org/openecomp/policy/drools/http/server/test/HttpServerTest.java
@@ -29,15 +29,19 @@
 
 import org.junit.Test;
 import org.openecomp.policy.drools.http.server.HttpServletServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * HttpServletServer JUNIT tests
  */
 public class HttpServerTest {
+	
+	private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
 
 	@Test
 	public void testSingleServer() throws Exception {
-		System.out.println("-- testSingleServer() --");
+		logger.info("-- testSingleServer() --");
 		
 		HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", 5678, "/", false, true);
 		server.addServletPackage("/*", this.getClass().getPackage().getName());
@@ -48,7 +52,6 @@
 		String echo = "hello";
 		URL url = new URL("http://localhost:5678/junit/echo/" + echo);
 		String response = response(url);
-		System.out.println("Received .. " + response);
 		assertTrue(response.equals(echo));
 	
 		String responseSwagger =  null;
@@ -67,7 +70,7 @@
 	
 	@Test
 	public void testMultipleServers() throws Exception {
-		System.out.println("-- testMultipleServers() --");
+		logger.info("-- testMultipleServers() --");
 		
 		HttpServletServer server1 = HttpServletServer.factory.build("echo-1", "localhost", 5678, "/", true, true);
 		server1.addServletPackage("/*", this.getClass().getPackage().getName());
@@ -84,18 +87,14 @@
 		
 		URL url1 = new URL("http://localhost:5678/junit/echo/" + echo);
 		String response1 = response(url1);
-		System.out.println("Received .. " + response1);
 		assertTrue(response1.equals(echo));
 		
 		URL urlSwagger = new URL("http://localhost:5678/swagger.json");
-		String responseSwagger = response(urlSwagger);
-		
-		System.out.println("Received .. " + responseSwagger);		
+		String responseSwagger = response(urlSwagger);	
 		assertTrue(responseSwagger != null);
 		
 		URL url2 = new URL("http://localhost:5679/junit/echo/" + echo);
 		String response2 = response(url2);
-		System.out.println("Received .. " + response2);
 		assertTrue(response2.equals(echo));
 		
 		String responseSwagger2 =  null;
@@ -105,8 +104,6 @@
 		} catch(IOException ioe) {
 			// Expected
 		}
-		
-		System.out.println("Received .. " + responseSwagger2);		
 		assertTrue(responseSwagger2 == null);
 		
 		HttpServletServer.factory.destroy();		
@@ -115,7 +112,7 @@
 	
 	@Test
 	public void testMultiServicePackage() throws Exception {
-		System.out.println("-- testMultiServicePackage() --");
+		logger.info("-- testMultiServicePackage() --");
 		
 		String randomName = UUID.randomUUID().toString();
 		
@@ -128,12 +125,10 @@
 		String echo = "hello";
 		URL urlService1 = new URL("http://localhost:5678/junit/echo/" + echo);
 		String responseService1 = response(urlService1);
-		System.out.println("Received .. " + responseService1);
 		assertTrue(responseService1.equals(echo));
 		
 		URL urlService2 = new URL("http://localhost:5678/junit/endpoints/http/servers");
 		String responseService2 = response(urlService2);
-		System.out.println("Received .. " + responseService2);
 		assertTrue(responseService2.contains(randomName));
 		
 		HttpServletServer.factory.destroy();		
@@ -142,7 +137,7 @@
 	
 	@Test
 	public void testServiceClass() throws Exception {
-		System.out.println("-- testServiceClass() --");
+		logger.info("-- testServiceClass() --");
 		String randomName = UUID.randomUUID().toString();
 		
 		HttpServletServer server = HttpServletServer.factory.build(randomName, "localhost", 5678, "/", false, true);
@@ -154,7 +149,6 @@
 		String echo = "hello";
 		URL urlService1 = new URL("http://localhost:5678/junit/echo/" + echo);
 		String responseService1 = response(urlService1);
-		System.out.println("Received .. " + responseService1);
 		assertTrue(responseService1.equals(echo));
 		
 		HttpServletServer.factory.destroy();		
@@ -163,7 +157,7 @@
 	
 	@Test
 	public void testMultiServiceClass() throws Exception {
-		System.out.println("-- testMultiServiceClass() --");
+		logger.info("-- testMultiServiceClass() --");
 		
 		String randomName = UUID.randomUUID().toString();
 		
@@ -177,12 +171,10 @@
 		String echo = "hello";
 		URL urlService1 = new URL("http://localhost:5678/junit/echo/" + echo);
 		String responseService1 = response(urlService1);
-		System.out.println("Received .. " + responseService1);
 		assertTrue(responseService1.equals(echo));
 		
 		URL urlService2 = new URL("http://localhost:5678/junit/endpoints/http/servers");
 		String responseService2 = response(urlService2);
-		System.out.println("Received .. " + responseService2);
 		assertTrue(responseService2.contains(randomName));
 		
 		HttpServletServer.factory.destroy();		
@@ -200,8 +192,6 @@
 		while ((line = ioReader.readLine()) != null) {
 			response += line; 
 		}
-		
-		System.out.println("R is " + response);
 		ioReader.close();
 		return response;
 	}
diff --git a/policy-endpoints/src/test/resources/logback-test.xml b/policy-endpoints/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..9e0dd9b
--- /dev/null
+++ b/policy-endpoints/src/test/resources/logback-test.xml
@@ -0,0 +1,15 @@
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <Pattern>
+                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n
+            </Pattern>
+        </encoder>
+    </appender>
+
+    <root level="warn">
+        <appender-ref ref="STDOUT"/>
+    </root>
+
+</configuration>
\ No newline at end of file
diff --git a/policy-healthcheck/pom.xml b/policy-healthcheck/pom.xml
index 913a944..ab0e02d 100644
--- a/policy-healthcheck/pom.xml
+++ b/policy-healthcheck/pom.xml
@@ -32,7 +32,7 @@
   <artifactId>policy-healthcheck</artifactId>
   
   <name>policy-healthcheck</name>
-  <description>Separately loadable module to perform healthchecks of the system</description>
+  <description>Loadable module that performs remote system healthchecks</description>
 
   <properties>
           <maven.compiler.source>1.8</maven.compiler.source>
@@ -96,7 +96,7 @@
 	  <groupId>io.swagger</groupId>
 	  <artifactId>swagger-jersey2-jaxrs</artifactId>
 	  <scope>provided</scope>
-	</dependency>  
+	</dependency>
     <dependency>
       <groupId>org.openecomp.policy.drools-pdp</groupId>
       <artifactId>policy-core</artifactId>
diff --git a/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheck.java b/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheck.java
index 17627a6..b45065e 100644
--- a/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheck.java
+++ b/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheck.java
@@ -30,6 +30,8 @@
 import org.openecomp.policy.drools.persistence.SystemPersistence;
 import org.openecomp.policy.drools.properties.Startable;
 import org.openecomp.policy.drools.system.PolicyEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Healthcheck
@@ -120,6 +122,11 @@
 class HealthCheckMonitor implements HealthCheck {
 
 	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(HealthCheckMonitor.class);
+	
+	/**
 	 * attached http servers
 	 */
 	protected volatile ArrayList<HttpServletServer> servers = new ArrayList<>();
@@ -137,7 +144,7 @@
 	/**
 	 * {@inheritDoc}
 	 */
-	public Reports healthCheck() {
+	public Reports healthCheck() {	
 		Reports reports = new Reports();
 		reports.healthy = PolicyEngine.manager.isAlive();
 		
@@ -165,7 +172,7 @@
 				try {
 					report.message = HttpClient.getBody(response, String.class);
 				} catch (Exception e) {
-					e.printStackTrace();
+					logger.warn("{}: cannot get body from http-client {}", this, client, e);
 				}
 			} catch (Exception e) {
 				report.healthy = false;
@@ -181,6 +188,7 @@
 	 */
 	@Override
 	public boolean start() throws IllegalStateException {
+		
 		try {
 			this.healthCheckProperties = SystemPersistence.manager.getProperties(HealthCheckFeature.CONFIGURATION_PROPERTIES_NAME);
 			this.servers = HttpServletServer.factory.build(healthCheckProperties);
@@ -190,7 +198,7 @@
 				try {
 					server.start();
 				} catch (Exception e) {
-					e.printStackTrace();
+					logger.warn("{}: cannot start http-server {}", this, server, e);
 				}
 			}
 		} catch (Exception e) {
@@ -205,11 +213,12 @@
 	 */
 	@Override
 	public boolean stop() throws IllegalStateException {
+		
 		for (HttpServletServer server : servers) {
 			try {
 				server.stop();
 			} catch (Exception e) {
-				e.printStackTrace();
+				logger.warn("{}: cannot stop http-server {}", this, server, e);
 			}
 		}
 		
@@ -217,7 +226,7 @@
 			try {
 				client.stop();
 			} catch (Exception e) {
-				e.printStackTrace();
+				logger.warn("{}: cannot stop http-client {}", this, client, e);
 			}
 		}
 		
diff --git a/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheckFeature.java b/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheckFeature.java
index 63216f6..0f16d8c 100644
--- a/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheckFeature.java
+++ b/policy-healthcheck/src/main/java/org/openecomp/policy/drools/healthcheck/HealthCheckFeature.java
@@ -22,11 +22,18 @@
 
 import org.openecomp.policy.drools.features.PolicyEngineFeatureAPI;
 import org.openecomp.policy.drools.system.PolicyEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This feature provides healthcheck verification of remotely associated RESTful components
  */
-public class HealthCheckFeature implements PolicyEngineFeatureAPI {
+public class HealthCheckFeature implements PolicyEngineFeatureAPI {	
+	
+	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(HealthCheckFeature.class); 
 	
 	/**
 	 * Properties Configuration Name
@@ -43,7 +50,7 @@
 		try {
 			HealthCheck.monitor.start();
 		} catch (IllegalStateException e) {
-			e.printStackTrace();
+			logger.error("Healthcheck Monitor cannot be started", e);
 		}
 		
 		return false;
@@ -54,7 +61,7 @@
 		try {
 			HealthCheck.monitor.stop();
 		} catch (IllegalStateException e) {
-			e.printStackTrace();
+			logger.error("Healthcheck Monitor cannot be stopped", e);
 		}
 		
 		return false;
diff --git a/policy-management/config/policyLogger.properties b/policy-management/config/policyLogger.properties
deleted file mode 100644
index f8f31d8..0000000
--- a/policy-management/config/policyLogger.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# policy-management
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-
-################################### Set concurrentHashMap and timer info  #######################
-#Timer initial delay and the delay between in milliseconds before task is to be execute.
-timer.delay.time=1000
-#Timer scheduleAtFixedRate period - time in milliseconds between successive task executions.
-check.interval= 30000
-#Longest time an event info can be stored in the concurrentHashMap for logging - in seconds. 
-event.expired.time=86400
-#Size of the concurrentHashMap which stores the event starting time, etc - when its size reaches this limit, the Timer gets executed 
-#to remove all expired records from this concurrentHashMap.
-concurrentHashMap.limit=5000
-#Size of the concurrentHashMap - when its size drops to this point, stop the Timer
-stop.check.point=2500
-################################### Set logging format #############################################
-# set EELF for EELF logging format, set LOG4J for using log4j, set SYSTEMOUT for using system.out.println
-logger.type=EELF
-#################################### Set level for EELF or SYSTEMOUT logging ##################################
-# Set level for debug file. Set DEBUG to enable .info, .warn and .debug; set INFO for enable .info and .warn; set OFF to disable all 
-debugLogger.level=INFO
-# Set level for metrics file. Set OFF to disable; set ON to enable
-metricsLogger.level=ON
-# Set level for error file. Set OFF to disable; set ON to enable
-error.level=ON
-# Set level for audit file. Set OFF to disable; set ON to enable
-audit.level=ON
diff --git a/policy-management/pom.xml b/policy-management/pom.xml
index 7feef7a..3ca8bc2 100644
--- a/policy-management/pom.xml
+++ b/policy-management/pom.xml
@@ -242,12 +242,6 @@
 		<artifactId>commons-lang3</artifactId>
 		<version>3.4</version>
 	</dependency>
-    
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.17</version>
-    </dependency>
 
     <dependency>
       <groupId>junit</groupId>
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java
index d94e773..276573e 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/controller/DroolsControllerFactory.java
@@ -30,8 +30,8 @@
 import org.openecomp.policy.drools.controller.internal.NullDroolsController;
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.event.comm.TopicSource;
 import org.openecomp.policy.drools.event.comm.TopicSink;
 import org.openecomp.policy.drools.properties.PolicyProperties;
@@ -140,11 +140,11 @@
  * Factory of Drools Controllers indexed by the Maven coordinates 
  */
 class IndexedDroolsControllerFactory implements DroolsControllerFactory {
-	
+
 	/**
 	 * logger 
 	 */
-	private static Logger logger = FlexLogger.getLogger(MavenDroolsController.class);
+	private static Logger logger = LoggerFactory.getLogger(MavenDroolsController.class);
 	
 	/**
 	 * Policy Controller Name Index
@@ -262,7 +262,8 @@
 				try {
 					customGsonCoder =  new CustomGsonCoder(customGson);
 				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
+					logger.warn("{}: cannot create custom-gson-coder {} because of {}", 
+							    this, customGson, e.getMessage(), e);
 				}
 			}
 			
@@ -276,7 +277,8 @@
 				try {
 					customJacksonCoder =  new CustomJacksonCoder(customJackson);
 				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
+					logger.warn("{}: cannot create custom-jackson-coder {} because of {}", 
+						        this, customJackson, e.getMessage(), e);
 				}
 			}
 			
@@ -537,4 +539,12 @@
 		 return controllers;
 	}
 	
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("IndexedDroolsControllerFactory [#droolsControllers=").append(droolsControllers.size())
+				.append("]");
+		return builder.toString();
+	}
+	
 }
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
index e404a09..06d2aaf 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
@@ -32,9 +32,8 @@
 import org.kie.api.runtime.rule.FactHandle;
 import org.kie.api.runtime.rule.QueryResults;
 import org.kie.api.runtime.rule.QueryResultsRow;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.core.PolicyContainer;
 import org.openecomp.policy.drools.core.PolicySession;
@@ -61,7 +60,7 @@
 	/**
 	 * logger 
 	 */
-	private static Logger  logger = FlexLogger.getLogger(MavenDroolsController.class);
+	private static Logger  logger = LoggerFactory.getLogger(MavenDroolsController.class);
 	
 	/**
 	 * Policy Container, the access object to the policy-core layer
@@ -423,16 +422,14 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void shutdown() throws IllegalStateException {
-		
-		if (logger.isInfoEnabled())
-			logger.info(this + "SHUTDOWN");
+	public void shutdown() throws IllegalStateException {		
+		logger.info("{}: SHUTDOWN", this);
 		
 		try {
 			this.stop();
 			this.removeCoders();
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "stop", this.toString());
+			logger.error("{} SHUTDOWN FAILED because of {}", this, e.getMessage(), e);
 		} finally {
 			this.policyContainer.shutdown();
 		}
@@ -445,14 +442,13 @@
 	 */
 	@Override
 	public void halt() throws IllegalStateException {
-		if (logger.isInfoEnabled())
-			logger.info(this + "SHUTDOWN");
+		logger.info("{}: HALT", this);
 		
 		try {
 			this.stop();
 			this.removeCoders();
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "halt", this.toString());
+			logger.error("{} HALT FAILED because of {}", this, e.getMessage(), e);
 		} finally {
 			this.policyContainer.destroy();
 		}	
@@ -462,20 +458,18 @@
 	 * removes this drools controllers and encoders and decoders from operation
 	 */
 	protected void removeCoders() {
-		
-		if (logger.isInfoEnabled())
-			logger.info(this + "REMOVE-CODERS");
+		logger.info("{}: REMOVE-CODERS", this);
 		
 		try {
 			this.removeDecoders();
 		} catch (IllegalArgumentException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "removeDecoders", this.toString());
+			logger.error("{} REMOVE-DECODERS FAILED because of {}", this, e.getMessage(), e);
 		}
 		
 		try {
 			this.removeEncoders();
 		} catch (IllegalArgumentException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "removeEncoders", this.toString());
+			logger.error("{} REMOVE-ENCODERS FAILED because of {}", this, e.getMessage(), e);
 		}
 	}
 
@@ -492,9 +486,7 @@
 	 */
 	@Override
 	public boolean offer(String topic, String event) {
-
-		if (logger.isInfoEnabled())
-			logger.info("OFFER: " + topic + ":" + event + " INTO " + this);
+		logger.debug("{}: OFFER: {} <- {}", this, topic, event);
 		
 		if (this.locked)
 			return true;
@@ -515,8 +507,8 @@
 				                                              this.getArtifactId(), 
 				                                              topic)) {
 			
-			logger.warn("DECODING-UNSUPPORTED: " + ":" + this.getGroupId() + 
-					          ":" + this.getArtifactId() + ":" + topic + " IN " + this);
+			logger.warn("{}: DECODING-UNSUPPORTED {}:{}:{}", this, 
+					    topic, this.getGroupId(), this.getArtifactId());
 			return true;
 		}
 		
@@ -529,12 +521,12 @@
 					                                      topic, 
 					                                      event);
 		} catch (UnsupportedOperationException uoe) {
-			if (logger.isInfoEnabled())
-				logger.info("DECODE:"+ this + ":" + topic + ":" + event);
+			logger.info("{}: DECODE FAILED: {} <- {} because of {}", this, topic, 
+					    event, uoe.getMessage(), uoe);
 			return true;
 		} catch (Exception e) {
-			e.printStackTrace();
-			logger.error("DECODE:"+ this + ":" + topic + ":" + event);
+			logger.warn("{}: DECODE FAILED: {} <- {} because of {}", this, topic, 
+				        event, e.getMessage(), e);
 			return true;
 		}
 		
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java b/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java
index 6bb1185..dda20a0 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/persistence/SystemPersistence.java
@@ -28,10 +28,9 @@
 import java.nio.file.StandardCopyOption;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
 import org.openecomp.policy.drools.utils.PropertyUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public interface SystemPersistence {
 	
@@ -119,7 +118,7 @@
 	/**
 	 * logger 
 	 */
-	private static Logger logger = FlexLogger.getLogger(SystemPropertiesPersistence.class);
+	private static Logger logger = LoggerFactory.getLogger(SystemPropertiesPersistence.class);
 	
 	/**
 	 * backs up the properties-based controller configuration
@@ -142,8 +141,7 @@
 				Files.copy(controllerPropertiesPath, 
 						   controllerPropertiesBakPath, StandardCopyOption.REPLACE_EXISTING);
 			} catch (Exception e) {
-				logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-		                    controllerName, "SystemPersistenceProperties");
+				logger.warn("{}: cannot be backed up", controllerName, e);
 	    		return false;
 			}
 		} 
@@ -178,7 +176,7 @@
 					this.backupController(controllerName);
 				}
 			} catch (Exception e) {
-				logger.info("No existing Properties");
+				logger.info("{}: no existing Properties", controllerName);
 				// continue
 			}
     	}
@@ -188,8 +186,7 @@
 	    	FileWriter writer = new FileWriter(controllerPropertiesFile);
 	    	properties.store(writer, "Machine created Policy Controller Configuration");
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-	                    controllerName, "SystemPersistenceProperties");
+			logger.warn("{}: cannot be STORED", controllerName, e);
 			return false;
 		}
 		
@@ -217,8 +214,7 @@
 						   controllerPropertiesBakPath, 
 						   StandardCopyOption.REPLACE_EXISTING);
 			} catch (Exception e) {
-				logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-						    controllerName, "SystemPersistenceProperties");
+				logger.warn("{}: cannot be DELETED", controllerName, e);
 				return false;
 			}
 		} 
@@ -243,10 +239,7 @@
 		try {
 			return PropertyUtil.getProperties(propertiesPath.toFile());
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-					    name, "SystemPersistenceProperties can't retrieved properties for " + 
-			            propertiesPath);
-			e.printStackTrace();
+			logger.warn("{}: can't read properties @ {}", name, propertiesPath);
 			throw new IllegalArgumentException("can't read properties for " + 
 			                                   name + " @ " + 
 					                           propertiesPath);
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
index d82b372..1030186 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
@@ -26,14 +26,13 @@
 import java.util.List;
 import java.util.Map;
 
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
 import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
 import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
 import org.openecomp.policy.drools.utils.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Coder (Encoder/Decoder) of Events.
@@ -399,8 +398,11 @@
  * class and best fitted json parsing tools.
  */
 class MultiplexorEventProtocolCoder implements EventProtocolCoder {
-	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(MultiplexorEventProtocolCoder.class);	
+	/**
+	 * Logger 
+	 */
+	private static Logger logger = LoggerFactory.getLogger(MultiplexorEventProtocolCoder.class);
+	
 	/**
 	 * Decoders
 	 */
@@ -423,11 +425,10 @@
 			               CustomJacksonCoder customJacksonCoder,
 			               int modelClassLoaderHash) 
 		   throws IllegalArgumentException {
-		logger.info("ADD-DECODER: " + groupId + ":" + artifactId + ":" + 
-		                  topic + ":" + eventClass + ":" + 
-				          protocolFilter + ":" + customGsonCoder + 
-				          ":" + customJacksonCoder + ":" + modelClassLoaderHash + 
-				          " INTO " + this);
+		logger.info("{}: add-decoder {}:{}:{}:{}:{}:{}:{}:{}", this, 
+				    groupId, artifactId, topic, eventClass,
+				    protocolFilter, customGsonCoder, customJacksonCoder,
+				    modelClassLoaderHash);
 		this.decoders.add(groupId, artifactId, topic, eventClass, protocolFilter, 
 				         customGsonCoder, customJacksonCoder, modelClassLoaderHash);
 	}
@@ -443,11 +444,10 @@
 			               CustomJacksonCoder customJacksonCoder,
 			               int modelClassLoaderHash) 
 		   throws IllegalArgumentException {
-		logger.info("ADD-ENCODER: " + groupId + ":" + artifactId + ":" + 
-                		   topic + ":" + eventClass + ":" + 
-                		   protocolFilter + ":" + customGsonCoder + 
-                		   ":" + customJacksonCoder + ":" + modelClassLoaderHash +
-                		   " INTO " + this);
+		logger.info("{}: add-decoder {}:{}:{}:{}:{}:{}:{}:{}", this, 
+			        groupId, artifactId, topic, eventClass,
+			        protocolFilter, customGsonCoder, customJacksonCoder,
+			        modelClassLoaderHash);
 		this.encoders.add(groupId, artifactId, topic, eventClass, protocolFilter, 
 		                  customGsonCoder, customJacksonCoder, modelClassLoaderHash);
 	}
@@ -458,8 +458,7 @@
 	@Override
 	public void removeDecoders(String groupId, String artifactId, String topic) 
 		   throws IllegalArgumentException {
-		logger.info("REMOVE-DECODER: " + groupId + ":" + artifactId + ":" + 
-                          topic + " FROM " + this);		
+		logger.info("{}: remove-decoder {}:{}:{}", this, groupId, artifactId, topic);	
 		this.decoders.remove(groupId, artifactId, topic);
 	}
 	
@@ -469,8 +468,7 @@
 	@Override
 	public void removeEncoders(String groupId, String artifactId, String topic) 
 		   throws IllegalArgumentException {
-		logger.info("REMOVE-ENCODER: " + groupId + ":" + artifactId + ":" + 
-                          topic + " FROM " + this);	
+		logger.info("{}: remove-encoder {}:{}:{}", this, groupId, artifactId, topic);
 		this.encoders.remove(groupId, artifactId, topic);
 	}
 	
@@ -496,8 +494,7 @@
 	@Override
 	public Object decode(String groupId, String artifactId, String topic, String json) 
 			throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
-		logger.info("DECODE: " + groupId + ":" + artifactId + ":" + 
-                          topic + ":" + json + " WITH " + this);
+		logger.debug("{}: decode {}:{}:{}:{}", this, groupId, artifactId, topic, json);
 		return this.decoders.decode(groupId, artifactId, topic, json);
 	}
 
@@ -507,8 +504,7 @@
 	@Override
 	public String encode(String groupId, String artifactId, String topic, Object event) 
 			throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
-		logger.info("ENCODE: " + groupId + ":" + artifactId + ":" + 
-                           topic + ":" + event + " WITH " + this);
+		logger.debug("{}: encode {}:{}:{}:{}", this, groupId, artifactId, topic, event);
 		return this.encoders.encode(groupId, artifactId, topic, event);
 	}
 	
@@ -518,7 +514,7 @@
 	@Override
 	public String encode(String topic, Object event) 
 			throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
-		logger.info("ENCODE: " + topic + ":" + event + " WITH " + this);
+		logger.debug("{}: encode {}:{}", this, topic, event);
 		return this.encoders.encode(topic, event);
 	}
 	
@@ -528,7 +524,7 @@
 	@Override
 	public String encode(String topic, Object event, DroolsController droolsController) 
 			throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
-		logger.info("ENCODE: " + topic + ":" + event + ":" + droolsController + " WITH " + this);
+		logger.debug("{}: encode {}:{}:{}", this, topic, event, droolsController);
 		return this.encoders.encode(topic, event, droolsController);
 	}
 
@@ -537,8 +533,7 @@
 	 */
 	@Override
 	public List<CoderFilters> getDecoderFilters(String groupId, String artifactId, String topic) 
-			throws IllegalArgumentException {
-		
+			throws IllegalArgumentException {		
 		return this.decoders.getFilters(groupId, artifactId, topic);
 	}
 	
@@ -547,8 +542,7 @@
 	 */
 	@Override
 	public ProtocolCoderToolset getDecoders(String groupId, String artifactId, String topic) 
-			throws IllegalArgumentException {
-		
+			throws IllegalArgumentException {		
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> decoderToolsets = this.decoders.getCoders(groupId, artifactId, topic);
 		if (decoderToolsets == null)
 			throw new IllegalArgumentException("Decoders not found for " + groupId + ":" + artifactId + ":" + topic);
@@ -561,8 +555,7 @@
 	 */
 	@Override
 	public List<CoderFilters> getEncoderFilters(String groupId, String artifactId, String topic) 
-			throws IllegalArgumentException {
-		
+			throws IllegalArgumentException {		
 		return this.encoders.getFilters(groupId, artifactId, topic);
 	}
 
@@ -571,8 +564,7 @@
 	 */
 	@Override
 	public CoderFilters getDecoderFilters(String groupId, String artifactId, String topic, String classname)
-			throws IllegalArgumentException {
-		
+			throws IllegalArgumentException {		
 		return this.decoders.getFilters(groupId, artifactId, topic, classname);
 	}
 	
@@ -581,8 +573,7 @@
 	 */
 	@Override
 	public CoderFilters getEncoderFilters(String groupId, String artifactId, String topic, String classname)
-			throws IllegalArgumentException {
-		
+			throws IllegalArgumentException {	
 		return this.encoders.getFilters(groupId, artifactId, topic, classname);
 	}
 	
@@ -669,7 +660,7 @@
  * class and best fitted json parsing tools.
  */
 abstract class GenericEventProtocolCoder  {
-	private static Logger  logger = FlexLogger.getLogger(GenericEventProtocolCoder.class);	
+	private static Logger  logger = LoggerFactory.getLogger(GenericEventProtocolCoder.class);	
 	
 	/**
 	 * Mapping topic:controller-id -> <protocol-decoder-toolset-pair> 
@@ -717,13 +708,11 @@
 			throw new IllegalArgumentException("Invalid group id");
 		}
 		
-		if (artifactId == null || artifactId.isEmpty()) {
+		if (artifactId == null || artifactId.isEmpty())
 			throw new IllegalArgumentException("Invalid artifact id");
-		}
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Invalid Topic");
-		}
 		
 		if (eventClass == null) {
 			throw new IllegalArgumentException("Invalid Event Class");
@@ -736,16 +725,14 @@
 			if (coders.containsKey(key)) {				
 				Pair<ProtocolCoderToolset, ProtocolCoderToolset> toolsets = coders.get(key);
 				
-				if (logger.isInfoEnabled())
-					logger.info("ADDING CODER TO EXISTING: " + toolsets + " for " + key);
+				logger.info("{}: adding coders for existing {}: ", this, key, toolsets.first());
 				
 				toolsets.first().addCoder(eventClass, protocolFilter, modelClassLoaderHash);
 				toolsets.second().addCoder(eventClass, protocolFilter, modelClassLoaderHash);
 				
 				if (!reverseCoders.containsKey(reverseKey)) {
-					if (logger.isInfoEnabled())
-						logger.info("Multiple coder classes case: " + toolsets.first() + 
-								           " for " + reverseKey + " - " + key);
+					logger.info("{}: adding new reverse coders (multiple classes case) for {}:{}: {}",
+							    this, reverseKey, key, toolsets.first());
 					
 					List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> reverseMappings =
 							new ArrayList<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
@@ -783,8 +770,7 @@
 					new Pair<ProtocolCoderToolset,ProtocolCoderToolset>(gsonCoderTools, 
 							                                            jacksonCoderTools);
 			
-			logger.info("ADDED TOOLSET: " + key + " : " + 
-			                  coderTools + ":" + this);
+			logger.info("{}: adding coders for new {}: {}", this, key, coderTools.first());
 			
 			coders.put(key, coderTools);
 			
@@ -800,24 +786,24 @@
 					present = parserSet.first().getControllerId().equals(key);
 					if (present) {
 						/* anomaly */
-						logger.error("UNEXPECTED TOOLSET REVERSE MAPPING FOUND: " + parserSet.first() + 
-								           " for " + reverseKey + " - " + key);
+						logger.error("{}: unexpected toolset reverse mapping found for {}:{}: {}", 
+								     this, reverseKey, key, parserSet.first());
 					}
 				}
 				
 				if (present) {
 					return;
 				} else {
-					logger.info("ADDING TOOLSET REVERSE MAPPING: " + reverseKey + " : " + 
-				                      toolsets + ":" + coderTools + ":" + this);
+					logger.info("{}: adding coder set for {}: {} ", this, 
+							    reverseKey, coderTools.getFirst());
 					toolsets.add(coderTools);
 				}
 			} else {
 				List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> toolsets =
 					new ArrayList<Pair<ProtocolCoderToolset,ProtocolCoderToolset>>();
-				logger.info("ADDING TOOLSET REVERSE MAPPING: " + reverseKey + " : " + 
-					              toolsets + ":" + coderTools + ":" +  this);
 				toolsets.add(coderTools);
+				
+				logger.info("{}: adding toolset for reverse key {}: {}", this, reverseKey, toolsets);
 				reverseCoders.put(reverseKey, toolsets);
 			}
 			
@@ -858,25 +844,22 @@
 	public void remove(String groupId, String artifactId, String topic) 
 		   throws IllegalArgumentException {
 		
-		if (groupId == null || groupId.isEmpty()) {
+		if (groupId == null || groupId.isEmpty())
 			throw new IllegalArgumentException("Invalid group id");
-		}
 		
-		if (artifactId == null || artifactId.isEmpty()) {
+		if (artifactId == null || artifactId.isEmpty())
 			throw new IllegalArgumentException("Invalid artifact id");
-		}
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Invalid Topic");
-		}
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		
 		synchronized(this) {
 			if (coders.containsKey(key)) {
 				Pair<ProtocolCoderToolset, ProtocolCoderToolset> p = coders.remove(key);
-				logger.info("REMOVED TOOLSET: " + key + " : " + p + " FROM " + 
-				                  coders + " : " +  this);
+				
+				logger.info("{}: removed toolset for {}: {}", this, key, p.getFirst());
 				
 				for (CoderFilters codeFilter : p.first().getCoders()) {
 					String className = codeFilter.getCodedClass();
@@ -889,15 +872,14 @@
 						while (toolsetsIter.hasNext()) {
 							Pair<ProtocolCoderToolset, ProtocolCoderToolset> toolset = toolsetsIter.next();
 							if (toolset.first().getControllerId().equals(key)) {
-								logger.info("REMOVED CODER FROM REVERSE MAPPING of TOOLSET: " + reverseKey + " : " + toolset + " FROM " + 
-										          reverseCoders);
+								logger.info("{}: removed coder from toolset for {} from reverse mapping {}: ", 
+										    this, reverseKey);
 								toolsetsIter.remove();
 							}
 						}
 						
 						if (this.reverseCoders.get(reverseKey).isEmpty()) {
-							logger.info("REMOVE FULL REVERSE MAPPING of TOOLSET: " + reverseKey + " FROM " + 
-							                  reverseCoders);							
+							logger.info("{}: removing reverse mapping for {}: ", this, reverseKey);						
 							this.reverseCoders.remove(reverseKey);
 						}
 					}
@@ -916,16 +898,14 @@
 	 */
 	public boolean isCodingSupported(String groupId, String artifactId, String topic) {
 		
-		if (groupId == null || groupId.isEmpty()) {
+		if (groupId == null || groupId.isEmpty())
 			throw new IllegalArgumentException("Invalid group id");
-		}
 		
-		if (artifactId == null || artifactId.isEmpty()) {
+		if (artifactId == null || artifactId.isEmpty())
 			throw new IllegalArgumentException("Invalid artifact id");
-		}
 		
 		if (topic == null || topic.isEmpty())
-			return false;
+			throw new IllegalArgumentException("Invalid Topic");
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		synchronized(this) {
@@ -947,9 +927,8 @@
 	public Object decode(String groupId, String artifactId, String topic, String json) 
 			throws IllegalArgumentException, UnsupportedOperationException, IllegalStateException {
 		
-		if (!isCodingSupported(groupId, artifactId, topic)) {
+		if (!isCodingSupported(groupId, artifactId, topic))
 			throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic) + " for encoding");
-		}
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
@@ -958,8 +937,7 @@
 			if (event != null)
 				return event;
 		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			logger.warn("Can't decode @ " + this);
+			logger.info("{}, cannot decode {}", this, json, e);
 		}
 		
 		if (multipleToolsetRetries) {
@@ -977,10 +955,8 @@
 					
 					return event;
 				}
-			} catch (Exception e2) {
-				// TODO Auto-generated catch block
-				e2.printStackTrace();
-				throw new UnsupportedOperationException(e2);
+			} catch (Exception e) {
+				throw new UnsupportedOperationException(e);
 			}
 		} 
 		
@@ -1001,14 +977,12 @@
 	public String encode(String groupId, String artifactId, String topic, Object event) 
 			throws IllegalArgumentException, UnsupportedOperationException {
 		
-		if (!isCodingSupported(groupId, artifactId, topic)) {
+		if (!isCodingSupported(groupId, artifactId, topic))
 			throw new IllegalArgumentException
 				("Unsupported:" + codersKey(groupId, artifactId, topic));
-		}
 		
-		if (event == null) {
+		if (event == null)
 			throw new IllegalArgumentException("Unsupported topic:" + topic);
-		}
 		
 		// reuse the decoder set, since there must be affinity in the model
 		String key = this.codersKey(groupId, artifactId, topic);
@@ -1027,7 +1001,7 @@
 	protected String encodeInternal(String key, Object event) 
 			throws IllegalArgumentException, UnsupportedOperationException {
 		
-		logger.debug("ENCODE: " + key + ":" + event + this);
+		logger.debug("{}: encode for {}: {}", this, key, event);
 		
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
 		try {
@@ -1035,8 +1009,7 @@
 			if (json != null && !json.isEmpty())
 				return json;
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "FIRST-ENCODE-INTERNAL: " + 
-		                       key + ":" + event, this.toString());
+			logger.warn("{}: cannot encode (first) for {}: {}", this, key, event, e);
 		}
 		
 		if (multipleToolsetRetries) {
@@ -1054,11 +1027,9 @@
 					
 					return json;
 				}
-			} catch (Exception e2) {
-				// TODO Auto-generated catch block
-				logger.error(MessageCodes.EXCEPTION_ERROR, e2, "SECOND-ENCODE-INTERNAL: " + 
-	                               key + ":" + event, this.toString());
-				throw new UnsupportedOperationException(e2);
+			} catch (Exception e) {
+				logger.error("{}: cannot encode (second) for {}: {}", this, key, event, e);
+				throw new UnsupportedOperationException(e);
 			}
 		}
 		
@@ -1069,46 +1040,33 @@
 	 * encode an object into a json string
 	 * 
 	 * @param topic topic
-	 * @param encodedClass object to convert to string
+	 * @param event object to convert to string
 	 * @return the json string
 	 * @throws IllegalArgumentException if invalid argument is provided
 	 * @throws UnsupportedOperationException if the operation cannot be performed
 	 */
-	public String encode(String topic, Object encodedClass) 
+	public String encode(String topic, Object event) 
 			throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException {
 		
-		if (encodedClass == null) {
+		if (event == null)
 			throw new IllegalArgumentException("Invalid encoded class");
-		}
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Invalid topic");
-		}
 		
-		logger.info("ENCODE: " + topic + ":" + 
-		                  encodedClass.getClass().getCanonicalName() + ":" + 
-				          encodedClass);
+		List<DroolsController> droolsControllers = droolsCreators(topic, event);
 		
-		List<DroolsController> droolsControllers = droolsCreators(topic, encodedClass);
-		
-		if (droolsControllers.isEmpty()) {
-			if (logger.isWarnEnabled())
-				logger.warn("No Drool Controllers for: " + topic + ":" + 
-	                        encodedClass.getClass().getCanonicalName() + ":" + 
-	                        droolsControllers + " IN " + this);		
-			throw new IllegalArgumentException("Invalid Topic: " + topic);
-		}
+		if (droolsControllers.isEmpty())	
+			throw new IllegalArgumentException("no drools controller has been found");
 		
 		if (droolsControllers.size() > 1) {
-			if (logger.isWarnEnabled())
-				logger.warn("MULTIPLE DROOLS CONTROLLERS FOUND for: " + topic + ":" + 
-	                              encodedClass.getClass().getCanonicalName() + ":" + 
-	                              droolsControllers + " IN " + this);		
+			logger.warn("{}: multiple drools-controller {} for {}:{} ", this, topic,
+						droolsControllers, event.getClass().getCanonicalName());		
 			// continue
 		}
 		
 		String key = codersKey(droolsControllers.get(0).getGroupId(), droolsControllers.get(0).getArtifactId(), topic);
-		return this.encodeInternal(key, encodedClass);
+		return this.encodeInternal(key, event);
 	}
 	
 	/**
@@ -1123,17 +1081,11 @@
 	public String encode(String topic, Object encodedClass, DroolsController droolsController) 
 			throws IllegalArgumentException, IllegalArgumentException, UnsupportedOperationException {
 		
-		if (encodedClass == null) {
+		if (encodedClass == null)
 			throw new IllegalArgumentException("Invalid encoded class");
-		}
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Invalid topic");
-		}
-		
-		logger.info("ENCODE: " + topic + ":" + 
-		                  encodedClass.getClass().getCanonicalName() + ":" + 
-				          encodedClass + ":" + droolsController);
 		
 		String key = codersKey(droolsController.getGroupId(), droolsController.getArtifactId(), topic);
 		return this.encodeInternal(key, encodedClass);
@@ -1154,9 +1106,7 @@
 		
 		String reverseKey = this.reverseCodersKey(topic, encodedClass.getClass().getCanonicalName());
 		if (!this.reverseCoders.containsKey(reverseKey)) {
-			logger.warn("NO MAPPING for REVERSE KEY: " + topic + ":" + 
-                    encodedClass.getClass().getCanonicalName() + ":" + 
-                    encodedClass + ":" + reverseKey + " : " + this);
+			logger.warn("{}: no reverse mapping for {}", this, reverseKey);
 			return droolsControllers;
 		}
 		
@@ -1169,13 +1119,9 @@
 		// but there should be no side-effects.  Ownership is crosscheck against classname and 
 		// classloader reference.
 		
-		if (toolsets == null || toolsets.isEmpty()) {
-			logger.warn("ENCODE: " + topic + ":" + 
-		                      encodedClass.getClass().getCanonicalName() + ":" + 
-			                  encodedClass + " ENCODER NOT FOUND");
+		if (toolsets == null || toolsets.isEmpty())
 			throw new IllegalStateException("No Encoders toolsets available for topic "+ topic +
 					                        " encoder " + encodedClass.getClass().getCanonicalName());
-		}
 		
 		for (Pair<ProtocolCoderToolset, ProtocolCoderToolset> encoderSet : toolsets) {
 			// figure out the right toolset
@@ -1193,10 +1139,10 @@
 			}
 		}
 		
-		if (droolsControllers.isEmpty()) {
-			throw new IllegalStateException("No Encoders toolsets available for topic "+ topic +
-		            " : encoder " + encodedClass.getClass().getCanonicalName());				
-		}
+		if (droolsControllers.isEmpty())
+			throw new IllegalStateException("No Encoders toolsets available for "+ topic +
+		                                    ":" + encodedClass.getClass().getCanonicalName());
+		
 		return droolsControllers;
 	}
 
@@ -1213,9 +1159,8 @@
 	public List<CoderFilters> getFilters(String groupId, String artifactId, String topic) 
 			throws IllegalArgumentException {
 		
-		if (!isCodingSupported(groupId, artifactId, topic)) {
+		if (!isCodingSupported(groupId, artifactId, topic))
 			throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-		}
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
@@ -1234,9 +1179,8 @@
 	public Pair<ProtocolCoderToolset,ProtocolCoderToolset> getCoders(String groupId, String artifactId, String topic) 
 			throws IllegalArgumentException {
 		
-		if (!isCodingSupported(groupId, artifactId, topic)) {
+		if (!isCodingSupported(groupId, artifactId, topic))
 			throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-		}
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
@@ -1254,13 +1198,11 @@
 	public List<CoderFilters> getFilters(String groupId, String artifactId) 
 			throws IllegalArgumentException {
 		
-		if (groupId == null || groupId.isEmpty()) {
+		if (groupId == null || groupId.isEmpty())
 			throw new IllegalArgumentException("Invalid group id");
-		}
 		
-		if (artifactId == null || artifactId.isEmpty()) {
+		if (artifactId == null || artifactId.isEmpty())
 			throw new IllegalArgumentException("Invalid artifact id");
-		}
 		
 		String key = this.codersKey(groupId, artifactId, "");
 		
@@ -1285,13 +1227,11 @@
 	public List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> getCoders(String groupId, String artifactId) 
 			throws IllegalArgumentException {
 		
-		if (groupId == null || groupId.isEmpty()) {
+		if (groupId == null || groupId.isEmpty())
 			throw new IllegalArgumentException("Invalid group id");
-		}
 		
-		if (artifactId == null || artifactId.isEmpty()) {
+		if (artifactId == null || artifactId.isEmpty())
 			throw new IllegalArgumentException("Invalid artifact id");
-		}
 		
 		String key = this.codersKey(groupId, artifactId, "");
 		
@@ -1319,13 +1259,11 @@
 	public CoderFilters getFilters(String groupId, String artifactId, String topic, String classname)
 			throws IllegalArgumentException {
 		
-		if (!isCodingSupported(groupId, artifactId, topic)) {
+		if (!isCodingSupported(groupId, artifactId, topic))
 			throw new IllegalArgumentException("Unsupported:" + codersKey(groupId, artifactId, topic));
-		}
 		
-		if (classname == null || classname.isEmpty()) {
+		if (classname == null || classname.isEmpty())
 			throw new IllegalArgumentException("classname must be provided");
-		}
 		
 		String key = this.codersKey(groupId, artifactId, topic);
 		Pair<ProtocolCoderToolset,ProtocolCoderToolset> coderTools = coders.get(key);
@@ -1343,13 +1281,11 @@
 	public List<CoderFilters> getReverseFilters(String topic, String codedClass)
 			throws IllegalArgumentException {
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Unsupported");
-		}
 		
-		if (codedClass == null) {
+		if (codedClass == null)
 			throw new IllegalArgumentException("class must be provided");
-		}
 		
 		String key = this.reverseCodersKey(topic, codedClass);
 		List<Pair<ProtocolCoderToolset,ProtocolCoderToolset>> toolsets = this.reverseCoders.get(key);
@@ -1376,28 +1312,20 @@
 	DroolsController getDroolsController(String topic, Object fact)
 			throws IllegalArgumentException {
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Unsupported");
-		}
 		
-		if (fact == null) {
+		if (fact == null)
 			throw new IllegalArgumentException("class must be provided");
-		}
 		
 		List<DroolsController> droolsControllers = droolsCreators(topic, fact);
 		
-		if (droolsControllers.isEmpty()) {
-			if (logger.isWarnEnabled())
-				logger.warn("No Drool Controllers for: " + topic + ":" + 
-								fact.getClass().getCanonicalName() + ":" + 
-								droolsControllers + " IN " + this);		
+		if (droolsControllers.isEmpty())	
 			throw new IllegalArgumentException("Invalid Topic: " + topic);
-		}
 		
 		if (droolsControllers.size() > 1) {
-			logger.warn("MULTIPLE DROOLS CONTROLLERS FOUND for: " + topic + ":" + 
-                              fact.getClass().getCanonicalName() + ":" + 
-                              droolsControllers + " IN " + this);		
+			logger.warn("{}: multiple drools-controller {} for {}:{} ", this,
+				        droolsControllers, topic, fact.getClass().getCanonicalName());
 			// continue
 		}
 		return droolsControllers.get(0);
@@ -1414,20 +1342,17 @@
 	List<DroolsController> getDroolsControllers(String topic, Object fact)
 			throws IllegalArgumentException {
 		
-		if (topic == null || topic.isEmpty()) {
+		if (topic == null || topic.isEmpty())
 			throw new IllegalArgumentException("Unsupported");
-		}
 		
-		if (fact == null) {
+		if (fact == null)
 			throw new IllegalArgumentException("class must be provided");
-		}
 		
 		List<DroolsController> droolsControllers = droolsCreators(topic, fact);
 		if (droolsControllers.size() > 1) {
 			// unexpected
-			logger.warn("MULTIPLE DROOLS CONTROLLERS FOUND for: " + topic + ":" + 
-                              fact.getClass().getCanonicalName() + ":" + 
-                              droolsControllers + " IN " + this);		
+			logger.warn("{}: multiple drools-controller {} for {}:{} ", this,
+					    droolsControllers, topic, fact.getClass().getCanonicalName());		
 			// continue
 		}
 		return droolsControllers;
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java
index a2ce312..d6146a3 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/JsonProtocolFilter.java
@@ -24,6 +24,8 @@
 import java.util.List;
 
 import org.openecomp.policy.drools.utils.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
@@ -36,6 +38,11 @@
 public class JsonProtocolFilter {
 	
 	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(JsonProtocolFilter.class);
+	
+	/**
 	 * Helper class to collect Filter information
 	 */
 	public static class FilterRule {
@@ -130,7 +137,6 @@
 		List<FilterRule> filters = new ArrayList<FilterRule>();
 		for (Pair<String, String> filterPair: rawFilters) {
 			if  (filterPair.first() == null || filterPair.first().isEmpty()) {
-				// TODO: warn
 				continue;
 			}
 			
@@ -211,8 +217,6 @@
 			}
 			return true;
 		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
 			throw new IllegalArgumentException(e);
 		}
 	}
@@ -244,8 +248,8 @@
 		} catch (IllegalArgumentException ile) {
 			throw ile;
 		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			logger.info("{}: cannot accept {} because of {}", 
+					    this, json, e.getMessage(), e);
 			throw new IllegalArgumentException(e);			
 		}
 	}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java
index 2d24d7a..fb3f95d 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/ProtocolCoderToolset.java
@@ -21,7 +21,6 @@
 package org.openecomp.policy.drools.protocol.coders;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.time.Instant;
@@ -31,14 +30,13 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
 import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomCoder;
 import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
 import org.openecomp.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomJacksonCoder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -62,6 +60,11 @@
 public abstract class ProtocolCoderToolset {
 	
 	/**
+	 * Logger
+	 */
+	private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
+	
+	/**
 	 * topic
 	 */
 	protected final String topic;
@@ -274,8 +277,6 @@
 		try {
 			event = this.filteringParser.parse(json);
 		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
 			throw new UnsupportedOperationException(e);
 		}
 		
@@ -286,8 +287,9 @@
 					return decoder;
 				} 
 			} catch (Exception e) {
-				// TODO: handle exception
-				e.printStackTrace();
+				logger.info("{}: unexpected failure accepting {} because of {}", 
+						    this, event, e.getMessage(), e);
+				// continue
 			}
 		}
 		
@@ -331,7 +333,7 @@
  * Tools used for encoding/decoding using Jackson
  */
 class JacksonProtocolCoderToolset extends ProtocolCoderToolset {
-	private static Logger  logger = FlexLogger.getLogger(JacksonProtocolCoderToolset.class);	
+	private static Logger  logger = LoggerFactory.getLogger(JacksonProtocolCoderToolset.class);	
 	/**
 	 * decoder
 	 */
@@ -396,16 +398,14 @@
 		DroolsController droolsController = 
 				DroolsController.factory.get(groupId, artifactId, "");
 		if (droolsController == null) {
-			String error = "NO-DROOLS-CONTROLLER for: " + json + " IN " + this;
-			logger.warn(error);
-			throw new IllegalStateException(error);
+			logger.warn("{}: no drools-controller to process {}", this, json);
+			throw new IllegalStateException("no drools-controller to process event");
 		}
 		
 		CoderFilters decoderFilter = filter(json);
 		if (decoderFilter == null) {
-			String error = "NO-DECODER for: " + json + " IN " + this;
-			logger.warn(error);
-			throw new UnsupportedOperationException(error);
+			logger.debug("{}: no decoder to process {}", this, json);
+			throw new UnsupportedOperationException("no decoder to process event");
 		}
 		
 		Class<?> decoderClass;
@@ -413,14 +413,13 @@
 			decoderClass = 
 					droolsController.fetchModelClass(decoderFilter.getCodedClass());
 			if (decoderClass ==  null) {
-				String error = "DECODE-ERROR FETCHING MODEL CLASS: " + ":" + json + ":" + this;
-				logger.error(error);
-				throw new IllegalStateException(error);				
+				logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass());
+				throw new IllegalStateException("cannot fetch application class " +  decoderFilter.getCodedClass());				
 			}
 		} catch (Exception e) {
-			String error = "DECODE-ERROR FETCHING MODEL CLASS: "+ e.getMessage() + ":" + json + ":" + this;
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, error);
-			throw new UnsupportedOperationException(error, e);
+			logger.warn("{}: cannot fetch application class {} because of {}", this, 
+					    decoderFilter.getCodedClass(), e.getMessage());
+			throw new UnsupportedOperationException("cannot fetch application class " +  decoderFilter.getCodedClass(), e);
 		}
 		
 
@@ -428,9 +427,9 @@
 			Object fact = this.decoder.readValue(json, decoderClass);
 			return fact;
 		} catch (Exception e) {
-			String error = "DECODE-ERROR FROM PDP-D FRAMEWORK: "+ json + ":" + e.getMessage() + ":" + this;
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-			throw new UnsupportedOperationException(error, e);
+			logger.warn("{} cannot decode {} into {} because of {}",
+					    this, json, decoderClass.getName(), e.getMessage(), e);
+			throw new UnsupportedOperationException("cannont decode into " + decoderFilter.getCodedClass(), e);
 		}
 	}
 	
@@ -452,9 +451,8 @@
 			String encodedEvent = this.encoder.writeValueAsString(event);
 			return encodedEvent;			
 		} catch (JsonProcessingException e) {
-			String error = "ENCODE-ERROR: "+ event + " IN " + this;
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-			throw new UnsupportedOperationException(error, e);
+			logger.error("{} cannot encode {} because of {}", this, event, e.getMessage(), e);
+			throw new UnsupportedOperationException("event cannot be encoded");
 		}
 	}
 
@@ -472,7 +470,11 @@
  */
 class GsonProtocolCoderToolset extends ProtocolCoderToolset {
 	
-	private static Logger  logger = FlexLogger.getLogger(GsonProtocolCoderToolset.class);
+	/**
+	 * Logger
+	 */
+	private static Logger  logger = LoggerFactory.getLogger(GsonProtocolCoderToolset.class);
+	
 	/**
 	 * Formatter for JSON encoding/decoding
 	 */
@@ -493,7 +495,8 @@
 			try {
 				return ZonedDateTime.parse(element.getAsString(), format);
 			} catch (Exception e) {
-				System.err.println(e);
+				logger.info("GsonUTCAdapter: cannot parse {} because of {}", 
+						    element, e.getMessage(), e);
 			}
 			return null;
 		}
@@ -577,16 +580,14 @@
 		DroolsController droolsController = 
 				DroolsController.factory.get(groupId, artifactId, "");
 		if (droolsController == null) {
-			String error = "NO-DROOLS-CONTROLLER for: " + json + " IN " + this;
-			logger.warn(error);
-			throw new IllegalStateException(error);
+			logger.warn("{}: no drools-controller to process {}", this, json);
+			throw new IllegalStateException("no drools-controller to process event");
 		}
 		
 		CoderFilters decoderFilter = filter(json);
 		if (decoderFilter == null) {
-			String error = "NO-DECODER for: " + json + " IN " + this;
-			logger.warn(error);
-			throw new UnsupportedOperationException(error);
+			logger.debug("{}: no decoder to process {}", this, json);
+			throw new UnsupportedOperationException("no decoder to process event");
 		}
 		
 		Class<?> decoderClass;
@@ -594,14 +595,13 @@
 			decoderClass = 
 					droolsController.fetchModelClass(decoderFilter.getCodedClass());
 			if (decoderClass ==  null) {
-				String error = "DECODE-ERROR FETCHING MODEL CLASS: " + ":" + json + ":" + this;
-				logger.error(error);
-				throw new IllegalStateException(error);				
+				logger.warn("{}: cannot fetch application class {}", this, decoderFilter.getCodedClass());
+				throw new IllegalStateException("cannot fetch application class " +  decoderFilter.getCodedClass());				
 			}
 		} catch (Exception e) {
-			String error = "DECODE-ERROR FETCHING MODEL CLASS: "+ e.getMessage() + ":" + json + ":" + this;
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, error);
-			throw new UnsupportedOperationException(error, e);
+			logger.warn("{}: cannot fetch application class {} because of {}", this, 
+				    decoderFilter.getCodedClass(), e.getMessage());
+			throw new UnsupportedOperationException("cannot fetch application class " +  decoderFilter.getCodedClass(), e);
 		}
 		
 		if (this.customCoder != null) {
@@ -615,20 +615,19 @@
 						                     	("fromJson", new Class[]{String.class, Class.class});
 				Object fact = fromJsonMethod.invoke(gsonObject, json, decoderClass);
 				return fact;
-			} catch (NoSuchFieldException | SecurityException | IllegalAccessException | 
-					 NoSuchMethodException | InvocationTargetException e) {
-				String error = "DECODE-ERROR-FROM-CUSTOM-CODER: " + e.getMessage() + ":" + json + ":" + this;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-				throw new UnsupportedOperationException(error, e);
+			} catch (Exception e) {
+				logger.warn("{}: cannot fetch application class {} because of {}", this, 
+					        decoderFilter.getCodedClass(), e.getMessage());
+				throw new UnsupportedOperationException("cannot fetch application class " +  decoderFilter.getCodedClass(), e);
 			}			
 		} else {
 			try {
 				Object fact = this.decoder.fromJson(json, decoderClass);
 				return fact;
 			} catch (Exception e) {
-				String error = "DECODE-ERROR FROM PDP-D FRAMEWORK: "+ json + ":" + e.getMessage() + ":" + this;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-				throw new UnsupportedOperationException(error, e);
+				logger.warn("{} cannot decode {} into {} because of {}",
+					    this, json, decoderClass.getName(), e.getMessage(), e);
+				throw new UnsupportedOperationException("cannont decode into " + decoderFilter.getCodedClass(), e);
 			}			
 		}
 	}
@@ -645,9 +644,11 @@
 		DroolsController droolsController = 
 				DroolsController.factory.get(groupId, artifactId, "");
 		if (droolsController == null) {
-			String error = "NO-DROOLS-CONTROLLER for: " + event + " IN " + this;
-			logger.warn(error);
-			throw new IllegalStateException(error);
+			logger.info("{}: no drools-controller to process {} (continue)", this, event);
+			if (this.customCoder != null) {
+				logger.warn("{}: no drools-controller to process {}", this, event);
+				throw new IllegalStateException("custom-coder but no drools-controller");
+			}
 		}
 		
 		if (this.customCoder != null) {
@@ -661,20 +662,17 @@
 						                     	("toJson", new Class[]{Object.class});
 				String encodedJson = (String) toJsonMethod.invoke(gsonObject, event);
 				return encodedJson;
-			} catch (NoSuchFieldException | SecurityException | IllegalAccessException | 
-					 NoSuchMethodException | InvocationTargetException e) {
-				String error = "DECODE-ERROR-FROM-CUSTOM-CODER: " + e.getMessage() + ":" + event + ":" + this;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-				throw new UnsupportedOperationException(error, e);
+			} catch (Exception e) {
+				logger.warn("{} cannot custom-encode {} because of {}", this, event, e.getMessage(), e);
+				throw new UnsupportedOperationException("event cannot be encoded", e);
 			}			
 		} else {
 			try {
 				String encodedEvent = this.encoder.toJson(event);
 				return encodedEvent;			
 			} catch (Exception e) {
-				String error = "ENCODE-ERROR: "+ event + " IN " + this;
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, error);
-				throw new UnsupportedOperationException(error, e);
+				logger.warn("{} cannot encode {} because of {}", this, event, e.getMessage(), e);
+				throw new UnsupportedOperationException("event cannot be encoded", e);
 			}		
 		}
 	}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java b/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java
index de66616..be6c496 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/server/restful/RestManager.java
@@ -20,6 +20,7 @@
 
 package org.openecomp.policy.drools.server.restful;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -42,9 +43,6 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.event.comm.TopicEndpoint;
 import org.openecomp.policy.drools.event.comm.TopicSink;
@@ -65,7 +63,10 @@
 import org.openecomp.policy.drools.protocol.configuration.PdpdConfiguration;
 import org.openecomp.policy.drools.system.PolicyController;
 import org.openecomp.policy.drools.system.PolicyEngine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import ch.qos.logback.classic.LoggerContext;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -101,7 +102,7 @@
 	/**
 	 * Logger
 	 */
-	private static Logger  logger = FlexLogger.getLogger(RestManager.class);  
+	private static Logger logger = LoggerFactory.getLogger(RestManager.class);  
 	
     @GET
     @Path("engine")
@@ -125,8 +126,7 @@
     	try {
 			PolicyEngine.manager.shutdown();
 		} catch (IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-					          "shutdown: " + PolicyEngine.manager);
+			logger.error("{}: cannot shutdown {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
     		return Response.status(Response.Status.BAD_REQUEST).
 			        entity(PolicyEngine.manager).
 			        build();
@@ -211,8 +211,7 @@
 			success = PolicyEngine.manager.configure(configuration);
 		} catch (Exception e) {
 			success = false;
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              "PolicyEngine", this.toString());
+			logger.info("{}: cannot configure {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
 		}
     	
 		if (!success)
@@ -260,8 +259,7 @@
 			PolicyEngine.manager.activate();
 		} catch (Exception e) {
 			success = false;
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              "PolicyEngine", this.toString());
+			logger.info("{}: cannot activate {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
 		}
     	
 		if (!success)
@@ -285,8 +283,7 @@
 			PolicyEngine.manager.deactivate();
 		} catch (Exception e) {
 			success = false;
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              "PolicyEngine", this.toString());
+			logger.info("{}: cannot deactivate {} because of {}", this, PolicyEngine.manager, e.getMessage(), e);
 		}
     	
 		if (!success)
@@ -406,8 +403,7 @@
 		} catch (IllegalArgumentException e) {
 			// This is OK
 		} catch (IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              controllerName, this.toString());
+			logger.info("{}: cannot get policy-controller because of {}", this, e.getMessage(), e);
 			return Response.status(Response.Status.NOT_ACCEPTABLE).
                             entity(new Error(controllerName + " not found")).build();
 		}
@@ -416,8 +412,7 @@
 			controller = PolicyEngine.manager.createPolicyController
 					(config.getProperty(PolicyProperties.PROPERTY_CONTROLLER_NAME), config);
 		} catch (IllegalArgumentException | IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			                  controllerName, this.toString());
+			logger.warn("{}: cannot create policy-controller because of {}", this, e.getMessage(), e);
     		return Response.status(Response.Status.BAD_REQUEST).
 							        entity(new Error(e.getMessage())).
 							        build();
@@ -426,13 +421,12 @@
     	try {
 			boolean success = controller.start();
 			if (!success) {
-				logger.warn("Can't start " + controllerName + ": " + controller.toString());
+				logger.info("{}: cannot start {}", this, controller);
 				return Response.status(Response.Status.PARTIAL_CONTENT).
                                        entity(new Error(controllerName + " can't be started")).build();
 			}
 		} catch (IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                    controllerName, this.toString());
+			logger.info("{}: cannot start {} because of {}", this, controller, e.getMessage(), e);;
 			return Response.status(Response.Status.PARTIAL_CONTENT).
                                    entity(controller).build();
 		}
@@ -547,14 +541,12 @@
 	    				        entity(new Error(controllerName + "  does not exist")).
 	    				        build();
 		} catch (IllegalArgumentException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			                  controllerName, this.toString());
+			logger.info("{}: cannot get policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
 			return Response.status(Response.Status.BAD_REQUEST).
 							        entity(new Error(controllerName +  " not found: " + e.getMessage())).
 							        build();
 		} catch (IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              controllerName, this.toString());
+			logger.info("{}: cannot get policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
 			return Response.status(Response.Status.NOT_ACCEPTABLE).
                                    entity(new Error(controllerName + " not acceptable")).build();
 		}
@@ -562,8 +554,7 @@
     	try {
 			PolicyEngine.manager.removePolicyController(controllerName);
 		} catch (IllegalArgumentException | IllegalStateException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			                  controllerName + controller);
+			logger.info("{}: cannot remove policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
     		return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
 							       entity(new Error(e.getMessage())).
 							       build();
@@ -647,14 +638,12 @@
 	    				        entity(new Error(controllerName + "  does not exist")).
 	    				        build();
 		} catch (IllegalArgumentException e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			                  controllerName, this.toString());
+			logger.info("{}: cannot update policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
 			return Response.status(Response.Status.BAD_REQUEST).
 							        entity(new Error(controllerName +  " not found: " + e.getMessage())).
 							        build();
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-                              controllerName, this.toString());
+			logger.info("{}: cannot update policy-controller {} because of {}", this, controllerName, e.getMessage(), e);
 			return Response.status(Response.Status.NOT_ACCEPTABLE).
                                    entity(new Error(controllerName + " not acceptable")).build();
 		}
@@ -2182,6 +2171,91 @@
 		        build();
     }
     
+    @GET
+    @Path("engine/tools/loggers")
+    @ApiOperation(
+        	value="all active loggers", 
+            responseContainer="List"
+    )
+    @ApiResponses(value = { 
+		@ApiResponse(code=500, message="logging misconfiguration")
+    })
+    public Response loggers() { 
+    	List<String> names = new ArrayList<String>();
+    	if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
+    		logger.warn("The SLF4J logger factory is not configured for logback");
+    		return Response.status(Status.INTERNAL_SERVER_ERROR).
+    				        entity(names).build();
+    	}
+    		
+    	LoggerContext context = 
+    			(LoggerContext) LoggerFactory.getILoggerFactory();
+    	for (Logger logger: context.getLoggerList()) {
+    		names.add(logger.getName());
+    	}
+    	
+		return Response.status(Status.OK).
+		        entity(names).
+		        build();
+    }
+    
+    @GET
+    @Path("engine/tools/loggers/{logger}")
+    @ApiOperation(
+        	value="logging level of a logger"
+    )
+    @ApiResponses(value = { 
+    	@ApiResponse(code=500, message="logging misconfiguration"),
+		@ApiResponse(code=404, message="logger not found")
+    })
+    public Response loggerName(@ApiParam(value="Logger Name", required=true) 
+                               @PathParam("logger") String loggerName) { 
+    	if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
+    		logger.warn("The SLF4J logger factory is not configured for logback");
+    		return Response.status(Status.INTERNAL_SERVER_ERROR).build();
+    	}
+    	
+    	LoggerContext context = 
+    			(LoggerContext) LoggerFactory.getILoggerFactory();
+    	ch.qos.logback.classic.Logger logger = context.getLogger(loggerName);
+    	if (logger == null) {
+    		return Response.status(Status.NOT_FOUND).build();
+    	}
+    	
+    	String loggerLevel = (logger.getLevel() != null) ? logger.getLevel().toString() : "";   	
+		return Response.status(Status.OK).entity(loggerLevel).build();
+    }
+    
+    @PUT
+    @Path("engine/tools/loggers/{logger}/{level}")
+    @ApiOperation(
+        	value="sets the logger level", 
+        	notes="Please use the SLF4J logger levels"
+    )
+    @ApiResponses(value = { 
+        	@ApiResponse(code=500, message="logging misconfiguration"),
+    		@ApiResponse(code=404, message="logger not found")
+    })
+    public Response loggerName(@ApiParam(value="Logger Name", required=true) 
+                               @PathParam("logger") String loggerName,
+                               @ApiParam(value="Logger Level", required=true) 
+                               @PathParam("level") String loggerLevel) { 
+    	if (!(LoggerFactory.getILoggerFactory() instanceof LoggerContext)) {
+    		logger.warn("The SLF4J logger factory is not configured for logback");
+    		return Response.status(Status.INTERNAL_SERVER_ERROR).build();
+    	}
+    		
+    	LoggerContext context = 
+    			(LoggerContext) LoggerFactory.getILoggerFactory();
+    	ch.qos.logback.classic.Logger logger = context.getLogger(loggerName);
+    	if (logger == null) {
+    		return Response.status(Status.NOT_FOUND).build();
+    	}
+    	
+    	logger.setLevel(ch.qos.logback.classic.Level.toLevel(loggerLevel));
+		return Response.status(Status.OK).entity(logger.getLevel().toString()).build();
+    }
+    
     /**
      * gets the underlying drools controller from the named policy controller
      * @param controllerName the policy controller name
@@ -2204,6 +2278,13 @@
      * Helper classes for aggregation of results
      */
 	
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("rest-telemetry-api []");
+		return builder.toString();
+	}
+
 	/**
 	 * Coding/Encoding Results Aggregation Helper class 
 	 */
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
index 108600b..3b12514 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
@@ -25,8 +25,8 @@
 import java.nio.file.Paths;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.core.PolicyContainer;
 import org.openecomp.policy.drools.persistence.SystemPersistence;
 import org.openecomp.policy.drools.utils.PropertyUtil;
@@ -35,14 +35,58 @@
  * Programmatic entry point to the management layer
  */
 public class Main {
+
+	/**
+	 * logback configuration file system property
+	 */
+	public static final String LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY = "logback.configurationFile";
 	
 	/**
-	 * logger
+	 * logback configuration file system property
 	 */
-	private static Logger  logger = FlexLogger.getLogger(Main.class, true);  
+	public static final String LOGBACK_CONFIGURATION_FILE_DEFAULT = "config/logback.xml";
 	
+	/**
+	 * EELF logback configuration path system property
+	 */
+	public static final String EELF_LOGBACK_PATH_SYSTEM_PROPERTY = "com.att.eelf.logging.file";
+	
+	/**
+	 * EELF logback configuration path value
+	 */
+	public static final String EELF_LOGBACK_PATH_DEFAULT = "config";
+	
+	/**
+	 * EELF logback configuration file system property
+	 */
+	public static final String EELF_LOGBACK_FILE_SYSTEM_PROPERTY = "com.att.eelf.logging.path";
+	
+	/**
+	 * EELF logback configuration file default value
+	 */
+	public static final String EELF_LOGBACK_FILE_DEFAULT = "logback.xml";
+	
+	
+	/**
+	 * main
+	 * 
+	 * @param args program arguments
+	 */
 	public static void main(String args[]) {
 		
+		/* logging defaults */
+		
+		if (System.getProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY) == null)
+			System.setProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY, LOGBACK_CONFIGURATION_FILE_DEFAULT);
+		
+		if (System.getProperty(EELF_LOGBACK_PATH_SYSTEM_PROPERTY) == null)
+			System.setProperty(EELF_LOGBACK_PATH_SYSTEM_PROPERTY, EELF_LOGBACK_PATH_DEFAULT);
+		
+		if (System.getProperty(EELF_LOGBACK_FILE_SYSTEM_PROPERTY) == null)
+			System.setProperty(EELF_LOGBACK_FILE_SYSTEM_PROPERTY, EELF_LOGBACK_FILE_DEFAULT);
+		
+		Logger logger = LoggerFactory.getLogger(Main.class);
+		
 		File configDir = new File(SystemPersistence.CONFIG_DIR_NAME);
 		
 		if (!configDir.isDirectory()) {
@@ -57,9 +101,7 @@
 		try {
 			PolicyContainer.globalInit(args);
 		} catch (Exception e) {
-			System.out.println("policy-core startup failed");
-			logger.warn("policy-core startup failed");
-			e.printStackTrace();
+			logger.warn("Main: cannot init policy-container because of {}", e.getMessage(), e);
 		}
 		
 		/* 1. Configure the Engine */
@@ -69,9 +111,7 @@
 			Properties properties = PropertyUtil.getProperties(policyEnginePath.toFile());
 			PolicyEngine.manager.configure(properties);
 		} catch (Exception e) {
-			String msg = "Policy Engine cannot be configured with properties: " + e.getMessage() + " : " + PolicyEngine.manager;
-			System.out.println(msg);
-			logger.warn(msg);
+			logger.warn("Main: cannot initialize {} because of {}", PolicyEngine.manager, e.getMessage(), e);
 		}
 		
 		/* 2. Start the Engine with the basic services only (no Policy Controllers) */
@@ -79,17 +119,12 @@
 		try {
 			boolean success = PolicyEngine.manager.start();
 			if (!success) {
-				System.out.println("Policy Engine found some problems starting some components: " + PolicyEngine.manager);
-				logger.warn("Policy Engine is in an invalid state: " + PolicyEngine.manager);				
+				logger.warn("Main: {} has been partially started", PolicyEngine.manager);		
 			}
 		} catch (IllegalStateException e) {
-			String msg = "Policy Engine is starting in an unexpected state: " + e.getMessage() + " : " + PolicyEngine.manager;
-			System.out.println(msg);
-			logger.warn(msg);
+			logger.warn("Main: cannot start {} (bad state) because of {}", PolicyEngine.manager, e.getMessage(), e);
 		} catch (Exception e) {
-			String msg = "Unexpected Situation.  Policy Engine cannot be started: " + e.getMessage() + " : " + PolicyEngine.manager;
-			System.out.println(msg);
-			e.printStackTrace();
+			logger.warn("Main: cannot start {} because of {}", PolicyEngine.manager, e.getMessage(), e);
 			System.exit(1);
 		}
 		
@@ -117,13 +152,10 @@
 					PolicyController controller = PolicyEngine.manager.createPolicyController(name, properties);
 					controller.start();
 				} catch (Exception e) {
-					System.out.println("can't instantiate Policy Controller based on properties file: " + 
-				                       config + " with message " + e.getMessage());
-					e.printStackTrace();
-				} catch (LinkageError le) {
-					System.out.println("can't instantiate Policy Controller based on properties file: " + 
-		                       config + ". A Linkage Error has been encountered: " + le.getMessage());
-					le.printStackTrace();					
+					logger.error("Main: cannot instantiate policy-controller {} because of {}", name, e.getMessage(), e);
+				} catch (LinkageError e) {
+					logger.warn("Main: cannot instantiate policy-controller {} (linkage) because of {}", 
+							    name, e.getMessage(), e);
 				}
 			}
 		}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java
index c6020ea..12a8acd 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyControllerFactory.java
@@ -25,8 +25,8 @@
 import java.util.List;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.features.PolicyControllerFeatureAPI;
 import org.openecomp.policy.drools.protocol.configuration.DroolsConfiguration;
@@ -184,7 +184,7 @@
  */
 class IndexedPolicyControllerFactory implements PolicyControllerFactory {
 	// get an instance of logger 
-	private static Logger  logger = FlexLogger.getLogger(PolicyControllerFactory.class);		
+	private static Logger  logger = LoggerFactory.getLogger(PolicyControllerFactory.class);		
 	
 	/**
 	 * Policy Controller Name Index
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
index f18aa78..974a726 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
@@ -24,9 +24,8 @@
 import java.util.List;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.eelf.MessageCodes;
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.core.jmx.PdpJmxListener;
 import org.openecomp.policy.drools.event.comm.Topic;
@@ -319,7 +318,7 @@
 	/**
 	 * logger
 	 */
-	private static Logger  logger = FlexLogger.getLogger(PolicyEngineManager.class);  	
+	private static Logger  logger = LoggerFactory.getLogger(PolicyEngineManager.class);  	
 	
 	/**
 	 * Is the Policy Engine running?
@@ -373,8 +372,8 @@
 				if (feature.beforeConfigure(this, properties))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-configure failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -386,19 +385,19 @@
 				source.register(this);
 			}
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "configure");
+			logger.error("{}: add-sources failed", this, e);
 		}
 		
 		try {
 			this.sinks = TopicEndpoint.manager.addTopicSinks(properties);
 		} catch (IllegalArgumentException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "configure");
+			logger.error("{}: add-sinks failed", this, e);
 		}
 		
 		try {
 			this.httpServers = HttpServletServer.factory.build(properties);
 		} catch (IllegalArgumentException e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "configure");
+			logger.error("{}: add-http-servers failed", this, e);
 		}
 		
 		/* policy-engine dispatch post configure hook */
@@ -407,8 +406,8 @@
 				if (feature.afterConfigure(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-configure failure because of {}",  
+						     this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -442,8 +441,8 @@
 				if (controller != null)
 					return controller;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + controllerFeature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-controller-create failure because of {}",  
+				             this, controllerFeature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -457,8 +456,8 @@
 				if (controllerFeature.afterCreate(controller))
 					return controller;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + controllerFeature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-controller-create failure because of {}",  
+			                 this, controllerFeature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -519,7 +518,7 @@
 				PolicyController policyController = this.updatePolicyController(configController);
 				policyControllers.add(policyController);
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "updatePolicyControllers");
+				logger.error("{}: cannot update-policy-controllers because of {}", this, e.getMessage(), e);
 			}
 		}
 		
@@ -620,10 +619,10 @@
 			
 			return policyController;
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "updatePolicyController " + e.getMessage());
+			logger.error("{}: cannot update-policy-controller because of {}", this, e.getMessage(), e);
 			throw e;
 		} catch (LinkageError e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine", "updatePolicyController " + e.getMessage());
+			logger.error("{}: cannot update-policy-controllers (rules) because of {}", this, e.getMessage(), e);
 			throw new IllegalStateException(e);
 		}
 	}
@@ -640,8 +639,8 @@
 				if (feature.beforeStart(this))
 					return true;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-start failure because of {}", 
+					         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 			
@@ -658,7 +657,8 @@
 				if (!httpServer.start())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, httpServer.toString(), this.toString());
+				logger.error("{}: cannot start http-server {} because of {}", this, 
+						     httpServer, e.getMessage(), e);
 			}
 		}
 		
@@ -669,7 +669,8 @@
 				if (!source.start())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, source.toString(), this.toString());
+				logger.error("{}: cannot start topic-source {} because of {}", this, 
+					         source, e.getMessage(), e);
 			}
 		}
 		
@@ -680,7 +681,8 @@
 				if (!sink.start())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, sink.toString(), this.toString());
+				logger.error("{}: cannot start topic-sink {} because of {}", this, 
+				             sink, e.getMessage(), e);
 			}
 		}
 		
@@ -692,7 +694,8 @@
 				if (!controller.start())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, controller.toString(), this.toString());
+				logger.error("{}: cannot start policy-controller {} because of {}", this, 
+			                 controller, e.getMessage(), e);
 				success = false;
 			}
 		}
@@ -703,8 +706,7 @@
 			if (!TopicEndpoint.manager.start())
 				success = false;			
 		} catch (IllegalStateException e) {
-			String msg = "Topic Endpoint Manager is in an invalid state: " + e.getMessage() + " : " + this;
-			logger.warn(msg);			
+			logger.warn("{}: Topic Endpoint Manager is in an invalid state because of {}", this, e.getMessage(), e);			
 		}
 		
 		
@@ -718,8 +720,8 @@
 				if (feature.afterStart(this))
 					return success;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-start failure because of {}",  
+					         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 
@@ -738,8 +740,8 @@
 				if (feature.beforeStop(this))
 					return true;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-stop failure because of {}", 
+					     this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -757,7 +759,8 @@
 				if (!controller.stop())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, controller.toString(), this.toString());
+				logger.error("{}: cannot stop policy-controller {} because of {}", this, 
+		                     controller, e.getMessage(), e);
 				success = false;
 			}
 		}
@@ -768,7 +771,8 @@
 				if (!source.stop())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, source.toString(), this.toString());
+				logger.error("{}: cannot start topic-source {} because of {}", this, 
+		                     source, e.getMessage(), e);
 			}
 		}
 		
@@ -778,7 +782,8 @@
 				if (!sink.stop())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, sink.toString(), this.toString());
+				logger.error("{}: cannot start topic-sink {} because of {}", this, 
+	                         sink, e.getMessage(), e);
 			}
 		}
 		
@@ -792,7 +797,8 @@
 				if (!httpServer.stop())
 					success = false;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, httpServer.toString(), this.toString());
+				logger.error("{}: cannot start http-server {} because of {}", this, 
+						     httpServer, e.getMessage(), e);
 			}
 		}		
 		
@@ -802,8 +808,8 @@
 				if (feature.afterStop(this))
 					return success;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-stop failure because of {}",  
+					         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -822,8 +828,8 @@
 				if (feature.beforeShutdown(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-shutdown failure because of {}", 
+					         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 
@@ -834,7 +840,8 @@
 			try {
 				source.shutdown();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, source.toString(), this.toString());
+				logger.error("{}: cannot shutdown topic-source {} because of {}", this, 
+	                         source, e.getMessage(), e);
 			}
 		}
 		
@@ -843,7 +850,8 @@
 			try {
 				sink.shutdown();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, sink.toString(), this.toString());
+				logger.error("{}: cannot shutdown topic-sink {} because of {}", this, 
+                             sink, e.getMessage(), e);
 			}
 		}
 		
@@ -862,8 +870,8 @@
 				if (feature.afterShutdown(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-shutdown failure because of {}",  
+				         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 
@@ -874,7 +882,7 @@
 		    	try {
 					Thread.sleep(5000L);
 				} catch (InterruptedException e) {
-					logger.warn("InterruptedException while shutting down management server: " +  this.toString());
+					logger.warn("{}: interrupted-exception while shutting down management server: ", this);
 				}		    	
 				
 				/* shutdown all unmanaged http servers */
@@ -882,14 +890,15 @@
 					try {
 						httpServer.shutdown();
 					} catch (Exception e) {
-						logger.error(MessageCodes.EXCEPTION_ERROR, e, httpServer.toString(), this.toString());
+						logger.error("{}: cannot shutdown http-server {} because of {}", this, 
+								     httpServer, e.getMessage(), e);
 					}
 				} 
 		    	
 		    	try {
 					Thread.sleep(5000L);
 				} catch (InterruptedException e) {
-					logger.warn("InterruptedException while shutting down management server: " +  this.toString());
+					logger.warn("{}: interrupted-exception while shutting down management server: ", this);
 				}
 		    	
 		    	System.exit(0);
@@ -917,8 +926,8 @@
 				if (feature.beforeLock(this))
 					return true;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-lock failure because of {}",  
+				         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -933,7 +942,8 @@
 			try {
 				success = controller.lock() && success;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, controller.toString(), this.toString());
+				logger.error("{}: cannot lock policy-controller {} because of {}", this, 
+						     controller, e.getMessage(), e);
 				success = false;
 			}
 		}
@@ -946,8 +956,8 @@
 				if (feature.afterLock(this))
 					return success;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-lock failure because of {}",  
+				         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -966,8 +976,8 @@
 				if (feature.beforeUnlock(this))
 					return true;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-unlock failure because of {}",  
+				         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -982,7 +992,8 @@
 			try {
 				success = controller.unlock() && success;
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, controller.toString(), this.toString());
+				logger.error("{}: cannot unlock policy-controller {} because of {}", this, 
+					         controller, e.getMessage(), e);
 				success = false;
 			}
 		}
@@ -995,8 +1006,8 @@
 				if (feature.afterUnlock(this))
 					return success;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-unlock failure because of {}",  
+				         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -1133,7 +1144,8 @@
 			PdpdConfiguration configuration = this.decoder.fromJson(event, PdpdConfiguration.class);
 			this.configure(configuration);
 		} catch (Exception e) {
-			logger.error(MessageCodes.EXCEPTION_ERROR, e, "CONFIGURATION ERROR IN PDP-D POLICY ENGINE: "+ event + ":" + e.getMessage() + ":" + this);
+			logger.error("{}: configuration-error due to {} because of {}", 
+					     this, event, e.getMessage(), e);
 		}
 	}
 
@@ -1248,8 +1260,9 @@
 			if (controller != null)
 				return controller.deliver(busType, topic, event);
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-					          busType + ":" + topic + " :" + event, this.toString());
+			logger.warn("{}: cannot find policy-controller to deliver {} over {}:{} because of {}", 
+					    this, event, busType, topic, e.getMessage(), e);
+			
 			/* continue (try without routing through the controller) */
 		}
 		
@@ -1262,8 +1275,8 @@
 			return this.deliver(busType, topic, json);
 
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			          busType + ":" + topic + " :" + event, this.toString());
+			logger.warn("{}: cannot deliver {} over {}:{} because of {}", 
+				        this, event, busType, topic, e.getMessage(), e);
 			throw e;
 		}
 	}
@@ -1300,8 +1313,8 @@
 			return sink.send(event);
 
 		} catch (Exception e) {
-			logger.warn(MessageCodes.EXCEPTION_ERROR, e, 
-			          busType + ":" + topic + " :" + event, this.toString());
+			logger.warn("{}: cannot deliver {} over {}:{} because of {}", 
+			            this, event, busType, topic, e.getMessage(), e);
 			throw e;
 		}
 	}
@@ -1318,8 +1331,8 @@
 				if (feature.beforeActivate(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-activate failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 
@@ -1329,11 +1342,11 @@
 				policyController.unlock();
 				policyController.start();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine.activate: cannot start " + 
-		                     policyController + " because of " + e.getMessage());
+				logger.error("{}: cannot activate of policy-controller {} because of {}", 
+				             this, policyController,e.getMessage(), e);
 			} catch (LinkageError e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine.activate: cannot start " + 
-			                 policyController + " because of " + e.getMessage());
+				logger.error("{}: cannot activate (rules compilation) of policy-controller {} because of {}", 
+			                 this, policyController,e.getMessage(), e);
 			}
 		}
 		
@@ -1345,8 +1358,8 @@
 				if (feature.afterActivate(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-activate failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 	}
@@ -1363,8 +1376,8 @@
 				if (feature.beforeDeactivate(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} before-deactivate failure because of {}",  
+				              this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -1374,11 +1387,11 @@
 			try { 
 				policyController.stop();
 			} catch (Exception e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine.deactivate: cannot stop " + 
-		                     policyController + " because of " + e.getMessage());
+				logger.error("{}: cannot deactivate (stop) policy-controller {} because of {}", 
+			                 this, policyController, e.getMessage(), e);
 			} catch (LinkageError e) {
-				logger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyEngine.deactivate: cannot start " + 
-			                 policyController + " because of " + e.getMessage());
+				logger.error("{}: cannot deactivate (stop) policy-controller {} because of {}", 
+		                     this, policyController, e.getMessage(), e);
 			}
 		}
 		
@@ -1388,8 +1401,8 @@
 				if (feature.afterDeactivate(this))
 					return;
 			} catch (Exception e) {
-				System.out.println("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: feature {} after-deactivate failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 	}
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java
index 36a5851..f049162 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/internal/AggregatedPolicyController.java
@@ -24,8 +24,8 @@
 import java.util.List;
 import java.util.Properties;
 
-import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
-import org.openecomp.policy.common.logging.flexlogger.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.controller.DroolsController;
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.TopicEndpoint;
@@ -50,7 +50,7 @@
 	/**
 	 * Logger
 	 */
-	private static Logger  logger = FlexLogger.getLogger(AggregatedPolicyController.class); 
+	private static Logger logger = LoggerFactory.getLogger(AggregatedPolicyController.class); 
 	
 	/**
 	 * identifier for this policy controller
@@ -144,10 +144,7 @@
 			// Register with drools infrastructure
 			this.droolsController = DroolsController.factory.build(properties, sources, sinks);
 		} catch (Exception | LinkageError e) {
-			logger.error("BUILD-INIT-DROOLS: " + e.getMessage());
-			e.printStackTrace();
-			
-			// throw back exception as input properties cause problems
+			logger.error("{}: cannot init-drools because of {}", this, e.getMessage(), e);
 			throw new IllegalArgumentException(e);
 		}
 	}
@@ -177,8 +174,8 @@
 		if (oldDroolsConfiguration.getGroupId().equalsIgnoreCase(newDroolsConfiguration.getGroupId()) &&
 			oldDroolsConfiguration.getArtifactId().equalsIgnoreCase(newDroolsConfiguration.getArtifactId()) &&
 			oldDroolsConfiguration.getVersion().equalsIgnoreCase(newDroolsConfiguration.getVersion())) {
-			logger.warn("UPDATE-DROOLS: nothing to do: identical configuration: " + oldDroolsConfiguration +
-					    " <=> " + newDroolsConfiguration);
+			logger.warn("{}: cannot update-drools: identical configuration {} vs {}", 
+					    this, oldDroolsConfiguration, newDroolsConfiguration);
 			return true;
 		}
 		
@@ -208,8 +205,7 @@
 				this.droolsController.stop();
 			
 		} catch (IllegalArgumentException e) {
-			logger.warn("INIT-DROOLS: " + e.getMessage());
-			e.printStackTrace();
+			logger.error("{}: cannot update-drools because of {}", this, e.getMessage(), e);
 			return false;
 		}	
 		
@@ -228,17 +224,16 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public boolean start() throws IllegalStateException {
-		
-		if (logger.isInfoEnabled())
-			logger.info("START: " +  this);
+	public boolean start() throws IllegalStateException {		
+		logger.info("{}: start", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeStart(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-start failure because of {}",  
+			                 this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -264,8 +259,8 @@
 			try {
 				sink.start();
 			} catch (Exception e) {
-				logger.warn("can't start sink: " + sink + " because of " + e.getMessage());
-				e.printStackTrace();
+				logger.error("{}: cannot start {} because of {}",  
+		                     this, sink, e.getMessage(), e);
 			}
 		}
 		
@@ -274,7 +269,8 @@
 				if (feature.afterStart(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-start failure because of {}",  
+		                     this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -286,16 +282,15 @@
 	 */
 	@Override
 	public boolean stop() {
-		
-		if (logger.isInfoEnabled())
-			logger.info("STOP: " + this);
+		logger.info("{}: stop", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeStop(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-stop failure because of {}",  
+		                     this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -321,7 +316,8 @@
 				if (feature.afterStop(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-stop failure because of {}",  
+	                         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -333,15 +329,15 @@
 	 */
 	@Override
 	public void shutdown() throws IllegalStateException {
-		if (logger.isInfoEnabled())
-			logger.info("SHUTDOWN: " + this);
+		logger.info("{}: shutdown", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeShutdown(this))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-shutdown failure because of {}",  
+	                         this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -354,7 +350,8 @@
 				if (feature.afterShutdown(this))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-shutdown failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 	}
@@ -364,15 +361,15 @@
 	 */
 	@Override
 	public void halt() throws IllegalStateException {
-		if (logger.isInfoEnabled())
-			logger.info("HALT: " + this);
+		logger.info("{}: halt", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeHalt(this))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-halt failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -385,7 +382,8 @@
 				if (feature.afterHalt(this))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-halt failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 	}
@@ -398,14 +396,15 @@
 			                    String topic, String event) {
 
 		if (logger.isDebugEnabled())
-			logger.debug("EVENT NOTIFICATION: " + commType + ":" + topic + ":" + event +  " INTO " + this);
+			logger.debug("{}: event offered from {}:{}: {}", this, commType, topic, event);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeOffer(this, commType, topic, event))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-offer failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -422,7 +421,8 @@
 				if (feature.afterOffer(this, commType, topic, event, success))
 					return;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-offer failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 	}
@@ -437,14 +437,15 @@
                UnsupportedOperationException {	
 		
 		if (logger.isDebugEnabled())
-			logger.debug("DELIVER: " + commType + ":" + topic + ":" + event +  " FROM " + this);
+			logger.debug("{}: deliver event to {}:{}: {}", this, commType, topic, event);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeDeliver(this, commType, topic, event))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-deliver failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -461,9 +462,9 @@
 			throw new IllegalStateException("Policy Engine is locked");
 		
 		if (!this.topic2Sinks.containsKey(topic)) {
-			logger.error("UNDELIVERED: " + commType + ":" + topic + ":" + event +  " FROM " + this);
-			throw new IllegalArgumentException
-					("Unsuported topic " + topic + " for delivery");
+			logger.warn("{}: cannot deliver event because the sink {}:{} is not registered: {}", 
+					     this, commType, topic, event);
+			throw new IllegalArgumentException("Unsuported topic " + topic + " for delivery");
 		}
 		
 		boolean success = this.droolsController.deliver(this.topic2Sinks.get(topic), event);
@@ -473,7 +474,8 @@
 				if (feature.afterDeliver(this, commType, topic, event, success))
 					return success;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-deliver failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -493,15 +495,15 @@
 	 */
 	@Override
 	public boolean lock() {
-		if (logger.isInfoEnabled())
-			logger.info("LOCK: " + this);
+		logger.info("{}: lock", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeLock(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-lock failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -522,7 +524,8 @@
 				if (feature.afterLock(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-lock failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -535,15 +538,15 @@
 	@Override
 	public boolean unlock() {
 		
-		if (logger.isInfoEnabled())
-			logger.info("UNLOCK: " + this);
+		logger.info("{}: unlock", this);
 		
 		for (PolicyControllerFeatureAPI feature : PolicyControllerFeatureAPI.providers.getList()) {
 			try {
 				if (feature.beforeUnlock(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} before-unlock failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
@@ -561,7 +564,8 @@
 				if (feature.afterUnlock(this))
 					return true;
 			} catch (Exception e) {
-				logger.warn("ERROR: Feature API: " + feature.getClass().getName() + e.getMessage(), e);
+				logger.error("{}: feature {} after-unlock failure because of {}",  
+                             this, feature.getClass().getName(), e.getMessage(), e);
 			}
 		}
 		
diff --git a/policy-endpoints/src/main/resources/schema/pdpd-configuration.jsonschema b/policy-management/src/main/resources/schemas/pdpd-configuration.jsonschema
similarity index 100%
rename from policy-endpoints/src/main/resources/schema/pdpd-configuration.jsonschema
rename to policy-management/src/main/resources/schemas/pdpd-configuration.jsonschema
diff --git a/policy-management/src/main/server/config/controller.properties.README b/policy-management/src/main/server/config/controller.properties.README
deleted file mode 100644
index e5a049c..0000000
--- a/policy-management/src/main/server/config/controller.properties.README
+++ /dev/null
@@ -1,172 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# ONAP POLICY
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-#
-# *-controller.properties configuration
-#
-#
-# The <controller-name>-controller.properties file define the
-# configuration aspects of a give controller at initialization time.
-#
-# It contains 3 major sections:
-#
-# 1. CONTROLLER
-# 2. DMAAP
-# 4. UEB
-# 5. DROOLS
-#
-# 1. CONTROLLER
-#
-# controller.name: controller unique name identifier.
-#
-# 2. DMAAP:
-#    2.1. DMAAP Sources Information
-#         2.1.1. Topics that this controller supports over DMAAP.
-#         2.1.1. DMAAP Network Information for each topic.
-#         2.1.2. Decoders information for each topic to map network input to
-#                an object that will be injected into its appropriate drools
-#                sessions.
-#         2.1.3. Filtering information for each decoder, to filter out from
-#                drools, messages that should not be processed. 
-#    2.2. DMAAP Sinks Information
-#         2.2.1. Topics that this controller supports over DMAAP.
-#         2.2.2. DMAAP Network Information for each topic.
-#         2.2.3. Encoders information for each topic to map a model object
-#                to serialize network output that will be send over the 
-#                appropriate DMAAP topic according to its network information.
-#
-# 2.1 DMAAP Sources
-#
-# dmaap.source.topics:  comma separated list of DMAAP topics source of events.
-# dmaap.source.topics.<aTopic>.servers:  comma separated list of DMAAP servers to poll for events.
-# [optional] dmaap.source.topics.<aTopic>.apiKey=<APIKEY>  : api key       
-# [optional] dmaap.source.topics.<aTopic>.apiSecret=<APISECRET>  : api secret
-# [optional] dmaap.source.topics.<aTopic>.consumerGroup=<CONSUMER-GROUP> : consumer group
-# [optional] dmaap.source.topics.<aTopic>.consumerInstance=<CONSUMER-INSTANCE>  : consumer instance
-# dmaap.source.topics.<aTopic>.events:  comma separated list of classes to which an event can be mapped to,
-#    where <aTopic> must be declared in dmaap.source.topics
-# [optional] dmaap.source.topics.<aTopic>.events.<eventClass>.filter:  comma separated list of conditions in the form of 
-#      pairs of "<field-name>=<field-value-regex>" values, where <field-name> identifies a field of the event, and
-#      <field-value-regex> is a regular expression that that field's value in the event must match
-#      against each particular instantiation of the event for this controller.   Note that multiple 
-#      "<field-name>=<field-value-regex>" are evaluated for acceptance by AND'ing each condition.
-#      Further, <aTopic> must be declared in dmaap.source.topics, and 
-#      <eventClass> in dmaap.source.topics.<aTopic>.events.
-# [optional] dmaap.source.topics.<aTopic>.events.custom.gson:  comma separated pair, where the first item
-#      is a class in the model that contains a gson parser, and the second is the actual gson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-# [optional] dmaap.source.topics.<aTopic>.events.custom.jackson:  comma separated pair, where the first item
-#      is a class in the model that contains a jackson parser, and the second is the actual jackson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-#
-# 2.2 DMAAP Sinks
-#
-# dmaap.sink.topics:  comma separated list of DMAAP topics destination of locally produced events.
-# dmaap.sink.topics.<aTopic>.servers:  comma separated list of DMAAP servers to send events.
-# [optional] dmaap.sink.topics.<aTopic>.apiKey=<API-KEY>  : api key       
-# [optional] dmaap.sink.topics.<aTopic>.apiSecret=<API-SECRET>  : api secret
-# [optional] dmaap.sink.topics.<aTopic>.partitionKey=<PARTITIONKEY> : partition key
-# dmaap.sink.topics.<aTopic>.events:  comma separated list of classes to which an event can be mapped to,
-#    where <aTopic> must be declared in dmaap.sink.topics
-# [optional] dmaap.sink.topics.<aTopic>.events.custom.gson:  comma separated pair, where the first item
-#      is a class in the model that contains a gson parser, and the second is the actual gson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-# [optional] dmaap.sink.topics.<aTopic>.events.custom.jackson:  comma separated pair, where the first item
-#      is a class in the model that contains a jackson parser, and the second is the actual jackson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-#
-# 2. UEB:
-#    2.1. UEB Sources Information
-#         2.1.1. Topics that this controller supports over UEB.
-#         2.1.1. UEB Network Information for each topic.
-#         2.1.2. Decoders information for each topic to map network input to
-#                an object that will be injected into its appropriate drools
-#                sessions.
-#         2.1.3. Filtering information for each decoder, to filter out from
-#                drools, messages that should not be processed. 
-#    2.2. UEB Sinks Information
-#         2.2.1. Topics that this controller supports over UEB.
-#         2.2.2. UEB Network Information for each topic.
-#         2.2.3. Encoders information for each topic to map a model object
-#                to serialize network output that will be send over the 
-#                appropriate UEB topic according to its network information.
-#
-#
-# 2.1 UEB Sources
-#
-# ueb.source.topics:  comma separated list of UEB topics source of events.
-# ueb.source.topics.<aTopic>.servers:  comma separated list of UEB servers to poll for events.
-# [optional] ueb.source.topics.<aTopic>.apiKey=<API-KEY>  : api key       
-# [optional] ueb.source.topics.<aTopic>.apiSecret=<API-SECRET>  : api secret
-# [optional] ueb.source.topics.<aTopic>.consumerGroup=<CONSUMER-GROUP> : consumer group
-# [optional] ueb.source.topics.<aTopic>.consumerInstance=<CONSUMER-INSTANCE>  : consumer instance
-# ueb.source.topics.<aTopic>.events:  comma separated list of classes to which an event can be mapped to,
-#    where <aTopic> must be declared in ueb.source.topics
-# ueb.source.topics.<aTopic>.events.<eventClass>.filter:  comma separated list of conditions in the form of 
-#      pairs of "<field-name>=<field-value-regex>" values, where <field-name> identifies a field of the event, and
-#      <field-value-regex> is a regular expression that that field's value in the event must match
-#      against each particular instantiation of the event for this controller.   Note that multiple 
-#      "<field-name>=<field-value-regex>" are evaluated for acceptance by AND'ing each condition.
-#      Further, <aTopic> must be declared in ueb.source.topics, and 
-#      <eventClass> in ueb.source.topics.<aTopic>.events
-# ueb.source.topics.<aTopic>.events:  comma separated list of classes to which an event can be mapped to,
-#    where <aTopic> must be declared in dmaap.source.topics
-# [optional] ueb.source.topics.<aTopic>.events.<eventClass>.filter:  comma separated list of conditions in the form of 
-#      pairs of "<field-name>=<field-value-regex>" values, where <field-name> identifies a field of the event, and
-#      <field-value-regex> is a regular expression that that field's value in the event must match
-#      against each particular instantiation of the event for this controller.   Note that multiple 
-#      "<field-name>=<field-value-regex>" are evaluated for acceptance by AND'ing each condition.
-#      Further, <aTopic> must be declared in dmaap.source.topics, and 
-#      <eventClass> in dmaap.source.topics.<aTopic>.events.
-# [optional] ueb.source.topics.<aTopic>.events.custom.gson:  comma separated pair, where the first item
-#      is a class in the model that contains a gson parser, and the second is the actual gson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-# [optional] ueb.source.topics.<aTopic>.events.custom.jackson:  comma separated pair, where the first item
-#      is a class in the model that contains a jackson parser, and the second is the actual jackson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-#
-# 2.1 UEB Sinks
-#
-# ueb.sink.topics:  comma separated list of UEB topics destination of locally produced events.
-# ueb.sink.topics.<aTopic>.servers:  comma separated list of UEB servers to send events.
-# [optional] ueb.sink.topics.<aTopic>.apiKey=<APIKEY>  : api key       
-# [optional] ueb.sink.topics.<aTopic>.apiSecret=<APISECRET>  : api secret
-# [optional] ueb.sink.topics.<aTopic>.partitionKey=<PARTITIONKEY> : partition key
-# ueb.sink.topics.<aTopic>.events:  comma separated list of classes to which an event can be mapped to,
-#    where <aTopic> must be declared in ueb.sink.topics
-# [optional] ueb.sink.topics.<aTopic>.events.custom.gson:  comma separated pair, where the first item
-#      is a class in the model that contains a gson parser, and the second is the actual gson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-# [optional] ueb.sink.topics.<aTopic>.events.custom.jackson:  comma separated pair, where the first item
-#      is a class in the model that contains a jackson parser, and the second is the actual jackson parser in
-#      the class.   This setting overrides the PDP-D generic framework parsers with an specific model
-#      provided one
-#
-# 3. DROOLS (Maven Group Coordinates):
-# 
-# rules.groupId: maven group id of rules jar file
-# rules.artifactId: maven artifact id of rules jar file
-# rules.version: comma separated list of versions supported and detected that include the drl.
diff --git a/policy-management/src/main/server/config/log4j.properties b/policy-management/src/main/server/config/log4j.properties
deleted file mode 100644
index 6ad2564..0000000
--- a/policy-management/src/main/server/config/log4j.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# policy-management
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-
-log4j.rootLogger=INFO,stdout
-
-log4j.logger.org.apache.http.headers=INFO,stdout
-log4j.logger.org.apache.http.wire=INFO,stdout
-log4j.logger.networkLogger=INFO,network
-
-log4j.additivity.networkLogger=false
-
-log4j.appender.stdout=org.apache.log4j.RollingFileAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] %m %C:%L%n
-
-log4j.appender.network=org.apache.log4j.RollingFileAppender
-log4j.appender.network.File=logs/network.log
-log4j.appender.network.layout=org.apache.log4j.PatternLayout
-log4j.appender.network.layout.ConversionPattern=[%d|%t]%m%n%n
-log4j.appender.network.MaxFileSize=50MB
-log4j.appender.network.MaxBackupIndex=4
-
-log4j.logger.debugLogger=INFO,debug
-log4j.additivity.debugLogger=false
-log4j.appender.debug=org.apache.log4j.RollingFileAppender
-log4j.appender.debug.File=logs/debug.log
-log4j.appender.debug.layout=org.apache.log4j.PatternLayout
-log4j.appender.debug.layout.ConversionPattern=[%d|%t]%m%n%n
-log4j.appender.debug.MaxFileSize=50MB
-log4j.appender.debug.MaxBackupIndex=4
-
diff --git a/policy-management/src/main/server/config/logback.xml b/policy-management/src/main/server/config/logback.xml
index 6b01620..58092cc 100644
--- a/policy-management/src/main/server/config/logback.xml
+++ b/policy-management/src/main/server/config/logback.xml
@@ -18,194 +18,140 @@
   ============LICENSE_END=========================================================
   -->
 
-<configuration scan="true" scanPeriod="3 seconds" debug="true">
-  <!--<jmxConfigurator /> -->
-  <!-- directory path for all other type logs -->
-  <property name="logDir" value="logs" />
-  
-  <!-- directory path for debugging type logs -->
-  <property name="debugDir" value="debug-logs" />
-  
-  <!--  specify the component name 
-    <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC"  -->
-  <property name="componentName" value="Policy"></property>
-  
-  <!--  log file names -->
-  <property name="errorLogName" value="error" />
-  <property name="metricsLogName" value="metrics" />
-  <property name="auditLogName" value="audit" />
-  <property name="debugLogName" value="debug" />
-  <!-- modified time stamp format -->
-  <property name="defaultPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
-  <property name="defaultMetricPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
-  <property name="defaultAuditPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
-  <property name="defaultErrorPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
-  
-  <property name="defaultPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}|%msg%n" />
-  
-   <property name="debugLoggerPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%X{ClassName}|%msg%n" />  
-<!--  <property name="debugLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> -->
- 
-  <property name="debugLoggerPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
-  
-  <property name="logDirectory" value="${logDir}/${componentName}" />
-  <property name="debugLogDirectory" value="${logDir}/${componentName}" />
-  
-  
-  <!-- Example evaluator filter applied against console appender -->
-  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-    <encoder>
-      <pattern>${defaultPattern}</pattern>
-    </encoder>
-  </appender>
+<configuration scan="true" scanPeriod="30 seconds" debug="false">
 
-  <!-- ============================================================================ -->
-  <!-- EELF Appenders -->
-  <!-- ============================================================================ -->
+	<property name="logDir" value="logs" />
 
-  <!-- The EELFAppender is used to record events to the general application 
-    log -->
-    
-    
+	<property name="errorLog" value="error" />
+	<property name="metricLog" value="metric" />
+	<property name="auditLog" value="audit" />
+	<property name="debugLog" value="debug" />
+	<property name="networkLog" value="network" />
 
-  
-  <!-- EELF Audit Appender. This appender is used to record audit engine 
-    related logging events. The audit logger and appender are specializations 
-    of the EELF application root logger and appender. This can be used to segregate 
-    Policy engine events from other components, or it can be eliminated to record 
-    these events as part of the application root log. -->
-    
-  <appender name="EELFAudit"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${auditLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-         <pattern>${defaultAuditPattern}</pattern>
-    </encoder>
-  </appender>
-  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFAudit" />
-  </appender>
+	<property name="metricPattern"
+		value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+	<property name="auditPattern"
+		value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+	<property name="errorPattern"
+		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
 
-<appender name="EELFMetrics"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${metricsLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-      <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - 
-        %msg%n"</pattern> -->
-      <pattern>${defaultMetricPattern}</pattern>
-    </encoder>
-  </appender>
-  
-  
-  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFMetrics"/>
-  </appender>
-   
-  <appender name="EELFError"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${logDirectory}/${errorLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-     <level>ERROR</level>
-     </filter>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-      <pattern>${defaultErrorPattern}</pattern>
-    </encoder>
-  </appender>
-  
-  <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFError"/>
-  </appender>
-  
-   <appender name="EELFDebug"
-    class="ch.qos.logback.core.rolling.RollingFileAppender">
-    <file>${debugLogDirectory}/${debugLogName}.log</file>
-    <rollingPolicy
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-      <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
-      </fileNamePattern>
-      <minIndex>1</minIndex>
-      <maxIndex>9</maxIndex>
-    </rollingPolicy>
-    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-     <level>INFO</level>
-     </filter>
-    <triggeringPolicy
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-      <maxFileSize>5MB</maxFileSize>
-    </triggeringPolicy>
-    <encoder>
-      <pattern>${debugLoggerPattern}</pattern>
-    </encoder>
-  </appender>
-  
-  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
-    <queueSize>256</queueSize>
-    <appender-ref ref="EELFDebug" />
-    <includeCallerData>true</includeCallerData>
-  </appender>
- 
-  
-  <!-- ============================================================================ -->
-  <!--  EELF loggers -->
-  <!-- ============================================================================ -->
- 
-  <logger name="com.att.eelf.audit" level="info" additivity="false">
-    <appender-ref ref="asyncEELFAudit" />
-  </logger>
-  
-  <logger name="com.att.eelf.metrics" level="info" additivity="false">
-        <appender-ref ref="asyncEELFMetrics" />
-  </logger>
- 
-    <logger name="com.att.eelf.error" level="error" additivity="false">
-  <appender-ref ref="asyncEELFError" />
-  </logger>
-  
-   <logger name="com.att.eelf.debug" level="info" additivity="false">
-        <appender-ref ref="asyncEELFDebug" />
-  </logger>
-  
-  
-  
-  <root level="INFO">
-        <appender-ref ref="asyncEELFDebug" />
-        <appender-ref ref="asyncEELFError" />
-  </root>
+	<property name="debugPattern" value="[%date|%level|%logger{0}|%thread] %msg%n" />
+	<property name="networkPattern" value="[%d|%t]%m%n" />
+
+	<appender name="AuditOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${logDir}/${auditLog}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${logDir}/${auditLog}.%i.log.zip</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>5MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${auditPattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="AsyncAuditOut" class="ch.qos.logback.classic.AsyncAppender">
+		<appender-ref ref="AuditOut" />
+	</appender>
+
+	<appender name="MetricOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${logDir}/${metricLog}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${logDir}/${metricLog}.%i.log.zip</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>5MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${metricPattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="AsyncMetricOut" class="ch.qos.logback.classic.AsyncAppender">
+		<appender-ref ref="MetricOut" />
+	</appender>
+
+	<appender name="ErrorOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${logDir}/${errorLog}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${logDir}/${errorLog}.%i.log.zip</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>WARN</level>
+		</filter>
+		<triggeringPolicy
+			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>15MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${errorPattern}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="AsyncErrorOut" class="ch.qos.logback.classic.AsyncAppender">
+		<appender-ref ref="ErrorOut" />
+	</appender>
+	
+	<appender name="DebugOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${logDir}/${debugLog}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${logDir}/${debugLog}.%i.log.zip</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>20MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${debugPattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="AsyncDebugOut" class="ch.qos.logback.classic.AsyncAppender">
+		<appender-ref ref="DebugOut" />
+	</appender>
+
+	<appender name="NetworkOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${logDir}/${networkLog}.log</file>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>logs/network.log.%i.zip</fileNamePattern>
+			<minIndex>1</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+			<maxFileSize>15MB</maxFileSize>
+		</triggeringPolicy>
+		<encoder>
+			<pattern>${networkPattern}</pattern>
+		</encoder>		
+	</appender>
+	
+	<appender name="AsyncNetworkOut" class="ch.qos.logback.classic.AsyncAppender">
+		<appender-ref ref="NetworkOut" />
+	</appender>
+	
+ 	<logger name="com.att.eelf.audit" level="INFO">
+		<appender-ref ref="AsyncAuditOut" />
+	</logger>
+
+	<logger name="com.att.eelf.metrics" level="INFO">
+		<appender-ref ref="AsyncMetricOut" />
+	</logger>
+
+	<logger name="network" level="INFO" additivity="false">
+		<appender-ref ref="AsyncNetworkOut" />		
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="AsyncDebugOut" />
+		<appender-ref ref="AsyncErrorOut" />
+	</root>
 
 </configuration>
diff --git a/policy-management/src/main/server/config/makefile b/policy-management/src/main/server/config/makefile
deleted file mode 100644
index 5a96c54..0000000
--- a/policy-management/src/main/server/config/makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-
-restart: stop start
-
-start:
-	bin/policy-management-controller start
-stop:
-	bin/policy-management-controller stop
-console:
-	bin/policy-management-controller console
diff --git a/policy-management/src/main/server/config/policyLogger.properties b/policy-management/src/main/server/config/policyLogger.properties
deleted file mode 100644
index 4a97799..0000000
--- a/policy-management/src/main/server/config/policyLogger.properties
+++ /dev/null
@@ -1,49 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# policy-management
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-
-################################### Set concurrentHashMap and timer info  #######################
-#Timer initial delay and the delay between in milliseconds before task is to be execute.
-timer.delay.time=1000
-#Timer scheduleAtFixedRate period - time in milliseconds between successive task executions.
-check.interval= 30000
-#Longest time an event info can be stored in the concurrentHashMap for logging - in seconds. 
-event.expired.time=86400
-#Size of the concurrentHashMap which stores the event starting time, etc - when its size reaches this limit, the Timer gets executed 
-#to remove all expired records from this concurrentHashMap.
-concurrentHashMap.limit=5000
-#Size of the concurrentHashMap - when its size drops to this point, stop the Timer
-stop.check.point=2500
-################################### Set logging format #############################################
-# set EELF for EELF logging format, set LOG4J for using log4j, set SYSTEMOUT for using system.out.println
-logger.type=EELF
-#################################### Set level for EELF or SYSTEMOUT logging ##################################
-# Set level for debug file. Set DEBUG to enable .info, .warn and .debug; set INFO for enable .info and .warn; set OFF to disable all 
-# Set override flag. Set TRUE for override the level setups in logback.xml. Set FALSE for using the level setups of logback.xml
-override.logback.level.setup=FALSE
-debugLogger.level=INFO
-# Set level for metrics file. Set OFF to disable; set ON to enable
-metricsLogger.level=ON
-# Set level for error file. Set OFF to disable; set ON to enable
-error.level=ON
-# Set level for audit file. Set OFF to disable; set ON to enable
-audit.level=ON
-#################################### Set Policy Component ##################################
-# Set DROOLS for drools PDP. Set XACML to xacml PDP
-policy.component=DROOLS
diff --git a/policy-management/src/main/server/config/system.properties b/policy-management/src/main/server/config/system.properties
index feffbd0..67294c8 100644
--- a/policy-management/src/main/server/config/system.properties
+++ b/policy-management/src/main/server/config/system.properties
@@ -20,12 +20,24 @@
 
 # system properties passed to controller
 
-# start JMX server port
+# jmx
+
 com.sun.management.jmxremote.port = 9991
 com.sun.management.jmxremote.authenticate = false
 com.sun.management.jmxremote.ssl = false
 
+# certs
+
 javax.net.ssl.keyStore=/opt/app/policy/etc/ssl/policy-keystore
 javax.net.ssl.keyStorePassword = ${{KEYSTORE_PASSWD}}
 javax.net.ssl.trustStore=/opt/app/policy/etc/ssl/policy-keystore
 javax.net.ssl.trustStorePassword = ${{KEYSTORE_PASSWD}}
+
+# standard logging
+
+logback.configurationFile=config/logback.xml
+
+# eelf logging
+
+com.att.eelf.logging.path=config
+com.att.eelf.logging.file=logback.xml
\ No newline at end of file
diff --git a/policy-utils/pom.xml b/policy-utils/pom.xml
index 509e293..108d66d 100644
--- a/policy-utils/pom.xml
+++ b/policy-utils/pom.xml
@@ -32,44 +32,17 @@
   </parent>
 
 
-	<dependencies>
+	<dependencies>    			
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+		</dependency> 	    
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<version>4.11</version>
 			<scope>test</scope>
 		</dependency>
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-			<version>1.2.17</version>
-			<scope>provided</scope>
-		</dependency>       	
-		<dependency>
-			<groupId>com.att.eelf</groupId>
-			<artifactId>eelf-core</artifactId>
-			<version>0.0.1</version>
-		</dependency>   		
-		<dependency>
-			<groupId>ch.qos.logback</groupId>
-			<artifactId>logback-classic</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
-			<groupId>ch.qos.logback</groupId>
-			<artifactId>logback-core</artifactId>
-			<version>1.1.1</version>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-			<version>1.7.6</version>
-		</dependency>  	    
-		<dependency>
-			<groupId>org.openecomp.policy.common</groupId>
-			<artifactId>ECOMP-Logging</artifactId>
-			<version>${common-modules.version}</version>
-		</dependency>	
   	</dependencies>
 
     
diff --git a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/OrderedServiceImpl.java b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/OrderedServiceImpl.java
index c5f9a34..72bf7b8 100644
--- a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/OrderedServiceImpl.java
+++ b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/OrderedServiceImpl.java
@@ -27,12 +27,18 @@
 import java.util.List;
 import java.util.ServiceLoader;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * This class is a template for building a sorted list of service instances,
  * which are discovered and created using 'ServiceLoader'. 
  */
 public class OrderedServiceImpl<T extends OrderedService>
 {
+  // logger
+  private static Logger  logger = LoggerFactory.getLogger(OrderedServiceImpl.class); 
+  
   // sorted list of instances implementing the service
   private List<T> implementers = null;
 
@@ -113,7 +119,7 @@
 
 	// create an unmodifiable version of this list
 	implementers = Collections.unmodifiableList(tmp);
-	System.out.println("***** OrderedServiceImpl implementers:\n" + implementers);
+	logger.info("***** OrderedServiceImpl implementers:\n {}", implementers);
 	return(implementers);
   }
 
diff --git a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/PropertyUtil.java b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/PropertyUtil.java
index 34ddcc1..1e8dc26 100644
--- a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/PropertyUtil.java
+++ b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/PropertyUtil.java
@@ -382,22 +382,4 @@
 	stopListening(new File(fileName), listener);
   }
 
-  /* ============================================================ */
-
-  // TEMPORARY - used to test callback interface
-  static public class Test implements Listener
-  {
-	String name;
-
-	public Test(String name)
-	  {
-		this.name = name;
-	  }
-
-	public void propertiesChanged(Properties properties, Set<String> changedKeys)
-	  {
-		System.out.println("Test(" + name + ")\nproperties = " + properties
-						   + "\nchangedKeys = " + changedKeys);
-	  }
-  }
 }
diff --git a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/ReflectionUtil.java b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/ReflectionUtil.java
index 1ab6828..0d82e84 100644
--- a/policy-utils/src/main/java/org/openecomp/policy/drools/utils/ReflectionUtil.java
+++ b/policy-utils/src/main/java/org/openecomp/policy/drools/utils/ReflectionUtil.java
@@ -23,43 +23,41 @@
  */
 package org.openecomp.policy.drools.utils;
 
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 /**
  * Reflection utilities
  *
  */
 public class ReflectionUtil {
 	
+	protected final static Logger logger = LoggerFactory.getLogger(ReflectionUtil.class);
+	
 	/**
 	 * returns (if exists) a class fetched from a given classloader
 	 * 
 	 * @param classLoader the class loader
-	 * @param classname the class name
+	 * @param className the class name
 	 * @return the actual class
 	 * @throws IllegalArgumentException if an invalid parameter has been passed in
 	 */
 	public static Class<?> fetchClass(ClassLoader classLoader, 
-			                          String classname) 
+			                          String className) 
 		throws IllegalArgumentException {
-		
-		PolicyLogger.info("FETCH-CLASS: " +  classname + " FROM " + classLoader);
-		
 		if (classLoader == null)
 			throw new IllegalArgumentException("A class loader must be provided");
 		
-		if (classname == null)
+		if (className == null)
 			throw new IllegalArgumentException("A class name to be fetched in class loader " +
 		                                       classLoader + " must be provided");
 		
 		try {
-			Class<?> aClass = Class.forName(classname, 
+			Class<?> aClass = Class.forName(className, 
 					                        true, 
 					                        classLoader);
 			return aClass;
 		} catch (Exception e) {
-			e.printStackTrace();
-			PolicyLogger.error("FETCH-CLASS: " + classname + " IN " + classLoader + " does NOT exist");
+			logger.error("FETCHED-CLASS {} IN {} does NOT EXIST", className, classLoader);
 		}
 		
 		return null;
@@ -84,8 +82,6 @@
 	 * @return
 	 */
 	public static boolean isSubclass(Class<?> parent, Class<?> presumedSubclass) {		
-		PolicyLogger.debug("IS-SUBCLASS: superclass: " +  parent.getCanonicalName() + 
-				          " subclass: " + presumedSubclass.getCanonicalName());
 		return (parent.isAssignableFrom(presumedSubclass));
 	}
 
diff --git a/policy-utils/src/test/java/org/openecomp/policy/drools/utils/PropertyUtilTest.java b/policy-utils/src/test/java/org/openecomp/policy/drools/utils/PropertyUtilTest.java
index 3238672..b45f1b4 100644
--- a/policy-utils/src/test/java/org/openecomp/policy/drools/utils/PropertyUtilTest.java
+++ b/policy-utils/src/test/java/org/openecomp/policy/drools/utils/PropertyUtilTest.java
@@ -34,12 +34,12 @@
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PropertyUtilTest
 {
- // private static final Logger PolicyLogger =
-//	Logger.getLogger(PropertyUtilTest.class.getName());
+  private final static Logger logger = LoggerFactory.getLogger(PropertyUtilTest.class);
 
   private static File directory = null;
 
@@ -49,7 +49,7 @@
   @BeforeClass
 	static public void setup()
   {
-	PolicyLogger.info("setup: creating a temporary directory");
+	logger.info("setup: creating a temporary directory");
 
 	// create a directory for temporary files
 	directory = new File(UUID.randomUUID().toString());
@@ -62,7 +62,7 @@
   @AfterClass
 	static public void teardown()
   {
-	PolicyLogger.info("teardown: remove the temporary directory");
+	logger.info("teardown: remove the temporary directory");
 
 	// the assumption is that we only have one level of temporary files
 	for (File file : directory.listFiles())
@@ -114,7 +114,7 @@
 		{
 		  // When a notification is received, store the values in the
 		  // 'returns' array, and signal using the same array.
-		  PolicyLogger.info("Listener invoked: properties=" + properties
+		  logger.info("Listener invoked: properties=" + properties
 					  + ", changedKeys=" + changedKeys);
 		  returns[0] = properties;
 		  returns[1] = changedKeys;
@@ -132,15 +132,15 @@
   @Test
 	public void testGetProperties() throws Exception
   {
-	PolicyLogger.info("testGetProperties: test the basic properties file interface");
+	logger.info("testGetProperties: test the basic properties file interface");
 
 	// copy system properties
-	PolicyLogger.info("Copy system properties to a file");
+	logger.info("Copy system properties to a file");
 	Properties prop1 = System.getProperties();
 	File file1 = createFile("createAndReadPropertyFile-1", prop1);
 
 	// read in properties, and compare
-	PolicyLogger.info("Read in properties from new file");
+	logger.info("Read in properties from new file");
 	Properties prop2 = PropertyUtil.getProperties(file1);
 
 	// they should match
@@ -153,14 +153,14 @@
   @Test
 	public void testListenerInterface() throws Exception
   {
-	PolicyLogger.info("testListenerInterface: test receipt of dynamic updates");
+	logger.info("testListenerInterface: test receipt of dynamic updates");
 
 	// create initial property file
 	Properties prop1 = new Properties();
 	prop1.setProperty("p1", "p1 value");
 	prop1.setProperty("p2", "p2 value");
 	prop1.setProperty("p3", "p3 value");
-	PolicyLogger.info("Create initial properties file: " + prop1);
+	logger.info("Create initial properties file: " + prop1);
 	File file1 = createFile("createAndReadPropertyFile-2", prop1);
 
 	// create a listener for the notification interface
@@ -169,7 +169,7 @@
 
 	// read it in, and do a comparison
 	Properties prop2 = PropertyUtil.getProperties(file1, listener);
-	PolicyLogger.info("Read in properties: " + prop2);
+	logger.info("Read in properties: " + prop2);
 	assertEquals(prop1, prop2);
 	assertEquals(prop2.getProperty("p1"), "p1 value");
 	assertEquals(prop2.getProperty("p2"), "p2 value");
@@ -179,7 +179,7 @@
 	prop2.remove("p1");		// remove one property
 	prop2.setProperty("p2", "new p2 value");	// change one property
 	prop2.setProperty("p4", "p4 value");		// add a new property
-	PolicyLogger.info("Modified properties: " + prop2);
+	logger.info("Modified properties: " + prop2);
 
 	// now, update the file, and wait for notification
 	synchronized(returns)
diff --git a/policy-utils/src/test/resources/log4j.properties b/policy-utils/src/test/resources/log4j.properties
deleted file mode 100644
index 0063f10..0000000
--- a/policy-utils/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# policy-utils
-# ================================================================================
-# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-# 
-#      http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-
-log4j.rootLogger=INFO, out
-
-# CONSOLE appender not used by default
-log4j.appender.out=org.apache.log4j.ConsoleAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d %-5p %-30.30c{1} %4L - %m%n
diff --git a/pom.xml b/pom.xml
index 373e6b6..7edfc1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,8 +42,9 @@
 		<jersey.version>2.22.2</jersey.version>
 		<jersey.swagger.version>1.5.13</jersey.swagger.version>
 		<jackson.version>2.8.4</jackson.version>
-		<http.client>4.5</http.client>
-		<http.core>4.4.4</http.core>
+		<http.client.version>4.5</http.client.version>
+		<http.core.version>4.4.4</http.core.version>
+		<logback.version>1.2.3</logback.version>
   
 		<sonar.language>java</sonar.language>
 		<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
@@ -102,9 +103,8 @@
 		</site>
 	</distributionManagement>
 
-	<dependencies>
+	<dependencies/>
 
-	</dependencies>
 	<dependencyManagement>
 		<dependencies>
 			<dependency>
@@ -165,12 +165,17 @@
 			<dependency>
 				<groupId>org.apache.httpcomponents</groupId>
 				<artifactId>httpclient</artifactId>
-				<version>${http.client}</version>
+				<version>${http.client.version}</version>
 			</dependency>
 			<dependency>
 				<groupId>org.apache.httpcomponents</groupId>
 				<artifactId>httpcore</artifactId>
-				<version>${http.core}</version>
+				<version>${http.core.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-classic</artifactId>
+				<version>${logback.version}</version>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>
