[SDC-29] Amdocs OnBoard 1707 initial commit.

Change-Id: Ie4d12a3f574008b792899b368a0902a8b46b5370
Signed-off-by: AviZi <avi.ziv@amdocs.com>
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml
index 130cc69..978adf4 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml
@@ -1,7 +1,10 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          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-versioning-api</name>
+    <artifactId>openecomp-sdc-versioning-api</artifactId>
     <parent>
         <groupId>org.openecomp.sdc</groupId>
         <artifactId>openecomp-sdc-lib</artifactId>
@@ -9,22 +12,19 @@
         <relativePath>../..</relativePath>
     </parent>
 
-    <artifactId>openecomp-sdc-versioning-api</artifactId>
-    <name>openecomp-sdc-versioning-api</name>
-
     <dependencies>
         <dependency>
-            <groupId>org.openecomp.sdc</groupId>
+            <groupId>org.openecomp.core</groupId>
             <artifactId>openecomp-facade-core</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.openecomp.sdc</groupId>
+            <groupId>org.openecomp.core</groupId>
             <artifactId>openecomp-facade-api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.openecomp.sdc</groupId>
+            <groupId>org.openecomp.core</groupId>
             <artifactId>openecomp-nosqldb-core</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -41,13 +41,13 @@
         <dependency>
             <groupId>org.glassfish.web</groupId>
             <artifactId>javax.el</artifactId>
-            <version>2.2.4</version>
+            <version>${javax.el.version}</version>
         </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
-            <version>1.10.19</version>
+            <version>${mockito.all.version}</version>
         </dependency>
         <dependency>
             <groupId>org.testng</groupId>
@@ -65,7 +65,12 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
-            <version>RELEASE</version>
+            <version>4.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-logging-core</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml.versionsBackup b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml.versionsBackup
new file mode 100644
index 0000000..3c9a34a
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/pom.xml.versionsBackup
@@ -0,0 +1,75 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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-versioning-api</name>
+    <artifactId>openecomp-sdc-versioning-api</artifactId>
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-lib</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.core</groupId>
+            <artifactId>openecomp-facade-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.core</groupId>
+            <artifactId>openecomp-facade-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.core</groupId>
+            <artifactId>openecomp-nosqldb-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>${hibernate.validator.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+            <version>${javax.el-api.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>2.2.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <scope>test</scope>
+            <version>1.10.19</version>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <scope>test</scope>
+            <version>6.8.5</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>snakeyaml</artifactId>
+                    <groupId>org.yaml</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>4.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-logging-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/VersioningUtil.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/VersioningUtil.java
index d51f8c0a..c4479d7 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/VersioningUtil.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/VersioningUtil.java
@@ -23,6 +23,7 @@
 import org.openecomp.core.dao.BaseDao;
 import org.openecomp.sdc.common.errors.CoreException;
 import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdc.versioning.dao.types.VersionStatus;
 import org.openecomp.sdc.versioning.dao.types.VersionableEntity;
 import org.openecomp.sdc.versioning.errors.RequestedVersionInvalidErrorBuilder;
 import org.openecomp.sdc.versioning.errors.VersionableSubEntityNotFoundErrorBuilder;
@@ -47,9 +48,13 @@
    * @param firstClassCitizenType the first class citizen type
    */
   public static <T extends VersionableEntity> void validateEntityExistence(Object retrievedEntity,
-                                                                 T inputEntity,
-                                                                 String firstClassCitizenType) {
+                                                                           T inputEntity,
+                                                                           String firstClassCitizenType) {
     if (retrievedEntity == null) {
+      //MdcDataErrorMessage.createErrorMessageAndUpdateMDC(LoggerServiceName
+      // .getServiceName(LoggerServiceName.Submit_Entity),
+      // LoggerConstants.TARGET_ENTITY_DB, LoggerTragetServiceName.SUBMIT_ENTITY,
+      // ErrorLevel.ERROR.name(), null, LoggerErrorDescription.SUBMIT_ENTITY);
       throw new CoreException(new VersionableSubEntityNotFoundErrorBuilder(
           inputEntity.getEntityType(),
           inputEntity.getId(),
@@ -84,6 +89,10 @@
     }
 
     if (nonExistingIds.size() > 0) {
+      //MdcDataErrorMessage.createErrorMessageAndUpdateMDC
+      // (LoggerServiceName.getServiceName(LoggerServiceName.Submit_Entity),
+      // LoggerConstants.TARGET_ENTITY_DB, LoggerTragetServiceName.SUBMIT_ENTITY,
+      // ErrorLevel.ERROR.name(), null, LoggerErrorDescription.SUBMIT_ENTITY);
       if (nonExistingIds.size() == 1) {
         throw new CoreException(new VersionableSubEntityNotFoundErrorBuilder(
             entity.getEntityType(),
@@ -123,6 +132,10 @@
 
     if (nonExistingIds.size() > 0) {
       if (nonExistingIds.size() == 1) {
+        //MdcDataErrorMessage.createErrorMessageAndUpdateMDC(LoggerServiceName
+        // .getServiceName(LoggerServiceName.Submit_Entity), LoggerConstants.TARGET_ENTITY_DB,
+        // LoggerTragetServiceName.ENTIT, ErrorLevel.ERROR.name(),
+        // null, LoggerErrorDescription.SUBMIT_ENTITY);
         throw new CoreException(new VersionableSubEntityNotFoundErrorBuilder(
             containedEntityType,
             nonExistingIds.get(0),
@@ -130,6 +143,10 @@
             containingEntity.getId(),
             containingEntity.getVersion()).build());
       }
+      //MdcDataErrorMessage.createErrorMessageAndUpdateMDC(LoggerServiceName
+      // .getServiceName(LoggerServiceName.Submit_Entity),
+      // LoggerConstants.TARGET_ENTITY_DB, LoggerTragetServiceName.SUBMIT_ENTITY,
+      // ErrorLevel.ERROR.name(), null, LoggerErrorDescription.SUBMIT_ENTITY);
       throw new CoreException(new VersionableSubEntityNotFoundErrorBuilder(
           containedEntityType,
           nonExistingIds,
@@ -168,19 +185,23 @@
   }
 
   /**
-   * Resolve version version.
+   * Resolve version.
    *
    * @param requestedVersion the requested version
    * @param versionInfo      the version info
    * @return the version
    */
-  public static Version resolveVersion(Version requestedVersion, VersionInfo versionInfo) {
+  public static Version resolveVersion(Version requestedVersion, VersionInfo versionInfo,
+                                       String user) {
     if (requestedVersion == null) {
       requestedVersion = versionInfo.getActiveVersion();
-    } else {
-      if (!versionInfo.getViewableVersions().contains(requestedVersion)) {
-        throw new CoreException(new RequestedVersionInvalidErrorBuilder().build());
-      }
+    }
+    if (versionInfo.getActiveVersion().equals(requestedVersion)
+        && user.equals(versionInfo.getLockingUser())) {
+      requestedVersion.setStatus(VersionStatus.Locked);
+    }
+    if (!versionInfo.getViewableVersions().contains(requestedVersion)) {
+      throw new CoreException(new RequestedVersionInvalidErrorBuilder().build());
     }
     return requestedVersion;
   }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionInfoDeletedDao.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionInfoDeletedDao.java
index cb6c050..ca09cdb 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionInfoDeletedDao.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionInfoDeletedDao.java
@@ -20,7 +20,6 @@
 
 package org.openecomp.sdc.versioning.dao;
 
-
 import org.openecomp.core.dao.BaseDao;
 import org.openecomp.sdc.versioning.dao.types.VersionInfoDeletedEntity;
 
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDao.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDao.java
index 8709a98..9ba042b 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDao.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDao.java
@@ -29,6 +29,8 @@
                    Version baseVersion, Version newVersion);
 
   void deleteVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
-                     Version versionToDelete);
+                     Version versionToDelete, Version backToVersion);
 
+  void closeVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
+                    Version versionToClose);
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDaoFactory.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDaoFactory.java
index be3c635..870a789 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDaoFactory.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/VersionableEntityDaoFactory.java
@@ -22,10 +22,13 @@
 
 import org.openecomp.core.factory.api.AbstractComponentFactory;
 import org.openecomp.core.factory.api.AbstractFactory;
+import org.openecomp.sdc.versioning.types.VersionableEntityStoreType;
 
 public abstract class VersionableEntityDaoFactory
     extends AbstractComponentFactory<VersionableEntityDao> {
   public static VersionableEntityDaoFactory getInstance() {
     return AbstractFactory.getInstance(VersionableEntityDaoFactory.class);
   }
+
+  public abstract VersionableEntityDao createInterface(VersionableEntityStoreType storeType);
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/Version.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/Version.java
index e6ac799..f0f67cf 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/Version.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/Version.java
@@ -20,16 +20,18 @@
 
 package org.openecomp.sdc.versioning.dao.types;
 
+import com.datastax.driver.mapping.annotations.Transient;
 import com.datastax.driver.mapping.annotations.UDT;
 
 @UDT(name = "version", keyspace = "dox")
 public class Version {
-  public static final String VERSION_REGEX = "^\\d+\\.\\d+$";
   public static final String VERSION_STRING_VIOLATION_MSG =
       "Version string must be in the format of: {integer}.{integer}";
 
   private int major;
   private int minor;
+  @Transient
+  private VersionStatus status = VersionStatus.Available;
 
   public Version() {
   }
@@ -56,7 +58,7 @@
     }
     try {
       version = new Version(Integer.parseInt(versionLevels[0]), Integer.parseInt(versionLevels[1]));
-    } catch (Exception exception) {
+    } catch (Exception ex) {
       throw new IllegalArgumentException(VERSION_STRING_VIOLATION_MSG);
     }
 
@@ -79,6 +81,14 @@
     this.minor = minor;
   }
 
+  public VersionStatus getStatus() {
+    return status;
+  }
+
+  public void setStatus(VersionStatus status) {
+    this.status = status;
+  }
+
   public Version calculateNextCandidate() {
     return new Version(major, minor + 1);
   }
@@ -92,6 +102,13 @@
   }
 
   @Override
+  public int hashCode() {
+    int result = major;
+    result = 31 * result + minor;
+    return result;
+  }
+
+  @Override
   public boolean equals(Object obj) {
     if (this == obj) {
       return true;
@@ -101,18 +118,10 @@
     }
 
     Version version = (Version) obj;
-
     return major == version.major && minor == version.minor;
   }
 
   @Override
-  public int hashCode() {
-    int result = major;
-    result = 31 * result + minor;
-    return result;
-  }
-
-  @Override
   public String toString() {
     return major + "." + minor;
   }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionStatus.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionStatus.java
index 1fb6854..cf980d6 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionStatus.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionStatus.java
@@ -24,5 +24,4 @@
   Available,
   Locked,
   Final
-
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionType.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionType.java
index 5a395c6..befbae6 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionType.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/dao/types/VersionType.java
@@ -22,5 +22,5 @@
 
 public enum VersionType {
   Draft,
-  Finalized
+  Finalized;
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckinOnEntityLockedByOtherErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckinOnEntityLockedByOtherErrorBuilder.java
index 829ce26..f0d8051 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckinOnEntityLockedByOtherErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckinOnEntityLockedByOtherErrorBuilder.java
@@ -20,9 +20,6 @@
 
 package org.openecomp.sdc.versioning.errors;
 
-import static org.openecomp.sdc.versioning.errors.VersioningErrorCodes
-    .CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER;
-
 import org.openecomp.sdc.common.errors.BaseErrorBuilder;
 import org.openecomp.sdc.common.errors.ErrorCategory;
 
@@ -32,8 +29,8 @@
 public class CheckinOnEntityLockedByOtherErrorBuilder extends BaseErrorBuilder {
 
   private static final String CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER_MSG =
-      "Can not check in versionable entity %s with id %s since it is "
-          + "checked out by other user: %s.";
+      "Can not check in versionable entity %s with id %s since it is checked out by other "
+          + "user: %s.";
 
   /**
    * Instantiates a new Checkin on entity locked by other error builder.
@@ -44,7 +41,7 @@
    */
   public CheckinOnEntityLockedByOtherErrorBuilder(String entityType, String entityId,
                                                   String lockingUser) {
-    getErrorCodeBuilder().withId(CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER);
+    getErrorCodeBuilder().withId(VersioningErrorCodes.CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER);
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder().withMessage(String
         .format(CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER_MSG, entityType, entityId, lockingUser));
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckoutOnLockedEntityErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckoutOnLockedEntityErrorBuilder.java
index 60c0247..9784782 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckoutOnLockedEntityErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/CheckoutOnLockedEntityErrorBuilder.java
@@ -29,8 +29,8 @@
 public class CheckoutOnLockedEntityErrorBuilder extends BaseErrorBuilder {
 
   private static final String CHECKOT_ON_LOCKED_ENTITY_MSG =
-      "Can not check out versionable entity %s with id %s since it is "
-          + "checked out by other user: %s.";
+      "Can not check out versionable entity %s with id %s since it is checked out by "
+          + "other user: %s.";
 
   /**
    * Instantiates a new Checkout on locked entity error builder.
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EditOnUnlockedEntityErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EditOnUnlockedEntityErrorBuilder.java
index fb61cce..4de5618 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EditOnUnlockedEntityErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EditOnUnlockedEntityErrorBuilder.java
@@ -20,6 +20,8 @@
 
 package org.openecomp.sdc.versioning.errors;
 
+import static org.openecomp.sdc.versioning.errors.VersioningErrorCodes.EDIT_ON_UNLOCKED_ENTITY;
+
 import org.openecomp.sdc.common.errors.BaseErrorBuilder;
 import org.openecomp.sdc.common.errors.ErrorCategory;
 
@@ -38,7 +40,7 @@
    * @param entityId   the entity id
    */
   public EditOnUnlockedEntityErrorBuilder(String entityType, String entityId) {
-    getErrorCodeBuilder().withId(VersioningErrorCodes.EDIT_ON_UNLOCKED_ENTITY);
+    getErrorCodeBuilder().withId(EDIT_ON_UNLOCKED_ENTITY);
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder()
         .withMessage(String.format(EDIT_ON_UNLOCKED_ENTITY_MSG, entityType, entityId));
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EntityAlreadyFinalizedErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EntityAlreadyFinalizedErrorBuilder.java
index 22643dd..bff3e82 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EntityAlreadyFinalizedErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/EntityAlreadyFinalizedErrorBuilder.java
@@ -20,9 +20,6 @@
 
 package org.openecomp.sdc.versioning.errors;
 
-import static org.openecomp.sdc.versioning.errors.VersioningErrorCodes
-    .SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED;
-
 import org.openecomp.sdc.common.errors.BaseErrorBuilder;
 import org.openecomp.sdc.common.errors.ErrorCategory;
 
@@ -41,7 +38,7 @@
    * @param entityId   the entity id
    */
   public EntityAlreadyFinalizedErrorBuilder(String entityType, String entityId) {
-    getErrorCodeBuilder().withId(SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED);
+    getErrorCodeBuilder().withId(VersioningErrorCodes.SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED);
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder()
         .withMessage(String.format(SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED_MSG, entityType, entityId));
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/RequestedVersionInvalidErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/RequestedVersionInvalidErrorBuilder.java
index 7d3afcb..d44b2c4 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/RequestedVersionInvalidErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/RequestedVersionInvalidErrorBuilder.java
@@ -37,4 +37,12 @@
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder().withMessage(REQUESTED_VERSION_INVALID_MSG);
   }
+
+/*    private static List<String> toStringList(Set<Version> versions) {
+        List<String> versionStrings = new ArrayList<>(versions.size());
+        for (Version version : versions) {
+            versionStrings.add(version.toString());
+        }
+        return versionStrings;
+    }*/
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/SubmitLockedEntityNotAllowedErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/SubmitLockedEntityNotAllowedErrorBuilder.java
index 3f4fc81..959c277 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/SubmitLockedEntityNotAllowedErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/SubmitLockedEntityNotAllowedErrorBuilder.java
@@ -29,8 +29,8 @@
 public class SubmitLockedEntityNotAllowedErrorBuilder extends BaseErrorBuilder {
 
   private static final String SUBMIT_LOCKED_ENTITY_NOT_ALLOWED_MSG =
-      "Versionable entity %s with id %s can not be submitted since it is currently "
-          + "locked by user %s.";
+      "Versionable entity %s with id %s can not be submitted since it is currently"
+          + " locked by user %s.";
 
   /**
    * Instantiates a new Submit locked entity not allowed error builder.
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnEntityLockedByOtherErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnEntityLockedByOtherErrorBuilder.java
index 5e2be13..2b90338 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnEntityLockedByOtherErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnEntityLockedByOtherErrorBuilder.java
@@ -20,9 +20,6 @@
 
 package org.openecomp.sdc.versioning.errors;
 
-import static org.openecomp.sdc.versioning.errors.VersioningErrorCodes
-    .UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER;
-
 import org.openecomp.sdc.common.errors.BaseErrorBuilder;
 import org.openecomp.sdc.common.errors.ErrorCategory;
 
@@ -32,8 +29,8 @@
 public class UndoCheckoutOnEntityLockedByOtherErrorBuilder extends BaseErrorBuilder {
 
   private static final String UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER_MSG =
-      "Can not undo checkout on versionable entity %s with id %s since it is checked out by "
-          + "other user: %s.";
+      "Can not undo checkout on versionable entity %s with id %s since it is checked "
+          +  "out by other user: %s.";
 
   /**
    * Instantiates a new Undo checkout on entity locked by other error builder.
@@ -44,7 +41,8 @@
    */
   public UndoCheckoutOnEntityLockedByOtherErrorBuilder(String entityType, String entityId,
                                                        String lockingUser) {
-    getErrorCodeBuilder().withId(UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER);
+    getErrorCodeBuilder().withId(
+        VersioningErrorCodes.UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER);
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder().withMessage(String
         .format(UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER_MSG, entityType, entityId,
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnUnlockedEntityErrorBuilder.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnUnlockedEntityErrorBuilder.java
index 36ca5b5..d56473f 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnUnlockedEntityErrorBuilder.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/errors/UndoCheckoutOnUnlockedEntityErrorBuilder.java
@@ -20,13 +20,9 @@
 
 package org.openecomp.sdc.versioning.errors;
 
-import static org.openecomp.sdc.versioning.errors.VersioningErrorCodes
-    .UNDO_CHECKOUT_ON_UNLOCKED_ENTITY;
-
 import org.openecomp.sdc.common.errors.BaseErrorBuilder;
 import org.openecomp.sdc.common.errors.ErrorCategory;
 
-
 /**
  * The type Undo checkout on unlocked entity error builder.
  */
@@ -42,7 +38,7 @@
    * @param entityId   the entity id
    */
   public UndoCheckoutOnUnlockedEntityErrorBuilder(String entityType, String entityId) {
-    getErrorCodeBuilder().withId(UNDO_CHECKOUT_ON_UNLOCKED_ENTITY);
+    getErrorCodeBuilder().withId(VersioningErrorCodes.UNDO_CHECKOUT_ON_UNLOCKED_ENTITY);
     getErrorCodeBuilder().withCategory(ErrorCategory.APPLICATION);
     getErrorCodeBuilder()
         .withMessage(String.format(UNDO_CHECKOUT_ON_UNLOCKED_ENTITY_MSG, entityType, entityId));
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityAction.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityAction.java
index c741385..ef9fef2 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityAction.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityAction.java
@@ -22,5 +22,5 @@
 
 public enum VersionableEntityAction {
   Read,
-  Write
+  Write;
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityMetadata.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityMetadata.java
index 161221a..8ec54c9 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityMetadata.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityMetadata.java
@@ -25,25 +25,33 @@
 
 public class VersionableEntityMetadata {
 
+  private VersionableEntityStoreType storeType;
   private String name;
   private String identifierName;
   private String versionIdentifierName;
   private List<UniqueValueMetadata> uniqueValuesMetadata = new ArrayList<>();
 
-  /**
-   * Instantiates a new Versionable entity metadata.
-   *
-   * @param name                  the name
-   * @param identifierName        the identifier name
-   * @param versionIdentifierName the version identifier name
-   */
   public VersionableEntityMetadata(String name, String identifierName,
                                    String versionIdentifierName) {
+    this(VersionableEntityStoreType.Cassandra, name, identifierName, versionIdentifierName);
+  }
+
+  public VersionableEntityMetadata(VersionableEntityStoreType storeType, String name,
+                                   String identifierName, String versionIdentifierName) {
+    this.storeType = storeType;
     this.name = name;
     this.identifierName = identifierName;
     this.versionIdentifierName = versionIdentifierName;
   }
 
+  public VersionableEntityStoreType getStoreType() {
+    return storeType;
+  }
+
+  public void setStoreType(VersionableEntityStoreType storeType) {
+    this.storeType = storeType;
+  }
+
   public String getName() {
     return name;
   }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityStoreType.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityStoreType.java
new file mode 100644
index 0000000..72c5ecd
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/java/org/openecomp/sdc/versioning/types/VersionableEntityStoreType.java
@@ -0,0 +1,6 @@
+package org.openecomp.sdc.versioning.types;
+
+public enum VersionableEntityStoreType {
+  Cassandra,
+  Zusammen
+}
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/resources/factoryConfiguration.json b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/resources/factoryConfiguration.json
index f36c2d5..e38ad1a 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/resources/factoryConfiguration.json
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-api/src/main/resources/factoryConfiguration.json
@@ -1,7 +1,6 @@
 {
   "org.openecomp.sdc.versioning.VersioningManagerFactory": "org.openecomp.sdc.versioning.impl.VersioningManagerFactoryImpl",
-  "org.openecomp.sdc.versioning.dao.VersionableEntityDaoFactory" : "org.openecomp.sdc.versioning.dao.impl.VersionableEntityDaoFactoryImpl",
+  "org.openecomp.sdc.versioning.dao.VersionableEntityDaoFactory": "org.openecomp.sdc.versioning.dao.impl.VersionableEntityDaoFactoryImpl",
   "org.openecomp.sdc.versioning.dao.VersionInfoDaoFactory": "org.openecomp.sdc.versioning.dao.impl.VersionInfoDaoFactoryImpl",
   "org.openecomp.sdc.versioning.dao.VersionInfoDeletedDaoFactory": "org.openecomp.sdc.versioning.dao.impl.VersionInfoDeletedDaoFactoryImpl"
-
 }
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml
index 89e53b2..fa693dc 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml
@@ -1,7 +1,12 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          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-versioning-core</name>
+    <artifactId>openecomp-sdc-versioning-core</artifactId>
+
+
     <parent>
         <groupId>org.openecomp.sdc</groupId>
         <artifactId>openecomp-sdc-lib</artifactId>
@@ -9,10 +14,6 @@
         <relativePath>../..</relativePath>
     </parent>
 
-    <name>openecomp-sdc-versioning-core</name>
-    <artifactId>openecomp-sdc-versioning-core</artifactId>
-
-
     <dependencies>
         <dependency>
             <groupId>org.openecomp.sdc</groupId>
@@ -20,23 +21,21 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>2.3.1</version>
-            <scope>test</scope>
+            <groupId>org.openecomp.core</groupId>
+            <artifactId>openecomp-zusammen-api</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.yaml</groupId>
-            <artifactId>snakeyaml</artifactId>
-            <version>1.14</version>
-            <scope>test</scope>
+            <groupId>org.openecomp.core</groupId>
+            <artifactId>openecomp-zusammen-core</artifactId>
+            <version>${project.version}</version>
+            <scope>runtime</scope>
         </dependency>
-
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
-            <version>1.10.19</version>
+            <version>${mockito.all.version}</version>
         </dependency>
         <dependency>
             <groupId>org.testng</groupId>
@@ -54,8 +53,13 @@
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
-            <version>RELEASE</version>
+            <version>4.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-logging-core</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml.versionsBackup b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml.versionsBackup
new file mode 100644
index 0000000..ce41a59
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/pom.xml.versionsBackup
@@ -0,0 +1,54 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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-versioning-core</name>
+    <artifactId>openecomp-sdc-versioning-core</artifactId>
+
+
+    <parent>
+        <groupId>org.openecomp.sdc</groupId>
+        <artifactId>openecomp-sdc-lib</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-versioning-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <scope>test</scope>
+            <version>1.10.19</version>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <scope>test</scope>
+            <version>6.8.5</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>snakeyaml</artifactId>
+                    <groupId>org.yaml</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>4.11</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.sdc</groupId>
+            <artifactId>openecomp-sdc-logging-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionHistoryCassandraDaoImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionHistoryCassandraDaoImpl.java
index a50a8b7..b364da0 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionHistoryCassandraDaoImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionHistoryCassandraDaoImpl.java
@@ -36,7 +36,8 @@
 import java.util.Collection;
 
 public class VersionHistoryCassandraDaoImpl extends CassandraBaseDao<VersionHistoryEntity>
-    implements VersionHistoryDao {
+    implements
+    VersionHistoryDao {
 
   private static NoSqlDb noSqlDb = NoSqlDbFactory.getInstance().createInterface();
   private static Mapper<VersionHistoryEntity> mapper =
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDaoImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDaoImpl.java
index a45c211..7bc73ce 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDaoImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDaoImpl.java
@@ -40,8 +40,6 @@
       noSqlDb.getMappingManager().mapper(VersionInfoEntity.class);
   private static VersionInfoAccessor accessor =
       noSqlDb.getMappingManager().createAccessor(VersionInfoAccessor.class);
-  //private static UDTMapper<VersionableEntityId> versionedEntityIdMapper = noSqlDb
-  //.getMappingManager().udtMapper(VersionableEntityId.class);
 
   @Override
   protected Mapper<VersionInfoEntity> getMapper() {
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDeletedDaoImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDeletedDaoImpl.java
index 82e4edc..af6b202 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDeletedDaoImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionInfoDeletedDaoImpl.java
@@ -20,6 +20,7 @@
 
 package org.openecomp.sdc.versioning.dao.impl;
 
+
 import com.datastax.driver.mapping.Mapper;
 import com.datastax.driver.mapping.Result;
 import com.datastax.driver.mapping.annotations.Accessor;
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoCassandraImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoCassandraImpl.java
index f02ea89..5673da7 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoCassandraImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoCassandraImpl.java
@@ -24,6 +24,8 @@
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import com.datastax.driver.mapping.UDTMapper;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.core.nosqldb.api.NoSqlDb;
 import org.openecomp.core.nosqldb.factory.NoSqlDbFactory;
 import org.openecomp.core.util.UniqueValueUtil;
@@ -33,8 +35,6 @@
 import org.openecomp.sdc.versioning.types.UniqueValueMetadata;
 import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
 
-import org.slf4j.LoggerFactory;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -45,8 +45,8 @@
 class VersionableEntityDaoCassandraImpl implements VersionableEntityDao {
 
   private static final NoSqlDb noSqlDb = NoSqlDbFactory.getInstance().createInterface();
-  private static org.slf4j.Logger Logger =
-      LoggerFactory.getLogger(VersionableEntityDaoCassandraImpl.class);
+  private static Logger Logger =
+      (Logger) LoggerFactory.getLogger(VersionableEntityDaoCassandraImpl.class);
   private static UDTMapper<Version> versionMapper =
       noSqlDb.getMappingManager().udtMapper(Version.class);
 
@@ -96,6 +96,22 @@
     }
   }
 
+  @Override
+  public void deleteVersion(VersionableEntityMetadata metadata, String entityId,
+                            Version versionToDelete, Version backToVersion) {
+    deleteRowsUniqueValues(metadata, entityId, versionToDelete);
+
+    String deleteCql = String.format("delete from %s where %s=? and %s=?", metadata.getName(),
+        metadata.getIdentifierName(), metadata.getVersionIdentifierName());
+    noSqlDb.execute(deleteCql, entityId, versionMapper.toUDT(versionToDelete));
+  }
+
+  @Override
+  public void closeVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
+                           Version versionToClose) {
+    // redundant in cassandra impl.
+  }
+
   private ResultSet loadVersionRows(VersionableEntityMetadata metadata, String entityId,
                                     Version version) {
     String selectCql = String.format("select * from %s where %s=? and %s=?", metadata.getName(),
@@ -107,16 +123,6 @@
     return noSqlDb.execute(selectCql, entityId, versionMapper.toUDT(version));
   }
 
-  @Override
-  public void deleteVersion(VersionableEntityMetadata metadata, String entityId,
-                            Version versionToDelete) {
-    deleteRowsUniqueValues(metadata, entityId, versionToDelete);
-
-    String deleteCql = String.format("delete from %s where %s=? and %s=?", metadata.getName(),
-        metadata.getIdentifierName(), metadata.getVersionIdentifierName());
-    noSqlDb.execute(deleteCql, entityId, versionMapper.toUDT(versionToDelete));
-  }
-
   private void initRowUniqueValues(List<UniqueValueMetadata> metadata,
                                    Map<String, Object> columnNameToValue) {
     for (UniqueValueMetadata uniqueMetadata : metadata) {
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoFactoryImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoFactoryImpl.java
index 8ec0814..3ab6560 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoFactoryImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoFactoryImpl.java
@@ -20,14 +20,31 @@
 
 package org.openecomp.sdc.versioning.dao.impl;
 
+import org.openecomp.core.zusammen.api.ZusammenAdaptorFactory;
 import org.openecomp.sdc.versioning.dao.VersionableEntityDao;
 import org.openecomp.sdc.versioning.dao.VersionableEntityDaoFactory;
+import org.openecomp.sdc.versioning.types.VersionableEntityStoreType;
 
 public class VersionableEntityDaoFactoryImpl extends VersionableEntityDaoFactory {
-  private static VersionableEntityDao INSTANCE = new VersionableEntityDaoCassandraImpl();
+  private static VersionableEntityDao CASSANDRA_INSTANCE = new VersionableEntityDaoCassandraImpl();
+  private static VersionableEntityDao ZUSAMMEN_INSTANCE =
+      new VersionableEntityDaoZusammenImpl(ZusammenAdaptorFactory.getInstance().createInterface());
 
   @Override
   public VersionableEntityDao createInterface() {
-    return INSTANCE;
+    throw new UnsupportedOperationException
+        ("Please use createInterface api with VersionableEntityStoreType argument.");
+  }
+
+  @Override
+  public VersionableEntityDao createInterface(VersionableEntityStoreType storeType) {
+    switch (storeType) {
+      case Cassandra:
+        return CASSANDRA_INSTANCE;
+      case Zusammen:
+        return ZUSAMMEN_INSTANCE;
+      default:
+        throw new IllegalArgumentException("Unssported state store");
+    }
   }
 }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoZusammenImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoZusammenImpl.java
new file mode 100644
index 0000000..9e12d0d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/dao/impl/VersionableEntityDaoZusammenImpl.java
@@ -0,0 +1,55 @@
+package org.openecomp.sdc.versioning.dao.impl;
+
+import com.amdocs.zusammen.datatypes.Id;
+import com.amdocs.zusammen.datatypes.SessionContext;
+import com.amdocs.zusammen.datatypes.item.ItemVersion;
+import com.amdocs.zusammen.datatypes.itemversion.Tag;
+import org.openecomp.core.zusammen.api.ZusammenAdaptor;
+import org.openecomp.core.zusammen.api.ZusammenUtil;
+import org.openecomp.sdc.versioning.dao.VersionableEntityDao;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
+
+import java.util.Optional;
+
+public class VersionableEntityDaoZusammenImpl implements VersionableEntityDao {
+
+  private ZusammenAdaptor zusammenAdaptor;
+
+  public VersionableEntityDaoZusammenImpl(ZusammenAdaptor zusammenAdaptor) {
+    this.zusammenAdaptor = zusammenAdaptor;
+  }
+
+  @Override
+  public void initVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
+                          Version baseVersion, Version newVersion) {
+    // redundant in zusammen impl.
+  }
+
+  @Override
+  public void deleteVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
+                            Version versionToDelete, Version backToVersion) {
+    SessionContext context = ZusammenUtil.createSessionContext();
+    Id itemId = new Id(entityId);
+    Id versionId = getItemVersionId(itemId, context);
+    zusammenAdaptor.resetVersionHistory(context, itemId, versionId, backToVersion.toString());
+  }
+
+  @Override
+  public void closeVersion(VersionableEntityMetadata versionableTableMetadata, String entityId,
+                           Version versionToClose) {
+    SessionContext context = ZusammenUtil.createSessionContext();
+    Id itemId = new Id(entityId);
+    Id versionId = getItemVersionId(itemId, context);
+    zusammenAdaptor
+        .tagVersion(context, itemId, versionId, new Tag(versionToClose.toString(), null));
+  }
+
+  // TODO: 3/19/2017 move to a common util
+  private Id getItemVersionId(Id itemId, SessionContext context) {
+    Optional<ItemVersion> itemVersionOptional = zusammenAdaptor.getFirstVersion(context, itemId);
+    ItemVersion itemVersion = itemVersionOptional.orElseThrow(() ->
+        new RuntimeException(String.format("No version was found for item %s.", itemId)));
+    return itemVersion.getId();
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerFactoryImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerFactoryImpl.java
index f7065cf..8ab5c60 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerFactoryImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerFactoryImpl.java
@@ -22,9 +22,14 @@
 
 import org.openecomp.sdc.versioning.VersioningManager;
 import org.openecomp.sdc.versioning.VersioningManagerFactory;
+import org.openecomp.sdc.versioning.dao.VersionInfoDaoFactory;
+import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDaoFactory;
 
 public class VersioningManagerFactoryImpl extends VersioningManagerFactory {
-  private static final VersioningManager INSTANCE = new VersioningManagerImpl();
+  private static final VersioningManager INSTANCE = new VersioningManagerImpl(
+      VersionInfoDaoFactory.getInstance().createInterface(),
+      VersionInfoDeletedDaoFactory.getInstance().createInterface()
+  );
 
   @Override
   public VersioningManager createInterface() {
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerImpl.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerImpl.java
index 6aa2a9f..0bbe3f8 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersioningManagerImpl.java
@@ -21,12 +21,16 @@
 package org.openecomp.sdc.versioning.impl;
 
 import org.openecomp.sdc.common.errors.CoreException;
+import org.openecomp.sdc.datatypes.error.ErrorLevel;
+import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
+import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage;
+import org.openecomp.sdc.logging.types.LoggerConstants;
+import org.openecomp.sdc.logging.types.LoggerErrorCode;
+import org.openecomp.sdc.logging.types.LoggerErrorDescription;
+import org.openecomp.sdc.logging.types.LoggerTragetServiceName;
 import org.openecomp.sdc.versioning.VersioningManager;
 import org.openecomp.sdc.versioning.dao.VersionInfoDao;
-import org.openecomp.sdc.versioning.dao.VersionInfoDaoFactory;
 import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDao;
-import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDaoFactory;
-import org.openecomp.sdc.versioning.dao.VersionableEntityDao;
 import org.openecomp.sdc.versioning.dao.VersionableEntityDaoFactory;
 import org.openecomp.sdc.versioning.dao.types.UserCandidateVersion;
 import org.openecomp.sdc.versioning.dao.types.Version;
@@ -51,6 +55,7 @@
 import org.openecomp.sdc.versioning.types.VersionInfo;
 import org.openecomp.sdc.versioning.types.VersionableEntityAction;
 import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
+import org.slf4j.MDC;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -63,15 +68,18 @@
 public class VersioningManagerImpl implements VersioningManager {
 
   private static final Version INITIAL_ACTIVE_VERSION = new Version(0, 0);
-  private static VersionInfoDao versionInfoDao =
-      VersionInfoDaoFactory.getInstance().createInterface();
-  private static VersionInfoDeletedDao versionInfoDeletedDao =
-      VersionInfoDeletedDaoFactory.getInstance().createInterface();
-  private static VersionableEntityDao versionableEntityDao =
-      VersionableEntityDaoFactory.getInstance().createInterface();
-
+  private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
   private static Map<String, Set<VersionableEntityMetadata>> versionableEntities = new HashMap<>();
 
+  private VersionInfoDao versionInfoDao;
+  private VersionInfoDeletedDao versionInfoDeletedDao;
+
+  public VersioningManagerImpl(VersionInfoDao versionInfoDao,
+                               VersionInfoDeletedDao versionInfoDeletedDao) {
+    this.versionInfoDao = versionInfoDao;
+    this.versionInfoDeletedDao = versionInfoDeletedDao;
+  }
+
   private static VersionInfo getVersionInfo(VersionInfoEntity versionInfoEntity, String user,
                                             VersionableEntityAction action) {
     return getVersionInfo(versionInfoEntity.getEntityId(),
@@ -103,6 +111,10 @@
                                             Version latestFinalVersion,
                                             Set<Version> viewableVersions,
                                             VersionableEntityAction action, String user) {
+
+
+    mdcDataDebugMessage.debugEntryMessage("entity Id", entityId);
+
     Version activeVersion;
 
     if (action == VersionableEntityAction.Write) {
@@ -110,11 +122,17 @@
         if (user.equals(candidate.getUser())) {
           activeVersion = candidate.getVersion();
         } else {
+          MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+              LoggerTragetServiceName.GET_VERSION_INFO, ErrorLevel.ERROR.name(),
+              LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't get entity version info");
           throw new CoreException(
               new EditOnEntityLockedByOtherErrorBuilder(entityType, entityId, candidate.getUser())
                   .build());
         }
       } else {
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.GET_VERSION_INFO, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't get entity version info");
         throw new CoreException(new EditOnUnlockedEntityErrorBuilder(entityType, entityId).build());
       }
     } else {
@@ -126,17 +144,23 @@
     }
 
     VersionInfo versionInfo = new VersionInfo();
+    versionInfo.setStatus(status);
+    activeVersion.setStatus(status);
+    if(latestFinalVersion!= null) latestFinalVersion.setStatus(status);
+    if(viewableVersions != null) viewableVersions.forEach(version->version.setStatus(status));
     versionInfo.setActiveVersion(activeVersion);
     versionInfo.setLatestFinalVersion(latestFinalVersion);
     versionInfo.setViewableVersions(toSortedList(viewableVersions));
     versionInfo.setFinalVersions(getFinalVersions(viewableVersions));
-    versionInfo.setStatus(status);
     if (candidate != null) {
+      candidate.getVersion().setStatus(status);
       versionInfo.setLockingUser(candidate.getUser());
       if (user.equals(candidate.getUser())) {
         versionInfo.getViewableVersions().add(candidate.getVersion());
       }
     }
+
+    mdcDataDebugMessage.debugExitMessage("entity Id", entityId);
     return versionInfo;
   }
 
@@ -150,24 +174,24 @@
   }
 
   private static List<Version> getFinalVersions(Set<Version> versions) {
-    return versions.stream().filter(version -> version.isFinal()).collect(Collectors.toList());
+    return versions.stream().filter(Version::isFinal).collect(Collectors.toList());
   }
 
   @Override
   public void register(String entityType, VersionableEntityMetadata entityMetadata) {
-    Set<VersionableEntityMetadata> entitiesMetadata = versionableEntities.get(entityType);
-    if (entitiesMetadata == null) {
-      entitiesMetadata = new HashSet<>();
-      versionableEntities.put(entityType, entitiesMetadata);
-    }
+    Set<VersionableEntityMetadata> entitiesMetadata =
+        versionableEntities.computeIfAbsent(entityType, k -> new HashSet<>());
     entitiesMetadata.add(entityMetadata);
   }
 
   @Override
   public Version create(String entityType, String entityId, String user) {
-    VersionInfoEntity versionInfoEntity =
-        versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
+    VersionInfoEntity
+        versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity != null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.CREATE_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't create versionable entity");
       throw new CoreException(new EntityAlreadyExistErrorBuilder(entityType, entityId).build());
     }
 
@@ -180,16 +204,63 @@
   }
 
   @Override
-  public Version checkout(String entityType, String entityId, String user) {
+  public void delete(String entityType, String entityId, String user) {
     VersionInfoEntity versionInfoEntity =
         versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.DELETE_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't delete versionable entity");
+      throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
+    }
+
+    switch (versionInfoEntity.getStatus()) {
+      case Locked:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.DELETE_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't delete versionable entity");
+        throw new CoreException(new DeleteOnLockedEntityErrorBuilder(entityType, entityId,
+            versionInfoEntity.getCandidate().getUser()).build());
+      default:
+        //do nothing
+        break;
+    }
+
+    doDelete(versionInfoEntity);
+  }
+
+  @Override
+  public void undoDelete(String entityType, String entityId, String user) {
+    VersionInfoDeletedEntity versionInfoDeletedEntity =
+        versionInfoDeletedDao.get(new VersionInfoDeletedEntity(entityType, entityId));
+    if (versionInfoDeletedEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.UNDO_DELETE_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't undo delete for versionable entity");
+      throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
+    }
+
+    doUndoDelete(versionInfoDeletedEntity);
+  }
+
+  @Override
+  public Version checkout(String entityType, String entityId, String user) {
+    VersionInfoEntity versionInfoEntity =
+        versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
+    MDC.put(LoggerConstants.TARGET_SERVICE_NAME, LoggerTragetServiceName.CHECKOUT_ENTITY);
+    if (versionInfoEntity == null) {
+      MDC.put(LoggerConstants.ERROR_CATEGORY, ErrorLevel.ERROR.name());
+      MDC.put(LoggerConstants.TARGET_ENTITY, LoggerConstants.TARGET_ENTITY_DB);
+      MDC.put(LoggerConstants.ERROR_DESCRIPTION, LoggerErrorDescription.CHECKOUT_ENTITY);
       throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
     }
 
     Version checkoutVersion = null;
     switch (versionInfoEntity.getStatus()) {
       case Locked:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.CHECKOUT_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't checkout versionable entity");
         throw new CoreException(new CheckoutOnLockedEntityErrorBuilder(entityType, entityId,
             versionInfoEntity.getCandidate().getUser()).build());
       case Final:
@@ -197,7 +268,10 @@
         checkoutVersion = doCheckout(versionInfoEntity, user);
         break;
       default:
+        //do nothing
+        break;
     }
+
     return checkoutVersion;
   }
 
@@ -206,6 +280,9 @@
     VersionInfoEntity versionInfoEntity =
         versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.UNDO_CHECKOUT_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't undo checkout for versionable entity");
       throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
     }
 
@@ -213,6 +290,10 @@
     switch (versionInfoEntity.getStatus()) {
       case Locked:
         if (!user.equals(versionInfoEntity.getCandidate().getUser())) {
+          MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+              LoggerTragetServiceName.UNDO_CHECKOUT_ENTITY, ErrorLevel.ERROR.name(),
+              LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
+              "Can't undo checkout for versionable entity");
           throw new CoreException(
               new UndoCheckoutOnEntityLockedByOtherErrorBuilder(entityType, entityId,
                   versionInfoEntity.getCandidate().getUser()).build());
@@ -221,16 +302,23 @@
         break;
       case Final:
       case Available:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.UNDO_CHECKOUT_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(),
+            "Can't undo checkout for versionable entity");
         throw new CoreException(
             new UndoCheckoutOnUnlockedEntityErrorBuilder(entityType, entityId).build());
       default:
+        //do nothing
+        break;
     }
+
     return activeVersion;
   }
 
   private Version undoCheckout(VersionInfoEntity versionInfoEntity) {
     deleteVersionFromEntity(versionInfoEntity.getEntityType(), versionInfoEntity.getEntityId(),
-        versionInfoEntity.getCandidate().getVersion());
+        versionInfoEntity.getCandidate().getVersion(), versionInfoEntity.getActiveVersion());
 
     versionInfoEntity.setStatus(versionInfoEntity.getActiveVersion().isFinal() ? VersionStatus.Final
         : VersionStatus.Available);
@@ -245,6 +333,9 @@
     VersionInfoEntity versionInfoEntity =
         versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.CHECKIN_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't checkin versionable entity");
       throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
     }
 
@@ -252,17 +343,26 @@
     switch (versionInfoEntity.getStatus()) {
       case Available:
       case Final:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.CHECKIN_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't checkin versionable entity");
         throw new CoreException(
             new CheckinOnUnlockedEntityErrorBuilder(entityType, entityId).build());
       case Locked:
         if (!user.equals(versionInfoEntity.getCandidate().getUser())) {
+          MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+              LoggerTragetServiceName.CHECKIN_ENTITY, ErrorLevel.ERROR.name(),
+              LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't checkin versionable entity");
           throw new CoreException(new CheckinOnEntityLockedByOtherErrorBuilder(entityType, entityId,
               versionInfoEntity.getCandidate().getUser()).build());
         }
         checkedInVersion = doCheckin(versionInfoEntity, checkinDescription);
         break;
       default:
+        //do nothing
+        break;
     }
+
     return checkedInVersion;
   }
 
@@ -271,22 +371,34 @@
     VersionInfoEntity versionInfoEntity =
         versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.SUBMIT_ENTITY, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't submit versionable entity");
       throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
     }
 
     Version submitVersion = null;
     switch (versionInfoEntity.getStatus()) {
       case Final:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.SUBMIT_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't submit versionable entity");
         throw new CoreException(
             new EntityAlreadyFinalizedErrorBuilder(entityType, entityId).build());
       case Locked:
+        MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+            LoggerTragetServiceName.SUBMIT_ENTITY, ErrorLevel.ERROR.name(),
+            LoggerErrorCode.PERMISSION_ERROR.getErrorCode(), "Can't submit versionable entity");
         throw new CoreException(new SubmitLockedEntityNotAllowedErrorBuilder(entityType, entityId,
             versionInfoEntity.getCandidate().getUser()).build());
       case Available:
         submitVersion = doSubmit(versionInfoEntity, user, submitDescription);
         break;
       default:
+        //do nothing
+        break;
     }
+
     return submitVersion;
   }
 
@@ -296,6 +408,9 @@
     VersionInfoEntity versionInfoEntity =
         versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
     if (versionInfoEntity == null) {
+      MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB,
+          LoggerTragetServiceName.GET_VERSION_INFO, ErrorLevel.ERROR.name(),
+          LoggerErrorCode.DATA_ERROR.getErrorCode(), "Can't get entity version info");
       throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
     }
     return getVersionInfo(versionInfoEntity, user, action);
@@ -329,35 +444,6 @@
     return activeVersions;
   }
 
-  @Override
-  public void delete(String entityType, String entityId, String user) {
-    VersionInfoEntity versionInfoEntity =
-        versionInfoDao.get(new VersionInfoEntity(entityType, entityId));
-    if (versionInfoEntity == null) {
-      throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
-    }
-
-    switch (versionInfoEntity.getStatus()) {
-      case Locked:
-        throw new CoreException(new DeleteOnLockedEntityErrorBuilder(entityType, entityId,
-            versionInfoEntity.getCandidate().getUser()).build());
-      default:
-    }
-
-    doDelete(versionInfoEntity, user);
-  }
-
-  @Override
-  public void undoDelete(String entityType, String entityId, String user) {
-    VersionInfoDeletedEntity versionInfoDeletedEntity =
-        versionInfoDeletedDao.get(new VersionInfoDeletedEntity(entityType, entityId));
-    if (versionInfoDeletedEntity == null) {
-      throw new CoreException(new EntityNotExistErrorBuilder(entityType, entityId).build());
-    }
-
-    doUndoDelete(versionInfoDeletedEntity, user);
-  }
-
   private void markAsCheckedOut(VersionInfoEntity versionInfoEntity, String checkingOutUser) {
     versionInfoEntity.setStatus(VersionStatus.Locked);
     versionInfoEntity.setCandidate(new UserCandidateVersion(checkingOutUser,
@@ -374,8 +460,7 @@
     return versionInfoEntity.getCandidate().getVersion();
   }
 
-  private void doDelete(VersionInfoEntity versionInfoEntity, String user) {
-
+  private void doDelete(VersionInfoEntity versionInfoEntity) {
     VersionInfoDeletedEntity versionInfoDeletedEntity = new VersionInfoDeletedEntity();
     versionInfoDeletedEntity.setStatus(versionInfoEntity.getStatus());
     versionInfoDeletedEntity.setViewableVersions(versionInfoEntity.getViewableVersions());
@@ -386,11 +471,9 @@
     versionInfoDeletedEntity.setLatestFinalVersion(versionInfoEntity.getLatestFinalVersion());
     versionInfoDeletedDao.create(versionInfoDeletedEntity);
     versionInfoDao.delete(versionInfoEntity);
-
   }
 
-  private void doUndoDelete(VersionInfoDeletedEntity versionInfoDeletedEntity, String user) {
-
+  private void doUndoDelete(VersionInfoDeletedEntity versionInfoDeletedEntity) {
     VersionInfoEntity versionInfoEntity = new VersionInfoEntity();
     versionInfoEntity.setStatus(versionInfoDeletedEntity.getStatus());
     versionInfoEntity.setViewableVersions(versionInfoDeletedEntity.getViewableVersions());
@@ -401,7 +484,6 @@
     versionInfoEntity.setLatestFinalVersion(versionInfoDeletedEntity.getLatestFinalVersion());
     versionInfoDao.create(versionInfoEntity);
     versionInfoDeletedDao.delete(versionInfoDeletedEntity);
-
   }
 
   private Version doCheckin(VersionInfoEntity versionInfoEntity, String checkinDescription) {
@@ -412,6 +494,9 @@
     versionInfoEntity.setStatus(VersionStatus.Available);
     versionInfoDao.update(versionInfoEntity);
 
+    closeVersionOnEntity(versionInfoEntity.getEntityType(), versionInfoEntity.getEntityId(),
+        versionInfoEntity.getActiveVersion());
+
     return versionInfoEntity.getActiveVersion();
   }
 
@@ -420,6 +505,8 @@
     Version finalVersion = versionInfoEntity.getActiveVersion().calculateNextFinal();
     initVersionOnEntity(versionInfoEntity.getEntityType(), versionInfoEntity.getEntityId(),
         versionInfoEntity.getActiveVersion(), finalVersion);
+    closeVersionOnEntity(versionInfoEntity.getEntityType(), versionInfoEntity.getEntityId(),
+        finalVersion);
 
     Set<Version> viewableVersions = new HashSet<>();
     for (Version version : versionInfoEntity.getViewableVersions()) {
@@ -444,6 +531,7 @@
     versionHistory.setUser(user);
     versionHistory.setDescription(description);
     versionHistory.setType(type);
+    //versionHistoryDao.create(versionHistory);
   }
 
   private void initVersionOnEntity(String entityType, String entityId, Version baseVersion,
@@ -451,17 +539,29 @@
     Set<VersionableEntityMetadata> entityMetadatas = versionableEntities.get(entityType);
     if (entityMetadatas != null) {
       for (VersionableEntityMetadata entityMetadata : entityMetadatas) {
-        versionableEntityDao.initVersion(entityMetadata, entityId, baseVersion, newVersion);
+        VersionableEntityDaoFactory.getInstance().createInterface(entityMetadata.getStoreType())
+            .initVersion(entityMetadata, entityId, baseVersion, newVersion);
       }
     }
   }
 
   private void deleteVersionFromEntity(String entityType, String entityId,
-                                       Version versionToDelete) {
+                                       Version versionToDelete, Version backToVersion) {
     Set<VersionableEntityMetadata> entityMetadatas = versionableEntities.get(entityType);
     if (entityMetadatas != null) {
       for (VersionableEntityMetadata entityMetadata : entityMetadatas) {
-        versionableEntityDao.deleteVersion(entityMetadata, entityId, versionToDelete);
+        VersionableEntityDaoFactory.getInstance().createInterface(entityMetadata.getStoreType())
+            .deleteVersion(entityMetadata, entityId, versionToDelete, backToVersion);
+      }
+    }
+  }
+
+  private void closeVersionOnEntity(String entityType, String entityId, Version versionToClose) {
+    Set<VersionableEntityMetadata> entityMetadatas = versionableEntities.get(entityType);
+    if (entityMetadatas != null) {
+      for (VersionableEntityMetadata entityMetadata : entityMetadatas) {
+        VersionableEntityDaoFactory.getInstance().createInterface(entityMetadata.getStoreType())
+            .closeVersion(entityMetadata, entityId, versionToClose);
       }
     }
   }
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/VersioningManagerTest.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/VersioningManagerTest.java
deleted file mode 100644
index 3695f9e..0000000
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/VersioningManagerTest.java
+++ /dev/null
@@ -1,364 +0,0 @@
-package org.openecomp.sdc.versioning;
-
-
-import org.openecomp.sdc.common.errors.CoreException;
-import org.openecomp.sdc.versioning.dao.VersionInfoDao;
-import org.openecomp.sdc.versioning.dao.VersionInfoDaoFactory;
-import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDao;
-import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDaoFactory;
-import org.openecomp.sdc.versioning.dao.types.Version;
-import org.openecomp.sdc.versioning.dao.types.VersionInfoDeletedEntity;
-import org.openecomp.sdc.versioning.dao.types.VersionInfoEntity;
-import org.openecomp.sdc.versioning.dao.types.VersionStatus;
-import org.openecomp.sdc.versioning.types.VersionInfo;
-import org.openecomp.sdc.versioning.types.VersionableEntityAction;
-import org.openecomp.sdc.versioning.types.VersionableEntityMetadata;
-import org.openecomp.core.nosqldb.api.NoSqlDb;
-import org.openecomp.core.nosqldb.factory.NoSqlDbFactory;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.mapping.UDTMapper;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class VersioningManagerTest {
-  private static final VersioningManager versioningManager =
-      VersioningManagerFactory.getInstance().createInterface();
-  private static final VersionInfoDao versionInfoDao =
-      VersionInfoDaoFactory.getInstance().createInterface();
-  private static final VersionInfoDeletedDao versionInfoDeletedDao =
-      VersionInfoDeletedDaoFactory.getInstance().createInterface();
-  private static final NoSqlDb noSqlDb = NoSqlDbFactory.getInstance().createInterface();
-  private static final String USR1 = "usr1";
-  private static final String USR2 = "usr2";
-  private static final String USR3 = "usr3";
-  private static final String TYPE1 = "Type1";
-  private static final String TYPE2 = "Type2";
-  private static final String ID1 = "Id1";
-  private static final String ID2 = "Id2";
-  private static final String ID3 = "Id3";
-  private static final String TYPE1_TABLE_NAME = "vendor_license_model";
-  private static final String TYPE1_ID_NAME = "vlm_id";
-  private static final String TYPE1_VERSION_NAME = "version";
-  private static final String TYPE2_TABLE_NAME = "feature_group";
-  private static final String TYPE2_ID_NAME = "vlm_id";
-  private static final String TYPE2_VERSION_NAME = "version";
-  private static final Version VERSION01 = new Version(0, 1);
-  private static final Version VERSION02 = new Version(0, 2);
-  private static final Version VERSION10 = new Version(1, 0);
-  private static final Version VERSION11 = new Version(1, 1);
-  private static UDTMapper<Version> versionMapper =
-      noSqlDb.getMappingManager().udtMapper(Version.class);
-  private static Set<Version> expectedViewableVersionsType1Id1 = new HashSet<>();
-
-  private static void assretVersionInfoEntity(VersionInfoEntity actual, String entityType,
-                                              String entityId, Version activeVersion,
-                                              Version candidateVersion, String candidateUser,
-                                              VersionStatus status, Set<Version> viewbleVersions,
-                                              Version latestFinalVersion) {
-    Assert.assertNotNull(actual);
-    Assert.assertEquals(actual.getEntityType(), entityType);
-    Assert.assertEquals(actual.getEntityId(), entityId);
-    Assert.assertEquals(actual.getActiveVersion(), activeVersion);
-    if (candidateVersion != null && candidateUser != null) {
-      Assert.assertEquals(actual.getCandidate().getVersion(), candidateVersion);
-      Assert.assertEquals(actual.getCandidate().getUser(), candidateUser);
-    } else {
-      Assert.assertNull(actual.getCandidate());
-    }
-    Assert.assertEquals(actual.getStatus(), status);
-    Assert.assertEquals(actual.getViewableVersions().size(), viewbleVersions.size());
-    Assert.assertEquals(actual.getViewableVersions(), viewbleVersions);
-    Assert.assertEquals(actual.getLatestFinalVersion(), latestFinalVersion);
-  }
-
-  private static void assretVersionInfo(VersionInfo actual, Version activeVersion,
-                                        VersionStatus status, String lockingUser,
-                                        Set<Version> viewableVersions, Version latestFinalVersion) {
-    Assert.assertNotNull(actual);
-    Assert.assertEquals(actual.getActiveVersion(), activeVersion);
-    Assert.assertEquals(actual.getStatus(), status);
-    Assert.assertEquals(actual.getLockingUser(), lockingUser);
-    Assert.assertEquals(actual.getViewableVersions().size(), viewableVersions.size());
-    Assert.assertEquals(actual.getViewableVersions(), viewableVersions);
-    Assert.assertEquals(actual.getLatestFinalVersion(), latestFinalVersion);
-  }
-
-//  @BeforeClass
-  private void init() {
-    versionInfoDao.delete(new VersionInfoEntity(TYPE1, ID1));
-    versionInfoDao.delete(new VersionInfoEntity(TYPE1, ID2));
-    versionInfoDao.delete(new VersionInfoEntity(TYPE2, ID3));
-    String deleteFromType1 = String
-        .format("delete from %s where %s=? and %s=?", TYPE1_TABLE_NAME, TYPE1_ID_NAME,
-            TYPE1_VERSION_NAME);
-    noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION01));
-    noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION02));
-    noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION11));
-
-    versioningManager.register(TYPE1,
-        new VersionableEntityMetadata(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME));
-    versioningManager.register(TYPE2,
-        new VersionableEntityMetadata(TYPE2_TABLE_NAME, TYPE2_ID_NAME, TYPE2_VERSION_NAME));
-  }
-
-//  @Test
-  public void createTest() {
-    Version version = versioningManager.create(TYPE1, ID1, USR1);
-    createVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
-        version);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, new Version(0, 0), VERSION01, USR1,
-        VersionStatus.Locked, expectedViewableVersionsType1Id1, null);
-  }
-
-//  @Test(dependsOnMethods = "createTest")
-  public void checkinTest() {
-    Version version = versioningManager.checkin(TYPE1, ID1, USR1, "checkin 0.1");
-    Assert.assertEquals(version, VERSION01);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    expectedViewableVersionsType1Id1.add(VERSION01);
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, null, null,
-        VersionStatus.Available, expectedViewableVersionsType1Id1, null);
-  }
-
-//  @Test(dependsOnMethods = "checkinTest")
-  public void getVersionInfoForReadOnAvailableTest() {
-    VersionInfo versionInfo =
-        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR2, VersionableEntityAction.Read);
-    assretVersionInfo(versionInfo, VERSION01, VersionStatus.Available, null,
-        expectedViewableVersionsType1Id1, null);
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForReadOnAvailableTest",
-//      expectedExceptions = CoreException.class)
-  public void getVersionInfoForWriteOnAvailableTest() {
-    versioningManager.getEntityVersionInfo(TYPE1, ID1, USR2, VersionableEntityAction.Write);
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForWriteOnAvailableTest",
-//      expectedExceptions = CoreException.class)
-  public void checkinOnAvailableTest() {
-    versioningManager.checkin(TYPE1, ID1, USR1, "fail checkin");
-  }
-
-//  @Test(dependsOnMethods = "checkinOnAvailableTest", expectedExceptions = CoreException.class)
-  public void undoCheckoutOnAvailableTest() {
-    versioningManager.undoCheckout(TYPE1, ID1, USR1);
-  }
-
-//  @Test(dependsOnMethods = "undoCheckoutOnAvailableTest")
-  public void checkoutTest() {
-    Version version = versioningManager.checkout(TYPE1, ID1, USR2);
-    Assert.assertEquals(version, VERSION02);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, VERSION02, USR2,
-        VersionStatus.Locked, expectedViewableVersionsType1Id1, null);
-
-    ResultSet results =
-        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
-            VERSION02);
-    Assert.assertTrue(results.iterator().hasNext());
-  }
-
-//  @Test(dependsOnMethods = "checkoutTest")
-  public void getVersionInfoForReadOnLockedSameUserTest() {
-    VersionInfo versionInfo =
-        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR2, VersionableEntityAction.Read);
-    Set<Version> expectedViewableVersions = new HashSet<>();
-    expectedViewableVersions.addAll(expectedViewableVersionsType1Id1);
-    expectedViewableVersions.add(VERSION02);
-    assretVersionInfo(versionInfo, VERSION02, VersionStatus.Locked, USR2, expectedViewableVersions,
-        null);
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForReadOnLockedSameUserTest")
-  public void getVersionInfoForReadOnLockedOtherUserTest() {
-    VersionInfo entityVersionInfo =
-        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Read);
-    Assert.assertEquals(entityVersionInfo.getActiveVersion(), VERSION01);
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForReadOnLockedOtherUserTest",
-//      expectedExceptions = CoreException.class)
-  public void getVersionInfoForWriteOnLockedOtherUserTest() {
-    versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Write)
-        .getActiveVersion();
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForWriteOnLockedOtherUserTest")
-  public void getVersionInfoForWriteOnLockedSameUserTest() {
-    Version activeVersion =
-        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR2, VersionableEntityAction.Write)
-            .getActiveVersion();
-    Assert.assertEquals(activeVersion, VERSION02);
-  }
-
-//  @Test(dependsOnMethods = "getVersionInfoForWriteOnLockedSameUserTest",
-//      expectedExceptions = CoreException.class)
-  public void checkoutOnLockedSameUserTest() {
-    versioningManager.checkout(TYPE1, ID1, USR2);
-  }
-
-//  @Test(dependsOnMethods = "checkoutOnLockedSameUserTest", expectedExceptions = CoreException.class)
-  public void checkoutOnLockedOtherUserTest() {
-    versioningManager.checkout(TYPE1, ID1, USR1);
-  }
-
-//  @Test(dependsOnMethods = "checkoutOnLockedSameUserTest", expectedExceptions = CoreException.class)
-  public void undoCheckoutOnLockedOtherUserTest() {
-    versioningManager.undoCheckout(TYPE1, ID1, USR1);
-  }
-
-//  @Test(dependsOnMethods = "undoCheckoutOnLockedOtherUserTest",
-//      expectedExceptions = CoreException.class)
-  public void submitOnLockedTest() {
-    versioningManager.submit(TYPE1, ID1, USR2, "failed submit");
-  }
-
-//  @Test(dependsOnMethods = "submitOnLockedTest")
-  public void undoCheckoutTest() {
-    Version version = versioningManager.undoCheckout(TYPE1, ID1, USR2);
-    Assert.assertEquals(version, VERSION01);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, null, null,
-        VersionStatus.Available, expectedViewableVersionsType1Id1, null);
-
-    ResultSet results =
-        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
-            VERSION02);
-    Assert.assertFalse(results.iterator().hasNext());
-  }
-
-//  @Test(dependsOnMethods = "undoCheckoutTest")
-  public void submitTest() {
-    Version version = versioningManager.submit(TYPE1, ID1, USR3, "submit msg");
-    Assert.assertEquals(version, VERSION10);
-    expectedViewableVersionsType1Id1 = new HashSet<>();
-    expectedViewableVersionsType1Id1.add(version);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION10, null, null,
-        VersionStatus.Final, expectedViewableVersionsType1Id1, VERSION10);
-
-    ResultSet results =
-        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
-            VERSION10);
-    Assert.assertTrue(results.iterator().hasNext());
-  }
-
-//  @Test(dependsOnMethods = "submitTest", expectedExceptions = CoreException.class)
-  public void checkinOnFinalizedTest() {
-    versioningManager.checkin(TYPE1, ID1, USR2, "failed checkin");
-  }
-
-//  @Test(dependsOnMethods = "checkinOnFinalizedTest", expectedExceptions = CoreException.class)
-  public void undoCheckouOnFinalizedTest() {
-    versioningManager.undoCheckout(TYPE1, ID1, USR2);
-  }
-
-//  @Test(dependsOnMethods = "undoCheckouOnFinalizedTest", expectedExceptions = CoreException.class)
-  public void submitOnFinalizedTest() {
-    versioningManager.submit(TYPE1, ID1, USR2, "failed submit");
-  }
-
-//  @Test(dependsOnMethods = "submitOnFinalizedTest")
-  public void checkoutOnFinalizedTest() {
-    Version version = versioningManager.checkout(TYPE1, ID1, USR3);
-    Assert.assertEquals(version, VERSION11);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION10, VERSION11, USR3,
-        VersionStatus.Locked, expectedViewableVersionsType1Id1, VERSION10);
-
-    ResultSet results =
-        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
-            VERSION11);
-    Assert.assertTrue(results.iterator().hasNext());
-  }
-
-//  @Test(dependsOnMethods = "checkoutOnFinalizedTest")
-  public void viewableVersionsTest() {
-    versioningManager.checkin(TYPE1, ID1, USR3, "check in 1.1");
-    versioningManager.checkout(TYPE1, ID1, USR3);
-    versioningManager.checkin(TYPE1, ID1, USR3, "check in 1.2");
-    versioningManager.submit(TYPE1, ID1, USR3, "submit in 2.0");
-    versioningManager.checkout(TYPE1, ID1, USR3);
-    versioningManager.checkin(TYPE1, ID1, USR3, "check in 2.1");
-    versioningManager.submit(TYPE1, ID1, USR3, "submit in 3.0");
-    versioningManager.checkout(TYPE1, ID1, USR3);
-    versioningManager.checkin(TYPE1, ID1, USR3, "check in 3.1");
-    versioningManager.checkout(TYPE1, ID1, USR3);
-    versioningManager.checkin(TYPE1, ID1, USR3, "check in 3.2");
-    versioningManager.checkout(TYPE1, ID1, USR2);
-
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    HashSet<Version> expectedViewableVersions = new HashSet<>();
-    expectedViewableVersions.add(VERSION10);
-    expectedViewableVersions.add(new Version(2, 0));
-    expectedViewableVersions.add(new Version(3, 0));
-    expectedViewableVersions.add(new Version(3, 1));
-    expectedViewableVersions.add(new Version(3, 2));
-    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, new Version(3, 2), new Version(3, 3),
-        USR2, VersionStatus.Locked, expectedViewableVersions, new Version(3, 0));
-  }
-
-//  @Test(dependsOnMethods = "viewableVersionsTest")
-  public void listActiveVersionsTest() {
-    versioningManager.create(TYPE1, ID2, USR3);
-    versioningManager.checkin(TYPE1, ID2, USR3, "check in 0.1");
-
-    versioningManager.create(TYPE2, ID3, USR3);
-    versioningManager.checkin(TYPE2, ID3, USR3, "check in 0.1");
-
-    Map<String, VersionInfo> idToVersionInfo =
-        versioningManager.listEntitiesVersionInfo(TYPE1, USR2, VersionableEntityAction.Read);
-    Assert.assertEquals(idToVersionInfo.size(), 2);
-    Assert.assertEquals(idToVersionInfo.get(ID1).getActiveVersion(), new Version(3, 3));
-    Assert.assertEquals(idToVersionInfo.get(ID2).getActiveVersion(), VERSION01);
-  }
-
-//  @Test(dependsOnMethods = "listActiveVersionsTest")
-  public void deleteTest() {
-    versioningManager.checkin(TYPE1, ID1, USR2, "check in for delete");
-    versioningManager.delete(TYPE1, ID1, USR1);
-
-    VersionInfoDeletedEntity versionInfoDeletedEntity =
-        versionInfoDeletedDao.get(new VersionInfoDeletedEntity(TYPE1, ID1));
-    Assert.assertNotNull(versionInfoDeletedEntity);
-
-    Map<String, VersionInfo> entitiesInfoMap =
-        versioningManager.listDeletedEntitiesVersionInfo(TYPE1, USR2, null);
-    Assert.assertEquals(entitiesInfoMap.size(), 1);
-    VersionInfoEntity versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    Assert.assertNull(versionInfoEntity);
-    versioningManager.undoDelete(TYPE1, ID1, USR1);
-    versionInfoEntity = versionInfoDao.get(new VersionInfoEntity(TYPE1, ID1));
-    Assert.assertNotNull(versionInfoEntity);
-
-
-  }
-
-  private void createVersionableEntityRecord(String tableName, String idName, String versionName,
-                                             String id, Version version) {
-    noSqlDb.execute(
-        String.format("insert into %s (%s,%s) values (?,?)", tableName, idName, versionName), id,
-        versionMapper.toUDT(version));
-  }
-
-  private ResultSet loadVersionableEntityRecord(String tableName, String idName, String versionName,
-                                                String id, Version version) {
-    return noSqlDb.execute(
-        String.format("select * from %s where %s=? and %s=?", tableName, idName, versionName), id,
-        versionMapper.toUDT(version));
-  }
-}
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/impl/VersioningManagerImplTest.java b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/impl/VersioningManagerImplTest.java
new file mode 100644
index 0000000..d4bccc6
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/java/org/openecomp/sdc/versioning/impl/VersioningManagerImplTest.java
@@ -0,0 +1,558 @@
+/*-
+ * ============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.versioning.impl;
+
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.common.errors.CoreException;
+import org.openecomp.sdc.versioning.dao.VersionInfoDao;
+import org.openecomp.sdc.versioning.dao.VersionInfoDeletedDao;
+import org.openecomp.sdc.versioning.dao.VersionableEntityDao;
+import org.openecomp.sdc.versioning.dao.types.UserCandidateVersion;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdc.versioning.dao.types.VersionInfoDeletedEntity;
+import org.openecomp.sdc.versioning.dao.types.VersionInfoEntity;
+import org.openecomp.sdc.versioning.dao.types.VersionStatus;
+import org.openecomp.sdc.versioning.types.VersionInfo;
+import org.openecomp.sdc.versioning.types.VersionableEntityAction;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+public class VersioningManagerImplTest {
+  private static final String USR1 = "usr1";
+  private static final String USR2 = "usr2";
+  private static final String TYPE1 = "Type1";
+/*  private static final String TYPE2 = "Type2";*/
+  private static final String ID1 = "Id1";
+/*  private static final String ID2 = "Id2";
+  private static final String ID3 = "Id3";
+  private static final String TYPE1_TABLE_NAME = "vendor_license_model";
+  private static final String TYPE1_ID_NAME = "vlm_id";
+  private static final String TYPE1_VERSION_NAME = "version";
+  private static final String TYPE2_TABLE_NAME = "feature_group";
+  private static final String TYPE2_ID_NAME = "vlm_id";
+  private static final String TYPE2_VERSION_NAME = "version";*/
+  private static final Version VERSION0 = new Version(0, 0);
+  private static final Version VERSION01 = new Version(0, 1);
+  private static final Version VERSION02 = new Version(0, 2);
+  private static final Version VERSION10 = new Version(1, 0);
+  private static final Version VERSION11 = new Version(1, 1);
+
+  /*  private static final NoSqlDb noSqlDb = NoSqlDbFactory.getInstance().createInterface();
+
+    private static UDTMapper<Version> versionMapper =
+        noSqlDb.getMappingManager().udtMapper(Version.class);*/
+  @Mock
+  private VersionInfoDao versionInfoDaoMock;
+  @Mock
+  private VersionInfoDeletedDao versionInfoDeletedDaoMock;
+  @InjectMocks
+  private VersioningManagerImpl versioningManager;
+
+  @Captor
+  private ArgumentCaptor<VersionInfoEntity> versionInfoEntityArg;
+
+  @BeforeMethod
+  public void setUp() throws Exception {
+    MockitoAnnotations.initMocks(this);
+  }
+
+  /*  @BeforeClass
+    private void init() {
+      versionInfoDaoMock.delete(new VersionInfoEntity(TYPE1, ID1));
+      versionInfoDaoMock.delete(new VersionInfoEntity(TYPE1, ID2));
+      versionInfoDaoMock.delete(new VersionInfoEntity(TYPE2, ID3));
+      String deleteFromType1 = String
+          .format("delete from %s where %s=? and %s=?", TYPE1_TABLE_NAME, TYPE1_ID_NAME,
+              TYPE1_VERSION_NAME);
+      noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION01));
+      noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION02));
+      noSqlDb.execute(deleteFromType1, ID1, versionMapper.toUDT(VERSION11));
+
+      versioningManager.register(TYPE1,
+          new VersionableEntityMetadata(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME));
+      versioningManager.register(TYPE2,
+          new VersionableEntityMetadata(TYPE2_TABLE_NAME, TYPE2_ID_NAME, TYPE2_VERSION_NAME));
+    }*/
+
+/*  @Test
+  public void testRegister() throws Exception {
+    VersionableEntityMetadata entityMetadata =
+        new VersionableEntityMetadata(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME);
+    versioningManager.register(TYPE1, entityMetadata);
+
+    Map<String, Set<VersionableEntityMetadata>> versionableEntities =
+        versionableEntitiesCapture.capture();
+    Set<VersionableEntityMetadata> type1Entities = versionableEntities.get(TYPE1);
+    Assert.assertNotNull(type1Entities);
+    Assert.assertTrue(type1Entities.contains(entityMetadata));
+  }*/
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCreateAlreadyExisting() {
+    doReturn(new VersionInfoEntity()).when(versionInfoDaoMock).get(anyObject());
+    versioningManager.create(TYPE1, ID1, USR1);
+  }
+
+  @Test
+  public void testCreate() {
+    Version version = versioningManager.create(TYPE1, ID1, USR1);
+    Assert.assertEquals(version, VERSION01);
+
+/*    createVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
+        version);*/
+    verify(versionInfoDaoMock).create(versionInfoEntityArg.capture());
+    VersionInfoEntity versionInfoEntity = versionInfoEntityArg.getValue();
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, new Version(0, 0), VERSION01, USR1,
+        VersionStatus.Locked, new HashSet<>(), null);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testDeleteNonExisting() {
+    versioningManager.delete(TYPE1, ID1, USR1);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testDeleteLocked() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR1, VERSION01), Collections.emptySet(), null);
+    versioningManager.delete(TYPE1, ID1, USR1);
+  }
+
+  @Test
+  public void testDelete() {
+    VersionInfoEntity versionInfoEntity = new VersionInfoEntity();
+    versionInfoEntity.setStatus(VersionStatus.Available);
+    doReturn(versionInfoEntity).when(versionInfoDaoMock).get(anyObject());
+
+    versioningManager.delete(TYPE1, ID1, USR1);
+
+    verify(versionInfoDaoMock).delete(versionInfoEntity);
+    ArgumentCaptor<VersionInfoDeletedEntity> versionInfoDeletedEntityArg =
+        ArgumentCaptor.forClass(VersionInfoDeletedEntity.class);
+    verify(versionInfoDeletedDaoMock).create(versionInfoDeletedEntityArg.capture());
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testUndoDeleteNonExisting() {
+    versioningManager.undoDelete(TYPE1, ID1, USR1);
+  }
+
+  @Test
+  public void testUndoDelete() {
+    VersionInfoDeletedEntity versionInfoDeletedEntity = new VersionInfoDeletedEntity();
+    versionInfoDeletedEntity.setStatus(VersionStatus.Available);
+    doReturn(versionInfoDeletedEntity).when(versionInfoDeletedDaoMock).get(anyObject());
+
+    versioningManager.undoDelete(TYPE1, ID1, USR1);
+
+    verify(versionInfoDeletedDaoMock).delete(versionInfoDeletedEntity);
+    verify(versionInfoDaoMock).create(versionInfoEntityArg.capture());
+/*
+    VersionInfoDeletedEntity versionInfoDeletedEntity =
+        versionInfoDeletedDaoMock.get(new VersionInfoDeletedEntity(TYPE1, ID1));
+    Assert.assertNotNull(versionInfoDeletedEntity);
+
+    Map<String, VersionInfo> entitiesInfoMap =
+        versioningManager.listDeletedEntitiesVersionInfo(TYPE1, USR2, null);
+    Assert.assertEquals(entitiesInfoMap.size(), 1);
+    VersionInfoEntity versionInfoEntity = versionInfoDaoMock.get(new VersionInfoEntity(TYPE1, ID1));
+    Assert.assertNull(versionInfoEntity);
+    versioningManager.undoDelete(TYPE1, ID1, USR1);
+    versionInfoEntity = versionInfoDaoMock.get(new VersionInfoEntity(TYPE1, ID1));
+    Assert.assertNotNull(versionInfoEntity);*/
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckoutNonExisting() {
+    versioningManager.checkout(TYPE1, ID1, USR2);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckoutOnLockedSameUser() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR1, VERSION01), Collections.emptySet(), null);
+    versioningManager.checkout(TYPE1, ID1, USR1);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckoutOnLockedOtherUser() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR2, VERSION01), Collections.emptySet(), null);
+    versioningManager.checkout(TYPE1, ID1, USR1);
+  }
+
+  @Test
+  public void testCheckoutOnFinalized() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION10);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Final, VERSION10, null, viewableVersions,
+        VERSION10);
+
+    Version version = versioningManager.checkout(TYPE1, ID1, USR1);
+    Assert.assertEquals(version, VERSION11);
+
+    VersionInfoEntity versionInfoEntity = versionInfoDaoMock.get(new VersionInfoEntity(TYPE1, ID1));
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION10, VERSION11, USR1,
+        VersionStatus.Locked, viewableVersions, VERSION10);
+/*
+    ResultSet results =
+        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
+            VERSION11);
+    Assert.assertTrue(results.iterator().hasNext());*/
+  }
+
+  @Test
+  public void testCheckout() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, VERSION01, null, viewableVersions,
+        null);
+
+    Version version = versioningManager.checkout(TYPE1, ID1, USR1);
+    Assert.assertEquals(version, VERSION02);
+
+    verify(versionInfoDaoMock).update(versionInfoEntityArg.capture());
+    VersionInfoEntity versionInfoEntity = versionInfoEntityArg.getValue();
+
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, VERSION02, USR1,
+        VersionStatus.Locked, viewableVersions, null);
+
+/*    ResultSet results =
+        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
+            VERSION02);
+    Assert.assertTrue(results.iterator().hasNext());*/
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testUndoCheckoutNonExisting() {
+    versioningManager.undoCheckout(TYPE1, ID1, USR1);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testUndoCheckoutOnAvailable() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, VERSION01, null, viewableVersions,
+        null);
+
+    versioningManager.undoCheckout(TYPE1, ID1, USR1);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testUndoCheckouOnFinalized() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION10);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Final, VERSION10, null, viewableVersions,
+        VERSION10);
+    versioningManager.undoCheckout(TYPE1, ID1, USR2);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testUndoCheckoutOnLockedOtherUser() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR2, VERSION01), Collections.emptySet(), null);
+
+    versioningManager.undoCheckout(TYPE1, ID1, USR1);
+  }
+
+  @Test
+  public void testUndoCheckout() {
+    HashSet<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION01,
+        new UserCandidateVersion(USR1, VERSION02), viewableVersions, null);
+
+    Version version = versioningManager.undoCheckout(TYPE1, ID1, USR1);
+    Assert.assertEquals(version, VERSION01);
+
+    VersionInfoEntity versionInfoEntity = versionInfoDaoMock.get(new VersionInfoEntity(TYPE1, ID1));
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, null, null,
+        VersionStatus.Available, viewableVersions, null);
+
+/*    ResultSet results =
+        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
+            VERSION02);
+    Assert.assertFalse(results.iterator().hasNext());*/
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckinNonExisting() {
+    versioningManager.checkin(TYPE1, ID1, USR1, "");
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckinOnAvailable() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, VERSION01, null, viewableVersions,
+        null);
+
+    versioningManager.checkin(TYPE1, ID1, USR1, "fail checkin");
+  }
+
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckinOnFinalized() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION10);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Final, VERSION10, null, viewableVersions,
+        VERSION10);
+
+    versioningManager.checkin(TYPE1, ID1, USR1, "failed checkin");
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testCheckinOnLockedOtherUser() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR2, VERSION01), Collections.emptySet(), null);
+
+    versioningManager.checkin(TYPE1, ID1, USR1, "");
+  }
+
+  @Test
+  public void testCheckin() {
+    HashSet<Version> viewableVersions = new HashSet<>();
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR1, VERSION01), viewableVersions, null);
+
+    Version version = versioningManager.checkin(TYPE1, ID1, USR1, "checkin 0.1");
+    Assert.assertEquals(version, VERSION01);
+
+    verify(versionInfoDaoMock).update(versionInfoEntityArg.capture());
+    VersionInfoEntity versionInfoEntity = versionInfoEntityArg.getValue();
+
+    viewableVersions.add(VERSION01);
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, VERSION01, null, null,
+        VersionStatus.Available, viewableVersions, null);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testSubmitNonExisting() {
+    versioningManager.submit(TYPE1, ID1, USR2, "failed submit");
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testSubmitOnLocked() {
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION0,
+        new UserCandidateVersion(USR1, VERSION01), Collections.emptySet(), null);
+    versioningManager.submit(TYPE1, ID1, USR2, "failed submit");
+  }
+
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testSubmitOnFinalized() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION10);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Final, VERSION10, null, viewableVersions,
+        VERSION10);
+    versioningManager.submit(TYPE1, ID1, USR2, "failed submit");
+  }
+
+  @Test
+  public void testSubmit() {
+    Version version32 = new Version(3, 2);
+    Version version40 = new Version(4, 0);
+
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION10);
+    viewableVersions.add(new Version(2, 0));
+    viewableVersions.add(new Version(3, 0));
+    viewableVersions.add(new Version(3, 1));
+    viewableVersions.add(version32);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, version32, null, viewableVersions,
+        new Version(3, 0));
+
+    Version version = versioningManager.submit(TYPE1, ID1, USR1, "submit msg");
+    Assert.assertEquals(version, version40);
+    viewableVersions.remove(new Version(3, 1));
+    viewableVersions.remove(version32);
+    viewableVersions.add(version40);
+
+    verify(versionInfoDaoMock).update(versionInfoEntityArg.capture());
+    VersionInfoEntity versionInfoEntity = versionInfoEntityArg.getValue();
+
+    assretVersionInfoEntity(versionInfoEntity, TYPE1, ID1, version40, null, null,
+        VersionStatus.Final, viewableVersions, version40);
+
+/*    ResultSet results =
+        loadVersionableEntityRecord(TYPE1_TABLE_NAME, TYPE1_ID_NAME, TYPE1_VERSION_NAME, ID1,
+            VERSION10);
+    Assert.assertTrue(results.iterator().hasNext());*/
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testGetVersionInfoOnNonExistingEntity() {
+    versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Read);
+  }
+
+  @Test
+  public void testGetVersionInfoForReadOnAvailable() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, VERSION01, null, viewableVersions,
+        null);
+
+    VersionInfo versionInfo =
+        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Read);
+    assertVersionInfo(versionInfo, VERSION01, VersionStatus.Available, null,
+        viewableVersions, null);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testGetVersionInfoForWriteOnAvailable() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Available, VERSION01, null, viewableVersions,
+        null);
+
+    versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Write);
+  }
+
+  @Test
+  public void testGetVersionInfoForReadOnLockedSameUser() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION01,
+        new UserCandidateVersion(USR1, VERSION02), viewableVersions, null);
+
+    VersionInfo versionInfo =
+        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Read);
+    viewableVersions.add(VERSION02);
+    assertVersionInfo(versionInfo, VERSION02, VersionStatus.Locked, USR1, viewableVersions, null);
+  }
+
+  @Test
+  public void testGetVersionInfoForReadOnLockedOtherUser() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION01,
+        new UserCandidateVersion(USR2, VERSION02), viewableVersions, null);
+
+    VersionInfo versionInfo =
+        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Read);
+    Assert.assertEquals(versionInfo.getActiveVersion(), VERSION01);
+    assertVersionInfo(versionInfo, VERSION01, VersionStatus.Locked, USR2, viewableVersions, null);
+  }
+
+  @Test(expectedExceptions = CoreException.class)
+  public void testGetVersionInfoForWriteOnLockedOtherUser() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION01,
+        new UserCandidateVersion(USR2, VERSION02), viewableVersions, null);
+
+    versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Write);
+  }
+
+  @Test
+  public void testGetVersionInfoForWriteOnLockedSameUser() {
+    Set<Version> viewableVersions = new HashSet<>();
+    viewableVersions.add(VERSION01);
+    mockVersionInfoEntity(TYPE1, ID1, VersionStatus.Locked, VERSION01,
+        new UserCandidateVersion(USR1, VERSION02), viewableVersions, null);
+
+    VersionInfo versionInfo =
+        versioningManager.getEntityVersionInfo(TYPE1, ID1, USR1, VersionableEntityAction.Write);
+    viewableVersions.add(VERSION02);
+    assertVersionInfo(versionInfo, VERSION02, VersionStatus.Locked, USR1, viewableVersions, null);
+  }
+
+/*  private void createVersionableEntityRecord(String tableName, String idName, String versionName,
+                                             String id, Version version) {
+    noSqlDb.execute(
+        String.format("insert into %s (%s,%s) values (?,?)", tableName, idName, versionName), id,
+        versionMapper.toUDT(version));
+  }
+
+  private ResultSet loadVersionableEntityRecord(String tableName, String idName, String versionName,
+                                                String id, Version version) {
+    return noSqlDb.execute(
+        String.format("select * from %s where %s=? and %s=?", tableName, idName, versionName), id,
+        versionMapper.toUDT(version));
+  }*/
+
+
+  private static void assretVersionInfoEntity(VersionInfoEntity actual, String entityType,
+                                              String entityId, Version activeVersion,
+                                              Version candidateVersion, String candidateUser,
+                                              VersionStatus status, Set<Version> viewbleVersions,
+                                              Version latestFinalVersion) {
+    Assert.assertNotNull(actual);
+    Assert.assertEquals(actual.getEntityType(), entityType);
+    Assert.assertEquals(actual.getEntityId(), entityId);
+    Assert.assertEquals(actual.getActiveVersion(), activeVersion);
+    if (candidateVersion != null && candidateUser != null) {
+      Assert.assertEquals(actual.getCandidate().getVersion(), candidateVersion);
+      Assert.assertEquals(actual.getCandidate().getUser(), candidateUser);
+    } else {
+      Assert.assertNull(actual.getCandidate());
+    }
+    Assert.assertEquals(actual.getStatus(), status);
+    Assert.assertEquals(actual.getViewableVersions().size(), viewbleVersions.size());
+    Assert.assertEquals(actual.getViewableVersions(), viewbleVersions);
+    Assert.assertEquals(actual.getLatestFinalVersion(), latestFinalVersion);
+  }
+
+  private static void assertVersionInfo(VersionInfo actual, Version activeVersion,
+                                        VersionStatus status, String lockingUser,
+                                        Set<Version> viewableVersions, Version latestFinalVersion) {
+    Assert.assertNotNull(actual);
+    Assert.assertEquals(actual.getActiveVersion(), activeVersion);
+    Assert.assertEquals(actual.getStatus(), status);
+    Assert.assertEquals(actual.getLockingUser(), lockingUser);
+    Assert.assertEquals(actual.getViewableVersions().size(), viewableVersions.size());
+    Assert.assertEquals(actual.getViewableVersions(), viewableVersions);
+    Assert.assertEquals(actual.getLatestFinalVersion(), latestFinalVersion);
+  }
+
+  private VersionInfoEntity mockVersionInfoEntity(String entityType, String entityId,
+                                                  VersionStatus status, Version activeVersion,
+                                                  UserCandidateVersion candidate,
+                                                  Set<Version> viewableVersions,
+                                                  Version latestFinalVersion) {
+    VersionInfoEntity mock = new VersionInfoEntity();
+    mock.setEntityType(entityType);
+    mock.setEntityId(entityId);
+    mock.setStatus(status);
+    mock.setActiveVersion(activeVersion);
+    mock.setCandidate(candidate);
+    mock.setViewableVersions(viewableVersions);
+    mock.setLatestFinalVersion(latestFinalVersion);
+
+    doReturn(mock).when(versionInfoDaoMock).get(anyObject());
+    return mock;
+  }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/resources/logback.xml b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/resources/logback.xml
new file mode 100644
index 0000000..c1932e3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/test/resources/logback.xml
@@ -0,0 +1,15 @@
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="warn">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+</configuration>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml b/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml
index 94b2729..32c8207 100644
--- a/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml
@@ -1,17 +1,19 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          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-versioning-lib</name>
+    <artifactId>openecomp-sdc-versioning-lib</artifactId>
+    <packaging>pom</packaging>
+
     <parent>
         <artifactId>openecomp-sdc-lib</artifactId>
         <groupId>org.openecomp.sdc</groupId>
         <version>1.1.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
     </parent>
 
-    <artifactId>openecomp-sdc-versioning-lib</artifactId>
-    <packaging>pom</packaging>
-    <name>openecomp-sdc-versioning-lib</name>
-
     <modules>
         <module>openecomp-sdc-versioning-api</module>
         <module>openecomp-sdc-versioning-core</module>
@@ -20,4 +22,4 @@
     <dependencies>
 
     </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml.versionsBackup b/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml.versionsBackup
new file mode 100644
index 0000000..7804ebf
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-versioning-lib/pom.xml.versionsBackup
@@ -0,0 +1,24 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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-versioning-lib</name>
+    <artifactId>openecomp-sdc-versioning-lib</artifactId>
+
+    <packaging>pom</packaging>
+    <parent>
+        <artifactId>openecomp-sdc-lib</artifactId>
+        <groupId>org.openecomp.sdc</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <modules>
+        <module>openecomp-sdc-versioning-api</module>
+        <module>openecomp-sdc-versioning-core</module>
+    </modules>
+
+    <dependencies>
+
+    </dependencies>
+</project>
\ No newline at end of file