diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/pom.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/pom.xml
new file mode 100644
index 0000000..3158995
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>openecomp-sdc-logging-api</artifactId>
+    <name>openecomp-sdc-logging-api</name>
+
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-logging-lib</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j-api.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>${testng.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/BaseFactory.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/BaseFactory.java
new file mode 100644
index 0000000..918818a
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/BaseFactory.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+import java.util.Iterator;
+import java.util.ServiceLoader;
+
+/**
+ * Contains common functionality for factories used in the logging framework.
+ *
+ * <p>In order to use the factory, a particular (e.g. framework-specific) implementation of a service must be
+ * configured as described in
+ * <a href="http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html">java.util.ServiceLoader</a>).</p>
+ *
+ * @author evitaliy
+ * @since 13/09/2016.
+ *
+ * @see ServiceLoader
+ */
+public class BaseFactory {
+
+    protected static <T> T locateService(Class<T> clazz) {
+
+        T service;
+        ServiceLoader<T> loader = ServiceLoader.load(clazz);
+        Iterator<T> iterator = loader.iterator();
+        if (iterator.hasNext()) {
+
+            service = iterator.next();
+            if (iterator.hasNext()) {
+                System.err.println(String.format("Warning! Configured more than one implementation of %s",
+                        clazz.getName()));
+            }
+
+            return service;
+        }
+
+        throw new IllegalArgumentException((String.format("No implementations configured for %s", clazz.getName())));
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java
new file mode 100644
index 0000000..9055e64
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java
@@ -0,0 +1,107 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+/**
+ * <p>This interface defines logging as specified by Open OPENECOMP logging requirements.</p>
+ *
+ * <p>Formatted messages must follow the <a href="http://www.slf4j.org/api/org/slf4j/helpers/MessageFormatter.html>SLF4J
+ * format</a>.</p>
+ *
+ * @author evitaliy
+ * @since 13/09/2016.
+ */
+public interface Logger {
+
+    String getName();
+
+    boolean isMetricsEnabled();
+
+    void metrics(String msg);
+
+    void metrics(String msg, Object arg);
+
+    void metrics(String msg, Object arg1, Object arg2);
+
+    void metrics(String msg, Object... arguments);
+
+    void metrics(String msg, Throwable t);
+
+    boolean isAuditEnabled();
+
+    void audit(String msg);
+
+    void audit(String msg, Object arg);
+
+    void audit(String msg, Object arg1, Object arg2);
+
+    void audit(String msg, Object... arguments);
+
+    void audit(String msg, Throwable t);
+
+    boolean isDebugEnabled();
+
+    void debug(String msg);
+
+    void debug(String msg, Object arg);
+
+    void debug(String msg, Object arg1, Object arg2);
+
+    void debug(String msg, Object... arguments);
+
+    void debug(String msg, Throwable t);
+
+    boolean isInfoEnabled();
+
+    void info(String msg);
+
+    void info(String msg, Object arg);
+
+    void info(String msg, Object arg1, Object arg2);
+
+    void info(String msg, Object... arguments);
+
+    void info(String msg, Throwable t);
+
+    boolean isWarnEnabled();
+
+    void warn(String msg);
+
+    void warn(String msg, Object arg);
+
+    void warn(String msg, Object... arguments);
+
+    void warn(String msg, Object arg1, Object arg2);
+
+    void warn(String msg, Throwable t);
+
+    boolean isErrorEnabled();
+
+    void error(String msg);
+
+    void error(String msg, Object arg);
+
+    void error(String msg, Object arg1, Object arg2);
+
+    void error(String msg, Object... arguments);
+
+    void error(String msg, Throwable t);
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerCreationService.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerCreationService.java
new file mode 100644
index 0000000..fbad636
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerCreationService.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+/**
+ *
+ * Implements a framework-specific logging, to be used by {@link LoggerFactory}.
+ *
+ * @author evitaliy
+ * @since 13/09/2016.
+ */
+public interface LoggerCreationService {
+
+    Logger getLogger(String className);
+
+    Logger getLogger(Class<?> clazz);
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java
new file mode 100644
index 0000000..68365fd
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java
@@ -0,0 +1,234 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+
+/**
+ * <a>Factory to hide a concrete, framework-specific implementation of logger creation.</a>
+ * <p>The service used by this factory must implement {@link LoggerCreationService}. If no
+ * implementation has been configured or could not be instantiated, a <b>no-op logger</b> will be
+ * used, and <b>no events</b> will be logged. This is done to prevent recursion if attempts are
+ * being made to log exceptions that resulted from logger initialization. </p>
+ *
+ * @author evitaliy
+ * @see BaseFactory
+ * @see LoggerCreationService
+ * @since 13/09/2016.
+ */
+@SuppressWarnings("ThrowableInstanceNeverThrown")
+public class LoggerFactory extends BaseFactory {
+
+  private static final LoggerCreationService SERVICE;
+
+  static {
+    LoggerCreationService service;
+
+    try {
+      service = locateService(LoggerCreationService.class);
+    } catch (Exception ex) {
+      new RuntimeException("Failed to instantiate logger factory", ex).printStackTrace();
+      // use the no-op service to prevent recursion in case of an attempt to log an exception as a
+      // result of a logger initialization error
+      service = new NoOpLoggerCreationService();
+    }
+
+    SERVICE = service;
+  }
+
+  public static Logger getLogger(String clazzName) {
+    return SERVICE.getLogger(clazzName);
+  }
+
+  public static Logger getLogger(Class<?> clazz) {
+    return SERVICE.getLogger(clazz);
+  }
+
+  private static class NoOpLoggerCreationService implements LoggerCreationService {
+
+    private static final Logger NO_OP_LOGGER = new Logger() {
+
+      @Override
+      public String getName() {
+        return "No-Op Logger";
+      }
+
+      @Override
+      public boolean isMetricsEnabled() {
+        return false;
+      }
+
+      @Override
+      public void metrics(String msg) {
+      }
+
+      @Override
+      public void metrics(String msg, Object arg) {
+      }
+
+      @Override
+      public void metrics(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void metrics(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void metrics(String msg, Throwable t) {
+      }
+
+      @Override
+      public boolean isAuditEnabled() {
+        return false;
+      }
+
+      @Override
+      public void audit(String msg) {
+      }
+
+      @Override
+      public void audit(String msg, Object arg) {
+      }
+
+      @Override
+      public void audit(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void audit(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void audit(String msg, Throwable t) {
+      }
+
+      @Override
+      public boolean isDebugEnabled() {
+        return false;
+      }
+
+      @Override
+      public void debug(String msg) {
+      }
+
+      @Override
+      public void debug(String msg, Object arg) {
+      }
+
+      @Override
+      public void debug(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void debug(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void debug(String msg, Throwable t) {
+      }
+
+      @Override
+      public boolean isInfoEnabled() {
+        return false;
+      }
+
+      @Override
+      public void info(String msg) {
+      }
+
+      @Override
+      public void info(String msg, Object arg) {
+      }
+
+      @Override
+      public void info(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void info(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void info(String msg, Throwable t) {
+      }
+
+      @Override
+      public boolean isWarnEnabled() {
+        return false;
+      }
+
+      @Override
+      public void warn(String msg) {
+      }
+
+      @Override
+      public void warn(String msg, Object arg) {
+      }
+
+      @Override
+      public void warn(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void warn(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void warn(String msg, Throwable t) {
+      }
+
+      @Override
+      public boolean isErrorEnabled() {
+        return false;
+      }
+
+      @Override
+      public void error(String msg) {
+      }
+
+      @Override
+      public void error(String msg, Object arg) {
+      }
+
+      @Override
+      public void error(String msg, Object arg1, Object arg2) {
+      }
+
+      @Override
+      public void error(String msg, Object... arguments) {
+      }
+
+      @Override
+      public void error(String msg, Throwable t) {
+      }
+    };
+
+    @Override
+    public Logger getLogger(String className) {
+      return NO_OP_LOGGER;
+    }
+
+    @Override
+    public Logger getLogger(Class<?> clazz) {
+      return NO_OP_LOGGER;
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/annotations/Metrics.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/annotations/Metrics.java
new file mode 100644
index 0000000..2bcad91
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/annotations/Metrics.java
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api.annotations;
+
+/**
+ * Indicates a method whose execution time should be measured and logged as required for Open OPENECOMP metrics.
+ *
+ * @author evitaliy
+ * @since 27/07/2016.
+ */
+
+public @interface Metrics {
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/ContextPropagationService.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/ContextPropagationService.java
new file mode 100644
index 0000000..98200da
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/ContextPropagationService.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api.context;
+
+/**
+ * Should be used to implement a framework-specific mechanism of propagation of a diagnostic context to child threads.
+ *
+ * @author evitaliy
+ * @since 12/09/2016.
+ */
+public interface ContextPropagationService {
+
+    Runnable create(Runnable task);
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/TaskFactory.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/TaskFactory.java
new file mode 100644
index 0000000..e2b31c3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/context/TaskFactory.java
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api.context;
+
+import org.openecomp.sdc.logging.api.BaseFactory;
+
+/**
+ * <p>Should be used to propagate a diagnostic context (for instance <a
+ * href="http://www.slf4j.org/manual.html#mdc">MDC</a>) to other threads.</p>
+ * <p>Applicable when creating a child thread directly, or submitting tasks for potentially
+ * postponed execution via an <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html">Executor</a>
+ * (including any of the <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html">executor
+ * services</a> and <a href="http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html">ForkJoinPool</a>).</p>
+ * <p>The service used by this factory must implement {@link ContextPropagationService}.</p>
+ *
+ * @author evitaliy
+ * @see ContextPropagationService
+ * @since 12/09/2016.
+ */
+@SuppressWarnings("ThrowableInstanceNeverThrown")
+public class TaskFactory extends BaseFactory {
+
+  private static final ContextPropagationService SERVICE;
+  private static final RuntimeException ERROR;
+
+  static {
+
+    ContextPropagationService service = null;
+    RuntimeException error = null;
+
+    try {
+      service = locateService(ContextPropagationService.class);
+    } catch (Exception ex) {
+      error = new RuntimeException("Failed to instantiate task factory", ex);
+    }
+
+    SERVICE = service;
+    ERROR = error;
+  }
+
+  /**
+   * Modify a task so that a diagnostic context is propagated to the thread when the task runs. Done
+   * in a logging-framework specific way.
+   *
+   * @param task any Runnable that will run in a thread
+   * @return modified (wrapped) original task that runs the same business logic, but also takes care
+   * of copying the diagnostic context for logging
+   */
+  public static Runnable create(Runnable task) {
+
+    if (SERVICE == null) {
+      throw ERROR;
+    }
+
+    return SERVICE.create(task);
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/context/MdcData.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/context/MdcData.java
new file mode 100644
index 0000000..a6a673d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/context/MdcData.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context;
+
+import org.openecomp.sdc.logging.types.LoggerConstants;
+import org.slf4j.MDC;
+
+
+public abstract class MdcData {
+  private String level;
+  private String errorCode;
+
+  MdcData() {
+  }
+
+  public MdcData(String level, String errorCode) {
+    this.level = level;
+    this.errorCode = errorCode;
+  }
+
+  public void setMdcValues() {
+    MDC.put(LoggerConstants.ERROR_CATEGORY, this.level);
+    MDC.put(LoggerConstants.ERROR_CODE, this.errorCode);
+  }
+
+  public String getLevel() {
+    return level;
+  }
+
+  public void setLevel(String level) {
+    this.level = level;
+  }
+
+  public String getErrorCode() {
+    return errorCode;
+  }
+
+  public void setErrorCode(String errorCode) {
+    this.errorCode = errorCode;
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/AuditMessages.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/AuditMessages.java
new file mode 100644
index 0000000..d562ae5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/AuditMessages.java
@@ -0,0 +1,42 @@
+package org.openecomp.sdc.logging.messages;
+
+/**
+ * Created by ayalaben on 4/20/2017.
+ */
+public class AuditMessages {
+
+  public static final String AUDIT_MSG = " --Audit-- ";
+
+  public static final String CREATE_VLM = "Create VLM. VLM Name: ";
+  public static final String CHECK_IN_VLM = "Check in VLM. VLM Id: ";
+  public static final String CHECK_OUT_VLM = "Check out VLM. VLM Id: ";
+  public static final String SUBMIT_VLM = "submit VLM. VLM Name: ";
+
+  public static final String CREATE_VSP = "Create VSP. VSP Name: ";
+  public static final String CHECK_IN_VSP = "Check in VSP. VSP Id: ";
+  public static final String CHECK_OUT_VSP = "Check out VSP. VSP Id: ";
+  public static final String RESUBMIT_ALL_FINAL_VSPS = "Check out, check in and submit all " +
+      "submitted VSPs, see ids below ";
+  public static final String SUBMIT_VSP = "Submit VSP. VSP Id: ";
+  public static final String SUBMIT_VSP_FAIL = "Submit VSP failed!. VSP Id: ";
+  public static final String SUBMIT_VSP_ERROR = "Submit VSP error: %s. VSP Id: %s";
+
+  public static final String UPLOAD_HEAT = "Upload HEAT. VSP Id: ";
+  public static final String UPLOAD_PROCESS_ARTIFACT = "Upload Process Artifact. VSP Id: ";
+  public static final String UPLOAD_MONITORING_FILE = "Upload Monitoring File of type %s "
+      +  ". VSP Id: %s, component id: %s";
+
+  public static final String IMPORT_SUCCESS = "VSP import to VF success. VSP Id: ";
+  public static final String IMPORT_FAIL = "VSP import to VF fail. VSP Id: ";
+
+  public static final String HEAT_VALIDATION_STARTED = "HEAT validation started. VSP Id: ";
+  public static final String HEAT_VALIDATION_COMPLETED = "HEAT validation completed. VSP Id: ";
+  public static final String HEAT_VALIDATION_ERROR = "HEAT validation error: %s. VSP Id: %s";
+  public static final String CSAR_VALIDATION_STARTED = "CSAR validation started. VSP Id: ";
+  public static final String HEAT_TRANSLATION_STARTED = "HEAT translation started. VSP Id: ";
+  public static final String HEAT_TRANSLATION_COMPLETED = "HEAT translation completed. VSP Id: ";
+  public static final String ENRICHMENT_ERROR = "Enrichment error: %s. VSP Id: %s";
+  public static final String ENRICHMENT_COMPLETED = "Enrichment completed. VSP Id: ";
+  public static final String CREATE_PACKAGE = "Created package. VSP Id: ";
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/DebugMessages.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/DebugMessages.java
new file mode 100644
index 0000000..c3e5f97
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/messages/DebugMessages.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.messages;
+
+
+public class DebugMessages {
+  public static final String DEFAULT_ENTER_METHOD = "Entering %s";
+  public static final String DEFAULT_EXIT_METHOD = "Exiting %s";
+
+  public static final String ENTER_METHOD = "Entering %s with %s = %s";
+  public static final String EXIT_METHOD = "Exiting %s with %s = %s";
+
+  public static final String ENTER_METHOD_FORMATTED = "Entering %s with %s";
+  public static final String EXIT_METHOD_FORMATTED = "Exiting %s with %s";
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/DebugConstants.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/DebugConstants.java
new file mode 100644
index 0000000..71884cf
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/DebugConstants.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+/**
+ * Created by TALIO on 1/10/2017.
+ */
+public class DebugConstants {
+  public static final String EXIT = "Exit";
+  public static final String EXIT_DEFAULT = "Exit_Default";
+  public static final String ENTER = "Enter";
+  public static final String ENTER_DEFAULT = "Enter_Default";
+  public static final String DEFAULT = "Default";
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerConstants.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerConstants.java
new file mode 100644
index 0000000..0d591be
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerConstants.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public class LoggerConstants {
+
+  public static final String REQUEST_ID = "RequestId";
+  public static final String PARTNER_NAME = "PartnerName";
+  public static final String SERVICE_NAME = "ServiceName";
+  public static final String INSTANCE_UUID = "InstanceUUID";
+  public static final String CATEGORY_LOG_LEVEL = "level";
+  public static final String STATUS_CODE = "StatusCode";
+  public static final String RESPONSE_CODE = "ResponseCode";
+  public static final String RESPONSE_DESCRIPTION = "ResponseDescription";
+  public static final String TARGET_SERVICE_NAME = "TargetServiceName";
+  public static final String TARGET_ENTITY = "TargetEntity";
+  public static final String TARGET_ENTITY_API = "API";
+  public static final String TARGET_ENTITY_DB = "DB";
+  public static final String ERROR_CATEGORY = "ErrorCategory";
+  public static final String ERROR_CODE = "ErrorCode";
+  public static final String ERROR_DESCRIPTION = "ErrorDescription";
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCategory.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCategory.java
new file mode 100644
index 0000000..e00c282
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCategory.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public enum LoggerErrorCategory {
+  ERROR,
+  WARN,
+  DEBUG,
+  INFO,
+  FATAL
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCode.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCode.java
new file mode 100644
index 0000000..3f48991
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorCode.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public enum LoggerErrorCode {
+  PERMISSION_ERROR("100"),
+  AVAILABILITY_ERROR("200"),
+  DATA_ERROR("300"),
+  SCHEMA_ERROR("400"),
+  BUSINESS_PROCESS_ERROR("500"),
+  UNKNOWN_ERROR("900"), ;
+
+  private String errorCode;
+
+  LoggerErrorCode(String errorCode) {
+    this.errorCode = errorCode;
+  }
+
+  public String getErrorCode() {
+    return errorCode;
+  }
+
+  public void setErrorCode(String errorCode) {
+    this.errorCode = errorCode;
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorDescription.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorDescription.java
new file mode 100644
index 0000000..7e502d5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerErrorDescription.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public class LoggerErrorDescription {
+  public static final String ARTIFACT_NOT_REFERENCED = "Artifact not referenced";
+  public static final String WRONG_FILE_EXTENSION = "Wrong file extention";
+  public static final String INVALID_HEAT_FORMAT = "Invalid HEAT format";
+  public static final String PARAMETER_NOT_FOUND = "Referenced parameter not found";
+  public static final String ENV_PARAMETER_NOT_IN_HEAT = "env includes parameter not in HEAT";
+  public static final String PARAMETER_DEFAULT_VALUE_NOT_ALIGNED_WITH_TYPE =
+      "Parameter default value not alinged with type";
+  public static final String INVALID_RESOURCE_TYPE = "Invalid resource type";
+  public static final String INVALID_GET_RESOURCE_SYNTAX = "Invalid get resource syntax";
+  public static final String RESOURCE_NOT_FOUND = "Resource not found";
+  public static final String INVALID_INDEX_VAR = "Invalid Resource Group index var";
+  public static final String MISSING_FILE = "Missing file";
+  public static final String MISSING_NOVA_PROPERTIES = "Missing NOVA server properties";
+  public static final String NESTED_LOOP = "Found nested loop";
+  public static final String MISSING_PARAMETER_IN_NESTED = "Missing parameter in nested file";
+  public static final String WRONG_VALUE_ASSIGNED_NESTED_PARAMETER =
+      "Wrong value assigned in nested parameters";
+  public static final String SERVER_NOT_DEFINED_NOVA = "Server not defined from nova";
+  public static final String WRONG_POLICY_SERVER_GROUP = "Wrong policy in server group";
+  public static final String SERVER_GROUP_SECURITY_GROUP_NOT_IN_USE =
+      "Server group or security group is not in use";
+  public static final String NETWORK_ATTACH_POLICY_NOT_IN_USE =
+      "Network Attach Policy is not in use";
+  public static final String NO_BIND_FROM_PORT_TO_NOVA = "No bind from port to nova sever";
+  public static final String PORT_BINDS_MORE_THAN_ONE_NOVA =
+      "Port binds to more than one nova sever";
+  public static final String MISSING_RESOURCE_DEPENDS_ON = "Missing resource in depends_on";
+  public static final String GET_ATTR_NOT_FOUND = "get_attr not found";
+  public static final String MISSING_GET_PARAM = "Missing get_param";
+  public static final String EMPTY_FILE = "Empty file";
+  public static final String VALIDATE_FILE = "Can't validate file";
+  public static final String INVALID_FILE_TYPE = "Invalid file type";
+  public static final String INVALID_ZIP = "Invalid zip file";
+  public static final String INVALID_VES_FILE = "Invalid VES file";
+
+
+
+  public static final String RESOURCE_UNIQUE_NETWORK_ROLE =
+      "Resource connects to two networks with the same role";
+  public static final String NAME_NOT_ALIGNED_WITH_GUIDELINES = "Name not aligned with guidelines";
+  public static final String VOLUME_FILE_NOT_EXPOSED = "Volume file not exposed";
+  public static final String RESOURCE_NOT_DEFINED_AS_OUTPUT = "Resource is not defined as output";
+  public static final String FLOATING_IP_IN_USE = "Floating IP resource type is in use";
+  public static final String MISSING_BASE_HEAT = "Missing base HEAT file";
+  public static final String MULTI_BASE_HEAT = "Multi base HEAT file";
+
+  public static final String EXTRACT_COMPOSITION_DATA = "Can't extract composition data";
+
+  public static final String MERGE_CONTRAIL_2_AND_3 =
+      "Merge of Contrail 2 and Contrail 3 resources";
+  public static final String CONTRAIL_2_IN_USE = "Contrail 2 resource is in use";
+
+  public static final String INVALID_MANIFEST = "Invalid manifest file";
+
+  public static final String INVALID_YAML_FORMAT = "Invalid YAML format";
+
+  public static final String CREATE_SERVICE_ARTIFACT = "Can't create service artifact";
+  public static final String CREATE_ENRICH_SERVICE_ARTIFACT =
+      "Can't create enriched service artifact";
+  public static final String CREATE_SERVICE_TEMPLATE = "Can't create service template";
+  public static final String CREATE_ENRICH_SERVICE_TEMPLATE =
+      "Can't create enriched service template";
+  public static final String GET_SERVICE_MODEL = "Can't get service model";
+  public static final String MISSING_MANDATORY_PROPERTY = "Missing mandatory property";
+  public static final String INVALID_PROPERTY = "Invalid Property";
+  public static final String INVALID_ADD_ACTION = "Invalid add action";
+  public static final String UNSUPPORTED_ENTITY = "Unsupported entity";
+  public static final String CREATE_CSAR = "Can't create CSAR file";
+  public static final String PACK_ARTIFACTS = "Can't pack artifacts into CSAR file";
+
+  public static final String TRANSLATE_HEAT = "Can't translate HEAT file";
+  public static final String RESOURCE_FILE_READ_ERROR = "Can't read resource file from class path.";
+  public static final String FAILED_TO_GENERATE_GLOBAL_TYPES = "Failed to generate globalTypes";
+
+  public static final String CHECKOUT_ENTITY = "Can't checkout versionable entity";
+  public static final String SUBMIT_ENTITY = "Can't submit versionable entity";
+  public static final String ENTITY_NOT_FOUND = "Versionable entity not found";
+  public static final String INVALID_VALUE = "Invalid value";
+
+  public static final String UNSUPPORTED_OPERATION = "Unsupported operation";
+  public static final String INVALID_JSON = "Invalid JSON format";
+
+  public static final String INSERT_INTO_APPLICATION_CONFIG =
+      "Can't insert value into application config table";
+
+  public static final String CANT_HEAL = "Can't perform healing operation";
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerServiceName.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerServiceName.java
new file mode 100644
index 0000000..e72d66a
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerServiceName.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public enum LoggerServiceName {
+
+  Create_VLM,
+  Get_VLM,
+  Checkout_VLM,
+  Checkin_VLM,
+  Undo_Checkout_VLM,
+  Submit_VLM,
+  Update_VLM,
+  List_VLM,
+
+  List_EP,
+  Create_EP,
+  Update_EP,
+  Get_EP,
+  Delete_EP,
+
+  Create_LIMIT,
+  Delete_LIMIT,
+  Update_LIMIT,
+  Get_LIMIT,
+
+  List_FG,
+  Create_FG,
+  Update_FG,
+  Get_FG,
+  Delete_FG,
+
+  List_LA,
+  Create_LA,
+  Update_LA,
+  Get_LA,
+  Delete_LA,
+
+  List_LKG,
+  Create_LKG,
+  Update_LKG,
+  Get_LKG,
+  Delete_LKG,
+
+  List_VSPs,
+  List_Packages,
+  Create_VSP,
+  Get_VSP,
+  Checkout_VSP,
+  Checkin_VSP,
+  Undo_Checkout_VSP,
+  Submit_VSP,
+  Update_VSP,
+  Re_Submit_ALL_Final_VSPs,
+  Create_Package,
+  List_VSP,
+  Upload_File,
+  Get_Uploaded_File,
+  Get_Translated_File,
+  Get_Questionnaire_VSP,
+  Update_Questionnaire_VSP,
+  Get_Information_Artifact,
+
+
+  List_Component_Processes,
+  Delete_List_Component_Processes,
+  Create_Component_Processes,
+  Update_Component_Processes,
+  Get_Component_Processes,
+  Delete_Component_Processes,
+  Upload_File_Component_Processes,
+  Get_Uploaded_File_Component_Processes,
+  Delete_Uploaded_File_Component_Processes,
+
+  List_Processes,
+  Delete_List_Processes,
+  Create_Processes,
+  Update_Processes,
+  Get_Processes,
+  Delete_Processes,
+  Upload_File_Processes,
+  Get_Uploaded_File_Processes,
+  Delete_Uploaded_File_Processes,
+
+  List_Components,
+  Delete_List_Components,
+  Create_Component,
+  Update_Component,
+  Get_Component,
+  Delete_Component,
+  Get_Questionnaire_Component,
+  Update_Questionnaire_Component,
+
+  Upload_Monitoring_Artifact,
+  Delete_Monitoring_Artifact,
+  List_Monitoring_Artifacts,
+
+  List_Network,
+  Create_Network,
+  Update_Network,
+  Get_Network,
+  Delete_Network,
+
+  List_nics,
+  Delete_List_nics,
+  Create_nic,
+  Update_nic,
+  Get_nic,
+  Delete_nic,
+  Get_Questionnaire_nic,
+  Update_Questionnaire_nic,
+
+  Create_Process,
+  Update_Process,
+
+  Create_Compute,
+  List_Computes,
+  Get_Compute,
+  Update_Compute,
+  Delete_Compute,
+  Get_Questionnaire_Compute,
+  Update_Questionnaire_Compute,
+
+  Insert_To_ApplicationConfig_Table,
+  Get_From_ApplicationConfig_Table,
+  Get_List_From_ApplicationConfig_Table_By_Namespace,
+
+  Create_Deployment_Flavor,
+  Get_List_Deployment_flavor,
+  Get_Deployment_flavor,
+  Delete_Deployment_flavor,
+  Update_Deployment_flavor,
+
+  Get_List_Activity_Log,
+
+  Validate,
+  Enrich, Delete_VSP, Get_Process_Artifact, Create_Entity, Checkout_Entity, Undo_Checkout_Entity,
+  Checkin_Entity, Submit_Entity, Get_Entity_Version, Delete_Entity, Undo_Delete_Entity,
+  Translate_Resource, Translate_HEAT, LoggerServiceName, Get_VSP_List, Delete_VLM, Update_Manifest,
+  Create_Image,
+  GET_Image_Schema,
+  List_Images,
+  GET_Image,
+  Delete_Image,
+  Update_Image,
+
+  CREATE_COMPONENT_DEPENDENCY_MODEL,
+  GET_COMPONENT_DEPENDENCY_MODEL,
+
+  Health_check
+  ;
+
+  public static String getServiceName(LoggerServiceName serviceName) {
+    return serviceName.name().replace("_", " ");
+  }
+
+  @Override
+  public String toString(){
+    return this.name().replace("_", " ");
+  }
+
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerTragetServiceName.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerTragetServiceName.java
new file mode 100644
index 0000000..6b0570e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/types/LoggerTragetServiceName.java
@@ -0,0 +1,206 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.types;
+
+
+public class LoggerTragetServiceName {
+  /*HEAT validator*/
+  public static final String VALIDATE_HEAT_BASE_STRUCTURE = "Validate Heat Base Structure";
+  public static final String VALIDATE_ARTIFACTS_EXISTENCE = "Validate Artifacts Existence";
+  public static final String VALIDATE_RESOURCE_REFERENCE_EXISTENCE =
+      "Validate Resource Reference Existence";
+  public static final String VALIDATE_PARAMETER_REFERENCE_EXITENCE =
+      "Validate Parameter Reference Existence";
+  public static final String VALIDATE_GET_ATTR_FROM_NESTED = "Validate get_attr From Nested";
+  public static final String VALIDATE_ENV_FILE = "Validate env File";
+  public static final String VALIDATE_BASE_PORTS_EXISTENCE = "Validate Base Ports Existence";
+  public static final String VALIDATE_ASSIGNED_VALUES_FOR_NOVA_IMAGE_FLAVOR =
+      "Validate Assigned Value For Nova Server Image Or Flavor";
+  public static final String VALIDATE_NOVA_SERVER_PORT_BINDING =
+      "Validate Ports Binding From Nova Server";
+  public static final String VALIDATE_SERVER_GROUP_EXISTENCE =
+      "Validate Nova Server Group Existence";
+  public static final String VALIDATE_PROPERTIES_MATCH_NESTED_PARAMETERS =
+      "Validate All Properties Match Nested Parameters";
+  public static final String VALIDATE_NESTING_LOOPS = "Validate Nested Loops";
+  public static final String VALIDATE_NOVA_SEVER_GROUP_POLICY = "Validate Nova Server Group Policy";
+  public static final String VALIDATE_RESOURCE_GROUP_TYPE = "Validate Resource Group Resource Type";
+  public static final String VALIDATE_ALL_SECURITY_GROUP_USED =
+      "Validate All Security Group Are Used From Neutron Port Resource";
+  public static final String VALIDATE_CONTRAIL_ATTACH_POLICY_TYPE =
+      "Validate Contrail Attach Policy Type";
+  public static final String VALIDATE_SECURITY_GROUP_FROM_BASE_OUTPUT =
+      "Validate Security Groups From Base File Outputs";
+  public static final String CHECK_FOR_ORPHAN_PORTS = "Validate All Referenced Ports Are Used";
+  public static final String CHECK_FOR_ORPHAN_ARTIFACTS = "Validate All Artifacts Are Referenced";
+  public static final String CHECK_FOR_VALID_FILE_EXTENTION = "Validate File Extention";
+  public static final String VALIDATE_PARAMTER_DEFAULT_MATCH_TYPE =
+      "Validate Parameter Default Aligns With Type";
+  public static final String VALIDATE_ENV_PARAMETER_MATCH_TYPE =
+      "Validate env Parameter Matches Type";
+  public static final String VALIDATE_RESOURCE_TYPE = "Validate Resource Type";
+  public static final String VALIDATE_FILE_EXISTENCE = "Validate File Exitence";
+  public static final String GET_RESOURCE_LIST_BY_TYPE =
+      "Get All Resources By Specific Resource Type";
+  public static final String VALIDATE_ALL_SERVER_GROUP_OR_SECURITY_GROUP_IN_USE =
+      "Validate All Security Group Or Server Group Are In Use";
+  public static final String VALIDATE_ATTACH_POLICY_IN_USE =
+      "Validate All Network Attach Policies Are In Use";
+  public static final String CHECK_RESOURCE_DEPENDS_ON = "Check Resource dependes_on";
+  public static final String GET_SHARED_RESOURCES_FROM_OUTPUTS =
+      "Get Shared Resources From Outputs";
+  public static final String VALIDATE_GET_RESOURCE = "Validate get_resource Syntax";
+  public static final String VALIDATE_FILE = "Validate File";
+
+  /*manifest validator*/
+  public static final String VALIDATE_MANIFEST_CONTENT = "Validate Manifest Content";
+  public static final String VALIDATE_FILE_IN_ZIP = "Validate File In Zip";
+  public static final String VALIDATE_FILE_IN_MANIFEST = "Validate File In Manifest";
+  public static final String VALIDATE_FILE_TYPE_AND_NAME =
+      "Validate File Type And Name In Manifest";
+  public static final String SCAN_MANIFEST_STRUCTURE = "Scan Manifest Structure";
+  public static final String VALIDATE_FILE_TYPE = "Validate File Type";
+
+  /*YAML validator*/
+  public static final String VALIDATE_YAML_CONTENT = "Validate YAML Content";
+
+
+  /*OPENECOMP guide line validator*/
+  public static final String VALIDATE_BASE_FILE =
+      "Validate If All Resources In Base File Are Exposed";
+  public static final String VALIDATE_FORBIDDEN_RESOURCE = "Validate If Resource Type Is Forbidden";
+  public static final String VALIDATE_FIXED_IPS_NAME = "Validate fixed_ips Naming Convention";
+  public static final String VALIDATE_IMAGE_AND_FLAVOR_NAME =
+      "Validate image And flavor Naming Convention";
+  public static final String VALIDATE_NOVA_SERVER_NAME = "Validate Nova Server Naming Convention";
+  public static final String VALIDATE_AVAILABILITY_ZONE_NAME =
+      "Validate availability_zone Naming Convention";
+  public static final String VALIDATE_NOVA_META_DATA_NAME =
+      "Validate Nova Server Meta Data Naming Convention";
+  public static final String VALIDATE_PORT_NETWORK_NAME = "Validate Port Network Naming Convention";
+  public static final String VALIDATE_VM_SYNC_IN_IMAGE_FLAVOR =
+      "Validate VM Name Is Sync In Image And Flavor";
+  public static final String VALIDATE_RESOURCE_NETWORK_UNIQUE_ROLW =
+      "Validate Nova Server Unique Role";
+  public static final String VALIDATE_VOLUME_FILE = "Validate HEAT Volume File";
+
+
+  public static final String VALIDATE_CONTRAIL_VM_NAME =
+      "Validate Contrail VM Name Aligned With Guidelines";
+  public static final String MERGE_OF_CONTRAIL_2_AND_3 = "Merge Of Contrail 2 And Contrail 3";
+  public static final String CONTRAIL_2_IN_USE = "Validate Contrail 2 Resource Is In Use";
+
+
+  public static final String VALIDATE_MANIFEST_PRE_CONDITION = "Validate Manifest Pre-Condition";
+  public static final String VALIDATE_HEAT_FORMAT = "Validate HEAT Format";
+
+  public static final String CREATE_ENTITY = "Create Entity";
+  public static final String CHECKOUT_ENTITY = "Checkout Entity";
+  public static final String UNDO_CHECKOUT_ENTITY = "Undo Checkout Entity";
+  public static final String CHECKIN_ENTITY = "Checkin Entity";
+  public static final String SUBMIT_ENTITY = "Submit Entity";
+  public static final String DELETE_ENTITY = "Delete Entity";
+  public static final String UNDO_DELETE_ENTITY = "Undo Delete Entity";
+
+  public static final String SUBMIT_VSP = "Submit VSP";
+  public static final String GET_VSP = "Get VSP";
+  public static final String ADD_VSP = "Add VSP";
+  public static final String DELETE_VSP = "Delete VSP";
+  public static final String UPDATE_VSP = "Update VSP";
+  public static final String ENRICH = "Enrich";
+  public static final String UPLOAD_FILE = "Upload file";
+  public static final String GET_UPLOADED_HEAT = "Get Uploaded HEAT File";
+  public static final String GET_TRANSLATED_FILE = "Get Translated File";
+  public static final String CREATE_TRANSLATED_FILE = "Create Translated File";
+  public static final String CREATE_PACKAGE = "Create Package";
+
+  public static final String SELF_HEALING = "Self Healing";
+  public static final String WRITE_ARTIFACT_XML = "Write Artifact To XML File";
+
+  public static final String GET_VLM = "Get VLM";
+
+  public static final String VALIDATE_MONITORING_FILE = "Validate Monitoring File";
+  public static final String UPLOAD_MONITORING_FILE = "Upload Monitoring file";
+
+  public static final String GET_VERSION_INFO = "Get version info";
+
+  public static final String CREATE_NETWORK = "Create Network";
+  public static final String DELETE_NETWORK = "Delete Network";
+
+  public static final String CREATE_COMPONENT = "Create Component";
+  public static final String DELETE_COMPONENT = "Delete Component";
+  public static final String UPDATE_COMPONENT = "Update Component";
+
+  public static final String GET_PROCESS_ARTIFACT = "Get Process Artifact";
+  public static final String UPLOAD_PROCESS_ARTIFACT = "Upload Process Artifact";
+
+  public static final String CREATE_NIC = "Create Nic";
+  public static final String DELETE_NIC = "Delete Nic";
+  public static final String UPDATE_NIC = "Update Nic";
+
+  public static final String CREATE_DEPLOYMENT_FLAVOR = "Create Deployment Flavor";
+  public static final String DELETE_DEPLOYMENT_FLAVOR = "Delete Deployment Flavor";
+  public static final String UPDATE_DEPLOYMENT_FLAVOR = "Update Deployment Flavor";
+
+  public static final String EXTRACT_COMPOSITION_DATA = "Extract Composition Data";
+
+  public static final String TRANSLATE_RESOURCE = "Translate Resource";
+  public static final String GET_RESOURCE = "Get Resource";
+  public static final String VALIDATE_HEAT_BEFORE_TRANSLATE = "Validate HEAT Before Translate";
+
+  public static final String CREATE_SERVICE_ARTIFACT = "Create Service Artifact In DB";
+  public static final String CREATE_SERVICE_ENRICH_ARTIFACT =
+      "Create Service Enriched Artifact In DB";
+  public static final String CREATE_SERVICE_TEMPLATE = "Create Service Template In DB";
+  public static final String CREATE_ENRICH_SERVICE_TEMPLATE =
+      "Create Enriched Service Template In DB";
+  public static final String GET_SERVICE_MODEL = "Get service model";
+  public static final String GET_SERVICE_TEMPLATE = "Get Service Template";
+  public static final String CREATE_REQUIREMENT_ASSIGNMENT = "Create Requierment Assignment";
+  public static final String GENERATE_TRANSLATED_ID = "Generate Translated Id";
+  public static final String ADD_ENTITIES_TO_TOSCA = "Add Entities To TOSCA";
+  public static final String CREATE_CSAR = "Create CSAR";
+  public static final String PACK_ARTIFACTS = "Pack Artifacts Into CSAR File";
+
+  public static final String VALIDATE_CHOICE_VALUE = "Check Chosen Value";
+
+  public static final String INSERT_INTO_APPLICATION_CONFIG =
+      "Insert Value Into Application Config";
+
+  public static final String VALIDATE_FILE_DATA_STRUCTURE = "Validate Manifest Sent From User";
+  public static final String CREATE_IMAGE = "Create Image";
+  public static final String DELETE_IMAGE = "Delete Image";
+  public static final String UPDATE_IMAGE = "Update Image";
+
+  public static final String CREATE_COMPUTE = "Create Compute";
+  public static final String UPDATE_COMPUTE = "Update Compute";
+  public static final String DELETE_COMPUTE = "Delete Compute";
+
+  public static final String COLLECT_MANUAL_VSP_TOSCA_DATA = "Collect Manual Vsp Tosca data";
+  public static final String GENERATE_MANUAL_VSP_TOSCA = "Generate Manual Vsp Tosca";
+
+  public static final String VALIDATE_DATE_RANGE = "Validate Date Range";
+
+  public static final String CREATE_COMPONENT_DEPENDENCY_MODEL = "Create Component Dependency "
+      + "Model";
+
+  public static final String READ_RESOURCE_FILE = "Read Resource File";
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/resources/factoryConfiguration.json b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/resources/factoryConfiguration.json
new file mode 100644
index 0000000..33163b3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/resources/factoryConfiguration.json
@@ -0,0 +1,3 @@
+{
+  "org.openecomp.sdc.logging.api.BaseFactory": "org.openecomp.sdc.logging.api.LoggerFactory"
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java
new file mode 100644
index 0000000..8464250
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Field;
+import java.util.ServiceLoader;
+
+import static org.testng.Assert.*;
+
+/**
+ * @author evitaliy
+ * @since 14/09/2016.
+ */
+public class LoggerFactoryTest {
+
+  @Test
+  public void testNoOpLoggerService() throws Exception {
+
+    assertFalse(ServiceLoader.load(LoggerCreationService.class).iterator().hasNext());
+
+    LoggerFactory.getLogger(LoggerFactoryTest.class);
+    Field factory = LoggerFactory.class.getDeclaredField("SERVICE");
+    factory.setAccessible(true);
+    Object impl = factory.get(null);
+    assertEquals("org.openecomp.sdc.logging.api.LoggerFactory$NoOpLoggerCreationService",
+        impl.getClass().getName());
+  }
+
+  @Test
+  public void testNoOpLoggerByClass() throws Exception {
+    Logger logger = LoggerFactory.getLogger(LoggerFactoryTest.class);
+    verifyLogger(logger);
+  }
+
+  @Test
+  public void testNoOpLoggerByName() throws Exception {
+    Logger logger = LoggerFactory.getLogger(LoggerFactoryTest.class.getName());
+    verifyLogger(logger);
+  }
+
+  private void verifyLogger(Logger logger) {
+    assertNotNull(logger);
+
+    // make sure no exceptions are thrown
+    logger.error("");
+    logger.warn("");
+    logger.info("");
+    logger.debug("");
+    logger.audit("");
+    logger.metrics("");
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/context/TaskFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/context/TaskFactoryTest.java
new file mode 100644
index 0000000..61e1819
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/context/TaskFactoryTest.java
@@ -0,0 +1,30 @@
+package org.openecomp.sdc.logging.api.context;
+
+import org.testng.annotations.Test;
+
+import java.util.ServiceLoader;
+
+import static org.testng.Assert.*;
+
+/**
+ * @author evitaliy
+ * @since 14/09/2016.
+ */
+public class TaskFactoryTest {
+
+  @Test(expectedExceptions = RuntimeException.class)
+  public void testNoImplementation() throws Exception {
+
+    assertFalse(ServiceLoader.load(ContextPropagationService.class).iterator().hasNext());
+
+    try {
+      TaskFactory.create(() -> {
+      });
+    } catch (RuntimeException e) {
+      Throwable cause = e.getCause();
+      assertNotNull(cause);
+      assertTrue(cause.getMessage().contains(ContextPropagationService.class.getName()));
+      throw e;
+    }
+  }
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/README b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/README
new file mode 100644
index 0000000..779c5d9
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/README
@@ -0,0 +1,29 @@
+The purpose of this module is to make a Web application meet the OPENECOMP logging requirements described in
+OPENECOMP platform application logging guidelines.
+
+The default out-of-the box solution is based on SLF4J.
+
+It introduces three major areas of functionality as follows:
+
+1. Routing of logging messages for the Logback library, so that all logging events are written to separate files
+according to their type.
+
+2. An AOP aspect for measuring execution time and logging it, so that the application code is not contaminated with
+this type of logging.
+
+3. Collecting and populating the context of a Web API request and propagating it to every logging event.
+
+TODO:
+
+1. MetricsAspect
+  - Configurable metrics message
+  - Make sure there are no exceptions but applicative ones
+
+2. EventTypeDiscriminator
+  - Make event types configurable to make the names of log files easily customizable
+
+3. DispatchingAppender
+  - Read appenders from configuration, so that there is no need in EELF loggers
+  - Simpler use of discriminator or an entirely different mechanism
+  - Better appender name pattern, or mapping between a discriminating value and an appender name
+  - Discard the appenders cache on configuration changes
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/pom.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/pom.xml
new file mode 100644
index 0000000..e9e66b2
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <name>openecomp-sdc-logging-core</name>
+    <artifactId>openecomp-sdc-logging-core</artifactId>
+    
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-logging-lib</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-logging-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>${aspectj.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>${servlet.version}</version>
+        </dependency>
+		
+		<!-- for testing -->
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>${testng.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-easymock</artifactId>
+            <version>${powermock.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-core</artifactId>
+            <version>${powermock.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-testng</artifactId>
+            <version>${powermock.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/Markers.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/Markers.java
new file mode 100644
index 0000000..711e6d1
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/Markers.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging;
+
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+/**
+ * <p>The list of markers that can be used for special logging such as metrics, audit, etc.</p>
+ *
+ * <p>Although markers can be easily instantiated whenever needed, having constants for them helps eliminate mistakes -
+ * misspelling, using a marker that is not handled, etc.</p>
+ *
+ * <p>Usage:</p>
+ *
+ * <pre>
+ *
+ *     Logger log = LogFactory.getLogger(this.getClass());
+ *     log.info(Markers.AUDIT, "User '{}' logged out", user);
+ *
+ * </pre>
+ *
+ * @author EVITALIY
+ * @since 13/09/2016.
+ *
+ * @see Marker
+ */
+public class Markers {
+
+    public static final Marker AUDIT = MarkerFactory.getMarker("AUDIT");
+    public static final Marker METRICS = MarkerFactory.getMarker("METRICS");
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/SLF4JLoggerCreationService.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/SLF4JLoggerCreationService.java
new file mode 100644
index 0000000..7f9ada1
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/SLF4JLoggerCreationService.java
@@ -0,0 +1,240 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging;
+
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerCreationService;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author evitaliy
+ * @since 13/09/2016.
+ */
+public class SLF4JLoggerCreationService implements LoggerCreationService {
+
+    @Override
+    public Logger getLogger(String className) {
+        return new SLF4JWrapper(className);
+    }
+
+    @Override
+    public Logger getLogger(Class<?> clazz) {
+        return new SLF4JWrapper(clazz);
+    }
+
+    private class SLF4JWrapper implements Logger {
+
+        private final org.slf4j.Logger logger;
+
+        SLF4JWrapper(Class<?> clazz) {
+            logger = LoggerFactory.getLogger(clazz);
+        }
+
+        SLF4JWrapper(String className) {
+            logger = LoggerFactory.getLogger(className);
+        }
+
+        @Override
+        public String getName() {
+            return logger.getName();
+        }
+
+        @Override
+        public boolean isMetricsEnabled() {
+            return logger.isInfoEnabled(Markers.METRICS);
+        }
+
+        @Override
+        public void metrics(String msg) {
+            logger.info(Markers.METRICS, msg);
+        }
+
+        @Override
+        public void metrics(String msg, Object arg) {
+            logger.info(Markers.METRICS, msg, arg);
+        }
+
+        @Override
+        public void metrics(String msg, Object arg1, Object arg2) {
+            logger.info(Markers.METRICS, msg, arg1, arg2);
+        }
+
+        @Override
+        public void metrics(String msg, Object... arguments) {
+            logger.info(Markers.METRICS, msg, arguments);
+        }
+
+        @Override
+        public void metrics(String msg, Throwable t) {
+            logger.info(Markers.METRICS, msg, t);
+        }
+
+        @Override
+        public boolean isAuditEnabled() {
+            return logger.isInfoEnabled(Markers.AUDIT);
+        }
+
+        @Override
+        public void audit(String msg) {
+            logger.info(Markers.AUDIT, msg);
+        }
+
+        @Override
+        public void audit(String msg, Object arg) {
+            logger.info(Markers.AUDIT, msg, arg);
+        }
+
+        @Override
+        public void audit(String msg, Object arg1, Object arg2) {
+            logger.info(Markers.AUDIT, msg, arg1, arg2);
+        }
+
+        @Override
+        public void audit(String msg, Object... arguments) {
+            logger.info(Markers.AUDIT, msg, arguments);
+        }
+
+        @Override
+        public void audit(String msg, Throwable t) {
+            logger.info(Markers.AUDIT, msg, t);
+        }
+
+        @Override
+        public boolean isDebugEnabled() {
+            return logger.isDebugEnabled();
+        }
+
+        @Override
+        public void debug(String msg) {
+            logger.debug(msg);
+        }
+
+        @Override
+        public void debug(String format, Object arg) {
+            logger.debug(format, arg);
+        }
+
+        @Override
+        public void debug(String format, Object arg1, Object arg2) {
+            logger.debug(format, arg1, arg2);
+        }
+
+        @Override
+        public void debug(String format, Object... arguments) {
+            logger.debug(format, arguments);
+        }
+
+        @Override
+        public void debug(String msg, Throwable t) {
+            logger.debug(msg, t);
+        }
+
+        @Override
+        public boolean isInfoEnabled() {
+            return logger.isInfoEnabled();
+        }
+
+        @Override
+        public void info(String msg) {
+            logger.info(msg);
+        }
+
+        @Override
+        public void info(String format, Object arg) {
+            logger.info(format, arg);
+        }
+
+        @Override
+        public void info(String format, Object arg1, Object arg2) {
+            logger.info(format, arg1, arg2);
+        }
+
+        @Override
+        public void info(String format, Object... arguments) {
+            logger.info(format, arguments);
+        }
+
+        @Override
+        public void info(String msg, Throwable t) {
+            logger.info(msg, t);
+        }
+
+        @Override
+        public boolean isWarnEnabled() {
+            return logger.isWarnEnabled();
+        }
+
+        @Override
+        public void warn(String msg) {
+            logger.warn(msg);
+        }
+
+        @Override
+        public void warn(String format, Object arg) {
+            logger.warn(format, arg);
+        }
+
+        @Override
+        public void warn(String format, Object... arguments) {
+            logger.warn(format, arguments);
+        }
+
+        @Override
+        public void warn(String format, Object arg1, Object arg2) {
+            logger.warn(format, arg1, arg2);
+        }
+
+        @Override
+        public void warn(String msg, Throwable t) {
+            logger.warn(msg, t);
+        }
+
+        @Override
+        public boolean isErrorEnabled() {
+            return logger.isErrorEnabled();
+        }
+
+        @Override
+        public void error(String msg) {
+            logger.error(msg);
+        }
+
+        @Override
+        public void error(String format, Object arg) {
+            logger.error(format, arg);
+        }
+
+        @Override
+        public void error(String format, Object arg1, Object arg2) {
+            logger.error(format, arg1, arg2);
+        }
+
+        @Override
+        public void error(String format, Object... arguments) {
+            logger.error(format, arguments);
+        }
+
+        @Override
+        public void error(String msg, Throwable t) {
+            logger.error(msg, t);
+        }
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/aspects/MetricsAspect.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/aspects/MetricsAspect.java
new file mode 100644
index 0000000..2b46802
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/aspects/MetricsAspect.java
@@ -0,0 +1,68 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.aspects;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.openecomp.sdc.logging.api.annotations.Metrics;
+
+/**
+ * <p>Wraps around any method annotated with {@link Metrics} to measure and log its execution time
+ * in milliseconds.</p>
+ * <p>In order for the aspect to be used, AspectJ annotation processing must be tuned on and this
+ * particular aspect enabled. Conversely, it can be disabled completely if the application does not
+ * need to log metrics.</p>
+ * <p>See, for example, <a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html">
+ * Aspect Oriented Programming with Spring</a>.</p>
+ *
+ * @author evitaliy
+ * @see Metrics
+ * @since 27/07/2016.
+ */
+@Aspect
+public class MetricsAspect {
+
+  private static final String MESSAGE_TEMPLATE = "'{}' took {} milliseconds";
+
+  @Around("@annotation(org.openecomp.sdc.logging.api.annotations.Metrics)")
+  public Object logExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
+
+    final Logger logger = LoggerFactory.getLogger(pjp.getSignature().getDeclaringTypeName());
+    // measure and log only if the logger for this class is enabled
+    if (logger.isMetricsEnabled()) {
+
+      final String method = pjp.getSignature().getName();
+      final long start = System.currentTimeMillis();
+
+      try {
+        return pjp.proceed();
+      } finally {
+        logger.metrics(MESSAGE_TEMPLATE, method, System.currentTimeMillis() - start);
+      }
+
+    } else {
+      return pjp.proceed();
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MDCPropagationService.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MDCPropagationService.java
new file mode 100644
index 0000000..7e29f3c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MDCPropagationService.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context;
+
+import org.openecomp.sdc.logging.api.context.ContextPropagationService;
+import org.slf4j.MDC;
+
+import java.util.Map;
+
+/**
+ * Propagates the <a href="http://www.slf4j.org/manual.html#mdc">SLF4J Mapped Diagnostic Context (MDC)</a>
+ * of a thread onto a runnable created by that thread, so that the context is available when the runnable is executed
+ * in a new thread.
+ *
+ * @author evitaliy
+ * @since 12/09/2016.
+ */
+public class MDCPropagationService implements ContextPropagationService {
+
+    public Runnable create(Runnable task) {
+        return new MDCCopyingWrapper(task);
+    }
+
+    private static class MDCCopyingWrapper implements Runnable {
+
+        private final Runnable task;
+        private final Map<String, String> context;
+
+        private MDCCopyingWrapper(Runnable task) {
+            this.task = task;
+            this.context = MDC.getCopyOfContextMap();
+        }
+
+        @Override
+        public void run() {
+
+            Map<String, String> oldContext = MDC.getCopyOfContextMap();
+            replaceMDC(this.context);
+
+            try {
+                task.run();
+            } finally {
+                replaceMDC(oldContext);
+            }
+        }
+
+        private static void replaceMDC(Map<String, String> context) {
+
+            if (context == null) {
+                MDC.clear();
+            } else  {
+                MDC.setContextMap(context);
+            }
+        }
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MdcUtil.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MdcUtil.java
new file mode 100644
index 0000000..81a22ad
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/MdcUtil.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context;
+
+import org.openecomp.sdc.logging.types.LoggerConstants;
+import org.slf4j.MDC;
+
+
+public class MdcUtil {
+
+  /**
+   * Sets values for mdc.
+   *
+   * @param targetEntity      the target entity
+   * @param targetServiceName the target service name
+   * @param errorCategory     the error category
+   * @param errorCode         the error code
+   * @param errorDescription  the error description
+   */
+  public static void setValuesForMdc(String targetEntity, String targetServiceName,
+                                     String errorCategory, String errorCode,
+                                     String errorDescription) {
+    MDC.put(LoggerConstants.TARGET_ENTITY, targetEntity);
+    MDC.put(LoggerConstants.TARGET_SERVICE_NAME, targetServiceName);
+    MDC.put(LoggerConstants.ERROR_CATEGORY, errorCategory);
+    MDC.put(LoggerConstants.ERROR_CODE, errorCode);
+    MDC.put(LoggerConstants.ERROR_DESCRIPTION, errorDescription);
+  }
+
+
+  /**
+   * Init mdc.
+   *  @param serviceName the service name
+   *
+   */
+  public static void initMdc(String serviceName) {
+    MDC.put(LoggerConstants.SERVICE_NAME, serviceName);
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataDebugMessage.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataDebugMessage.java
new file mode 100644
index 0000000..11d3fd3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataDebugMessage.java
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context.impl;
+
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.openecomp.sdc.logging.context.MdcData;
+import org.openecomp.sdc.logging.messages.DebugMessages;
+import org.openecomp.sdc.logging.types.DebugConstants;
+import org.openecomp.sdc.logging.types.LoggerErrorCategory;
+import org.openecomp.sdc.logging.util.LoggingUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MdcDataDebugMessage extends MdcData {
+
+  private Logger logger;
+  private static Map<String, String> mapExitOrEntryToMessage;
+
+  static {
+    mapExitOrEntryToMessage = new HashMap<>();
+    mapExitOrEntryToMessage.put(DebugConstants.ENTER, DebugMessages.ENTER_METHOD);
+    mapExitOrEntryToMessage.put(DebugConstants.ENTER_DEFAULT, DebugMessages.DEFAULT_ENTER_METHOD);
+    mapExitOrEntryToMessage.put(DebugConstants.EXIT, DebugMessages.EXIT_METHOD);
+    mapExitOrEntryToMessage.put(DebugConstants.EXIT_DEFAULT, DebugMessages.DEFAULT_EXIT_METHOD);
+  }
+
+  public MdcDataDebugMessage() {
+    super(LoggerErrorCategory.DEBUG.name(), null);
+  }
+
+  //todo add more explanations as to the first parameter structure in case of multiples and in
+  // case of no params in method
+  /**
+   * Debug entry message.
+   *
+   * @param entityParameter the entity parameter
+   * @param ids             the ids
+   */
+  public void debugEntryMessage(String entityParameter, String... ids) {
+    logDebugMessage(entityParameter, DebugConstants.ENTER, ids);
+  }
+
+  /**
+   * Debug exit message.
+   *
+   * @param entityParameter the entity parameter
+   * @param ids             the ids
+   */
+  public void debugExitMessage(String entityParameter, String... ids) {
+    logDebugMessage(entityParameter, DebugConstants.EXIT, ids);
+  }
+
+  private void logDebugMessage(String entityParameter, String enterOrExit, String... ids) {
+    String methodName = LoggingUtils.getCallingMethodNameForDebugging();
+    String declaringClass = LoggingUtils.getDeclaringClass();
+    logger = LoggerFactory.getLogger(declaringClass);
+    String messageToWrite;
+
+    if (entityParameter == null || ids == null) {
+      messageToWrite = mapExitOrEntryToMessage.get(enterOrExit + "_" + DebugConstants.DEFAULT);
+      logger.debug(String.format(messageToWrite, methodName));
+    } else {
+      messageToWrite = mapExitOrEntryToMessage.get(enterOrExit);
+      logger.debug(String
+          .format(messageToWrite, methodName, entityParameter, String.join(",", ids)));
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataErrorMessage.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataErrorMessage.java
new file mode 100644
index 0000000..190c37d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/context/impl/MdcDataErrorMessage.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context.impl;
+
+import org.openecomp.sdc.logging.context.MdcData;
+import org.openecomp.sdc.logging.types.LoggerConstants;
+import org.slf4j.MDC;
+
+
+public class MdcDataErrorMessage extends MdcData {
+  private String targetEntity;
+  private String targetServiceName;
+  private String errorDescription;
+
+  /**
+   * Instantiates a new Mdc data error message.
+   *
+   * @param targetEntity      the target entity
+   * @param targetServiceName the target service name
+   * @param errorCategory     the error category
+   * @param errorCode         the error code
+   * @param errorDescription  the error description
+   */
+  public MdcDataErrorMessage(String targetEntity, String targetServiceName, String errorCategory,
+                             String errorCode, String errorDescription) {
+    super(errorCategory, errorCode);
+    this.targetEntity = targetEntity;
+    this.targetServiceName = targetServiceName;
+    this.errorDescription = errorDescription;
+
+    this.setMdcValues();
+  }
+
+  /**
+   * Create error message and update mdc.
+   *
+   * @param targetEntity      the target entity
+   * @param targetServiceName the target service name
+   * @param level             the level
+   * @param errorCode         the error code
+   * @param errorDescription  the error description
+   */
+  public static void createErrorMessageAndUpdateMdc(String targetEntity, String targetServiceName,
+                                                    String level, String errorCode,
+                                                    String errorDescription) {
+    MdcDataErrorMessage mdcDataErrorMessage =
+        new MdcDataErrorMessage(targetEntity, targetServiceName, level, errorCode,
+            errorDescription);
+  }
+
+  @Override
+  public void setMdcValues() {
+    super.setMdcValues();
+    MDC.put(LoggerConstants.TARGET_ENTITY, this.targetEntity);
+    MDC.put(LoggerConstants.TARGET_SERVICE_NAME, this.targetServiceName);
+    MDC.put(LoggerConstants.ERROR_DESCRIPTION, this.errorDescription);
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java
new file mode 100644
index 0000000..2273e1c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java
@@ -0,0 +1,148 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.logback;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.sift.MDCBasedDiscriminator;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.joran.spi.DefaultClass;
+import ch.qos.logback.core.sift.Discriminator;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * <p>Allows to use EELF logging configuration almost as is, by using a custom routing function, but pre-configured
+ * appenders attached to the standard EELF loggers.</p>
+ *
+ * <p>Changes that must be made in <i>logback.xml</i> supplied with EELF:</p>
+ *
+ * <pre>
+ *     &lt;appender name="DISPATCHER" class="org.openecomp.sdc.logging.logback.DispatchingAppender"&gt;
+ *          &lt;discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/&gt;
+ *          &lt;appenderNamePattern&gt;asyncEELF%s&lt;/appenderNamePattern&gt;
+ *     &lt;/appender&gt;
+ *
+ *     &lt;root level="INFO" additivity="false"&gt;
+ *          &lt;appender-ref ref="DISPATCHER" /&gt;
+ *      &lt;/root&gt;
+ * </pre>
+ *
+ * @author EVITALIY
+ * @since 17/08/2016.
+ */
+public class DispatchingAppender extends AppenderBase<ILoggingEvent> {
+
+    // "magic" appender to indicate a missing appender
+    private static final Appender<ILoggingEvent> NO_APPENDER = new DispatchingAppender();
+
+    private Map<String, Appender<ILoggingEvent>> appenders = new ConcurrentHashMap<>();
+
+    private Discriminator<ILoggingEvent> discriminator;
+    private String appenderNamePattern;
+
+    @DefaultClass(MDCBasedDiscriminator.class)
+    public void setDiscriminator(Discriminator<ILoggingEvent> discriminator) {
+        this.discriminator = discriminator;
+    }
+
+    public Discriminator<ILoggingEvent> getDiscriminator() {
+        return this.discriminator;
+    }
+
+    public void setAppenderNamePattern(String pattern) {
+        this.appenderNamePattern = pattern;
+    }
+
+    public String getAppenderNamePattern() {
+        return this.appenderNamePattern;
+    }
+
+    @Override
+    protected void append(ILoggingEvent event) {
+
+        if (this.isStarted()) {
+
+            String discriminatingValue = this.discriminator.getDiscriminatingValue(event);
+            String appenderName = String.format(this.appenderNamePattern, discriminatingValue);
+            Appender<ILoggingEvent> appender = this.lookupAppender(appenderName);
+            if (appender == NO_APPENDER) {
+                this.addError(String.format("Appender %s does not exist", appenderName));
+            } else {
+                appender.doAppend(event);
+            }
+        }
+    }
+
+    private Appender<ILoggingEvent> lookupAppender(String key) {
+
+        Appender<ILoggingEvent> appender = appenders.get(key);
+        if (appender != null) {
+            return appender;
+        }
+
+        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        for (Logger log : context.getLoggerList()) {
+
+            Iterator<Appender<ILoggingEvent>> iterator = log.iteratorForAppenders();
+            while (iterator.hasNext()) {
+
+                Appender<ILoggingEvent> element = iterator.next();
+                if (key.equals(element.getName())) {
+                    this.appenders.putIfAbsent(key, element);
+                    return element;
+                }
+            }
+        }
+
+        // to avoid consecutive lookups if the required appender does not exist
+        this.appenders.putIfAbsent(key, NO_APPENDER);
+        return NO_APPENDER;
+    }
+
+    @Override
+    public void start() {
+
+        int errors = 0;
+        if (this.discriminator == null) {
+            this.addError("Missing discriminator. Aborting");
+        }
+
+        if (!this.discriminator.isStarted()) {
+            this.addError("Discriminator has not started successfully. Aborting");
+            ++errors;
+        }
+
+        if (this.appenderNamePattern == null) {
+            this.addError("Missing name pattern. Aborting");
+            ++errors;
+        }
+
+        if (errors == 0) {
+            super.start();
+        }
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminator.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminator.java
new file mode 100644
index 0000000..5aa3665
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminator.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.logback;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.sift.AbstractDiscriminator;
+import org.openecomp.sdc.logging.Markers;
+import org.slf4j.Marker;
+
+/**
+ * Can be used with {@link ch.qos.logback.classic.sift.SiftingAppender} to route events of different types to
+ * separate log files. For example,
+ *
+ * <pre>
+ *     &lt;configuration&gt;
+ *         &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"&gt;
+ *             &lt;discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/&gt;
+ *             &lt;sift&gt;
+ *                  &lt;appender name="{EventType}" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
+ *                      &lt;file&gt;${logDirectory}/${eventType}.log&lt;/file&gt;
+ *                      &lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"&gt;
+ *                          &lt;fileNamePattern&gt;${logDirectory}/${eventType}.%i.log.zip&lt;/fileNamePattern&gt;
+ *                          &lt;minIndex&gt;1&lt;/minIndex&gt;
+ *                          &lt;maxIndex&gt;9&lt;/maxIndex&gt;
+ *                      &lt;/rollingPolicy&gt;
+ *                      &lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"&gt;
+ *                          &lt;maxFileSize&gt;5MB&lt;/maxFileSize&gt;
+ *                      &lt;/triggeringPolicy&gt;
+ *                      &lt;encoder&gt;
+ *                          &lt;pattern&gt;${defaultPattern}&lt;/pattern&gt;
+ *                      &lt;/encoder&gt;
+ *                  &lt;/appender&gt;
+ *             &lt;/sift&gt;
+ *         &lt;/appender&gt;
+ *
+ *         &lt;root level="INFO"&gt;
+ *             &lt;appender-ref ref="SIFT" /&gt;
+ *         &lt;/root&gt;
+ *     &lt;/configuration&gt;
+ * </pre>
+ *
+ * @author evitaliy
+ * @since 21/07/2016.
+ */
+public class EventTypeDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
+
+    private static final String KEY = "eventType";
+
+    private static final String AUDIT = "Audit";
+    private static final String METRICS = "Metrics";
+    private static final String ERROR = "Error";
+    private static final String DEBUG = "Debug";
+    private static final String DEFAULT = DEBUG;
+
+    private static final int MIN_ERROR_LEVEL = Level.WARN_INT;
+    private static final int MAX_ERROR_LEVEL = Level.ERROR_INT;
+    private static final int DEFAULT_LEVEL = Level.DEBUG_INT;
+
+    @Override
+    public String getDiscriminatingValue(ILoggingEvent event) {
+
+        Level level = event.getLevel();
+        final int levelInt = level == null ? DEFAULT_LEVEL : level.toInt();
+        if ((levelInt > MIN_ERROR_LEVEL - 1) && (levelInt < MAX_ERROR_LEVEL + 1)) {
+            return ERROR;
+        }
+
+        if (levelInt == Level.DEBUG_INT) {
+            return DEBUG;
+        }
+
+        /*
+         * After DEBUG, ERROR, and WARNING have been filtered out,
+         * only TRACE and INFO are left. TRACE is less than DEBUG
+         * and therefore cannot be used. So, INFO should be used for
+         * custom routing like AUDIT and METRICS
+         */
+        if (levelInt == Level.INFO_INT) {
+
+            final Marker marker = event.getMarker();
+            if (marker != null) {
+
+                if (marker.contains(Markers.AUDIT)) {
+                    return AUDIT;
+                }
+
+                if (marker.contains(Markers.METRICS)) {
+                    return METRICS;
+                }
+            }
+
+            return ERROR;
+        }
+
+        return DEFAULT;
+    }
+
+    @Override
+    public String getKey() {
+        return KEY;
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/servlet/LoggingFilter.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/servlet/LoggingFilter.java
new file mode 100644
index 0000000..7294b9b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/servlet/LoggingFilter.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.servlet;
+
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.slf4j.MDC;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+
+
+/**
+ *
+ * <p>Pushes information required by EELF onto MDC (Mapped Diagnostic Context).</p>
+ *
+ * <p>This is servlet filter that should be configured in <i>web.xml</i> to be used. Example:</p>
+ *
+ * <pre>
+ *
+ *  &lt;filter&gt;
+ *      &lt;filter-name&gt;LoggingServletFilter&lt;/filter-name&gt;
+ *      &lt;filter-class&gt;org.openecomp.sdc.logging.servlet.LoggingFilter&lt;/filter-class&gt;
+ *  &lt;/filter&gt;
+ *
+ *  &lt;filter-mapping&gt;
+ *      &lt;filter-name&gt;LoggingServletFilter&lt;/filter-name&gt;
+ *      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
+ *  &lt;/filter-mapping&gt;
+ *
+ * </pre>
+ *
+ * @author evitaliy
+ * @since 25/07/2016.
+ */
+public class LoggingFilter implements Filter {
+
+    // should be cashed to avoid low-level call, but with a timeout to account for IP or FQDN changes
+    private static final HostAddressCache HOST_ADDRESS = new HostAddressCache();
+    private static final String UNKNOWN = "UNKNOWN";
+
+    private final static Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class);
+
+    public void destroy() {
+    }
+
+    public void doFilter(ServletRequest request, ServletResponse response,
+                         FilterChain chain) throws IOException, ServletException {
+
+        try {
+
+            MDC.clear();
+
+            MDC.put("RequestId", UUID.randomUUID().toString());
+            MDC.put("ServiceInstanceId", "N/A"); // not applicable
+            MDC.put("ServiceName", "ASDC");
+            MDC.put("InstanceUUID", "N/A");
+
+            // For some reason chooses IPv4 or IPv6 in a random way
+            MDC.put("RemoteHost", request.getRemoteHost());
+
+            InetAddress host = HOST_ADDRESS.get();
+
+            String ipAddress, hostName;
+            if (host == null) {
+                ipAddress = UNKNOWN;
+                hostName = UNKNOWN;
+            } else {
+                ipAddress = host.getHostAddress();
+                hostName = host.getHostName();
+            }
+
+            MDC.put("ServerIPAddress", ipAddress);
+            MDC.put("ServerFQDN", hostName);
+
+            if(request instanceof HttpServletRequest) {
+                String userName = ((HttpServletRequest) request).getHeader("USER_ID");
+                MDC.put("PartnerName", userName);
+            }
+            // TODO: Clarify what these stand for
+    //        MDC.put("AlertSeverity", );
+    //        MDC.put("Timer", );
+
+            chain.doFilter(request, response);
+
+        } finally {
+            MDC.clear();
+        }
+    }
+
+    public void init(FilterConfig config) throws ServletException { }
+
+    private static class HostAddressCache {
+
+        private static final long REFRESH_TIME = 1000L;
+
+        private final AtomicLong lastUpdated = new AtomicLong(0L);
+        private InetAddress hostAddress;
+
+        public InetAddress get() {
+
+            long current = System.currentTimeMillis();
+            if (current - lastUpdated.get() > REFRESH_TIME) {
+
+                synchronized (this) {
+
+                    try {
+                        lastUpdated.set(current); // set now to register the attempt even if failed
+                        hostAddress = InetAddress.getLocalHost();
+                    } catch (UnknownHostException e) {
+                        LOGGER.error("Failed to retrieve local hostname for logging", e);
+                        hostAddress = null;
+                    }
+                }
+            }
+
+            return hostAddress;
+        }
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/util/LoggingUtils.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/util/LoggingUtils.java
new file mode 100644
index 0000000..06b0d5b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/util/LoggingUtils.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.util;
+
+/**
+ * Created by TALIO on 1/10/2017.
+ */
+public class LoggingUtils {
+
+  public static String getCallingMethodNameForDebugging() {
+    return Thread.currentThread().getStackTrace()[4].getMethodName();
+  }
+
+  public static String getDeclaringClass(){
+    return Thread.currentThread().getStackTrace()[4].getClassName();
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.LoggerCreationService b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.LoggerCreationService
new file mode 100644
index 0000000..ee01c4d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.LoggerCreationService
@@ -0,0 +1 @@
+org.openecomp.sdc.logging.SLF4JLoggerCreationService
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.context.ContextPropagationService b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.context.ContextPropagationService
new file mode 100644
index 0000000..2c40161
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/resources/META-INF/services/org.openecomp.sdc.logging.api.context.ContextPropagationService
@@ -0,0 +1 @@
+org.openecomp.sdc.logging.context.MDCPropagationService
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LoggerFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LoggerFactoryTest.java
new file mode 100644
index 0000000..fe81a46
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LoggerFactoryTest.java
@@ -0,0 +1,25 @@
+package org.openecomp.sdc.logging;
+
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Field;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * @author evitaliy
+ * @since 12/09/2016.
+ */
+public class LoggerFactoryTest {
+
+  @Test
+  public void testCreate() throws Exception {
+    // test that the service loader loads the right implementation
+    LoggerFactory.getLogger(LoggerFactoryTest.class);
+    Field factory = LoggerFactory.class.getDeclaredField("SERVICE");
+    factory.setAccessible(true);
+    Object implementation = factory.get(null);
+    assertEquals(SLF4JLoggerCreationService.class, implementation.getClass());
+  }
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/RoutingTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/RoutingTest.java
new file mode 100644
index 0000000..87f2f17
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/RoutingTest.java
@@ -0,0 +1,155 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.sift.SiftingAppender;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+import org.openecomp.sdc.logging.logback.EventTypeDiscriminator;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Predicate;
+
+/**
+ * TODO: Add more negative tests
+ *
+ * @author EVITALIY
+ * @since 17/08/2016.
+ */
+public class RoutingTest {
+
+  private static final String ERROR = "Error";
+  private static final String DEBUG = "Debug";
+  private static final String AUDIT = "Audit";
+  private static final String METRICS = "Metrics";
+
+  private Logger logger;
+  private Map<String, TestAppender> result = new ConcurrentHashMap<>();
+
+  @BeforeClass
+  public void setUp() {
+
+    SiftingAppender appender = new SiftingAppender();
+
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    discriminator.start();
+
+    appender.setDiscriminator(discriminator);
+    appender.setAppenderFactory((context, discriminatingValue) ->
+        result.computeIfAbsent(discriminatingValue, f -> {
+          TestAppender tmp = new TestAppender();
+          tmp.start();
+          return tmp;
+        }));
+
+    appender.start();
+
+    logger = (Logger) LoggerFactory.getLogger(RoutingTest.class.getName());
+    // prevent from writing into appenders attached via parent loggers
+    logger.setAdditive(false);
+    logger.addAppender(appender);
+    logger.setLevel(Level.DEBUG);
+  }
+
+  @Test
+  public void testWarning() {
+    String msg = "This is a test warning";
+    logger.warn(msg);
+    TestAppender appender = result.get(ERROR);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.WARN.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  @Test
+  public void testError() {
+    String msg = "This is a test error";
+    logger.error(msg);
+    TestAppender appender = result.get(ERROR);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.ERROR.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  @Test
+  public void testDebug() {
+    String msg = "This is a test debug";
+    logger.debug(msg);
+    TestAppender appender = result.get(DEBUG);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.DEBUG.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  @Test
+  public void testInfo() {
+    String msg = "This is a test info";
+    logger.info(msg);
+    TestAppender appender = result.get(ERROR);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.INFO.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  @Test
+  public void testAudit() {
+    String msg = "This is a test audit";
+    logger.info(Markers.AUDIT, msg);
+    TestAppender appender = result.get(AUDIT);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.INFO.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  @Test
+  public void testMetrics() {
+    String msg = "This is a test metrics";
+    logger.info(Markers.METRICS, msg);
+    TestAppender appender = result.get(METRICS);
+    Assert.assertTrue(appender.contains((event) ->
+        Level.INFO.equals(event.getLevel()) && msg.equals(event.getFormattedMessage())));
+  }
+
+  /**
+   * An appender that just accumulates messages in a list and enables to inspect them
+   *
+   * @author EVITALIY
+   * @since 17/08/2016.
+   */
+  private static class TestAppender extends AppenderBase<ILoggingEvent> {
+
+    private List<ILoggingEvent> events = Collections.synchronizedList(new ArrayList<>(10));
+
+    @Override
+    protected void append(ILoggingEvent event) {
+      this.events.add(event);
+    }
+
+    public boolean contains(Predicate<ILoggingEvent> predicate) {
+      return events.stream().anyMatch(predicate);
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java
new file mode 100644
index 0000000..a191c80
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.api;
+
+import org.testng.annotations.Test;
+
+/**
+ * This is only for manual testing - change ENABLE to 'true'
+ *
+ * @author evitaliy
+ * @since 13/09/2016.
+ */
+public class LoggerTest {
+
+  private static final boolean ENABLED = false;
+  private static final Logger LOGGER = LoggerFactory.getLogger(LoggerTest.class);
+
+  @Test(enabled = ENABLED)
+  public void testMetrics() throws Exception {
+    LOGGER.metrics("This is metrics");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testAudit() throws Exception {
+    LOGGER.audit("This is audit");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testDebug() throws Exception {
+    LOGGER.debug("This is debug");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testInfo() throws Exception {
+    LOGGER.info("This is info");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testWarn() throws Exception {
+    LOGGER.warn("This is warning");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testError() throws Exception {
+    LOGGER.error("This is error");
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java
new file mode 100644
index 0000000..8b9ee3e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java
@@ -0,0 +1,451 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.aspects;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.reflect.SourceLocation;
+import org.aspectj.runtime.internal.AroundClosure;
+import org.easymock.EasyMock;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.testng.PowerMockTestCase;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
+
+/**
+ * @author EVITALIY
+ * @since 17/08/2016.
+ */
+@PrepareForTest(LoggerFactory.class)
+public class MetricsAspectTest extends PowerMockTestCase {
+
+  private static final Object OBJ_TO_RETURN = new Object();
+  private static final String EXPECTED_MESSAGE = "'{}' took {} milliseconds";
+
+  @Test
+  public void testLogExecutionTime() throws Throwable {
+
+    String className = UUID.randomUUID().toString();
+    String methodName = UUID.randomUUID().toString();
+
+    TestLogger logger = initLogging(className, true);
+
+    MetricsAspect aspect = new MetricsAspect();
+    MockProceedingJoinPoint pjp = new MockProceedingJoinPoint(className, methodName);
+    Object returned = aspect.logExecutionTime(pjp);
+
+    Assert.assertEquals(OBJ_TO_RETURN, returned);
+    assertExecution(methodName, pjp, logger);
+  }
+
+  @Test
+  public void testMetricsDisabled() throws Throwable {
+
+    String className = UUID.randomUUID().toString();
+    String methodName = UUID.randomUUID().toString();
+
+    TestLogger logger = initLogging(className, false);
+
+    MetricsAspect aspect = new MetricsAspect();
+    MockProceedingJoinPoint pjp = new MockProceedingJoinPoint(className, methodName);
+    Object returned = aspect.logExecutionTime(pjp);
+
+    Assert.assertEquals(OBJ_TO_RETURN, returned);
+    Assert.assertEquals(1, pjp.getCount());
+    // return any event - must be empty
+    Assert.assertFalse(logger.contains((event) -> true));
+  }
+
+  @Test(expectedExceptions = IllegalArgumentException.class)
+  public void testThrowingError() throws Throwable {
+
+    String className = UUID.randomUUID().toString();
+    String methodName = UUID.randomUUID().toString();
+
+    final TestLogger logger = initLogging(className, true);
+
+    MetricsAspect aspect = new MetricsAspect();
+    MockProceedingJoinPoint pjp = new MockProceedingJoinPointWithException(className, methodName);
+
+    try {
+      aspect.logExecutionTime(pjp);
+    } finally {
+      assertExecution(methodName, pjp, logger);
+    }
+  }
+
+  private TestLogger initLogging(String className, boolean enabled) {
+    TestLogger logger = new TestLogger(enabled);
+    PowerMock.mockStatic(LoggerFactory.class);
+    EasyMock.expect(LoggerFactory.getLogger(className)).andReturn(logger);
+    PowerMock.replay(LoggerFactory.class);
+    return logger;
+  }
+
+  private void assertExecution(String methodName, MockProceedingJoinPoint pjp, TestLogger logger) {
+
+    Assert.assertEquals(1, pjp.getCount());
+    Assert.assertTrue(logger.contains((event) ->
+        (event != null) && (event.length == 3) && EXPECTED_MESSAGE.equals(event[0])
+            && methodName.equals(event[1]) && (event[2] instanceof Long)));
+  }
+
+  private static class MockSignature implements Signature {
+
+    private final String className;
+    private final String methodName;
+
+    private MockSignature(String className, String methodName) {
+      this.className = className;
+      this.methodName = methodName;
+    }
+
+    @Override
+    public String toShortString() {
+      return null;
+    }
+
+    @Override
+    public String toLongString() {
+      return null;
+    }
+
+    @Override
+    public String getName() {
+      return methodName;
+    }
+
+    @Override
+    public int getModifiers() {
+      return 0;
+    }
+
+    @Override
+    public Class getDeclaringType() {
+      return null;
+    }
+
+    @Override
+    public String getDeclaringTypeName() {
+      return className;
+    }
+  }
+
+  private static class MockProceedingJoinPoint implements ProceedingJoinPoint {
+
+    private AtomicInteger count = new AtomicInteger(0);
+    private Signature signature;
+
+    MockProceedingJoinPoint(String className, String methodName) {
+      this.signature = new MockSignature(className, methodName);
+    }
+
+    int getCount() {
+      return count.get();
+    }
+
+    @Override
+    public Object proceed() throws Throwable {
+      count.incrementAndGet();
+      return OBJ_TO_RETURN;
+    }
+
+    @Override
+    public void set$AroundClosure(AroundClosure aroundClosure) {
+
+    }
+
+    @Override
+    public Object proceed(Object[] objects) throws Throwable {
+      return null;
+    }
+
+    @Override
+    public String toShortString() {
+      return null;
+    }
+
+    @Override
+    public String toLongString() {
+      return null;
+    }
+
+    @Override
+    public Object getThis() {
+      return null;
+    }
+
+    @Override
+    public Object getTarget() {
+      return null;
+    }
+
+    @Override
+    public Object[] getArgs() {
+      return new Object[0];
+    }
+
+    @Override
+    public Signature getSignature() {
+      return this.signature;
+    }
+
+    @Override
+    public SourceLocation getSourceLocation() {
+      return null;
+    }
+
+    @Override
+    public String getKind() {
+      return null;
+    }
+
+    @Override
+    public StaticPart getStaticPart() {
+      return null;
+    }
+  }
+
+  private static class MockProceedingJoinPointWithException extends MockProceedingJoinPoint {
+
+    MockProceedingJoinPointWithException(String className, String methodName) {
+      super(className, methodName);
+    }
+
+    @Override
+    public Object proceed() throws Throwable {
+      super.proceed();
+      throw new IllegalArgumentException();
+    }
+  }
+
+  private class TestLogger implements Logger {
+
+    private final boolean enabled;
+    private List<Object[]> events = Collections.synchronizedList(new ArrayList<>(10));
+
+    TestLogger(boolean enabled) {
+      this.enabled = enabled;
+    }
+
+    @Override
+    public String getName() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isMetricsEnabled() {
+      return this.enabled;
+    }
+
+    @Override
+    public void metrics(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void metrics(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void metrics(String var1, Object var2, Object var3) {
+
+      if (this.enabled) {
+        events.add(new Object[]{var1, var2, var3});
+      }
+    }
+
+    @Override
+    public void metrics(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void metrics(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isAuditEnabled() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void audit(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void audit(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void audit(String var1, Object var2, Object var3) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void audit(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void audit(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isDebugEnabled() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void debug(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void debug(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void debug(String var1, Object var2, Object var3) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void debug(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void debug(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isInfoEnabled() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void info(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void info(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void info(String var1, Object var2, Object var3) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void info(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void info(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isWarnEnabled() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void warn(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void warn(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void warn(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void warn(String var1, Object var2, Object var3) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void warn(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public boolean isErrorEnabled() {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void error(String var1) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void error(String var1, Object var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void error(String var1, Object var2, Object var3) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void error(String var1, Object... var2) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void error(String var1, Throwable throwable) {
+      throw new RuntimeException("Not implemented");
+    }
+
+    public boolean contains(Predicate<Object[]> predicate) {
+      return events.stream().anyMatch(predicate);
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/MDCPropagationFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/MDCPropagationFactoryTest.java
new file mode 100644
index 0000000..c0aa1d0
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/MDCPropagationFactoryTest.java
@@ -0,0 +1,223 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.context;
+
+import org.slf4j.MDC;
+import org.testng.annotations.Test;
+
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.testng.Assert.*;
+
+/**
+ * @author evitaliy
+ * @since 12/09/2016.
+ */
+public class MDCPropagationFactoryTest {
+
+  // Disable if an old version of MDC implementation is being used.
+  // MDCPropagationFactory should be used when MDC is not propagated to child threads.
+  // See https://jira.qos.ch/browse/LOGBACK-422 and https://jira.qos.ch/browse/LOGBACK-624
+  private static final boolean ENABLED = false;
+
+  @Test(enabled = ENABLED)
+  public void testNoPropagation() throws InterruptedException {
+
+    String uuid = UUID.randomUUID().toString();
+    AtomicBoolean complete = new AtomicBoolean(false);
+    MDC.put("data", uuid);
+
+    Runnable runnable = () -> {
+      assertNull(MDC.get("data"), "Data unexpectedly copied to a child thread. " +
+              "Are you using an old version of MDC implementation (e.g. logback)?");
+      complete.set(true);
+    };
+
+    Thread thread = new Thread(runnable);
+    thread.start();
+    thread.join();
+
+    assertEquals(MDC.get("data"), uuid, "Expected data to be retained in this thread");
+    assertTrue(complete.get(), "Expected the inner thread to run");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testPropagation() throws InterruptedException {
+
+    String uuid = UUID.randomUUID().toString();
+    AtomicBoolean complete = new AtomicBoolean(false);
+    MDC.put("data", uuid);
+
+    MDCPropagationService factory = new MDCPropagationService();
+    Runnable runnable = factory.create(() -> {
+      assertEquals(MDC.get("data"), uuid, "Expected data to be propagated to the child thread's MDC");
+      complete.set(true);
+    });
+
+    Thread thread = new Thread(runnable);
+    thread.start();
+
+    thread.join();
+
+    assertEquals(MDC.get("data"), uuid, "Expected data to be retained in this thread");
+    assertTrue(complete.get(), "Expected the inner thread to run");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testReplacement() throws InterruptedException {
+
+    String innerUuid = UUID.randomUUID().toString();
+    AtomicBoolean innerComplete = new AtomicBoolean(false);
+    AtomicBoolean outerComplete = new AtomicBoolean(false);
+
+    MDC.put("data", innerUuid);
+
+    MDCPropagationService factory = new MDCPropagationService();
+
+    // should run with the context of main thread
+    Runnable inner = factory.create(() -> {
+      assertEquals(MDC.get("data"), innerUuid, "Expected data to be propagated to the child thread's MDC");
+      innerComplete.set(true);
+    });
+
+    // pushes its own context, but runs the inner runnable
+    Runnable outer = () -> {
+      String outerUuid = UUID.randomUUID().toString();
+      MDC.put("data", outerUuid);
+      inner.run();
+      assertEquals(MDC.get("data"), outerUuid, "Expected MDC data to be replaced with stored data");
+      outerComplete.set(true);
+    };
+
+
+    Thread thread = new Thread(outer);
+    thread.start();
+    thread.join();
+
+    assertEquals(MDC.get("data"), innerUuid, "Expected data to be retained in this thread");
+    assertTrue(outerComplete.get(), "Expected the outer thread to run");
+    assertTrue(innerComplete.get(), "Expected the inner thread to run");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testEmpty() throws InterruptedException {
+
+    final AtomicBoolean complete = new AtomicBoolean(false);
+
+    MDC.remove("data");
+    assertNull(MDC.get("data"), "Expected MDC data to be empty");
+
+    MDCPropagationService factory = new MDCPropagationService();
+    Runnable runnable = factory.create(() -> {
+      assertNull(MDC.get("data"), "Expected MDC data to be empty");
+      complete.set(true);
+    });
+
+    Thread thread = new Thread(runnable);
+    thread.start();
+    thread.join();
+
+    assertNull(MDC.get("data"), "Expected MDC data to be empty");
+    assertTrue(complete.get(), "Expected the inner thread to run");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testCleanup() throws Exception {
+
+    String innerUuid = UUID.randomUUID().toString();
+    AtomicBoolean innerComplete = new AtomicBoolean(false);
+    AtomicBoolean outerComplete = new AtomicBoolean(false);
+
+    MDC.put("data", innerUuid);
+
+    MDCPropagationService factory = new MDCPropagationService();
+
+    // should run with the context of main thread
+    Runnable inner = factory.create(() -> {
+      assertEquals(MDC.get("data"), innerUuid, "Expected data to be propagated to the child thread's MDC");
+      innerComplete.set(true);
+    });
+
+    // pushes its own context, but runs the inner runnable
+    Runnable outer = () -> {
+      assertNull(MDC.get("data"), "Expected MDC data not to be copied to this thread");
+      inner.run();
+      assertNull(MDC.get("data"), "Expected MDC data to remain empty in this thread");
+      outerComplete.set(true);
+    };
+
+    Thread thread = new Thread(outer);
+    thread.start();
+    thread.join();
+
+    assertEquals(MDC.get("data"), innerUuid, "Expected MDC data to be retained in parent thread");
+    assertTrue(outerComplete.get(), "Expected the outer thread to run");
+    assertTrue(innerComplete.get(), "Expected the inner thread to run");
+  }
+
+  @Test(enabled = ENABLED)
+  public void testCleanupAfterError() throws Exception {
+
+    String innerUuid = UUID.randomUUID().toString();
+    AtomicBoolean innerComplete = new AtomicBoolean(false);
+    AtomicBoolean outerComplete = new AtomicBoolean(false);
+    AtomicBoolean exceptionThrown = new AtomicBoolean(false);
+
+    MDC.put("data", innerUuid);
+
+    MDCPropagationService factory = new MDCPropagationService();
+
+    // should run with the context of main thread
+    Runnable inner = factory.create(() -> {
+      assertEquals(MDC.get("data"), innerUuid, "Expected data to be propagated to the child thread's MDC");
+      innerComplete.set(true);
+      throw new RuntimeException();
+    });
+
+    // pushes its own context, but runs the inner runnable
+    Runnable outer = () -> {
+
+      String outerUuid = UUID.randomUUID().toString();
+      MDC.put("data", outerUuid);
+      assertEquals(MDC.get("data"), outerUuid, "Expected MDC data to be populated in this thread");
+
+      try {
+        inner.run();
+      } catch (RuntimeException e) {
+        exceptionThrown.set(true);
+      } finally {
+        assertEquals(MDC.get("data"), outerUuid, "Expected MDC data to be reverted even in case of exception");
+        outerComplete.set(true);
+      }
+    };
+
+    Thread thread = new Thread(outer);
+    thread.start();
+    thread.join();
+
+    assertEquals(MDC.get("data"), innerUuid, "Expected MDC data to be retained in parent thread");
+    assertTrue(outerComplete.get(), "Expected the outer thread to run");
+    assertTrue(innerComplete.get(), "Expected the inner thread to run");
+    assertTrue(exceptionThrown.get(), "Expected the inner class to throw exception");
+  }
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/TaskFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/TaskFactoryTest.java
new file mode 100644
index 0000000..dad60d4
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/context/TaskFactoryTest.java
@@ -0,0 +1,26 @@
+package org.openecomp.sdc.logging.context;
+
+import org.openecomp.sdc.logging.api.context.TaskFactory;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Field;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * @author evitaliy
+ * @since 12/09/2016.
+ */
+public class TaskFactoryTest {
+
+  @Test
+  public void testCreate() throws Exception {
+    // test that the service loader loads the right implementation
+    TaskFactory.create(() -> {
+    });
+    Field factory = TaskFactory.class.getDeclaredField("SERVICE");
+    factory.setAccessible(true);
+    Object implementation = factory.get(null);
+    assertEquals(MDCPropagationService.class, implementation.getClass());
+  }
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminatorTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminatorTest.java
new file mode 100644
index 0000000..39b3170
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminatorTest.java
@@ -0,0 +1,220 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.logback;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import org.openecomp.sdc.logging.Markers;
+import org.slf4j.MarkerFactory;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * @author EVITALIY
+ * @since 17/08/2016.
+ */
+public class EventTypeDiscriminatorTest {
+
+  private static final String DEBUG = "Debug";
+  private static final String ERROR = "Error";
+
+  @Test
+  public void testGetDefaultDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetErrorDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.ERROR);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetWarnDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.WARN);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetInfoDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.INFO);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetTraceDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.TRACE);
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetErrorWithAuditDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.ERROR);
+    event.setMarker(Markers.AUDIT);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetErrorWithMetricsDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.ERROR);
+    event.setMarker(Markers.METRICS);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetWarnWithAuditDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.WARN);
+    event.setMarker(Markers.AUDIT);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetWarnWithMetricsDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.WARN);
+    event.setMarker(Markers.METRICS);
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetDebugWithAuditDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.DEBUG);
+    event.setMarker(Markers.AUDIT);
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetDebugWithMetricsDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.DEBUG);
+    event.setMarker(Markers.METRICS);
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetTraceWithAuditDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.TRACE);
+    event.setMarker(Markers.AUDIT);
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetTraceWithMetricsDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.TRACE);
+    event.setMarker(Markers.METRICS);
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetErrorWithMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.ERROR);
+    event.setMarker(MarkerFactory.getMarker("Dummy"));
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetWarnWithMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.WARN);
+    event.setMarker(MarkerFactory.getMarker("Dummy"));
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetDebugWithMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.DEBUG);
+    event.setMarker(MarkerFactory.getMarker("Dummy"));
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetTraceWithMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.TRACE);
+    event.setMarker(MarkerFactory.getMarker("Dummy"));
+    assertEquals(discriminator.getDiscriminatingValue(event), DEBUG);
+  }
+
+  @Test
+  public void testGetInfoWithMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.INFO);
+    event.setMarker(MarkerFactory.getMarker("Dummy"));
+    assertEquals(discriminator.getDiscriminatingValue(event), ERROR);
+  }
+
+  @Test
+  public void testGetAuditDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.INFO);
+    event.setMarker(Markers.AUDIT);
+    assertEquals(discriminator.getDiscriminatingValue(event), "Audit");
+  }
+
+  @Test
+  public void testGetMetricsMarkerDiscriminatingValue() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    LoggingEvent event = new LoggingEvent();
+    event.setLevel(Level.INFO);
+    event.setMarker(Markers.METRICS);
+    assertEquals(discriminator.getDiscriminatingValue(event), "Metrics");
+  }
+
+  @Test
+  public void testGetKey() throws Exception {
+    EventTypeDiscriminator discriminator = new EventTypeDiscriminator();
+    assertEquals("eventType", discriminator.getKey());
+  }
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/servlet/LoggingFilterTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/servlet/LoggingFilterTest.java
new file mode 100644
index 0000000..0779e38
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/servlet/LoggingFilterTest.java
@@ -0,0 +1,314 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdc.logging.servlet;
+
+import org.slf4j.MDC;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import javax.servlet.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.InetAddress;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+/**
+ * TODO: Add more tests
+ *
+ * @author EVITALIY
+ * @since 17/08/2016.
+ */
+public class LoggingFilterTest {
+
+  private static final String REMOTE_HOST = UUID.randomUUID().toString();
+
+  @Test
+  public void testDoFilter() throws Exception {
+    LoggingFilter loggingFilter = new LoggingFilter();
+    ServletRequest mockRequest = new TestServletRequest();
+    ServletResponse mockResponse = new TestServletResponse();
+    TestFilterChain mockChain = new TestFilterChain();
+    loggingFilter.doFilter(mockRequest, mockResponse, mockChain);
+    assertEquals(1, mockChain.getCount());
+    assertNull(MDC.getCopyOfContextMap());
+  }
+
+  private static class TestServletRequest implements ServletRequest {
+
+    @Override
+    public Object getAttribute(String s) {
+      return null;
+    }
+
+    @Override
+    public Enumeration getAttributeNames() {
+      return null;
+    }
+
+    @Override
+    public String getCharacterEncoding() {
+      return null;
+    }
+
+    @Override
+    public void setCharacterEncoding(String s) throws UnsupportedEncodingException {
+
+    }
+
+    @Override
+    public int getContentLength() {
+      return 0;
+    }
+
+    @Override
+    public String getContentType() {
+      return null;
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+      return null;
+    }
+
+    @Override
+    public String getParameter(String s) {
+      return null;
+    }
+
+    @Override
+    public Enumeration getParameterNames() {
+      return null;
+    }
+
+    @Override
+    public String[] getParameterValues(String s) {
+      return new String[0];
+    }
+
+    @Override
+    public Map getParameterMap() {
+      return null;
+    }
+
+    @Override
+    public String getProtocol() {
+      return null;
+    }
+
+    @Override
+    public String getScheme() {
+      return null;
+    }
+
+    @Override
+    public String getServerName() {
+      return null;
+    }
+
+    @Override
+    public int getServerPort() {
+      return 0;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+      return null;
+    }
+
+    @Override
+    public String getRemoteAddr() {
+      return null;
+    }
+
+    @Override
+    public String getRemoteHost() {
+      return REMOTE_HOST;
+    }
+
+    @Override
+    public void setAttribute(String s, Object o) {
+
+    }
+
+    @Override
+    public void removeAttribute(String s) {
+
+    }
+
+    @Override
+    public Locale getLocale() {
+      return null;
+    }
+
+    @Override
+    public Enumeration getLocales() {
+      return null;
+    }
+
+    @Override
+    public boolean isSecure() {
+      return false;
+    }
+
+    @Override
+    public RequestDispatcher getRequestDispatcher(String s) {
+      return null;
+    }
+
+    @Override
+    public String getRealPath(String s) {
+      return null;
+    }
+
+    @Override
+    public int getRemotePort() {
+      return 0;
+    }
+
+    @Override
+    public String getLocalName() {
+      return null;
+    }
+
+    @Override
+    public String getLocalAddr() {
+      return null;
+    }
+
+    @Override
+    public int getLocalPort() {
+      return 0;
+    }
+  }
+
+  private static class TestFilterChain implements FilterChain {
+
+    private AtomicInteger count = new AtomicInteger(0);
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse)
+        throws IOException, ServletException {
+
+      Assert.assertNotNull(MDC.get("RequestId"));
+      Assert.assertEquals(MDC.get("ServiceInstanceId"), "N/A");
+      Assert.assertEquals(MDC.get("ServiceName"), "ASDC");
+      Assert.assertEquals(MDC.get("InstanceUUID"), "N/A");
+      Assert.assertEquals(MDC.get("RemoteHost"), REMOTE_HOST);
+
+      InetAddress host = InetAddress.getLocalHost();
+      Assert.assertEquals(MDC.get("ServerIPAddress"), host.getHostAddress());
+      Assert.assertEquals(MDC.get("ServerFQDN"), host.getHostName());
+
+      count.incrementAndGet();
+    }
+
+    public int getCount() {
+      return count.get();
+    }
+  }
+
+  private static class TestServletResponse implements ServletResponse {
+
+    @Override
+    public String getCharacterEncoding() {
+      return null;
+    }
+
+    @Override
+    public void setCharacterEncoding(String s) {
+
+    }
+
+    @Override
+    public String getContentType() {
+      return null;
+    }
+
+    @Override
+    public void setContentType(String s) {
+
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() throws IOException {
+      return null;
+    }
+
+    @Override
+    public PrintWriter getWriter() throws IOException {
+      return null;
+    }
+
+    @Override
+    public void setContentLength(int i) {
+
+    }
+
+    @Override
+    public int getBufferSize() {
+      return 0;
+    }
+
+    @Override
+    public void setBufferSize(int i) {
+
+    }
+
+    @Override
+    public void flushBuffer() throws IOException {
+
+    }
+
+    @Override
+    public void resetBuffer() {
+
+    }
+
+    @Override
+    public boolean isCommitted() {
+      return false;
+    }
+
+    @Override
+    public void reset() {
+
+    }
+
+    @Override
+    public Locale getLocale() {
+      return null;
+    }
+
+    @Override
+    public void setLocale(Locale locale) {
+
+    }
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/README b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/README
new file mode 100644
index 0000000..430f36d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/README
@@ -0,0 +1,8 @@
+Different routing/dispatching mechanisms can be tested using -Dlogback.configurationFile and a custom configuration
+file, for example
+
+-Dlogback.configurationFile=<path>/dispatching-logback.xml
+
+or
+
+-Dlogback.configurationFile=<path>/sifting-logback.xml
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/dispatching-logback.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/dispatching-logback.xml
new file mode 100644
index 0000000..c6c51f1
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/dispatching-logback.xml
@@ -0,0 +1,335 @@
+<configuration scan="true" scanPeriod="3 seconds">
+  <!--<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 -->
+  <property name="componentName" value="SDC" />
+  
+  <!--  log file names -->
+  <property name="generalLogName" value="application" />
+  <property name="securityLogName" value="security" />
+  <property name="performanceLogName" value="performance" />
+  <property name="serverLogName" value="server" />
+  <property name="policyLogName" value="policy" />
+  <property name="errorLogName" value="error" />
+  <property name="metricsLogName" value="metrics" />
+  <property name="auditLogName" value="audit" />
+  <property name="debugLogName" value="debug" />
+  
+  <property name="defaultPattern" value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+  
+  <property name="debugLoggerPattern" value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}|[%caller{3}]| %msg%n" />
+  
+  <property name="logDirectory" value="${logDir}/${componentName}" />
+  <property name="debugLogDirectory" value="${debugDir}/${componentName}" />
+  
+  
+  <!-- Example evaluator filter applied against console appender -->
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- ============================================================================ -->
+  <!-- EELF Appenders -->
+  <!-- ============================================================================ -->
+
+  <!-- The EELFAppender is used to record events to the general application 
+    log -->
+    
+    
+  <appender name="EELF"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${generalLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${generalLogName}.%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>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELF" />
+  </appender>
+
+  <!-- EELF Security Appender. This appender is used to record security events 
+    to the security log file. Security events are separate from other loggers 
+    in EELF so that security log records can be captured and managed in a secure 
+    way separate from the other logs. This appender is set to never discard any 
+    events. -->
+  <appender name="EELFSecurity"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${securityLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${securityLogName}.%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>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <discardingThreshold>0</discardingThreshold>
+    <appender-ref ref="EELFSecurity" />
+  </appender>
+
+  <!-- EELF Performance Appender. This appender is used to record performance 
+    records. -->
+  <appender name="EELFPerformance"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${performanceLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <outputPatternAsHeader>true</outputPatternAsHeader>
+      <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFPerformance" />
+  </appender>
+
+  <!-- EELF Server Appender. This appender is used to record Server related 
+    logging events. The Server logger and appender are specializations of the 
+    EELF application root logger and appender. This can be used to segregate Server 
+    events from other components, or it can be eliminated to record these events 
+    as part of the application root log. -->
+  <appender name="EELFServer"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${serverLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${serverLogName}.%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>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFServer" />
+  </appender>
+
+  
+  <!-- EELF Policy Appender. This appender is used to record Policy engine 
+    related logging events. The Policy 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="EELFPolicy"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${policyLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${policyLogName}.%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>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFPolicy" />
+  </appender>
+  
+  
+  <!-- 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>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFAudit" />
+  </appender>
+
+<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>${defaultPattern}</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>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <pattern>${defaultPattern}</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>
+    <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="org.openecomp.eelf" level="info" additivity="false">
+    <appender-ref ref="asyncEELF" />
+  </logger>
+  <logger name="org.openecomp.eelf.security" level="info" additivity="false">
+    <appender-ref ref="asyncEELFSecurity" />
+  </logger>
+  <logger name="org.openecomp.eelf.perf" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPerformance" />
+  </logger>
+  <logger name="org.openecomp.eelf.server" level="info" additivity="false">
+    <appender-ref ref="asyncEELFServer" />
+  </logger>
+  <logger name="org.openecomp.eelf.policy" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPolicy" />
+  </logger>
+
+  <logger name="org.openecomp.eelf.audit" level="info" additivity="false">
+    <appender-ref ref="asyncEELFAudit" />
+  </logger>
+  
+  <logger name="org.openecomp.eelf.metrics" level="info" additivity="false">
+        <appender-ref ref="asyncEELFMetrics" />
+  </logger>
+ 
+ 
+   <logger name="org.openecomp.eelf.error" level="error" additivity="false">
+  <appender-ref ref="asyncEELFError" />
+  </logger>
+  
+   <logger name="org.openecomp.eelf.debug" level="debug" additivity="false">
+        <appender-ref ref="asyncEELFDebug" />
+  </logger>
+
+  <appender name="DISPATCHER" class="org.openecomp.sdc.logging.logback.DispatchingAppender">
+    <discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/>
+    <appenderNamePattern>asyncEELF%s</appenderNamePattern>
+  </appender>
+  
+  <root level="DEBUG" additivity="false">
+    <appender-ref ref="DISPATCHER" />
+  </root>
+
+</configuration>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/logback-test.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..4029db2
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/logback-test.xml
@@ -0,0 +1,41 @@
+<configuration scan="true" scanPeriod="3 seconds">
+
+    <property name="logDir" value="logs" />
+    <property name="componentName" value="SDC" />
+
+    <property name="defaultPattern"
+              value="%logger|%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+
+    <property name="logDirectory" value="${logDir}/${componentName}" />
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${defaultPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="DISPATCHER" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/>
+        <sift>
+            <appender name="${eventType}" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <file>${logDirectory}/${eventType}.log</file>
+                <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+                    <fileNamePattern>${logDirectory}/${eventType}.%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>${defaultPattern}</pattern>
+                </encoder>
+            </appender>
+        </sift>
+    </appender>
+
+    <root level="DEBUG">
+        <appender-ref ref="DISPATCHER" />
+    </root>
+
+</configuration>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/sifting-logback.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/sifting-logback.xml
new file mode 100644
index 0000000..b713b54
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/resources/sifting-logback.xml
@@ -0,0 +1,42 @@
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+
+    <property name="logDir" value="logs" />
+    <property name="componentName" value="SDC" />
+
+    <property name="defaultPattern" value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+
+    <property name="debugPattern" value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}|[%caller{3}]| %msg%n" />
+
+    <property name="logDirectory" value="${logDir}/${componentName}" />
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${defaultPattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="DISPATCHER" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/>
+        <sift>
+            <appender name="${eventType}" class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <file>${logDirectory}/${eventType}.log</file>
+                <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+                    <fileNamePattern>${logDirectory}/${eventType}.%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>${defaultPattern}</pattern>
+                </encoder>
+            </appender>
+        </sift>
+    </appender>
+
+    <root level="DEBUG" additivity="false">
+        <appender-ref ref="DISPATCHER" />
+    </root>
+
+</configuration>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/pom.xml b/openecomp-be/lib/openecomp-sdc-logging-lib/pom.xml
new file mode 100644
index 0000000..589b8bb
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/pom.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <name>openecomp-sdc-logging-lib</name>
+    <artifactId>openecomp-sdc-logging-lib</artifactId>
+    <packaging>pom</packaging>
+
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-lib</artifactId>
+        <version>1.2.0-SNAPSHOT</version>
+    </parent>
+
+    <modules>
+        <module>openecomp-sdc-logging-api</module>
+        <module>openecomp-sdc-logging-core</module>
+    </modules>
+
+</project>
