diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-bpmn-flows/pom.xml b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-bpmn-flows/pom.xml
index 734d4e0..e608465 100644
--- a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-bpmn-flows/pom.xml
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-bpmn-flows/pom.xml
@@ -8,4 +8,11 @@
   </parent>
   <artifactId>so-etsi-nfvo-ns-lcm-bpmn-flows</artifactId>
   <name>SO ETSI NFVO NS LCM BPMN Flows</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.onap.so.etsi.nfvo</groupId>
+      <artifactId>so-etsi-nfvo-ns-lcm-database-service</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/pom.xml b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/pom.xml
index 8e1fba4..b860dde 100644
--- a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/pom.xml
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/pom.xml
@@ -8,4 +8,18 @@
   </parent>
   <artifactId>so-etsi-nfvo-ns-lcm-database-service</artifactId>
   <name>SO ETSI NFVO NS LCM Database Service</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mariadb.jdbc</groupId>
+      <artifactId>mariadb-java-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.flywaydb</groupId>
+      <artifactId>flyway-core</artifactId>
+    </dependency>
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobAction.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobAction.java
new file mode 100644
index 0000000..50573b4
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobAction.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ */
+public enum JobAction {
+    CREATE, INSTANTIATE, TERMINATE, DELETE;
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobStatusEnum.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobStatusEnum.java
new file mode 100644
index 0000000..c67a3cc
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/JobStatusEnum.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public enum JobStatusEnum {
+    STARTING, STARTED, IN_PROGRESS, ERROR, FINISHED, FINISHED_WITH_ERROR;
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJob.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJob.java
new file mode 100644
index 0000000..9453caa
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJob.java
@@ -0,0 +1,274 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils.toIndentedString;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils;
+
+
+@Entity
+@Table(name = "JOB")
+public class NfvoJob {
+
+    @Id
+    @Column(name = "JOB_ID")
+    private String jobId;
+
+    @Column(name = "JOB_TYPE")
+    private String jobType;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "JOB_ACTION")
+    private JobAction jobAction;
+
+    @Column(name = "RESOURCE_ID")
+    private String resourceId;
+
+    @Column(name = "RESOURCE_NAME")
+    private String resourceName;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "STATUS")
+    private JobStatusEnum status;
+
+    @Column(name = "START_TIME")
+    private LocalDateTime startTime;
+
+    @Column(name = "END_TIME")
+    private LocalDateTime endTime;
+
+    @Column(name = "PROGRESS")
+    private int progress;
+
+    @Column(name = "PROCESS_INSTANCE_ID")
+    private String processInstanceId;
+
+    @OneToMany(mappedBy = "nfvoJob", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+    private List<NfvoJobStatus> nfvoJobStatuses = new ArrayList<>();
+
+    public NfvoJob() {
+        this.jobId = UUID.randomUUID().toString();
+    }
+
+    public void setJobId(final String jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getJobId() {
+        return jobId;
+    }
+
+    public NfvoJob jobId(final String jobId) {
+        this.jobId = jobId;
+        return this;
+    }
+
+    public String getJobType() {
+        return jobType;
+    }
+
+    public void setJobType(final String jobType) {
+        this.jobType = jobType;
+    }
+
+    public NfvoJob jobType(final String jobType) {
+        this.jobType = jobType;
+        return this;
+    }
+
+    public JobAction getJobAction() {
+        return jobAction;
+    }
+
+    public void setJobAction(final JobAction jobAction) {
+        this.jobAction = jobAction;
+    }
+
+    public NfvoJob jobAction(final JobAction jobAction) {
+        this.jobAction = jobAction;
+        return this;
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(final String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public NfvoJob resourceId(final String resourceId) {
+        this.resourceId = resourceId;
+        return this;
+    }
+
+    public JobStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(final JobStatusEnum status) {
+        this.status = status;
+    }
+
+    public NfvoJob status(final JobStatusEnum status) {
+        this.status = status;
+        return this;
+    }
+
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(final LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public NfvoJob startTime(final LocalDateTime startTime) {
+        this.startTime = startTime;
+        return this;
+    }
+
+    public LocalDateTime getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(final LocalDateTime endTime) {
+        this.endTime = endTime;
+    }
+
+    public NfvoJob endTime(final LocalDateTime endTime) {
+        this.endTime = endTime;
+        return this;
+    }
+
+    public int getProgress() {
+        return progress;
+    }
+
+    public void setProgress(final int progress) {
+        this.progress = progress;
+    }
+
+    public NfvoJob progress(final int progress) {
+        this.progress = progress;
+        return this;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(final String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public NfvoJob processInstanceId(final String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+        return this;
+    }
+
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    public void setResourceName(final String resourceName) {
+        this.resourceName = resourceName;
+    }
+
+    public NfvoJob resourceName(final String resourceName) {
+        this.resourceName = resourceName;
+        return this;
+    }
+
+    public List<NfvoJobStatus> getNfvoJobStatuses() {
+        return nfvoJobStatuses;
+    }
+
+    public void setJobStatuses(final List<NfvoJobStatus> nfvoJobStatuses) {
+        this.nfvoJobStatuses = nfvoJobStatuses;
+    }
+
+    public NfvoJob nfvoJobStatuses(final List<NfvoJobStatus> nfvoJobStatuses) {
+        this.nfvoJobStatuses = nfvoJobStatuses;
+        return this;
+    }
+
+    public NfvoJob nfvoJobStatus(final NfvoJobStatus nfvoJobStatus) {
+        nfvoJobStatus.setNfvoJob(this);
+        this.nfvoJobStatuses.add(nfvoJobStatus);
+        return this;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(jobId, processInstanceId, jobType, jobAction, startTime, endTime, status, progress,
+                resourceId, resourceName, nfvoJobStatuses);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj instanceof NfvoJob) {
+            final NfvoJob other = (NfvoJob) obj;
+            return Objects.equals(jobId, other.jobId) && Objects.equals(processInstanceId, other.processInstanceId)
+                    && Objects.equals(jobType, other.jobType) && Objects.equals(jobAction, other.jobAction)
+                    && Objects.equals(progress, other.progress) && Objects.equals(status, other.status)
+                    && Objects.equals(startTime, other.startTime) && Objects.equals(endTime, other.endTime)
+                    && Objects.equals(status, other.status) && Objects.equals(resourceId, other.resourceId)
+                    && Objects.equals(resourceName, other.resourceName)
+                    && Utils.isEquals(nfvoJobStatuses, other.nfvoJobStatuses);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("class NfvoJob {\n");
+        sb.append("    jobId: ").append(toIndentedString(jobId)).append("\n");
+        sb.append("    processInstanceId: ").append(toIndentedString(processInstanceId)).append("\n");
+        sb.append("    jobType: ").append(toIndentedString(jobType)).append("\n");
+        sb.append("    jobAction: ").append(toIndentedString(jobAction)).append("\n");
+        sb.append("    progress: ").append(toIndentedString(progress)).append("\n");
+        sb.append("    status: ").append(toIndentedString(status)).append("\n");
+        sb.append("    startTime: ").append(toIndentedString(startTime)).append("\n");
+        sb.append("    endTime: ").append(toIndentedString(endTime)).append("\n");
+        sb.append("    resId: ").append(toIndentedString(resourceId)).append("\n");
+        sb.append("    resName: ").append(toIndentedString(resourceName)).append("\n");
+        sb.append("    nfvoJobStatuses: ").append(toIndentedString(nfvoJobStatuses)).append("\n");
+
+        sb.append("}");
+        return sb.toString();
+    }
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJobStatus.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJobStatus.java
new file mode 100644
index 0000000..9bd0592
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoJobStatus.java
@@ -0,0 +1,147 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils.toIndentedString;
+import java.time.LocalDateTime;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "JOB_STATUS")
+public class NfvoJobStatus {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ID")
+    private int id;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "STATUS")
+    private JobStatusEnum status;
+
+    @Column(name = "DESCRIPTION")
+    private String description;
+
+    @Column(name = "UPDATED_TIME")
+    private LocalDateTime updatedTime;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "JOB_ID")
+    private NfvoJob nfvoJob;
+
+    public int getId() {
+        return id;
+    }
+
+    public JobStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(final JobStatusEnum status) {
+        this.status = status;
+    }
+
+    public NfvoJobStatus status(final JobStatusEnum status) {
+        this.status = status;
+        return this;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(final String description) {
+        this.description = description;
+    }
+
+    public NfvoJobStatus description(final String description) {
+        this.description = description;
+        return this;
+    }
+
+    public LocalDateTime getUpdatedTime() {
+        return updatedTime;
+    }
+
+    public void setUpdatedTime(final LocalDateTime updatedTime) {
+        this.updatedTime = updatedTime;
+    }
+
+    public NfvoJobStatus updatedTime(final LocalDateTime addTime) {
+        this.updatedTime = addTime;
+        return this;
+    }
+
+    public NfvoJob getNfvoJob() {
+        return nfvoJob;
+    }
+
+    public void setNfvoJob(final NfvoJob nfvoJob) {
+        this.nfvoJob = nfvoJob;
+    }
+
+    public NfvoJobStatus nfvoJob(final NfvoJob nfvoJob) {
+        this.nfvoJob = nfvoJob;
+        return this;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, status, updatedTime, description, nfvoJob.getJobId());
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+
+        if (obj instanceof NfvoJobStatus) {
+            final NfvoJobStatus other = (NfvoJobStatus) obj;
+            return Objects.equals(id, other.id) && Objects.equals(status, other.status)
+                    && Objects.equals(updatedTime, other.updatedTime) && Objects.equals(description, other.description)
+                    && Objects.equals(nfvoJob.getJobId(), other.nfvoJob.getJobId());
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("class NfvoJobStatus {\n");
+        sb.append("    Id: ").append(toIndentedString(id)).append("\n");
+        sb.append("    status: ").append(toIndentedString(status)).append("\n");
+        sb.append("    descp: ").append(toIndentedString(description)).append("\n");
+        sb.append("    updatedTime: ").append(toIndentedString(updatedTime)).append("\n");
+        sb.append("    jobId: ").append(nfvoJob != null ? toIndentedString(nfvoJob.getJobId()) : "").append("\n");
+        sb.append("}");
+        return sb.toString();
+    }
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNfInst.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNfInst.java
new file mode 100644
index 0000000..e901e10
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNfInst.java
@@ -0,0 +1,213 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils.toIndentedString;
+import java.time.LocalDateTime;
+import java.util.Objects;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * @author mukeshsharma (mukeshsharma@est.tech)
+ */
+@Entity
+@Table(name = "NF_INST")
+public class NfvoNfInst {
+
+    @Id
+    @Column(name = "NF_INST_ID")
+    private String nfInstId;
+
+    @Column(name = "NAME")
+    private String name;
+
+    @Column(name = "VNFD_ID")
+    private String vnfdId;
+
+    @Column(name = "PACKAGE_ID")
+    private String packageId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "NS_INST_ID")
+    private NfvoNsInst nsInst;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "STATUS")
+    private State status;
+
+    @Column(name = "CREATE_TIME")
+    private LocalDateTime createTime;
+
+    @Column(name = "LAST_UPDATE_TIME")
+    private LocalDateTime lastUpdateTime;
+
+    public NfvoNfInst() {
+        this.nfInstId = UUID.randomUUID().toString();
+    }
+
+    public String getNfInstId() {
+        return nfInstId;
+    }
+
+    public void setNfInstId(final String nfInstId) {
+        this.nfInstId = nfInstId;
+    }
+
+    public NfvoNfInst nfInstId(final String nfInstId) {
+        this.nfInstId = nfInstId;
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public NfvoNfInst name(final String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getVnfdId() {
+        return vnfdId;
+    }
+
+    public void setVnfdId(final String vnfdId) {
+        this.vnfdId = vnfdId;
+    }
+
+    public NfvoNfInst vnfdId(final String vnfdId) {
+        this.vnfdId = vnfdId;
+        return this;
+    }
+
+    public String getPackageId() {
+        return packageId;
+    }
+
+    public void setPackageId(final String packageId) {
+        this.packageId = packageId;
+    }
+
+    public NfvoNfInst packageId(final String packageId) {
+        this.packageId = packageId;
+        return this;
+    }
+
+    public NfvoNsInst getNsInst() {
+        return nsInst;
+    }
+
+    public void setNsInst(final NfvoNsInst nsInst) {
+        this.nsInst = nsInst;
+    }
+
+    public NfvoNfInst nfvoNsInst(final NfvoNsInst nfvoNsInst) {
+        this.nsInst = nfvoNsInst;
+        return this;
+    }
+
+    public State getStatus() {
+        return status;
+    }
+
+    public void setStatus(final State status) {
+        this.status = status;
+    }
+
+    public NfvoNfInst status(final State status) {
+        this.status = status;
+        return this;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(final LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public NfvoNfInst createTime(final LocalDateTime createTime) {
+        this.createTime = createTime;
+        return this;
+    }
+
+    public LocalDateTime getLastUpdateTime() {
+        return lastUpdateTime;
+    }
+
+    public void setLastUpdateTime(final LocalDateTime lastUpdateTime) {
+        this.lastUpdateTime = lastUpdateTime;
+    }
+
+    public NfvoNfInst lastUpdateTime(final LocalDateTime lastUpdateTime) {
+        this.lastUpdateTime = lastUpdateTime;
+        return this;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        if (this == object)
+            return true;
+        if (object == null || getClass() != object.getClass())
+            return false;
+        final NfvoNfInst that = (NfvoNfInst) object;
+        return Objects.equals(nfInstId, that.nfInstId) && Objects.equals(name, that.name)
+                && Objects.equals(vnfdId, that.vnfdId) && Objects.equals(packageId, that.packageId)
+                && Objects.equals(nsInst, that.nsInst) && Objects.equals(status, that.status)
+                && Objects.equals(createTime, that.createTime) && Objects.equals(lastUpdateTime, that.lastUpdateTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nfInstId, name, vnfdId, packageId, nsInst, status, createTime, lastUpdateTime);
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("class NfvoNfInst {\n");
+        sb.append("    nfInstId: ").append(toIndentedString(nfInstId)).append("\n");
+        sb.append("    name: ").append(toIndentedString(name)).append("\n");
+        sb.append("    vnfdId: ").append(toIndentedString(vnfdId)).append("\n");
+        sb.append("    packageId: ").append(toIndentedString(packageId)).append("\n");
+        sb.append("    nsInst: ").append(nsInst != null ? toIndentedString(nsInst.getNsInstId()) : null).append("\n");
+        sb.append("    status: ").append(toIndentedString(status)).append("\n");
+        sb.append("    createTime: ").append(toIndentedString(createTime)).append("\n");
+        sb.append("    lastUpdateTime: ").append(toIndentedString(lastUpdateTime)).append("\n");
+
+        sb.append("}");
+        return sb.toString();
+    }
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNsInst.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNsInst.java
new file mode 100644
index 0000000..fdd053c
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NfvoNsInst.java
@@ -0,0 +1,289 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils.toIndentedString;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+@Entity
+@Table(name = "NS_INST")
+public class NfvoNsInst {
+
+    @Id
+    @Column(name = "NS_INST_ID")
+    private String nsInstId;
+
+    @Column(name = "NAME")
+    private String name;
+
+    @Column(name = "NS_PACKAGE_ID")
+    private String nsPackageId;
+
+    @Column(name = "NSD_ID")
+    private String nsdId;
+
+    @Column(name = "NSD_INVARIANT_ID")
+    private String nsdInvariantId;
+
+    @Column(name = "DESCRIPTION")
+    private String description;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "STATUS")
+    private State status;
+
+    @Column(name = "STATUS_UPDATED_TIME")
+    private LocalDateTime statusUpdatedTime;
+
+    @Column(name = "GLOBAL_CUSTOMER_ID")
+    private String globalCustomerId;
+
+    @Column(name = "SERVICE_TYPE")
+    private String serviceType;
+
+    @OneToMany(mappedBy = "nsInst", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    private List<NfvoNfInst> nfvoNfInsts = new ArrayList<>();
+
+    @OneToMany(mappedBy = "nfvoNsInst", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    private List<NsLcmOpOcc> nsLcmOpOccs = new ArrayList<>();
+
+    public NfvoNsInst() {
+        this.nsInstId = UUID.randomUUID().toString();
+    }
+
+    public String getNsInstId() {
+        return nsInstId;
+    }
+
+    public void setNsInstId(final String nsInstId) {
+        this.nsInstId = nsInstId;
+    }
+
+    public NfvoNsInst nsInstId(final String nsInstId) {
+        this.nsInstId = nsInstId;
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+
+    public NfvoNsInst name(final String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getNsPackageId() {
+        return nsPackageId;
+    }
+
+    public void setNsPackageId(final String nsPackageId) {
+        this.nsPackageId = nsPackageId;
+    }
+
+    public NfvoNsInst nsPackageId(final String nsPackageId) {
+        this.nsPackageId = nsPackageId;
+        return this;
+    }
+
+    public String getNsdId() {
+        return nsdId;
+    }
+
+    public void setNsdId(final String nsdId) {
+        this.nsdId = nsdId;
+    }
+
+    public NfvoNsInst nsdId(final String nsdId) {
+        this.nsdId = nsdId;
+        return this;
+    }
+
+    public String getNsdInvariantId() {
+        return nsdInvariantId;
+    }
+
+    public void setNsdInvariantId(final String nsdInvariantId) {
+        this.nsdInvariantId = nsdInvariantId;
+    }
+
+    public NfvoNsInst nsdInvariantId(final String nsdInvariantId) {
+        this.nsdInvariantId = nsdInvariantId;
+        return this;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(final String description) {
+        this.description = description;
+    }
+
+    public NfvoNsInst description(final String description) {
+        this.description = description;
+        return this;
+    }
+
+    public State getStatus() {
+        return status;
+    }
+
+    public void setStatus(final State status) {
+        this.status = status;
+    }
+
+    public NfvoNsInst status(final State status) {
+        this.status = status;
+        return this;
+    }
+
+    public LocalDateTime getStatusUpdatedTime() {
+        return statusUpdatedTime;
+    }
+
+    public void setStatusUpdatedTime(final LocalDateTime statusUpdatedTime) {
+        this.statusUpdatedTime = statusUpdatedTime;
+    }
+
+    public NfvoNsInst statusUpdatedTime(final LocalDateTime statusUpdatedTime) {
+        this.statusUpdatedTime = statusUpdatedTime;
+        return this;
+    }
+
+    public String getGlobalCustomerId() {
+        return globalCustomerId;
+    }
+
+    public void setGlobalCustomerId(final String globalCustomerId) {
+        this.globalCustomerId = globalCustomerId;
+    }
+
+    public NfvoNsInst globalCustomerId(final String globalCustomerId) {
+        this.globalCustomerId = globalCustomerId;
+        return this;
+    }
+
+    public String getServiceType() {
+        return serviceType;
+    }
+
+    public void setServiceType(final String serviceType) {
+        this.serviceType = serviceType;
+    }
+
+    public NfvoNsInst serviceType(final String serviceType) {
+        this.serviceType = serviceType;
+        return this;
+    }
+
+    public List<NfvoNfInst> getNfvoNfInsts() {
+        return nfvoNfInsts;
+    }
+
+    public void setNfvoNfInsts(final List<NfvoNfInst> nfvoNfInsts) {
+        this.nfvoNfInsts = nfvoNfInsts;
+    }
+
+    public NfvoNsInst nfvoNfInsts(final NfvoNfInst nfvoNfInsts) {
+        nfvoNfInsts.nfvoNsInst(this);
+        this.nfvoNfInsts.add(nfvoNfInsts);
+        return this;
+    }
+
+    public List<NsLcmOpOcc> getNsLcmOpOccs() {
+        return nsLcmOpOccs;
+    }
+
+    public void setNsLcmOpOccs(final List<NsLcmOpOcc> nsLcmOpOccs) {
+        this.nsLcmOpOccs = nsLcmOpOccs;
+    }
+
+    public NfvoNsInst nsLcmOpOccs(final NsLcmOpOcc nsLcmOpOcc) {
+        nsLcmOpOcc.nfvoNsInst(this);
+        this.nsLcmOpOccs.add(nsLcmOpOcc);
+        return this;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nsInstId, name, nsPackageId, nsdId, nsdInvariantId, description, status, statusUpdatedTime,
+                globalCustomerId, serviceType, nfvoNfInsts, nsLcmOpOccs);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (obj instanceof NfvoNsInst) {
+            final NfvoNsInst other = (NfvoNsInst) obj;
+            return Objects.equals(nsInstId, other.nsInstId) && Objects.equals(name, other.name)
+                    && Objects.equals(nsPackageId, other.nsPackageId) && Objects.equals(nsdId, other.nsdId)
+                    && Objects.equals(nsdInvariantId, other.nsdInvariantId)
+                    && Objects.equals(description, other.description) && Objects.equals(status, other.status)
+                    && Objects.equals(statusUpdatedTime, other.statusUpdatedTime)
+                    && Objects.equals(globalCustomerId, other.globalCustomerId)
+                    && Objects.equals(serviceType, other.serviceType) && Objects.equals(nfvoNfInsts, other.nfvoNfInsts)
+                    && Objects.equals(nsLcmOpOccs, other.nsLcmOpOccs);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("class NfvoNsInst {\n");
+        sb.append("    nsInstId: ").append(toIndentedString(nsInstId)).append("\n");
+        sb.append("    name: ").append(toIndentedString(name)).append("\n");
+        sb.append("    nsPackageId: ").append(toIndentedString(nsPackageId)).append("\n");
+        sb.append("    nsdId: ").append(toIndentedString(nsdId)).append("\n");
+        sb.append("    nsdInvariantId: ").append(toIndentedString(nsdInvariantId)).append("\n");
+        sb.append("    description: ").append(toIndentedString(description)).append("\n");
+        sb.append("    status: ").append(toIndentedString(status)).append("\n");
+        sb.append("    statusUpdatedTime: ").append(toIndentedString(statusUpdatedTime)).append("\n");
+        sb.append("    globalCustomerId: ").append(toIndentedString(globalCustomerId)).append("\n");
+        sb.append("    serviceType: ").append(toIndentedString(serviceType)).append("\n");
+        sb.append("    nfvoNfInsts: ").append(toIndentedString(nfvoNfInsts)).append("\n");
+        sb.append("    nsLcmOpOccs: ").append(toIndentedString(nsLcmOpOccs)).append("\n");
+
+        sb.append("}");
+        return sb.toString();
+    }
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpOcc.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpOcc.java
new file mode 100644
index 0000000..7549b49
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpOcc.java
@@ -0,0 +1,233 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+import static org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils.Utils.toIndentedString;
+import java.time.LocalDateTime;
+import java.util.Objects;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * @author mukeshsharma(mukeshsharma@est.tech)
+ */
+@Entity
+@Table(name = "NS_LCM_OP_OCCS")
+public class NsLcmOpOcc {
+
+    @Id
+    @Column(name = "ID")
+    private String id;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "OPERATION_STATE")
+    private OperationStateEnum operationState;
+
+    @Column(name = "STATE_ENTERED_TIME")
+    private LocalDateTime stateEnteredTime;
+
+    @Column(name = "START_TIME")
+    private LocalDateTime startTime;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "NS_INST_ID")
+    private NfvoNsInst nfvoNsInst;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "OPERATION")
+    private NsLcmOpType operation;
+
+    @Column(name = "IS_AUTO_INNOVATION")
+    private boolean isAutoInnovation;
+
+    @Column(name = "OPERATION_PARAMS")
+    private String operationParams;
+
+    @Column(name = "IS_CANCEL_PENDING")
+    private boolean isCancelPending;
+
+    public NsLcmOpOcc() {
+        this.id = UUID.randomUUID().toString();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(final String id) {
+        this.id = id;
+    }
+
+    public NsLcmOpOcc id(final String id) {
+        this.id = id;
+        return this;
+    }
+
+    public OperationStateEnum getOperationState() {
+        return operationState;
+    }
+
+    public void setOperationState(final OperationStateEnum operationState) {
+        this.operationState = operationState;
+    }
+
+    public NsLcmOpOcc operationState(final OperationStateEnum operationState) {
+        this.operationState = operationState;
+        return this;
+    }
+
+    public LocalDateTime getStateEnteredTime() {
+        return stateEnteredTime;
+    }
+
+    public void setStateEnteredTime(final LocalDateTime stateEnteredTime) {
+        this.stateEnteredTime = stateEnteredTime;
+    }
+
+    public NsLcmOpOcc stateEnteredTime(final LocalDateTime stateEnteredTime) {
+        this.stateEnteredTime = stateEnteredTime;
+        return this;
+    }
+
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(final LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public NsLcmOpOcc startTime(final LocalDateTime startTime) {
+        this.startTime = startTime;
+        return this;
+    }
+
+    public NfvoNsInst getNfvoNsInst() {
+        return nfvoNsInst;
+    }
+
+    public void setNfvoNsInst(final NfvoNsInst nfvoNsInst) {
+        this.nfvoNsInst = nfvoNsInst;
+    }
+
+    public NsLcmOpOcc nfvoNsInst(final NfvoNsInst nfvoNsInst) {
+        this.nfvoNsInst = nfvoNsInst;
+        return this;
+    }
+
+    public NsLcmOpType getOperation() {
+        return operation;
+    }
+
+    public void setOperation(final NsLcmOpType operation) {
+        this.operation = operation;
+    }
+
+    public NsLcmOpOcc operation(final NsLcmOpType operation) {
+        this.operation = operation;
+        return this;
+    }
+
+    public boolean getIsAutoInnovation() {
+        return isAutoInnovation;
+    }
+
+    public void setIsAutoInnovation(final boolean isAutoInnovation) {
+        this.isAutoInnovation = isAutoInnovation;
+    }
+
+    public NsLcmOpOcc isAutoInnovation(final boolean isAutoInnovation) {
+        this.isAutoInnovation = isAutoInnovation;
+        return this;
+    }
+
+    public String getOperationParams() {
+        return operationParams;
+    }
+
+    public void setOperationParams(final String operationParams) {
+        this.operationParams = operationParams;
+    }
+
+    public NsLcmOpOcc operationParams(final String operationParams) {
+        this.operationParams = operationParams;
+        return this;
+    }
+
+    public boolean getIsCancelPending() {
+        return isCancelPending;
+    }
+
+    public void setIsCancelPending(final boolean isCancelPending) {
+        this.isCancelPending = isCancelPending;
+    }
+
+    public NsLcmOpOcc isCancelPending(final boolean isCancelPending) {
+        this.isCancelPending = isCancelPending;
+        return this;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        if (this == object)
+            return true;
+        if (object == null || getClass() != object.getClass())
+            return false;
+        final NsLcmOpOcc that = (NsLcmOpOcc) object;
+        return Objects.equals(id, that.id) && Objects.equals(operationState, that.operationState)
+                && Objects.equals(stateEnteredTime, that.stateEnteredTime) && Objects.equals(startTime, that.startTime)
+                && Objects.equals(nfvoNsInst, that.nfvoNsInst) && Objects.equals(operation, that.operation)
+                && Objects.equals(isAutoInnovation, that.isAutoInnovation)
+                && Objects.equals(operationParams, that.operationParams)
+                && Objects.equals(isCancelPending, that.isCancelPending);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, operationState, stateEnteredTime, startTime, nfvoNsInst, operation, isAutoInnovation,
+                operationParams, isCancelPending);
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("class NfvoNsInst {\n");
+        sb.append("    id: ").append(toIndentedString(id)).append("\n");
+        sb.append("    operationState: ").append(toIndentedString(operationState)).append("\n");
+        sb.append("    stateEnteredTime: ").append(toIndentedString(stateEnteredTime)).append("\n");
+        sb.append("    startTime: ").append(toIndentedString(startTime)).append("\n");
+        sb.append("    nfvoNsInst: ").append(nfvoNsInst != null ? toIndentedString(nfvoNsInst.getNsInstId()) : null)
+                .append("\n");
+        sb.append("    operation: ").append(toIndentedString(operation)).append("\n");
+        sb.append("    isAutoInnovation: ").append(toIndentedString(isAutoInnovation)).append("\n");
+        sb.append("    operationParams: ").append(toIndentedString(operationParams)).append("\n");
+        sb.append("    isCancelPending: ").append(toIndentedString(isCancelPending)).append("\n");
+        sb.append("}");
+        return sb.toString();
+    }
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpType.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpType.java
new file mode 100644
index 0000000..351f961
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/NsLcmOpType.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public enum NsLcmOpType {
+    INSTANTIATE, TERMINATE, SCALE, UPDATE, HEAL;
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/OperationStateEnum.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/OperationStateEnum.java
new file mode 100644
index 0000000..236652e
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/OperationStateEnum.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public enum OperationStateEnum {
+    PROCESSING, COMPLETED, PARTIALLY_COMPLETED, FAILED_TEMP, FAILED, ROLLING_BACK, ROLLED_BACK;
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/State.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/State.java
new file mode 100644
index 0000000..08dbef3
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/State.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public enum State {
+    NOT_INSTANTIATED, INSTANTIATED;
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/utils/Utils.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/utils/Utils.java
new file mode 100644
index 0000000..c55ef57
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/beans/utils/Utils.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.beans.utils;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+public class Utils {
+
+    private Utils() {}
+
+    public static final String toIndentedString(final Object object) {
+        return object == null ? "null" : object.toString().replace("\n", "\n    ");
+    }
+
+
+    public static boolean isEquals(final List<?> first, List<?> second) {
+        if (first == null) {
+            return second == null;
+        }
+        if (first.isEmpty()) {
+            return second.isEmpty();
+        }
+        if (first.size() == second.size()) {
+            for (int index = 0; index < first.size(); index++) {
+                if (!Objects.equals(first.get(index), second.get(index))) {
+                    return false;
+                }
+            }
+            return true;
+
+        }
+        return false;
+    }
+
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/config/NfvoDatabaseConfiguration.java b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/config/NfvoDatabaseConfiguration.java
new file mode 100644
index 0000000..0438a42
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/java/org/onap/so/etsi/nfvo/ns/lcm/database/config/NfvoDatabaseConfiguration.java
@@ -0,0 +1,86 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.etsi.nfvo.ns.lcm.database.config;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import org.onap.so.etsi.nfvo.ns.lcm.database.beans.NfvoJob;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jmx.export.MBeanExporter;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+/**
+ * @author Waqas Ikram (waqas.ikram@est.tech)
+ *
+ */
+@Configuration
+@EnableTransactionManagement
+@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
+        basePackages = {"org.onap.so.etsi.nfvo.ns.lcm.database.repository"})
+public class NfvoDatabaseConfiguration {
+
+    @Autowired(required = false)
+    private MBeanExporter mBeanExporter;
+
+    private static final String NFVO_DATA_SOURCE_QUALIFIER = "nfvoDataSource";
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.hikari.nfvo")
+    public HikariConfig nfvoDbConfig() {
+        return new HikariConfig();
+    }
+
+    @Bean(name = NFVO_DATA_SOURCE_QUALIFIER)
+    public DataSource dataSource() {
+        if (mBeanExporter != null) {
+            mBeanExporter.addExcludedBean(NFVO_DATA_SOURCE_QUALIFIER);
+        }
+        final HikariConfig hikariConfig = this.nfvoDbConfig();
+        return new HikariDataSource(hikariConfig);
+    }
+
+    @Primary
+    @Bean(name = "entityManagerFactory")
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory(final EntityManagerFactoryBuilder builder,
+            @Qualifier(NFVO_DATA_SOURCE_QUALIFIER) final DataSource dataSource) {
+        return builder.dataSource(dataSource).packages(NfvoJob.class.getPackage().getName()).persistenceUnit("nfvo")
+                .build();
+    }
+
+    @Primary
+    @Bean(name = "transactionManager")
+    public PlatformTransactionManager transactionManager(
+            @Qualifier("entityManagerFactory") final EntityManagerFactory entityManagerFactory) {
+        return new JpaTransactionManager(entityManagerFactory);
+    }
+
+}
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/resources/db/migration/V1_1__create_nfvo_tables.sql b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/resources/db/migration/V1_1__create_nfvo_tables.sql
new file mode 100644
index 0000000..e4c959d
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-database-service/src/main/resources/db/migration/V1_1__create_nfvo_tables.sql
@@ -0,0 +1,72 @@
+use nfvo;
+
+CREATE TABLE IF NOT EXISTS `JOB` (
+  `JOB_ID` varchar(255) NOT NULL,
+  `JOB_TYPE` varchar(255) NOT NULL,
+  `JOB_ACTION` varchar(255) NOT NULL,
+  `RESOURCE_ID` varchar(255) NOT NULL,
+  `RESOURCE_NAME` varchar(255) DEFAULT NULL,
+  `STATUS` varchar(255) NOT NULL,
+  `START_TIME` DATETIME DEFAULT NULL,
+  `END_TIME` DATETIME DEFAULT NULL,
+  `PROGRESS` int(11) DEFAULT NULL,
+  `PROCESS_INSTANCE_ID` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`JOB_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `JOB_STATUS` (
+  `ID` INT NOT NULL AUTO_INCREMENT,
+  `UPDATED_TIME` DATETIME NOT NULL,
+  `DESCRIPTION` longtext DEFAULT NULL,
+  `STATUS` varchar(255) NOT NULL,
+  `JOB_ID` varchar(255) NOT NULL,
+  PRIMARY KEY (`ID`),
+  FOREIGN KEY (JOB_ID)
+      REFERENCES JOB(JOB_ID)
+      ON UPDATE CASCADE ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `NS_INST` (
+  `NS_INST_ID` varchar(255) NOT NULL,
+  `NAME` varchar(255) NOT NULL,
+  `NS_PACKAGE_ID` varchar(255) DEFAULT NULL,
+  `NSD_ID` varchar(255) NOT NULL,
+  `NSD_INVARIANT_ID` varchar(255) NOT NULL,
+  `DESCRIPTION` longtext DEFAULT NULL,
+  `STATUS` varchar(255) NOT NULL,
+  `STATUS_UPDATED_TIME` DATETIME NOT NULL,
+  `GLOBAL_CUSTOMER_ID` varchar(255) DEFAULT NULL,
+  `SERVICE_TYPE` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`NS_INST_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `NF_INST` (
+  `NF_INST_ID` varchar(255) NOT NULL,
+  `NAME` varchar(255) DEFAULT NULL,
+  `VNFD_ID` varchar(255) DEFAULT NULL,
+  `PACKAGE_ID` varchar(255) DEFAULT NULL,
+  `NS_INST_ID` varchar(255) NOT NULL,
+  `STATUS` varchar(255) NOT NULL,
+  `CREATE_TIME` DATETIME DEFAULT NULL,
+  `LAST_UPDATE_TIME` DATETIME DEFAULT NULL,
+  PRIMARY KEY (`NF_INST_ID`),
+  FOREIGN KEY (NS_INST_ID)
+      REFERENCES NS_INST(NS_INST_ID)
+	  ON UPDATE CASCADE ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `NS_LCM_OP_OCCS` (
+  `ID` varchar(255) NOT NULL,
+  `OPERATION_STATE` varchar(255) NOT NULL,
+  `STATE_ENTERED_TIME` DATETIME DEFAULT NULL,
+  `START_TIME` DATETIME DEFAULT NULL,
+  `NS_INST_ID` varchar(255) NOT NULL,
+  `OPERATION` varchar(255) NOT NULL,
+  `IS_AUTO_INNOVATION` varchar(255) NOT NULL,
+  `OPERATION_PARAMS` longtext NOT NULL,
+  `IS_CANCEL_PENDING` varchar(255) NOT NULL,
+  PRIMARY KEY (`ID`),
+  FOREIGN KEY (NS_INST_ID)
+      REFERENCES NS_INST(NS_INST_ID)
+	  ON UPDATE CASCADE ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/pom.xml b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/pom.xml
index 2c3c394..d48acb6 100644
--- a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/pom.xml
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/pom.xml
@@ -50,6 +50,16 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.onap.so.etsi.nfvo</groupId>
+      <artifactId>so-etsi-nfvo-ns-lcm-bpmn-flows</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
diff --git a/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/src/test/resources/application.yaml b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/src/test/resources/application.yaml
new file mode 100644
index 0000000..255ed2f
--- /dev/null
+++ b/so-etsi-nfvo/so-etsi-nfvo-ns-lcm/so-etsi-nfvo-ns-lcm-service/src/test/resources/application.yaml
@@ -0,0 +1,28 @@
+# Copyright © 2020 Nordix Foundation
+#
+# 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.
+spring:
+   main:
+      allow-bean-definition-overriding: true
+   flyway:
+      baseline-on-migrate: false
+   datasource:
+      hikari:
+         nfvo:
+            jdbcUrl: jdbc:h2:mem:NFVO;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATe SCHEMA IF NOT EXISTS NFVO;
+            driver-class-name: org.h2.Driver
+            pool-name: ns-lcm-bpmn-pool
+            registerMbeans: true
+   jpa:
+      hibernate:
+         ddl-auto: none
\ No newline at end of file
