diff --git a/mso-api-handlers/mso-requests-db/src/main/java/META-INF/MANIFEST.MF b/mso-api-handlers/mso-requests-db/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: 
+
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/HibernateUtil.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/HibernateUtil.java
new file mode 100644
index 0000000..21bece9
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/HibernateUtil.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.openecomp.mso.logger.MessageEnum;
+import org.openecomp.mso.logger.MsoLogger;
+
+@SuppressWarnings("deprecation")
+public class HibernateUtil {
+
+    //private static SessionFactory SESSION_FACTORY;
+    private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
+    
+     private static SessionFactory SESSION_FACTORY;
+
+
+    static {
+        try {
+
+         if ("MYSQL".equals (System.getProperty ("mso.db")) || "MARIADB".equals(System.getProperty("mso.db"))) {
+                SESSION_FACTORY = new Configuration ().configure ("hibernate-mysql.cfg.xml").buildSessionFactory ();
+            } else {
+            	LOGGER.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "DB Connection not specified to the JVM,choose either:-Dmso.db=MARIADB, -Dmso.db=MYSQL or -Dmso.container=AJSC", "", "", MsoLogger.ErrorCode.DataError , "DB Connection not specified to the JVM,choose either:-Dmso.db=MARIADB, -Dmso.db=MYSQL or -Dmso.container=AJSC");
+            }
+        } catch (Exception ex) {
+            LOGGER.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, ex.getMessage (), "", "", MsoLogger.ErrorCode.DataError , "Problem in getting DB connection type", ex);
+            throw ex;
+        }
+    }
+
+    public static SessionFactory getSessionFactory () {
+        return SESSION_FACTORY;
+    }
+
+    private HibernateUtil () {
+        // Avoid creation of an instance
+    }
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraActiveRequests.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraActiveRequests.java
new file mode 100644
index 0000000..992cf6a
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraActiveRequests.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+
+/**
+ * InfraActiveRequests
+ */
+public class InfraActiveRequests extends InfraRequests {
+
+	/**
+     * Serialization id.
+     */
+    private static final long serialVersionUID = 5003555140088137254L;
+
+	public InfraActiveRequests() {
+	    super ();
+	}
+
+	public InfraActiveRequests(String requestId, String action) {
+	    super (requestId, action);
+	}
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraRequests.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraRequests.java
new file mode 100644
index 0000000..4312819
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/InfraRequests.java
@@ -0,0 +1,405 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+// Generated Jul 27, 2015 3:05:00 PM by Hibernate Tools 3.4.0.CR1
+
+import java.sql.Timestamp;
+
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.openecomp.mso.requestsdb.adapter.TimestampXMLAdapter;
+
+/**
+ * InfraActiveRequests generated by hbm2java
+ */
+public class InfraRequests implements java.io.Serializable {
+
+    /**
+     * Serialization id.
+     */
+    private static final long serialVersionUID = -661307666798018192L;
+
+    private String requestId;
+	private String clientRequestId;
+	private String action;
+	private String requestStatus;
+	private String statusMessage;
+	private Long progress;
+	private Timestamp startTime;
+	private Timestamp endTime;
+	private String source;
+	private String vnfId;
+	private String vnfName;
+	private String vnfType;
+	private String serviceType;
+	private String aicNodeClli;
+	private String tenantId;
+	private String provStatus;
+	private String vnfParams;
+	private String vnfOutputs;
+	private String requestBody;
+	private String responseBody;
+	private String lastModifiedBy;
+	private Timestamp modifyTime;
+	private String requestType;
+	private String volumeGroupId;
+	private String volumeGroupName;
+	private String vfModuleId;
+	private String vfModuleName;
+	private String vfModuleModelName;
+	private String aaiServiceId;
+	private String aicCloudRegion;
+	private String callBackUrl;
+	private String correlator;
+	private String serviceInstanceId;
+	private String serviceInstanceName;
+	private String requestScope;
+	private String requestAction;
+	private String networkId;
+	private String networkName;
+	private String networkType;
+	
+
+	public InfraRequests() {
+	}
+
+	public InfraRequests(String requestId, String action) {
+		this.requestId = requestId;
+		this.action = action;
+	}
+
+	public String getRequestId() {
+		return this.requestId;
+	}
+
+	public void setRequestId(String requestId) {
+		this.requestId = requestId;
+	}
+
+	public String getClientRequestId() {
+		return clientRequestId;
+	}
+
+	public void setClientRequestId(String clientRequestId) {
+		this.clientRequestId = clientRequestId;
+	}
+
+	public String getAction() {
+		return this.action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
+
+	public String getRequestStatus() {
+		return this.requestStatus;
+	}
+
+	public void setRequestStatus(String requestStatus) {
+		this.requestStatus = requestStatus;
+	}
+
+	public String getStatusMessage() {
+		return this.statusMessage;
+	}
+
+	public void setStatusMessage(String statusMessage) {
+		this.statusMessage = statusMessage;
+	}
+
+	public Long getProgress() {
+		return this.progress;
+	}
+
+	public void setProgress(Long progress) {
+		this.progress = progress;
+	}
+
+    @XmlJavaTypeAdapter(TimestampXMLAdapter.class)
+	public Timestamp getStartTime() {
+		return this.startTime;
+	}
+
+	public void setStartTime(Timestamp startTime) {
+		this.startTime = startTime;
+	}
+
+    @XmlJavaTypeAdapter(TimestampXMLAdapter.class)
+	public Timestamp getEndTime() {
+		return this.endTime;
+	}
+
+	public void setEndTime(Timestamp endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getSource() {
+		return this.source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public String getVnfId() {
+		return this.vnfId;
+	}
+
+	public void setVnfId(String vnfId) {
+		this.vnfId = vnfId;
+	}
+
+	public String getVnfName() {
+		return this.vnfName;
+	}
+
+	public void setVnfName(String vnfName) {
+		this.vnfName = vnfName;
+	}
+
+	public String getVnfType() {
+		return this.vnfType;
+	}
+
+	public void setVnfType(String vnfType) {
+		this.vnfType = vnfType;
+	}
+
+	public String getServiceType() {
+		return this.serviceType;
+	}
+
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+
+	public String getAicNodeClli() {
+		return this.aicNodeClli;
+	}
+
+	public void setAicNodeClli(String aicNodeClli) {
+		this.aicNodeClli = aicNodeClli;
+	}
+
+	public String getTenantId() {
+		return this.tenantId;
+	}
+
+	public void setTenantId(String tenantId) {
+		this.tenantId = tenantId;
+	}
+
+	public String getProvStatus() {
+		return this.provStatus;
+	}
+
+	public void setProvStatus(String provStatus) {
+		this.provStatus = provStatus;
+	}
+
+	public String getVnfParams() {
+		return this.vnfParams;
+	}
+
+	public void setVnfParams(String vnfParams) {
+		this.vnfParams = vnfParams;
+	}
+
+	public String getVnfOutputs() {
+		return this.vnfOutputs;
+	}
+
+	public void setVnfOutputs(String vnfOutputs) {
+		this.vnfOutputs = vnfOutputs;
+	}
+
+	public String getRequestBody() {
+		return this.requestBody;
+	}
+
+	public void setRequestBody(String requestBody) {
+		this.requestBody = requestBody;
+	}
+
+	public String getResponseBody() {
+		return this.responseBody;
+	}
+
+	public void setResponseBody(String responseBody) {
+		this.responseBody = responseBody;
+	}
+
+	public String getLastModifiedBy() {
+		return this.lastModifiedBy;
+	}
+
+	public void setLastModifiedBy(String lastModifiedBy) {
+		this.lastModifiedBy = lastModifiedBy;
+	}
+
+    @XmlJavaTypeAdapter(TimestampXMLAdapter.class)
+	public Timestamp getModifyTime() {
+		return this.modifyTime;
+	}
+
+	public void setModifyTime(Timestamp modifyTime) {
+		this.modifyTime = modifyTime;
+	}
+
+	public String getRequestType() {
+		return this.requestType;
+	}
+
+	public void setRequestType(String requestType) {
+		this.requestType = requestType;
+	}
+	
+	public String getVolumeGroupId() {
+		return this.volumeGroupId;
+	}
+
+	public void setVolumeGroupId(String volumeGroupId) {
+		this.volumeGroupId = volumeGroupId;
+	}
+	
+	public String getVolumeGroupName() {
+		return this.volumeGroupName;
+	}
+
+	public void setVolumeGroupName(String volumeGroupName) {
+		this.volumeGroupName = volumeGroupName;
+	}
+	
+	public String getVfModuleId() {
+		return this.vfModuleId;
+	}
+
+	public void setVfModuleId(String vfModuleId) {
+		this.vfModuleId = vfModuleId;
+	}
+	
+	public String getVfModuleName() {
+		return this.vfModuleName;
+	}
+
+	public void setVfModuleName(String vfModuleName) {
+		this.vfModuleName = vfModuleName;
+	}
+	
+	public String getVfModuleModelName() {
+		return this.vfModuleModelName;
+	}
+
+	public void setVfModuleModelName(String vfModuleModelName) {
+		this.vfModuleModelName = vfModuleModelName;
+	}
+	
+	public String getAaiServiceId() {
+		return this.aaiServiceId;
+	}
+
+	public void setAaiServiceId(String aaiServiceId) {
+		this.aaiServiceId = aaiServiceId;
+	}
+
+	public String getAicCloudRegion() {
+		return this.aicCloudRegion;
+	}
+
+	public void setAicCloudRegion(String aicCloudRegion) {
+		this.aicCloudRegion = aicCloudRegion;
+	}
+
+	public String getCallBackUrl() {
+		return callBackUrl;
+	}
+
+	public void setCallBackUrl(String callBackUrl) {
+		this.callBackUrl = callBackUrl;
+	}
+
+	public String getCorrelator() {
+		return correlator;
+	}
+
+	public void setCorrelator(String correlator) {
+		this.correlator = correlator;
+	}
+
+	public String getServiceInstanceId() {
+		return serviceInstanceId;
+	}
+
+	public void setServiceInstanceId(String serviceInstanceId) {
+		this.serviceInstanceId = serviceInstanceId;
+	}
+
+	public String getServiceInstanceName() {
+		return serviceInstanceName;
+	}
+
+	public void setServiceInstanceName(String serviceInstanceName) {
+		this.serviceInstanceName = serviceInstanceName;
+	}
+
+	public String getRequestScope() {
+		return requestScope;
+	}
+
+	public void setRequestScope(String requestScope) {
+		this.requestScope = requestScope;
+	}
+	
+	public String getRequestAction() {
+		return requestAction;
+	}
+
+	public void setRequestAction(String requestAction) {
+		this.requestAction = requestAction;
+	}
+
+	public String getNetworkId() {
+		return networkId;
+	}
+
+	public void setNetworkId(String networkId) {
+		this.networkId = networkId;
+	}
+
+	public String getNetworkName() {
+		return networkName;
+	}
+
+	public void setNetworkName(String networkName) {
+		this.networkName = networkName;
+	}
+
+	public String getNetworkType() {
+		return networkType;
+	}
+
+	public void setNetworkType(String networkType) {
+		this.networkType = networkType;
+	}
+	
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/MockRequestsDatabase.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/MockRequestsDatabase.java
new file mode 100644
index 0000000..22179e9
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/MockRequestsDatabase.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MockRequestsDatabase {
+	
+	private Map<String, InfraActiveRequests> activeRequests;
+	
+	public MockRequestsDatabase() {
+		activeRequests = new HashMap<String, InfraActiveRequests>();
+	}
+	
+	public void addRecord(InfraActiveRequests record) {
+		String serviceType = record.getServiceType();
+		String serviceInstanceId = record.getServiceInstanceId();
+		String key = serviceType + "::" + serviceInstanceId;
+		activeRequests.put(key, record);
+	}
+	
+	public void deleteRecord(String serviceType, String serviceInstanceId) {
+		String key = serviceType + "::" + serviceInstanceId;
+		activeRequests.remove(key);
+	}
+	
+	public InfraActiveRequests getRecord(String serviceType, String serviceInstanceId) {
+		String key = serviceType + "::" + serviceInstanceId;
+		InfraActiveRequests record = activeRequests.get(key);
+		return record;
+	}
+	
+	public InfraActiveRequests checkDuplicate(String serviceType, String serviceInstanceId) {
+		return getRecord(serviceType, serviceInstanceId);
+	}
+	
+	public InfraActiveRequests checkRetry(String serviceType, String serviceInstanceId) {
+		InfraActiveRequests record = getRecord(serviceType, serviceInstanceId);
+		InfraActiveRequests returnRecord = null;
+		if (record != null) {
+			String requestAction = record.getRequestAction();
+			if (requestAction == null || !requestAction.equals("GetLayer3ServiceDetailsRequest")) {
+				String status = record.getRequestStatus();
+				if (status != null && status.equals("COMPLETED")) {
+					return returnRecord = record;
+				}
+			}
+		}
+		return returnRecord;
+	}
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/RequestsDatabase.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/RequestsDatabase.java
new file mode 100644
index 0000000..8961b26
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/RequestsDatabase.java
@@ -0,0 +1,494 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpStatus;
+import org.hibernate.Criteria;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.hibernate.persister.entity.AbstractEntityPersister;
+
+import org.openecomp.mso.logger.MsoLogger;
+
+public final class RequestsDatabase {
+
+    private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL);
+
+    private static final String SOURCE = "source";
+    private static final String START_TIME = "startTime";
+    private static final String REQUEST_TYPE = "requestType";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String SERVICE_INSTANCE_NAME = "serviceInstanceName";
+    private static final String VNF_INSTANCE_NAME = "vnfName";
+    private static final String VNF_INSTANCE_ID = "vnfId";
+    private static final String VOLUME_GROUP_INSTANCE_NAME = "volumeGroupName";
+    private static final String VOLUME_GROUP_INSTANCE_ID = "volumeGroupId";
+    private static final String VFMODULE_INSTANCE_NAME = "vfModuleName";
+    private static final String VFMODULE_INSTANCE_ID = "vfModuleId";
+    private static final String NETWORK_INSTANCE_NAME = "networkName";
+    private static final String NETWORK_INSTANCE_ID = "networkId";
+    private static final String GLOBAL_SUBSCRIBER_ID = "globalSubscriberId";
+    private static final String SERVICE_NAME_VERSION_ID = "serviceNameVersionId";
+    private static final String SERVICE_ID = "serviceId";
+    private static final String SERVICE_VERSION = "serviceVersion";
+    private static final String SERVICE_TYPE = "serviceType";
+    private static final String REQUEST_ID = "requestId";
+    private static MockRequestsDatabase mockDB = null;
+
+    /**
+     * Avoids creating an instance of this utility class.
+     */
+    private RequestsDatabase () {
+    }
+
+    public static boolean healthCheck () {
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        try {
+            Query query = session.createSQLQuery (" show tables ");
+
+            List<?> list = query.list();
+
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+        }
+        return true;
+    }
+
+
+    public static int updateInfraStatus (String requestId, String requestStatus, String lastModifiedBy) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        int result = 0;
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
+            query.setParameter ("requestStatus", requestStatus);
+            query.setParameter (REQUEST_ID, requestId);
+            query.setParameter ("lastModifiedBy", lastModifiedBy);
+            Calendar modifyTime = Calendar.getInstance ();
+            Timestamp modifyTimeStamp = new Timestamp (modifyTime.getTimeInMillis ());
+            query.setParameter ("modifyTime", modifyTimeStamp);
+            result = query.executeUpdate ();
+            session.getTransaction ().commit ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
+        }
+        return result;
+    }
+
+    public static int updateInfraStatus (String requestId, String requestStatus, long progress, String lastModifiedBy) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        int result = 0;
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, modifyTime = :modifyTime, progress = :progress, lastModifiedBy = :lastModifiedBy where requestId = :requestId ");
+            query.setParameter ("requestStatus", requestStatus);
+            query.setParameter (REQUEST_ID, requestId);
+            query.setParameter ("progress", progress);
+            query.setParameter ("lastModifiedBy", lastModifiedBy);
+            Calendar modifyTime = Calendar.getInstance ();
+            Timestamp modifyTimeStamp = new Timestamp (modifyTime.getTimeInMillis ());
+            query.setParameter ("modifyTime", modifyTimeStamp);
+            result = query.executeUpdate ();
+            session.getTransaction ().commit ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraStatus", null);
+        }
+        return result;
+    }
+
+    public static int updateInfraFinalStatus (String requestId, String requestStatus, String statusMessage, long progress, String responseBody, String lastModifiedBy) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Update infra request record " + requestId + " with status " + requestStatus);
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        int result = 0;
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("update InfraActiveRequests set requestStatus = :requestStatus, statusMessage = :statusMessage, progress = :progress, endTime = :endTime, responseBody = :responseBody, lastModifiedBy = :lastModifiedBy where id.requestId = :requestId ");
+            query.setParameter ("requestStatus", requestStatus);
+            query.setParameter ("requestId", requestId);
+            Calendar endTime = Calendar.getInstance ();
+            Timestamp endTimeStamp = new Timestamp (endTime.getTimeInMillis ());
+            query.setParameter ("endTime", endTimeStamp);
+            query.setParameter ("statusMessage", statusMessage);
+            query.setParameter ("progress", progress);
+            query.setParameter ("responseBody", responseBody);
+            query.setParameter ("lastModifiedBy", lastModifiedBy);
+            result = query.executeUpdate ();
+            session.getTransaction ().commit ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateInfraFinalStatus", null);
+        }
+        return result;
+    }
+
+    
+    private static List<InfraActiveRequests> executeInfraQuery (List <Criterion> criteria, Order order) {
+
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Execute query on infra active request table");
+        
+        List <InfraActiveRequests> results = new ArrayList<InfraActiveRequests>();
+
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        try {
+            session.beginTransaction ();
+            Criteria crit = session.createCriteria (InfraActiveRequests.class);
+            for (Criterion criterion : criteria) {
+                crit.add (criterion);
+            }
+            crit.addOrder (order);
+
+           // @SuppressWarnings("unchecked")
+            results = crit.list ();
+
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getInfraActiveRequest", null);
+        }
+        return results;
+    }
+    
+    public static InfraActiveRequests getRequestFromInfraActive (String requestId) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Get request " + requestId + " from InfraActiveRequests DB");
+
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        InfraActiveRequests ar = null;
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("from InfraActiveRequests where requestId = :requestId OR clientRequestId = :requestId");
+            query.setParameter (REQUEST_ID, requestId);
+            ar = (InfraActiveRequests) query.uniqueResult ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "InfraRequestDB", "getRequestFromInfraActive", null);
+        }
+        return ar;
+    }
+    
+    public static InfraActiveRequests checkInstanceNameDuplicate (HashMap<String,String> instanceIdMap, String instanceName, String requestScope) {
+
+        List <Criterion> criteria = new LinkedList <> ();
+       
+        if(instanceName != null && !instanceName.equals("")) {
+        	
+        	if(requestScope.equals("service")){
+        		criteria.add (Restrictions.eq (SERVICE_INSTANCE_NAME, instanceName));
+        	} else if(requestScope.equals("vnf")){
+        		criteria.add (Restrictions.eq (VNF_INSTANCE_NAME, instanceName));
+        	} else if(requestScope.equals("volumeGroup")){
+        		criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_NAME, instanceName));
+        	} else if(requestScope.equals("vfModule")){
+        		criteria.add (Restrictions.eq (VFMODULE_INSTANCE_NAME, instanceName));
+        	} else if(requestScope.equals("network")){
+        		criteria.add (Restrictions.eq (NETWORK_INSTANCE_NAME, instanceName));
+        	}
+        
+        } else {
+            if(instanceIdMap != null){
+            	if(requestScope.equals("service") && instanceIdMap.get("serviceInstanceId") != null){
+            		criteria.add (Restrictions.eq (SERVICE_INSTANCE_ID, instanceIdMap.get("serviceInstanceId")));
+             	}
+            
+            	if(requestScope.equals("vnf") && instanceIdMap.get("vnfInstanceId") != null){
+            		criteria.add (Restrictions.eq (VNF_INSTANCE_ID, instanceIdMap.get("vnfInstanceId")));
+             	}
+            
+            	if(requestScope.equals("vfModule") && instanceIdMap.get("vfModuleInstanceId") != null){
+            		criteria.add (Restrictions.eq (VFMODULE_INSTANCE_ID, instanceIdMap.get("vfModuleInstanceId")));
+             	}
+            
+            	if(requestScope.equals("volumeGroup") && instanceIdMap.get("volumeGroupInstanceId") != null){
+            		criteria.add (Restrictions.eq (VOLUME_GROUP_INSTANCE_ID, instanceIdMap.get("volumeGroupInstanceId")));
+             	}
+            
+            	if(requestScope.equals("network") && instanceIdMap.get("networkInstanceId") != null){
+            		criteria.add (Restrictions.eq (NETWORK_INSTANCE_ID, instanceIdMap.get("networkInstanceId")));
+            	}
+            }
+        }
+        
+        criteria.add (Restrictions.in ("requestStatus", new String[] { "PENDING", "IN_PROGRESS", "TIMEOUT" }));
+        
+        Order order = Order.desc (START_TIME);
+        
+        List<InfraActiveRequests> dupList = executeInfraQuery(criteria, order);
+        
+        InfraActiveRequests infraActiveRequests = null;
+        
+        if(dupList != null && dupList.size() > 0){
+        	infraActiveRequests = dupList.get(0);
+        }
+         	
+        return infraActiveRequests; 
+    }
+      
+    public static List<InfraActiveRequests> getOrchestrationFiltersFromInfraActive (Map<String, List<String>> orchestrationMap) {
+        
+    	
+    	List <Criterion> criteria = new LinkedList <> ();
+    	for (Map.Entry<String, List<String>> entry : orchestrationMap.entrySet())
+    	{
+    		String mapKey = entry.getKey();
+
+    	    if(mapKey.equalsIgnoreCase("vnfInstanceId")){
+    	    	mapKey = "vnfId";
+     	    } else if(mapKey.equalsIgnoreCase("vnfInstanceName")) {
+    	    	mapKey = "vnfName";
+    	    } else if(mapKey.equalsIgnoreCase("vfModuleInstanceId")) {
+    	    	mapKey = "vfModuleId";
+    	    } else if(mapKey.equalsIgnoreCase("vfModuleInstanceName")) {
+    	    	mapKey = "vfModuleName";
+    	    } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceId")) {
+    	    	mapKey = "volumeGroupId";
+    	    } else if(mapKey.equalsIgnoreCase("volumeGroupInstanceName")) {
+    	    	mapKey = "volumeGroupName";
+    	    } else if(mapKey.equalsIgnoreCase("networkInstanceId")) {
+    	    	mapKey = "networkId";
+    	    } else if(mapKey.equalsIgnoreCase("networkInstanceName")) {
+    	    	mapKey = "networkName";
+    	    } else if(mapKey.equalsIgnoreCase("lcpCloudRegionId")) {
+    	    	mapKey = "aicCloudRegion";
+    	    } 
+    	    
+    	    criteria.add(Restrictions.eq(mapKey, entry.getValue().get(1)));  	    
+    	    
+    	}
+    	
+         Order order = Order.asc (START_TIME);
+
+        return executeInfraQuery (criteria, order);
+    }
+
+
+    public static List <InfraActiveRequests> getRequestListFromInfraActive (String queryAttributeName,
+                                                                            String queryValue,
+                                                                            String requestType) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Get list of infra requests from DB with " + queryAttributeName + " = " + queryValue);
+
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        try {
+            session.beginTransaction ();
+            Criteria crit = session.createCriteria (InfraActiveRequests.class)
+                    .add (Restrictions.eq (queryAttributeName, queryValue));
+            crit.add (Restrictions.eqOrIsNull (REQUEST_TYPE, requestType));
+            crit.addOrder (Order.desc (START_TIME));
+            crit.addOrder (Order.asc (SOURCE));
+
+            @SuppressWarnings("unchecked")
+            List <InfraActiveRequests> arList = crit.list ();
+            if (arList != null && !arList.isEmpty ()) {
+                return arList;
+            }
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+           // msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestListFromInfraActive", null);
+        }
+        return null;
+    }
+
+
+    public static InfraActiveRequests getRequestFromInfraActive (String requestId, String requestType) {
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Get infra request from DB with id " + requestId);
+
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        InfraActiveRequests ar = null;
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("from InfraActiveRequests where (requestId = :requestId OR clientRequestId = :requestId) and requestType = :requestType");
+            query.setParameter (REQUEST_ID, requestId);
+            query.setParameter (REQUEST_TYPE, requestType);
+            ar = (InfraActiveRequests) query.uniqueResult ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "getRequestFromInfraActive", null);
+        }
+        return ar;
+    }
+
+
+    public static InfraActiveRequests checkDuplicateByVnfName (String vnfName, String action, String requestType) {
+
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Get infra request from DB for VNF " + vnfName + " and action " + action + " and requestType " + requestType);
+
+        InfraActiveRequests ar = null;
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("from InfraActiveRequests where vnfName = :vnfName and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC");
+            query.setParameter ("vnfName", vnfName);
+            query.setParameter ("action", action);
+            query.setParameter (REQUEST_TYPE, requestType);
+            @SuppressWarnings("unchecked")
+            List <InfraActiveRequests> results = query.list ();
+            if (!results.isEmpty ()) {
+                ar = results.get (0);
+            }
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfName", null);
+        }
+
+        return ar;
+    }
+
+    public static InfraActiveRequests checkDuplicateByVnfId (String vnfId, String action, String requestType) {
+
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Get list of infra requests from DB for VNF " + vnfId + " and action " + action);
+
+        InfraActiveRequests ar = null;
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        try {
+            session.beginTransaction ();
+            Query query = session.createQuery ("from InfraActiveRequests where vnfId = :vnfId and action = :action and (requestStatus = 'PENDING' or requestStatus = 'IN_PROGRESS' or requestStatus = 'TIMEOUT') and requestType = :requestType ORDER BY startTime DESC");
+            query.setParameter ("vnfId", vnfId);
+            query.setParameter ("action", action);
+            query.setParameter (REQUEST_TYPE, requestType);
+            @SuppressWarnings("unchecked")
+            List <InfraActiveRequests> results = query.list ();
+            if (!results.isEmpty ()) {
+                ar = results.get (0);
+            }
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "checkDuplicateByVnfId", null);
+        }
+
+        return ar;
+    }
+
+    public static void setMockDB(MockRequestsDatabase mockDB) {
+        RequestsDatabase.mockDB = mockDB;
+    }
+
+    /**
+     * Fetch a specific SiteStatus by SiteName.
+     *
+     * @param siteName The unique name of the site
+     * @return SiteStatus object or null if none found
+     */
+    public static SiteStatus getSiteStatus (String siteName) {
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+
+        long startTime = System.currentTimeMillis ();
+        SiteStatus siteStatus = null;
+        msoLogger.debug ("Request database - get Site Status with Site name:" + siteName);
+        try {
+            String hql = "FROM SiteStatus WHERE siteName = :site_name";
+            Query query = session.createQuery (hql);
+            query.setParameter ("site_name", siteName);
+
+            siteStatus = (SiteStatus) query.uniqueResult ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.debug ("getSiteStatus - Successfully: " + siteStatus);
+        }
+        return siteStatus;
+    }
+
+    /**
+     * Fetch a specific SiteStatus by SiteName.
+     *
+     * @param siteName The unique name of the site
+     * @param status The updated status of the Site
+     */
+    public static void updateSiteStatus (String siteName, boolean status) {
+        Session session = HibernateUtil.getSessionFactory ().openSession ();
+        session.beginTransaction ();
+
+        long startTime = System.currentTimeMillis ();
+        msoLogger.debug ("Request database - save Site Status with Site name:" + siteName);
+        try {
+            String hql = "FROM SiteStatus WHERE siteName = :site_name";
+            Query query = session.createQuery (hql);
+            query.setParameter ("site_name", siteName);
+
+            SiteStatus siteStatus = (SiteStatus) query.uniqueResult ();
+            if (siteStatus == null) {
+                siteStatus = new SiteStatus ();
+                siteStatus.setSiteName (siteName);
+                siteStatus.setStatus (status);
+                //siteStatus.setCreated(new Timestamp(new Date().getTime()));
+                session.save (siteStatus);
+            } else {
+                siteStatus.setStatus(status);
+                //siteStatus.setCreated(new Timestamp(new Date().getTime()));
+                session.merge (siteStatus);
+            }
+            session.getTransaction ().commit ();
+        } finally {
+            if (session != null && session.isOpen ()) {
+                session.close ();
+            }
+            msoLogger.recordMetricEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully", "RequestDB", "updateSiteStatus", null);
+        }
+    }
+
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/SiteStatus.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/SiteStatus.java
new file mode 100644
index 0000000..4218096
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/SiteStatus.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb;
+
+
+import org.openecomp.mso.logger.MsoLogger;
+
+import java.sql.Timestamp;
+
+
+public class SiteStatus {
+
+    private static final MsoLogger LOGGER = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL);
+
+    private boolean status;
+    private String siteName;
+    private Timestamp created;
+
+    public SiteStatus() {
+    }
+
+    public Timestamp getCreated() {
+        return created;
+    }
+
+    public void setCreated(Timestamp created) {
+        this.created = created;
+    }
+
+    public String getSiteName() {
+        return siteName;
+    }
+
+    public void setSiteName(String siteName) {
+        this.siteName = siteName;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public boolean getStatus() {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return "SiteStatus{" +
+                "status=" + status +
+                ", siteName='" + siteName + '\'' +
+                ", created=" + created +
+                '}';
+    }
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/TimestampXMLAdapter.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/TimestampXMLAdapter.java
new file mode 100644
index 0000000..1e3f46d
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/TimestampXMLAdapter.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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.mso.requestsdb.adapter;
+
+
+import java.sql.Timestamp;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class TimestampXMLAdapter extends XmlAdapter <Long, Timestamp> {
+
+    @Override
+    public Long marshal (Timestamp v) throws Exception {
+        return v.getTime ();
+    }
+
+    @Override
+    public Timestamp unmarshal (Long v) throws Exception {
+        if (v == null) {
+            return new Timestamp(0);
+        }
+        return new Timestamp (v);
+    }
+}
diff --git a/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/package-info.java b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/package-info.java
new file mode 100644
index 0000000..542d711
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/java/org/openecomp/mso/requestsdb/adapter/package-info.java
@@ -0,0 +1,26 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * 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=========================================================
+ */
+
+/**
+ * XML adapters.
+ */
+
+package org.openecomp.mso.requestsdb.adapter;
+
diff --git a/mso-api-handlers/mso-requests-db/src/main/resources/InfraActiveRequests.hbm.xml b/mso-api-handlers/mso-requests-db/src/main/resources/InfraActiveRequests.hbm.xml
new file mode 100644
index 0000000..b98177a
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/resources/InfraActiveRequests.hbm.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP MSO
+  ================================================================================
+  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=========================================================
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<!-- Generated Jul 27, 2015 3:05:00 PM by Hibernate Tools 3.4.0.CR1 -->
+<hibernate-mapping>
+    <class name="org.openecomp.mso.requestsdb.InfraActiveRequests" table="INFRA_ACTIVE_REQUESTS">
+        <id name="requestId" type="string">
+            <column name="REQUEST_ID" length="45"/>
+            <generator class="assigned"/>
+        </id>
+        <property name="clientRequestId" type="string" unique="true">
+            <column name="CLIENT_REQUEST_ID" length="45" unique="true"/>
+        </property>
+        <property name="action" type="string">
+            <column name="ACTION" length="45" not-null="true"/>
+        </property>
+        <property name="requestStatus" type="string">
+            <column name="REQUEST_STATUS" length="20"/>
+        </property>
+        <property name="statusMessage" type="string">
+            <column name="STATUS_MESSAGE" length="2000"/>
+        </property>
+        <property name="progress" type="java.lang.Long">
+            <column name="PROGRESS" precision="11" scale="0"/>
+        </property>
+        <property name="startTime" type="timestamp">
+            <column name="START_TIME"/>
+        </property>
+        <property name="endTime" type="timestamp">
+            <column name="END_TIME"/>
+        </property>
+        <property name="source" type="string">
+            <column name="SOURCE" length="45"/>
+        </property>
+        <property name="vnfId" type="string">
+            <column name="VNF_ID" length="45"/>
+        </property>
+        <property name="vnfName" type="string">
+            <column name="VNF_NAME" length="80"/>
+        </property>
+        <property name="vnfType" type="string">
+            <column name="VNF_TYPE" length="200"/>
+        </property>
+        <property name="serviceType" type="string">
+            <column name="SERVICE_TYPE" length="45"/>
+        </property>
+        <property name="aicNodeClli" type="string">
+            <column name="AIC_NODE_CLLI" length="11"/>
+        </property>
+        <property name="tenantId" type="string">
+            <column name="TENANT_ID" length="45"/>
+        </property>
+        <property name="provStatus" type="string">
+            <column name="PROV_STATUS" length="20"/>
+        </property>
+        <property name="vnfParams" type="text">
+            <column name="VNF_PARAMS"/>
+        </property>
+        <property name="vnfOutputs" type="text">
+            <column name="VNF_OUTPUTS"/>
+        </property>
+        <property name="requestBody" type="text">
+            <column name="REQUEST_BODY"/>
+        </property>
+        <property name="responseBody" type="text">
+            <column name="RESPONSE_BODY"/>
+        </property>
+        <property name="lastModifiedBy" type="string">
+            <column name="LAST_MODIFIED_BY" length="50"/>
+        </property>
+        <property name="modifyTime" type="timestamp">
+            <column name="MODIFY_TIME"/>
+        </property>
+        <property name="requestType" type="string">
+            <column name="REQUEST_TYPE" length="20"/>
+        </property>
+        <property name="volumeGroupId" type="string">
+            <column name="VOLUME_GROUP_ID" length="45"/>
+        </property>
+        <property name="volumeGroupName" type="string">
+            <column name="VOLUME_GROUP_NAME" length="45"/>
+        </property>
+        <property name="vfModuleId" type="string">
+            <column name="VF_MODULE_ID" length="45"/>
+        </property>
+        <property name="vfModuleName" type="string">
+            <column name="VF_MODULE_NAME" length="200"/>
+        </property>
+        <property name="vfModuleModelName" type="string">
+            <column name="VF_MODULE_MODEL_NAME" length="200"/>
+        </property>
+         <property name="aaiServiceId" type="string">
+            <column name="AAI_SERVICE_ID" length="50"/>
+        </property>
+        <property name="aicCloudRegion" type="string">
+            <column name="AIC_CLOUD_REGION" length="11"/>
+        </property>
+        <property name="callBackUrl" type="string">
+            <column name="CALLBACK_URL" length="200"/>
+        </property>
+        <property name="correlator" type="string">
+            <column name="CORRELATOR" length="80"/>
+        </property>
+        <property name="serviceInstanceId" type="string">
+            <column name="SERVICE_INSTANCE_ID" length="45"/>
+        </property>
+        <property name="serviceInstanceName" type="string">
+            <column name="SERVICE_INSTANCE_NAME" length="80"/>
+        </property>
+        <property name="requestScope" type="string">
+            <column name="REQUEST_SCOPE" length="20"/>
+        </property>
+        <property name="requestAction" type="string">
+            <column name="REQUEST_ACTION" length="45" not-null="true"/>
+        </property>
+        <property name="networkId" type="string">
+            <column name="NETWORK_ID" length="45"/>
+        </property>
+        <property name="networkName" type="string">
+            <column name="NETWORK_NAME" length="80"/>
+        </property>
+        <property name="networkType" type="string">
+            <column name="NETWORK_TYPE" length="80"/>
+        </property>
+    </class>
+</hibernate-mapping>
diff --git a/mso-api-handlers/mso-requests-db/src/main/resources/SiteStatus.hbm.xml b/mso-api-handlers/mso-requests-db/src/main/resources/SiteStatus.hbm.xml
new file mode 100644
index 0000000..95ccfda
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/resources/SiteStatus.hbm.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP MSO
+  ================================================================================
+  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=========================================================
+  -->
+
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.openecomp.mso.requestsdb">
+	<class name="SiteStatus" table="SITE_STATUS">
+		<meta attribute="class-description">
+			This class describes a Site Status
+		</meta>
+		
+		<id name="siteName" type="string" column="SITE_NAME"/>
+
+		<property name="status" column="STATUS" type="boolean" length="256"/>
+		<property name="created" column="CREATION_TIMESTAMP" type="timestamp" generated="insert" insert="false" update="false"/>
+	</class>
+</hibernate-mapping>
diff --git a/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-mysql.cfg.xml b/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-mysql.cfg.xml
new file mode 100644
index 0000000..531b771
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-mysql.cfg.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP MSO
+  ================================================================================
+  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=========================================================
+  -->
+
+<!DOCTYPE hibernate-configuration PUBLIC
+		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+    <session-factory>
+        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
+        <property name="hibernate.show_sql">false</property>
+        <property name="hibernate.format_sql">true</property>
+        <property name="connection.datasource">java:jboss/datasources/mso-requests</property>
+		
+<!-- 		<property name="hibernate.hbm2ddl.auto">create</property> -->
+
+        <mapping resource="InfraActiveRequests.hbm.xml"></mapping>
+        <mapping resource="SiteStatus.hbm.xml"></mapping>
+    </session-factory>
+</hibernate-configuration>
diff --git a/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-requests-ajsc.cfg.xml b/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-requests-ajsc.cfg.xml
new file mode 100644
index 0000000..14bd7b5
--- /dev/null
+++ b/mso-api-handlers/mso-requests-db/src/main/resources/hibernate-requests-ajsc.cfg.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP MSO
+  ================================================================================
+  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=========================================================
+  -->
+
+<!DOCTYPE hibernate-configuration PUBLIC
+		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+	   <session-factory>
+        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
+        <property name="hibernate.show_sql">false</property>
+        <property name="hibernate.format_sql">true</property>
+
+        <mapping resource="InfraActiveRequests.hbm.xml"></mapping>
+        <mapping resource="SiteStatus.hbm.xml"></mapping>
+       </session-factory>
+     <!-- <session-factory name="MSORequestsFactory">
+      	<property name="connection.url">${REQUESTS_CONNECTION_URL}</property>
+        <property name="connection.username">${REQUESTS_USERNAME}</property>
+        <property name="connection.password">${REQUESTS_PASSWORD}</property>
+        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
+        <property name="hibernate.default_schema">mso_requests</property>
+        <property name="connection.driver_class">org.mariadb.jdbc.Driver</property>
+        <property name="hibernate.current_session_context_class">thread</property>
+        <property name="hibernate.show_sql">false</property>
+        <property name="hibernate.format_sql">true</property>    
+
+         
+        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
+		<property name="hibernate.c3p0.min_size">${REQUESTS_MIN_POOL_SIZE}</property> 
+		<property name="hibernate.c3p0.max_size">${REQUESTS_MAX_POOL_SIZE}</property> 
+		<property name="hibernate.c3p0.timeout">${REQUESTS_TIMEOUT}</property> 
+		<property name="hibernate.c3p0.max_statements">50</property> 
+		<property name="hibernate.c3p0.idle_test_period">1000</property> 
+		<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property> 
+		
+  
+
+        <mapping resource="InfraActiveRequests.hbm.xml"></mapping>     
+
+    </session-factory> -->
+</hibernate-configuration>
