diff --git a/osam-core-framework/.mvn/wrapper/maven-wrapper.jar b/osam-core-framework/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..9cc84ea
--- /dev/null
+++ b/osam-core-framework/.mvn/wrapper/maven-wrapper.jar
Binary files differ
diff --git a/osam-core-framework/.mvn/wrapper/maven-wrapper.properties b/osam-core-framework/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..488eeee
--- /dev/null
+++ b/osam-core-framework/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.4/apache-maven-3.5.4-bin.zip
diff --git a/osam-core-framework/README.md b/osam-core-framework/README.md
new file mode 100644
index 0000000..f354b71
--- /dev/null
+++ b/osam-core-framework/README.md
@@ -0,0 +1,9 @@
+# OSAM
+```
+docker pull mariadb
+
+docker run --name springbootdb -e MYSQL_DATABASE=osam -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=root  -d -p 3306:3306  mariadb
+```
+Restructure:`mvn clean package spring-boot:repackage`
+
+Run:`mvn spring-boot:run -X`
diff --git a/osam-core-framework/api/pom.xml b/osam-core-framework/api/pom.xml
new file mode 100644
index 0000000..0221e6c
--- /dev/null
+++ b/osam-core-framework/api/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AbstractStorageService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AbstractStorageService.java
new file mode 100644
index 0000000..c7c7375
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AbstractStorageService.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import java.util.List;
+
+public interface AbstractStorageService <K,V>{
+
+    V addOrUpdate(V value);
+
+    void removeById(K key);
+
+    V getById(K key);
+
+    List<V> getAll();
+}
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AccessPodService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AccessPodService.java
new file mode 100644
index 0000000..da0a9b9
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AccessPodService.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.AccessPod;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+public interface AccessPodService extends AbstractStorageService<Long, AccessPod>{
+    AccessPod findByPnfId(String pnfId);
+    void removeByPnfId(String pnfId);
+}
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AlarmService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AlarmService.java
new file mode 100644
index 0000000..5fd8468
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/AlarmService.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.AlarmsAndEvents;
+import org.onap.osam.model.dao.ActiveAlarmsAndEvents;
+import org.onap.osam.model.dao.HistoricalAlarmsAndEvents;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *  basic methods belongs to Active Alarms
+ */
+public interface AlarmService{
+
+    List<ActiveAlarmsAndEvents> getActiveAlarmsAndEventsByDate(Date startDate, Date endDate);
+
+    List<HistoricalAlarmsAndEvents> getHistoricalAlarmsAndEventsByDate(Date startDate, Date endDate);
+
+    void addOrUpdate(AlarmsAndEvents alarmsAndEvents);
+
+}
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/BroadBandService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/BroadBandService.java
new file mode 100644
index 0000000..7ccaea8
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/BroadBandService.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.Service;
+import org.onap.osam.model.dao.SpeedProfile;
+import org.onap.osam.model.dao.TechnologyProfile;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public interface BroadBandService {
+    /**
+     *
+     * @param speedProfile
+     */
+    SpeedProfile addSpeedProfile(SpeedProfile speedProfile);
+
+    /**
+     *
+     * @param technologyProfile
+     */
+    TechnologyProfile addTechnologyProfile(TechnologyProfile technologyProfile);
+
+    /**
+     *
+     * @param service
+     */
+    Service addService(Service service);
+
+    /**
+     *
+     * @param id
+     */
+    void removeSpeedProfile(Long id);
+
+    /**
+     *
+     * @param id
+     */
+    void removeTechnologyProfile(Long id);
+
+    /**
+     *
+     * @param id
+     */
+    void removeService(Long id);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    SpeedProfile getSpeedProfile(Long id);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    TechnologyProfile getTechnologyProfile(Long id);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    Service getService(Long id);
+
+    /**
+     *
+     * @return
+     */
+    List<SpeedProfile> getSpeedProfiles();
+
+    /**
+     *
+     * @return
+     */
+    List<TechnologyProfile> getTechnologyProfiles();
+
+    /**
+     *
+     * @return
+     */
+    List<Service> getServices();
+
+}
+
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/DeviceService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/DeviceService.java
new file mode 100644
index 0000000..921bf66
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/DeviceService.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.Chassis;
+import org.onap.osam.model.dao.OLTPort;
+import org.onap.osam.model.dao.OLTSlot;
+import org.onap.osam.model.dao.ONTDevice;
+
+import java.util.List;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public interface DeviceService {
+
+     enum OntProvisioningType {
+        PREPROVISION,
+        FULL,
+        PROVISION
+    }
+
+
+/*
+Chassis Related Functionality
+---------------------------------------------------------------------------------------
+*/
+
+    /**
+     *
+     * @param chassis
+     */
+    Chassis addChassis(Chassis chassis);
+
+    /**
+     *
+     * @param id
+     */
+    void deleteChassis(Long id);
+
+    /**
+     *
+     * @param clli
+     */
+    public void deleteChassisByClli(String clli);
+
+    /**
+     *
+     * @param id
+     * @return Chassis
+     */
+    Chassis getChassisById(Long id);
+
+    /**
+     *
+     * @param clli
+     * @return Chassis
+     */
+    Chassis getChassisByClli(String clli);
+
+    /**
+     *
+     * @return Long
+     */
+    Long getChassisCount();
+
+    List<Chassis> getByPnfId(String pnfId);
+
+    List<Chassis> getAllChassis();
+
+/*
+oltSlot Related Functionality
+---------------------------------------------------------------------------------------
+*/
+
+    /**
+     *
+     *
+     * @param oltSlot
+     * @param chassis
+     */
+    OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis);
+
+    /**
+     *
+     * @param id
+     */
+    void deleteOLTSlot(Long id);
+
+    /**
+     *
+     * @param id
+     * @return oltSlot
+     */
+    OLTSlot getOLTSlotById(Long id);
+
+    /**
+     *
+     * @param serialNumber
+     * @return oltSlot
+     */
+    OLTSlot getOLTSlotBySerialNumber(String serialNumber);
+
+
+    /**
+     *
+     * @return all OLT slots
+     */
+    List<OLTSlot> getAllOLTSlots();
+
+/*
+OLTPort Related Functionality
+---------------------------------------------------------------------------------------
+*/
+
+    /**
+     *
+     * @param id
+     */
+    void deleteOLTPort(Long id);
+
+    /**
+     *
+     * @param id
+     * @return OLTPort
+     */
+    OLTPort getOLTPortById(Long id);
+
+/*
+ONTDevice Related Functionality
+---------------------------------------------------------------------------------------
+*/
+
+    /**
+     *
+     * @param ontDevice
+     * @param provisioningType
+     */
+    ONTDevice provisionONTDevice(ONTDevice ontDevice, OntProvisioningType provisioningType);
+
+    /**
+     *
+     * @param id
+     */
+    void deleteONTDevice(Long id);
+
+    /**
+     *
+     * @param id
+     * @return ONTDevice
+     */
+    ONTDevice getONTDeviceById(Long id);
+
+    /**
+     *
+     * @param serialNumber
+     * @return ONTDevice
+     */
+    ONTDevice getONTDeviceBySerialNumber(String serialNumber);
+
+    /**
+     *
+     * @return all ONT devices
+     */
+    List<ONTDevice> getAllONTDevices();
+
+}
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/PmConfigsService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/PmConfigsService.java
new file mode 100644
index 0000000..40c7dde
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/PmConfigsService.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.PmConfigs;
+import org.onap.osam.model.dao.PmGroupConfig;
+import org.onap.osam.model.dao.PmConfig;
+
+import java.util.List;
+
+public interface PmConfigsService extends AbstractStorageService<Long,PmConfigs>{
+
+    List<PmConfig> getPmConfigByPmConfigsId(Long pmConfigsId);
+
+    List<PmConfig> getPmConfigByPmConfigGroupId(Long pmGroupConfigsId);
+
+    void addPmGroupConfig(PmConfig pmConfig);
+
+    void addPmGroupConfig(PmGroupConfig pmGroupConfig);
+
+    void removePmConfig(Long pmConfigId);
+
+    void removeGroupPmConfig(Long pmGroupConfigId);
+
+}
diff --git a/osam-core-framework/api/src/main/java/org/onap/osam/api/service/SubscriberService.java b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/SubscriberService.java
new file mode 100644
index 0000000..f71be56
--- /dev/null
+++ b/osam-core-framework/api/src/main/java/org/onap/osam/api/service/SubscriberService.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.api.service;
+
+import org.onap.osam.model.dao.Subscriber;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public interface SubscriberService extends AbstractStorageService<Long,Subscriber> {
+    Subscriber getBySubscriberIdentifier(String userIdentifier);
+}
diff --git a/osam-core-framework/async-jobs/pom.xml b/osam-core-framework/async-jobs/pom.xml
new file mode 100644
index 0000000..ec112e3
--- /dev/null
+++ b/osam-core-framework/async-jobs/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>async-jobs</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>6.14.3</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/AsyncJobService.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/AsyncJobService.java
new file mode 100644
index 0000000..940bc5f
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/AsyncJobService.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.dao.job.JobStatus;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface AsyncJobService {
+
+    JobStatus calcStatus(String asyncRequestStatus);
+
+    List<UUID> pushBulkJob(String userId, boolean isSuccessful, boolean isOLTDependant);
+
+/*
+    List<String> PARAMS_TO_IGNORE = Arrays.asList("vnf_name", "vf_module_name");
+
+    List<ServiceInfo> getAllServicesInfo();
+
+
+    String getServiceInstantiationPath(ServiceInstantiation serviceInstantiationRequest);
+
+    String getOrchestrationRequestsPath();
+
+    ServiceInfo getServiceInfoByJobId(UUID jobUUID);
+
+    List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source);
+
+    ServiceInfo updateServiceInfo(UUID jobUUID, Consumer<ServiceInfo> serviceUpdater);
+
+    ServiceInfo updateServiceInfoAndAuditStatus(UUID jobUuid, Job.JobStatus jobStatus);
+
+    void auditVidStatus(UUID jobUUID, Job.JobStatus jobStatus);
+
+    void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus);
+
+    void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo);
+
+    void handleFailedInstantiation(UUID jobUUID);
+
+    void deleteJob(UUID jobId);
+
+    void hideServiceInfo(UUID jobUUID);
+
+    int getCounterForName(String name);
+
+    int getMaxRetriesGettingFreeNameFromAai();
+
+    void setMaxRetriesGettingFreeNameFromAai(int maxRetriesGettingFreeNameFromAai);
+
+    String getUniqueName(String name, ResourceType resourceType);
+*/
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobCommand.java
new file mode 100644
index 0000000..ca594c0
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobCommand.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.impl.JobSharedData;
+
+import java.util.Map;
+
+
+/**
+ * A callable instance, with serializable characteristics.
+ * Represents a step in a chain of steps, which eventualy
+ * resides into a packing Job.
+ */
+public interface IJobCommand {
+
+    /**
+     * Initialize the command state
+     * @param sharedData shared data cross all job commands
+     * @param commandData An input to be set into the command. Each implementation may expect different keys in the map.
+     * @return Returns itself
+     */
+    default IJobCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
+        return this;
+    }
+
+    /**
+     * @return Returns the inner state of the command. This state, once passed into init(), should
+     *         bring the command back to it's state.
+     */
+    Map<String, Object> getData();
+
+    /**
+     * Execute the command represented by this instance. Assumes the instance is already init().
+     * @return A NextCommand containing the next command in chain of commands, or null if chain
+     *         should be terminated. Might return itself (packed in a NextCommand).
+     */
+    NextCommand call();
+
+    default JobType getType() {
+        return JobType.jobTypeOf(this.getClass());
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobFactory.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobFactory.java
new file mode 100644
index 0000000..460aba2
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobFactory.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.impl.JobSharedData;
+
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * kind of factory for creating jobs and converting them to Job Model
+ */
+public interface IJobFactory {
+/*
+    JobModel toModel(Job job);
+*/
+
+    OsamJob createRootJob(JobType jobType, AsyncJobRequest request, String userId, Integer indexInBulk, Map<String, Object> jobData);
+
+    OsamJob createChildJob(JobType jobType, JobStatus jobStatus, AsyncJobRequest request, JobSharedData parentSharedData, Map<String, Object> jobData);
+
+    // Marks types that are an AsyncJob payload
+    interface AsyncJobRequest {
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobsDataAccessService.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobsDataAccessService.java
new file mode 100644
index 0000000..231c057
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/IJobsDataAccessService.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface IJobsDataAccessService {
+
+    UUID add(OsamJob job);
+
+    Optional<OsamJob> pull(JobStatus topic, String ownerId);
+
+    void pushBack(OsamJob job);
+
+    Collection<OsamJob> peek();
+
+    OsamJob peek(UUID jobId);
+
+    void delete(UUID jobId);
+
+    boolean mute(UUID jobId);
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/JobType.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/JobType.java
new file mode 100644
index 0000000..1cabcad
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/JobType.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.command.HttpCallCommand;
+import org.onap.osam.job.command.NoOpCommand;
+import org.onap.osam.job.command.WatchingCommand;
+import org.onap.osam.job.command.demo.ChassisCommand;
+import org.onap.osam.job.command.demo.OLTCommand;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+
+public enum JobType {
+
+    HttpCall(HttpCallCommand.class),
+    Watching(WatchingCommand.class),
+    NoOp(NoOpCommand.class),
+    //Demo
+    ChassisCreation(ChassisCommand.class),
+    OLTCreation(OLTCommand.class);
+
+    private static final Map<Class, JobType> REVERSE_MAP = Stream.of(values())
+            .collect(Collectors.toMap(t -> t.getCommandClass(), t -> t));
+
+    private final Class commandClass;
+
+    <T extends IJobCommand> JobType(Class<T> commandClass) {
+        this.commandClass = commandClass;
+    }
+
+    public Class getCommandClass() {
+        return commandClass;
+    }
+    static JobType jobTypeOf(Class commandClass) {
+        return REVERSE_MAP.get(commandClass);
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/NextCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/NextCommand.java
new file mode 100644
index 0000000..6a61322
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/NextCommand.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job;
+
+import org.onap.osam.job.dao.job.JobStatus;
+
+public class NextCommand {
+    private final JobStatus status;
+    private final IJobCommand command;
+
+    public NextCommand(JobStatus nextStatus, IJobCommand nextCommand) {
+        this.status = nextStatus;
+        this.command = nextCommand;
+    }
+
+    public NextCommand(JobStatus nextStatus) {
+        this.status = nextStatus;
+        this.command = null;
+    }
+
+    public JobStatus getStatus() {
+        return status;
+    }
+
+    public IJobCommand getCommand() {
+        return command;
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseInProgressStatusCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseInProgressStatusCommand.java
new file mode 100644
index 0000000..e1de031
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseInProgressStatusCommand.java
@@ -0,0 +1,142 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.IJobsDataAccessService;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.AsyncJobService;
+import org.onap.osam.job.impl.JobSharedData;
+import org.onap.osam.job.utils.TimeUtils;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.Map;
+
+@Slf4j
+public abstract class BaseInProgressStatusCommand extends CommandBase implements IJobCommand {
+
+    protected AsyncJobService asyncInstantiationBL;
+
+    protected IJobsDataAccessService jobsDataAccessService;
+
+    protected IJobFactory jobAdapter;
+
+/*
+    @Inject
+    protected RestMsoImplementation restMso;
+
+    @Inject
+    protected AuditService auditService;
+*/
+
+    protected String requestId;
+
+    protected String instanceId;
+
+
+    @Override
+    public NextCommand call() {
+
+     //   try {
+            String asyncRequestStatus = getAsyncRequestStatus();
+            //asyncInstantiationBL.auditMsoStatus(getSharedData().getRootJobId(), asyncRequestStatus.get().request);
+            JobStatus jobStatus = asyncInstantiationBL.calcStatus(asyncRequestStatus);
+            ZonedDateTime jobStartTime = getZonedDateTime(asyncRequestStatus);
+            jobStatus = isExpired(jobStartTime) ? JobStatus.FAILED : jobStatus;
+            return processJobStatus(jobStatus);
+
+            //TODO error handling
+  /*      } catch (javax.ws.rs.ProcessingException e) {
+            // Retry when we can't connect MSO during getStatus
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "Cannot get orchestration status for {}, will retry: {}", requestId, e, e);
+            return new NextCommand(JobStatus.IN_PROGRESS, this);
+        } catch (BadResponseFromMso e) {
+            return handleFailedMsoResponse(e.getMsoResponse());
+        }
+        catch (RuntimeException e) {
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "Cannot get orchestration status for {}, stopping: {}", requestId, e, e);
+            return new NextCommand(JobStatus.STOPPED, this);
+        }*/
+    }
+
+    abstract NextCommand processJobStatus(JobStatus jobStatus);
+
+    abstract boolean isExpired(ZonedDateTime jobStartTime);
+
+    private String getAsyncRequestStatus() {
+/*
+        String path = asyncInstantiationBL.getOrchestrationRequestsPath()+"/"+requestId;
+        RestObject<AsyncRequestStatus> msoResponse = restMso.GetForObject(path, AsyncRequestStatus.class);
+        if (msoResponse.getStatusCode() >= 400 || msoResponse.get() == null) {
+            throw new BadResponseFromMso(msoResponse);
+        }
+*/
+        //TODO
+        return "dummy";
+    }
+
+    /*private NextCommand handleFailedMsoResponse(RestObject<AsyncRequestStatus> msoResponse) {
+        auditService.setFailedAuditStatusFromMso(getSharedData().getJobUuid(), requestId, msoResponse.getStatusCode(), msoResponse.getRaw());
+        LOGGER.error(EELFLoggerDelegate.errorLogger,
+                "Failed to get orchestration status for {}. Status code: {},  Body: {}",
+                requestId, msoResponse.getStatusCode(), msoResponse.getRaw());
+        return new NextCommand(JobStatus.IN_PROGRESS, this);
+    }*/
+
+    @Override
+    public BaseInProgressStatusCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
+        return init(sharedData, (String) commandData.get("requestId"), (String) commandData.get("instanceId"));
+    }
+
+
+    protected BaseInProgressStatusCommand init(JobSharedData sharedData,
+                                               String requestId,
+                                               String instanceId) {
+        init(sharedData);
+        this.requestId = requestId;
+        this.instanceId = instanceId;
+        return this;
+    }
+
+    @Override
+    public Map<String, Object> getData() {
+        return ImmutableMap.of(
+            "requestId", requestId,
+            "instanceId", instanceId
+        );
+    }
+
+    private ZonedDateTime getZonedDateTime(String response) {
+        ZonedDateTime jobStartTime;
+        try {
+            //TODO dummy time until real impl is provided
+            jobStartTime = TimeUtils.parseZonedDateTime(ZonedDateTime.now().toString());
+        } catch (DateTimeParseException | NullPointerException e) {
+            log.error("Failed to parse start time for {}, body: {}. Current time will be used", requestId, response, e);
+            jobStartTime = ZonedDateTime.now();
+        }
+        return jobStartTime;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseWatchingCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseWatchingCommand.java
new file mode 100644
index 0000000..711c27d
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/BaseWatchingCommand.java
@@ -0,0 +1,117 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.AsyncJobService;
+import org.onap.osam.job.impl.JobSharedData;
+import org.onap.osam.job.repository.job.OsamJobRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Slf4j
+public abstract class BaseWatchingCommand extends CommandBase implements IJobCommand {
+
+    @Autowired
+    protected AsyncJobService asyncInstantiationBL;
+
+    @Autowired
+    private OsamJobRepository osamJobRepository;
+
+    private List<UUID> childrenJobsIds;
+
+    protected boolean isRoot;
+
+    public BaseWatchingCommand() {}
+
+    public BaseWatchingCommand(JobSharedData sharedData, List<UUID> childrenJobsIds, boolean isRoot) {
+        init(sharedData, childrenJobsIds, isRoot);
+    }
+
+    @Override
+    public BaseWatchingCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
+        return init(
+                sharedData,
+                ((List<String>) commandData.get("childrenJobs")).stream().map(x -> UUID.fromString(x)).collect(Collectors.toList()),
+                (boolean) commandData.get("isRoot")
+        );
+    }
+
+    protected BaseWatchingCommand init(JobSharedData sharedData, List<UUID> childrenJobsIds, boolean isRoot) {
+        super.init(sharedData);
+        this.childrenJobsIds = CollectionUtils.isEmpty(childrenJobsIds) ? new ArrayList<>() : childrenJobsIds;
+        this.isRoot = isRoot;
+        return this;
+    }
+
+    @Override
+    public NextCommand call() {
+        Map<UUID, OsamJob> jobs = getAllChildrenJobs();
+
+        boolean isAllChildrenFinal = true;
+        boolean hasFailedChild = false;
+        for (UUID jobId: childrenJobsIds) {
+            OsamJob job = jobs.get(jobId);
+
+
+            //if job not found - we assume it failed
+            if (job == null || job.getStatus() == null) {
+                hasFailedChild = true;
+                continue;
+            }
+
+            if (!job.getStatus().isFinal()) {
+                isAllChildrenFinal = false;
+            } else if (!job.getStatus().equals(JobStatus.COMPLETED)) {
+                //if job status is final - check if it failed status
+                hasFailedChild = true;
+            }
+        }
+
+        return getNextCommand(isAllChildrenFinal, hasFailedChild);
+    }
+
+    private Map<UUID, OsamJob> getAllChildrenJobs() {
+        List<OsamJob> jobs = osamJobRepository.findAllByUuid(childrenJobsIds);
+        return jobs.stream().collect(Collectors.toMap(OsamJob::getUuid, item -> item));
+    }
+
+    protected abstract NextCommand getNextCommand(boolean isAllChildrenFinal, boolean hasFailedChild);
+
+
+    @Override
+    public Map<String, Object> getData() {
+        Map<String, Object> data = new HashMap<>();
+        data.put("childrenJobs", childrenJobsIds);
+        data.put("isRoot", isRoot);
+        return data;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/CommandBase.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/CommandBase.java
new file mode 100644
index 0000000..94c43e7
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/CommandBase.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.impl.JobSharedData;
+@Slf4j
+@Getter
+@Setter
+public abstract class CommandBase {
+
+    private JobSharedData sharedData;
+
+    protected CommandBase init(JobSharedData sharedData) {
+        this.setSharedData(sharedData);
+        return this;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/HttpCallCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/HttpCallCommand.java
new file mode 100644
index 0000000..372d751
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/HttpCallCommand.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import com.google.common.collect.ImmutableMap;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.impl.JobSharedData;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.http.HttpEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Map;
+import java.util.UUID;
+
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class HttpCallCommand implements IJobCommand {
+    private String url;
+    private UUID uuid;
+
+    public HttpCallCommand() {
+    }
+
+    public HttpCallCommand(String url, UUID uuid) {
+        init(url, uuid);
+    }
+
+    @Override
+    public NextCommand call() {
+        RestTemplate restTemplate = new RestTemplate();
+        HttpEntity<String> request = new HttpEntity<>(new String(uuid.toString()));
+        String str = restTemplate.postForObject(url, request, String.class);
+        return new NextCommand(JobStatus.COMPLETED);
+    }
+
+    @Override
+    public HttpCallCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
+        return init((String) commandData.get("url"), sharedData.getJobUuid());
+    }
+
+    private HttpCallCommand init(String url, UUID jobUuid) {
+        this.url = url;
+        this.uuid = jobUuid;
+        return this;
+    }
+
+    @Override
+    public Map<String, Object> getData() {
+        return ImmutableMap.of("url", url);
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/JobCommandFactory.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/JobCommandFactory.java
new file mode 100644
index 0000000..dc92182
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/JobCommandFactory.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import org.onap.osam.common.exception.GenericUncheckedException;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobCommand;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+import java.util.function.Function;
+
+@Component
+public class JobCommandFactory {
+
+    final Function<Class<? extends IJobCommand>, IJobCommand> jobFactory;
+
+    @Autowired
+    public JobCommandFactory(ApplicationContext applicationContext) {
+        this.jobFactory = (jobType -> {
+            final Object commandBean = applicationContext.getBean(jobType);
+
+            if (!(commandBean instanceof IJobCommand)) {
+                throw new GenericUncheckedException(commandBean.getClass() + " is not a IJobCommand");
+            }
+
+            return (IJobCommand) commandBean;
+        });
+    }
+
+    public JobCommandFactory(Function<Class<? extends IJobCommand>, IJobCommand> jobFactory) {
+        this.jobFactory = jobFactory;
+    }
+
+    public IJobCommand toCommand(OsamJob job) {
+
+        final IJobCommand command = jobFactory.apply(job.getType().getCommandClass());
+        command.init(job.getSharedData(), job.getDataMap());
+
+        return command;
+    }
+
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/NoOpCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/NoOpCommand.java
new file mode 100644
index 0000000..8f110a1
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/NoOpCommand.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.NextCommand;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Map;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class NoOpCommand implements IJobCommand {
+
+    @Override
+    public NextCommand call() {
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> getData() {
+        return Collections.emptyMap();
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/WatchingCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/WatchingCommand.java
new file mode 100644
index 0000000..70b9f00
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/WatchingCommand.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.impl.JobSharedData;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.UUID;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class WatchingCommand extends BaseWatchingCommand {
+
+    public WatchingCommand() {}
+
+    public WatchingCommand(JobSharedData sharedData, List<UUID> childrenJobsIds, boolean isRoot) {
+        super(sharedData, childrenJobsIds, isRoot);
+    }
+
+    protected NextCommand getNextCommand(boolean isAllChildrenFinal, boolean hasFailedChild) {
+        if (isAllChildrenFinal) {
+            JobStatus jobStatus = hasFailedChild ?  JobStatus.COMPLETED_WITH_ERRORS : JobStatus.COMPLETED;
+            return new NextCommand(jobStatus);
+        } else {
+            if (isRoot) {
+                return new NextCommand(JobStatus.IN_PROGRESS, this);
+            }
+            return new NextCommand(JobStatus.RESOURCE_IN_PROGRESS, this);
+        }
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/ChassisCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/ChassisCommand.java
new file mode 100644
index 0000000..98de930
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/ChassisCommand.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command.demo;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.command.WatchingCommand;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.JobType;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.command.CommandBase;
+import org.onap.osam.job.impl.DummyAsyncRequest;
+import org.onap.osam.job.impl.JobFactory;
+import org.onap.osam.job.impl.JobSharedData;
+import org.onap.osam.job.impl.JobsDataAccessService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@Slf4j
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+
+/**
+ * In this example, Chassis job is successful and spawns off OLT job - without being dependent on it.
+ */
+
+public class ChassisCommand extends CommandBase implements IJobCommand {
+
+    private Boolean isSuccessful;
+
+    private Boolean isOltDependant;
+
+    @Autowired
+    protected JobsDataAccessService jobsDataAccessService;
+
+    @Autowired
+    protected JobFactory jobFactory;
+
+    public ChassisCommand(){}
+
+    @Override
+    public IJobCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
+        super.init(sharedData);
+        isSuccessful = (Boolean) commandData.get("isSuccessful");
+        isOltDependant = (Boolean) commandData.get("isOltDependant");
+        return this;
+    }
+
+    @Override
+    public Map<String, Object> getData() {
+        return ImmutableMap.of("isSuccessful", isSuccessful,
+                "isOltDependant", isOltDependant);
+    }
+
+    @Override
+    public NextCommand call() {
+        NextCommand nextCommand;
+        if (isSuccessful){
+            log.debug("ChassisCommand - it's your LUCKY day! :) ChassisCreation created, continuing to OLTCreation...");
+
+            //Adding an OLTCreation child job
+            final List<UUID> oltChildJobs = getOltChildJobs();
+
+            if (isOltDependant){
+                log.debug("ChassisCommand - OLT Dependent scenario. Pending to wait if OLT job succeeds before deciding if Chassis job succeeds.");
+                nextCommand = new NextCommand(JobStatus.PENDING, new WatchingCommand(getSharedData(), oltChildJobs, true));
+            } else {
+                log.debug("ChassisCommand - independent scenario. This job is completed, regardless of child OLT job.");
+                nextCommand = new NextCommand(JobStatus.COMPLETED);
+            }
+         } else {
+            log.debug("ChassisCommand - it's your UNLUCKY day! :( ChassisCreation creation failed, your bulk request is finished here.");
+            nextCommand = new NextCommand(JobStatus.FAILED);
+        }
+        return nextCommand;
+    }
+
+    private List<UUID> getOltChildJobs() {
+        log.debug("Spinning off OLT child job....");
+        Map<String, Object> dataForOLTChild = ImmutableMap.of();
+        return Lists.newArrayList(jobsDataAccessService.add(jobFactory.createChildJob(JobType.OLTCreation, JobStatus.CREATING, new DummyAsyncRequest(), getSharedData(), ImmutableMap.of())));
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/OLTCommand.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/OLTCommand.java
new file mode 100644
index 0000000..4de73ad
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/command/demo/OLTCommand.java
@@ -0,0 +1,48 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command.demo;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.command.CommandBase;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Slf4j
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class OLTCommand extends CommandBase implements IJobCommand {
+    @Override
+    public Map<String, Object> getData() {
+        return ImmutableMap.of();
+    }
+
+    @Override
+    public NextCommand call() {
+        log.debug("OLTCreation Command - for this demo, I'm always successful!!");
+        return new NextCommand(JobStatus.COMPLETED);
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/JobStatus.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/JobStatus.java
new file mode 100644
index 0000000..c3b031f
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/JobStatus.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.dao.job;
+
+public enum JobStatus {
+    COMPLETED(true),
+    FAILED(true),
+    IN_PROGRESS(false),
+    RESOURCE_IN_PROGRESS(false),
+    PAUSE(false),
+    PENDING(false),
+    STOPPED(true),
+    COMPLETED_WITH_ERRORS(true),
+    CREATING(false);
+
+    private final Boolean finalStatus;
+    public Boolean isFinal(){return finalStatus;}
+
+    JobStatus(Boolean finalStatus)
+    {
+        this.finalStatus = finalStatus ;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/OsamJob.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/OsamJob.java
new file mode 100644
index 0000000..807221f
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/dao/job/OsamJob.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.dao.job;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.annotations.DynamicUpdate;
+import org.hibernate.annotations.SelectBeforeUpdate;
+import org.hibernate.annotations.Type;
+import org.onap.osam.job.JobType;
+import org.onap.osam.job.impl.JobData;
+import org.onap.osam.job.impl.JobSharedData;
+import org.onap.osam.model.dao.BaseEntity;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Column;
+import javax.persistence.Converter;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Lob;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+
+/*
+ The following 2 annotations let hibernate to update only fields that actually have been changed.
+ DynamicUpdate tell hibernate to update only dirty fields.
+ SelectBeforeUpdate is needed since during update the entity is detached (get and update are in different sessions)
+*/
+@DynamicUpdate()
+@SelectBeforeUpdate()
+@Entity
+@Getter
+@Setter
+@Slf4j
+public class OsamJob extends BaseEntity {
+
+    @Column(unique = true, nullable = false, columnDefinition = "CHAR(36)")
+    @Type(type="org.hibernate.type.UUIDCharType")
+    private UUID uuid;
+
+    @CreatedDate
+    private Date createdDate;
+
+    @LastModifiedDate
+    private Date modifiedDate;
+
+    @Enumerated(value = EnumType.STRING)
+    private JobStatus status;
+
+    @Enumerated(value = EnumType.STRING)
+    private JobType type;
+
+    @Lob
+    @Column
+    private JobData data = new JobData();
+
+    @Column
+    private String takenBy;
+
+    @Column
+    private String userId;
+
+    @Column(nullable = false)
+    private Integer age = 0;
+
+    @Column(nullable = false)
+    private Integer indexInBulk = 0;
+
+    @Column
+    private Date deletedAt;
+
+    public Map<String, Object> getDataMap() {
+        return data.getCommandData().get(getType());
+    }
+
+    public void setTypeAndData(JobType jobType, Map<String, Object> data) {
+        // *add* the data to map,
+        // then change state to given type
+        this.type = jobType;
+        this.data.getCommandData().put(jobType, data);
+    }
+
+    public void setSharedData(JobSharedData sharedData) {
+        this.data.setSharedData(sharedData);
+    }
+
+    public JobSharedData getSharedData(){
+        return this.data.getSharedData();
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof OsamJob)) return false;
+        OsamJob daoJob = (OsamJob) o;
+        return Objects.equals(getUuid(), daoJob.getUuid());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getUuid());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("status", status)
+                .add("type", type)
+                .add("uuid", uuid)
+                .add("takenBy", takenBy)
+                .add("userId", userId)
+                .add("age", age)
+                .add("createdDate", createdDate)
+                .add("modifiedDate", modifiedDate)
+                .add("deletedAt", deletedAt)
+                .add("data", data)
+                .toString();
+    }
+
+    @Converter(autoApply = true)
+    public static class JobDataConverter implements AttributeConverter<JobData, String> {
+
+        @Override
+        public String convertToDatabaseColumn(JobData jobData) {
+            if( jobData == null )
+                return null;
+
+            ObjectMapper mapper = new ObjectMapper();
+
+            try {
+                return mapper.writeValueAsString(jobData);
+            } catch (JsonProcessingException e) {
+                log.error("Couldn't persist JobData object {}, error: {}. Persisting null", jobData, e);
+                return null;
+            }
+        }
+
+        @Override
+        public JobData convertToEntityAttribute(String s) {
+            if( s == null )
+                return null;
+
+            ObjectMapper mapper = new ObjectMapper();
+
+            try {
+                return mapper.readValue(s, JobData.class);
+            } catch (IOException e) {
+                log.error("Couldn't deserialize {} to JobData object, error: {}. Returning null", s, e);
+                return null;
+            }
+        }
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/exceptions/JobException.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/exceptions/JobException.java
new file mode 100644
index 0000000..46ba80e
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/exceptions/JobException.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.exceptions;
+
+import java.util.UUID;
+
+public class JobException extends RuntimeException {
+    private final UUID jobUuid;
+
+    public JobException(String message, UUID jobUuid, Throwable cause) {
+        super(message, cause);
+        this.jobUuid = jobUuid;
+    }
+
+    public UUID getJobUuid() {
+        return jobUuid;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/AsyncJobServiceImpl.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/AsyncJobServiceImpl.java
new file mode 100644
index 0000000..c964f01
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/AsyncJobServiceImpl.java
@@ -0,0 +1,506 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.AsyncJobService;
+import org.onap.osam.job.JobType;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class AsyncJobServiceImpl implements AsyncJobService {
+
+    private final JobFactory jobFactory;
+
+    private final JobsDataAccessService jobsDataAccessService;
+
+    private Map<String, JobStatus> msoStateToJobStatusMap = ImmutableMap.<String, JobStatus>builder()
+            .put("inprogress", JobStatus.IN_PROGRESS)
+            .put("failed", JobStatus.FAILED)
+            .put("pause", JobStatus.PAUSE)
+            .put("paused", JobStatus.PAUSE)
+            .put("complete", JobStatus.COMPLETED)
+            .put("pending", JobStatus.IN_PROGRESS)
+            .put("pendingmanualtask", JobStatus.PAUSE)
+            .put("unlocked", JobStatus.IN_PROGRESS)
+            .build();
+
+
+    public AsyncJobServiceImpl(JobFactory jobFactory, JobsDataAccessService jobsDataAccessService) {
+        this.jobFactory = jobFactory;
+        this.jobsDataAccessService = jobsDataAccessService;
+    }
+
+    @Override
+    public JobStatus calcStatus(String asyncRequestStatus) {
+        JobStatus jobStatus = msoStateToJobStatusMap.get(asyncRequestStatus);
+        return (jobStatus != null ? jobStatus : JobStatus.IN_PROGRESS);
+    }
+
+    @Override
+    public List<UUID> pushBulkJob(String userId, boolean isSuccessful, boolean isOltDependant) {
+        List<UUID> uuids = new ArrayList<>();
+        Date createdBulkDate = Calendar.getInstance().getTime();
+        int bulkSize = 1;
+        for (int i = 0; i < bulkSize; i++) {
+            OsamJob job = jobFactory.createRootJob(JobType.ChassisCreation, new DummyAsyncRequest(), userId, i,
+                    ImmutableMap.of("isSuccessful", isSuccessful, "isOltDependant", isOltDependant));
+            UUID jobId = jobsDataAccessService.add(job);
+            uuids.add(jobId);
+        }
+        return uuids;
+    }
+
+
+
+/*
+    private final DataAccessService dataAccessService;
+
+    private final IJobFactory jobAdapter;
+
+    private final IJobsDataAccessService jobService;
+
+    private SessionFactory sessionFactory;
+
+    private AaiClientInterface aaiClient;
+
+    private int maxRetriesGettingFreeNameFromAai = MAX_RETRIES_GETTING_FREE_NAME_FROM_AAI;
+
+    private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AsyncInstantiationBusinessLogicImpl.class);
+
+
+
+    @Autowired
+    public AsyncInstantiationBusinessLogicImpl(DataAccessService dataAccessService,
+                                               IJobFactory jobAdapter,
+                                               IJobsDataAccessService jobService,
+                                               SessionFactory sessionFactory,
+                                               AaiClientInterface aaiClient) {
+        this.dataAccessService = dataAccessService;
+        this.jobAdapter = jobAdapter;
+        this.jobService = jobService;
+        this.sessionFactory = sessionFactory;
+        this.aaiClient = aaiClient;
+    }
+
+    @Override
+    public List<ServiceInfo> getAllServicesInfo() {
+        return dataAccessService.getList(ServiceInfo.class, filterByCreationDateAndNotDeleted(), orderByCreatedDateAndStatus(), null);
+    }
+
+    private String filterByCreationDateAndNotDeleted() {
+        LocalDateTime minus3Months = LocalDateTime.now().minusMonths(3);
+        Timestamp filterDate = Timestamp.valueOf(minus3Months);
+        return " where" +
+                "   hidden = false" +
+                "   and deleted_at is null" +  // don't fetch deleted
+                "   and created >= '" + filterDate + "' ";
+    }
+
+    private String orderByCreatedDateAndStatus() {
+        return " createdBulkDate DESC ,\n" +
+                "  (CASE jobStatus\n" +
+                "   WHEN 'COMPLETED' THEN 0\n" +
+                "   WHEN 'FAILED' THEN 0\n" +
+                "   WHEN 'IN_PROGRESS' THEN 1\n" +
+                "   WHEN 'PAUSE' THEN 2\n" +
+                "   WHEN 'PENDING' THEN 3\n" +
+                "   WHEN 'STOPPED' THEN 3 END),\n" +
+                "  statusModifiedDate ";
+    }
+
+    @Override
+    public List<UUID> pushBulkJob(ServiceInstantiation request, String userId) {
+        List<UUID> uuids = new ArrayList<>();
+        Date createdBulkDate = Calendar.getInstance().getTime();
+        int bulkSize = request.getBulkSize();
+        UUID templateId = UUID.randomUUID();
+        for (int i = 0; i < bulkSize; i++) {
+            //Job job = jobAdapter.createJob(JobType.ServiceInstantiation, request, templateId, userId, i);
+            Job job = jobAdapter.createJob(JobType.NoOp, request, templateId, userId, i);//should be some instatiation, this was changed as part of code cleaning
+
+            UUID jobId = jobService.add(job);
+            auditVidStatus(jobId,getStatus());
+            uuids.add(jobId);
+            dataAccessService.saveDomainObject(createServiceInfo(userId, request, jobId, templateId, createdBulkDate), DaoUtils.getPropsMap());
+        }
+        return uuids;
+    }
+
+    private ServiceInfo createServiceInfo(String userId, ServiceInstantiation serviceInstantiation, UUID jobId, UUID templateId, Date createdBulkDate) {
+        return new ServiceInfo(
+                userId, JobStatus.PENDING, serviceInstantiation.isPause(), jobId, templateId,
+                serviceInstantiation.getOwningEntityId(),
+                serviceInstantiation.getOwningEntityName(),
+                serviceInstantiation.getProjectName(),
+                serviceInstantiation.getAicZoneId(),
+                serviceInstantiation.getAicZoneName(),
+                serviceInstantiation.getTenantId(),
+                serviceInstantiation.getTenantName(),
+                serviceInstantiation.getLcpCloudRegionId(),
+                null,
+                serviceInstantiation.getSubscriptionServiceType(),
+                serviceInstantiation.getSubscriberName(),
+                null,
+                serviceInstantiation.getInstanceName(),
+                serviceInstantiation.getModelInfo().getModelInvariantId(),
+                serviceInstantiation.getModelInfo().getModelName(),
+                serviceInstantiation.getModelInfo().getModelVersion(),
+                createdBulkDate
+        );
+    }
+
+
+    */
+/*//*
+/@Override
+    public RequestDetailsWrapper<ServiceInstantiationRequestDetails> generateServiceInstantiationRequest(UUID jobId, ServiceInstantiation payload, String userId) {
+
+           ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity owningEntity = new ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity(payload.getOwningEntityId(), payload.getOwningEntityName());
+
+        SubscriberInfo subscriberInfo = new SubscriberInfo();
+        subscriberInfo.setGlobalSubscriberId(payload.getGlobalSubscriberId());
+
+        String serviceInstanceName = null;
+        if(payload.isUserProvidedNaming()) {
+            serviceInstanceName = getUniqueName(payload.getInstanceName(), ResourceType.SERVICE_INSTANCE);
+            String finalServiceInstanceName = serviceInstanceName;
+            updateServiceInfo(jobId, x -> x.setServiceInstanceName(finalServiceInstanceName));
+        }
+        ServiceInstantiationRequestDetails.RequestInfo requestInfo = new ServiceInstantiationRequestDetails.RequestInfo(
+                serviceInstanceName,
+                payload.getProductFamilyId(),
+                "VID",
+                payload.isRollbackOnFailure(),
+                userId);
+
+        List<ServiceInstantiationRequestDetails.ServiceInstantiationService> serviceInstantiationService = new LinkedList<>();
+        List<Map<String, String>> unFilteredInstanceParams = payload.getInstanceParams() != null ? payload.getInstanceParams() : new LinkedList<>();
+        List<Map<String, String>> filteredInstanceParams = removeUnNeededParams(unFilteredInstanceParams);
+        ServiceInstantiationRequestDetails.ServiceInstantiationService serviceInstantiationService1 = new ServiceInstantiationRequestDetails.ServiceInstantiationService(
+                payload.getModelInfo(),
+                serviceInstanceName,
+                filteredInstanceParams,
+                createServiceInstantiationVnfList(payload)
+        );
+        serviceInstantiationService.add(serviceInstantiationService1);
+
+        ServiceInstantiationRequestDetails.RequestParameters requestParameters = new ServiceInstantiationRequestDetails.RequestParameters(payload.getSubscriptionServiceType(), false, serviceInstantiationService);
+
+        ServiceInstantiationRequestDetails.Project project = payload.getProjectName() != null ?  new ServiceInstantiationRequestDetails.Project(payload.getProjectName()) : null;
+
+        ServiceInstantiationRequestDetails requestDetails = new ServiceInstantiationRequestDetails(payload.getModelInfo(), owningEntity, subscriberInfo,
+                project, requestInfo, requestParameters);
+
+        RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper(requestDetails);
+        debugRequestDetails(requestDetailsWrapper, logger);
+        return requestDetailsWrapper;
+    }*//*
+
+
+    private List<Map<String, String>> removeUnNeededParams(List<Map<String, String>> instanceParams) {
+        List<String> keysToRemove = new ArrayList<>();
+        if (instanceParams != null && !instanceParams.isEmpty()) {
+            for (String key : instanceParams.get(0).keySet()) {
+                for (String paramToIgnore : PARAMS_TO_IGNORE)
+                    if ((key.equalsIgnoreCase(paramToIgnore))) {
+                        keysToRemove.add(key);
+                    }
+            }
+            for (String key : keysToRemove) {
+                instanceParams.get(0).remove(key);
+            }
+            //TODO will be removed on once we stop using List<Map<String, String>>
+            if (instanceParams.get(0).isEmpty()) {
+                return Collections.emptyList();
+            }
+        }
+        return instanceParams;
+    }
+
+    private ServiceInstantiationRequestDetails.ServiceInstantiationVnfList createServiceInstantiationVnfList(ServiceInstantiation payload) {
+        CloudConfiguration cloudConfiguration = new CloudConfiguration();
+        cloudConfiguration.setTenantId(payload.getTenantId());
+        cloudConfiguration.setLcpCloudRegionId(payload.getLcpCloudRegionId());
+
+        Map<String, Vnf> vnfs = payload.getVnfs();
+        List<ServiceInstantiationRequestDetails.ServiceInstantiationVnf> vnfList = new ArrayList<>();
+        for (Vnf vnf : vnfs.values()) {
+            Map<String, Map<String, VfModule>> vfModules = vnf.getVfModules();
+            List<VfModule> convertedUnFilteredVfModules = convertVfModuleMapToList(vfModules);
+            List<VfModule> filteredVfModules = filterInstanceParamsFromVfModuleAndUniqueNames(convertedUnFilteredVfModules, vnf.isUserProvidedNaming());
+            ServiceInstantiationRequestDetails.ServiceInstantiationVnf serviceInstantiationVnf = new ServiceInstantiationRequestDetails.ServiceInstantiationVnf(
+                    vnf.getModelInfo(),
+                    cloudConfiguration,
+                    vnf.getPlatformName(),
+                    vnf.getLineOfBusiness(),
+                    payload.getProductFamilyId(),
+                    removeUnNeededParams(vnf.getInstanceParams()),
+                    filteredVfModules,
+                    vnf.isUserProvidedNaming() ? getUniqueName(vnf.getInstanceName(), ResourceType.GENERIC_VNF) : null
+            );
+            vnfList.add(serviceInstantiationVnf);
+        }
+
+        return new ServiceInstantiationRequestDetails.ServiceInstantiationVnfList(vnfList);
+    }
+
+    private List<VfModule> convertVfModuleMapToList(Map<String, Map<String, VfModule>> vfModules) {
+        return vfModules.values().stream().flatMap(vfModule -> vfModule.values().stream()).collect(Collectors.toList());
+    }
+
+    private List<VfModule> filterInstanceParamsFromVfModuleAndUniqueNames(List<VfModule> unFilteredVfModules, boolean isUserProvidedNaming) {
+        return unFilteredVfModules.stream().map(vfModule ->
+                new VfModule(
+                        vfModule.getModelInfo(),
+                        getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getInstanceName(), ResourceType.VF_MODULE),
+                        getUniqueNameIfNeeded(isUserProvidedNaming, vfModule.getVolumeGroupInstanceName(), ResourceType.VOLUME_GROUP),
+                        removeUnNeededParams(vfModule.getInstanceParams())))
+                .collect(Collectors.toList());
+    }
+
+    private String getUniqueNameIfNeeded(boolean isUserProvidedNaming, String name, ResourceType resourceType) {
+        return isUserProvidedNaming && !StringUtils.isEmpty(name) ?
+                getUniqueName(name, resourceType) : null;
+    }
+
+    @Override
+    public String getServiceInstantiationPath(ServiceInstantiation serviceInstantiationRequest) {
+        //in case pause flag is true - use assign , else - use create.
+        return MsoBusinessLogicImpl.validateEndpointPath(
+                serviceInstantiationRequest.isPause() ?
+                        "mso.restapi.serviceInstanceAssign" : "mso.restapi.serviceInstanceCreate"
+        );
+    }
+
+    @Override
+    public String getOrchestrationRequestsPath() {
+        return MsoBusinessLogicImpl.validateEndpointPath(MsoProperties.MSO_REST_API_GET_ORC_REQ);
+    }
+
+    @Override
+    public ServiceInfo updateServiceInfo(UUID jobUUID, Consumer<ServiceInfo> serviceUpdater) {
+        ServiceInfo serviceInfo = getServiceInfoByJobId(jobUUID);
+        serviceUpdater.accept(serviceInfo);
+        dataAccessService.saveDomainObject(serviceInfo, DaoUtils.getPropsMap());
+        return serviceInfo;
+    }
+
+
+
+    private void setServiceInfoStatus(ServiceInfo serviceInfo, JobStatus jobStatus) {
+        serviceInfo.setJobStatus(jobStatus);
+        serviceInfo.setStatusModifiedDate(new Date());
+    }
+
+    public ServiceInfo getServiceInfoByJobId(UUID jobUUID) {
+        List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, String.format(" where jobId = '%s' ", jobUUID), null, null);
+        if (serviceInfoList.size() != 1) {
+            throw new GenericUncheckedException("Failed to retrieve job with uuid " + jobUUID + " from ServiceInfo table. Instances found: " + serviceInfoList.size());
+        }
+        return serviceInfoList.get(0);
+    }
+
+    public List<JobAuditStatus> getAuditStatuses(UUID jobUUID, JobAuditStatus.SourceStatus source) {
+        return dataAccessService.getList(
+            JobAuditStatus.class,
+            String.format(" where SOURCE = '%s' and JOB_ID = '%s'",source, jobUUID),
+            " CREATED_DATE ", null);
+    }
+
+    private JobAuditStatus getLatestAuditStatus(UUID jobUUID, JobAuditStatus.SourceStatus source){
+        List<JobAuditStatus> list = getAuditStatuses(jobUUID,source);
+        return !list.isEmpty() ? list.get(list.size()-1) : null;
+    }
+
+    @Override
+    public void auditVidStatus(UUID jobUUID, JobStatus jobStatus){
+        JobAuditStatus vidStatus = new JobAuditStatus(jobUUID, jobStatus.toString(), JobAuditStatus.SourceStatus.VID);
+        auditStatus(vidStatus);
+    }
+
+    @Override
+    public void auditMsoStatus(UUID jobUUID, AsyncRequestStatus.Request msoRequestStatus){
+        auditMsoStatus(jobUUID, msoRequestStatus.requestStatus.getRequestState(), msoRequestStatus.requestId, msoRequestStatus.requestStatus.getStatusMessage());
+    }
+
+    @Override
+    public void auditMsoStatus(UUID jobUUID, String jobStatus, String requestId, String additionalInfo){
+        JobAuditStatus msoStatus = new JobAuditStatus(jobUUID, jobStatus, JobAuditStatus.SourceStatus.MSO,
+                requestId != null ? UUID.fromString(requestId) : null,
+                additionalInfo);
+        auditStatus(msoStatus);
+    }
+
+    private void auditStatus(JobAuditStatus jobAuditStatus){
+        JobAuditStatus latestStatus = getLatestAuditStatus(jobAuditStatus.getJobId(),jobAuditStatus.getSource());
+        if (latestStatus == null || !latestStatus.equals(jobAuditStatus))
+            dataAccessService.saveDomainObject(jobAuditStatus, DaoUtils.getPropsMap());
+
+    }
+
+
+
+    @Override
+    public void handleFailedInstantiation(UUID jobUUID) {
+        ServiceInfo serviceInfo = updateServiceInfoAndAuditStatus(jobUUID, JobStatus.FAILED);
+        List<ServiceInfo> serviceInfoList = dataAccessService.getList(
+                ServiceInfo.class,
+                String.format(" where templateId = '%s' and jobStatus = '%s'",
+                        serviceInfo.getTemplateId(),
+                        JobStatus.PENDING),
+                null, null);
+        serviceInfoList.forEach(si -> updateServiceInfoAndAuditStatus(si.getJobId(), JobStatus.STOPPED));
+    }
+
+    @Override
+    public void deleteJob(UUID jobId) {
+        jobService.delete(jobId);
+        Date now = new Date();
+        updateServiceInfo(jobId, x -> x.setDeletedAt(now));
+    }
+
+    @Override
+    public void hideServiceInfo(UUID jobUUID) {
+        ServiceInfo serviceInfo = getServiceInfoByJobId(jobUUID);
+        if (!serviceInfo.getJobStatus().isFinal()) {
+            String message = String.format( "jobId %s: Service status does not allow hide service, status = %s",
+                    serviceInfo.getJobId(),
+                    serviceInfo.getJobStatus());
+            logger.error(EELFLoggerDelegate.errorLogger, message);
+            throw new OperationNotAllowedException(message);
+        }
+        serviceInfo.setHidden(true);
+        dataAccessService.saveDomainObject(serviceInfo, DaoUtils.getPropsMap());
+    }
+
+    @Override
+    public int
+
+
+    getCounterForName(String name) {
+
+        String hqlSelectNC = "from NameCounter where name = :name";
+        String hqlUpdateCounter = "update NameCounter set counter = :newCounter " +
+                "where name= :name " +
+                "and counter= :prevCounter";
+
+        Integer counter = null;
+        GenericUncheckedException lastException = null;
+        for (int i = 0; i< MAX_RETRIES_GETTING_COUNTER && counter==null; i++) {
+            try {
+                counter = calcCounter(name, hqlSelectNC, hqlUpdateCounter);
+            }
+            catch (GenericUncheckedException exception) {
+                lastException = exception; //do nothing, we will try again in the loop
+            }
+        }
+
+        if (counter!=null) {
+            return counter;
+        }
+
+        throw lastException!=null ? new DbFailureUncheckedException(lastException) :
+                new DbFailureUncheckedException("Failed to get counter for "+name+" due to unknown error");
+
+    }
+
+    private Integer calcCounter(String name, String hqlSelectNC, String hqlUpdateCounter) {
+        Integer counter;
+        counter = DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
+            NameCounter nameCounter = (NameCounter) session.createQuery(hqlSelectNC)
+                    .setText("name", name)
+                    .uniqueResult();
+            if (nameCounter != null) {
+                int updatedRows = session.createQuery(hqlUpdateCounter)
+                        .setText("name", nameCounter.getName())
+                        .setInteger("prevCounter", nameCounter.getCounter())
+                        .setInteger("newCounter", nameCounter.getCounter() + 1)
+                        .executeUpdate();
+                if (updatedRows == 1) {
+                    return nameCounter.getCounter() + 1;
+                }
+            } else {
+                Object nameAsId = session.save(new NameCounter(name));
+                //if save success
+                if (nameAsId != null) {
+                    return 1;
+                }
+            }
+            //in case of failure return null, in order to continue the loop
+            return null;
+        });
+        return counter;
+    }
+
+    @Override
+    public int getMaxRetriesGettingFreeNameFromAai() {
+        return maxRetriesGettingFreeNameFromAai;
+    }
+
+    @Override
+    public void setMaxRetriesGettingFreeNameFromAai(int maxRetriesGettingFreeNameFromAai) {
+        this.maxRetriesGettingFreeNameFromAai = maxRetriesGettingFreeNameFromAai;
+    }
+
+    @Override
+    public String getUniqueName(String name, ResourceType resourceType) {
+        //check that name aai response well before increasing counter from DB
+        //Prevents unnecessary increasing of the counter while AAI doesn't response
+        isNameFreeInAai(NAME_FOR_CHECK_AAI_STATUS, resourceType);
+
+        for (int i=0; i<getMaxRetriesGettingFreeNameFromAai(); i++) {
+            int counter = getCounterForName(name);
+            String newName = formatNameAndCounter(name, counter);
+            if (isNameFreeInAai(newName, resourceType)) {
+                return newName;
+            }
+        }
+
+        throw new MaxRetriesException("find unused name for "+name, getMaxRetriesGettingFreeNameFromAai());
+    }
+
+    //the method is protected so we can call it in the UT
+    protected String formatNameAndCounter(String name, int counter) {
+        return name + "_" + String.format("%03d", counter);
+    }
+
+    private boolean isNameFreeInAai(String name, ResourceType resourceType) throws InvalidAAIResponseException {
+        AaiResponse<AaiNodeQueryResponse> aaiResponse = aaiClient.searchNodeTypeByName(name, resourceType);
+        if (aaiResponse.getHttpCode() > 399 || aaiResponse.getT() == null) {
+            throw new InvalidAAIResponseException(aaiResponse);
+        }
+        return CollectionUtils.isEmpty(aaiResponse.getT().resultData);
+    }
+*/
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/DummyAsyncRequest.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/DummyAsyncRequest.java
new file mode 100644
index 0000000..22ce508
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/DummyAsyncRequest.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.onap.osam.job.IJobFactory;
+
+/**
+ * Currently - dummy class for demo purposes
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DummyAsyncRequest implements IJobFactory.AsyncJobRequest {
+
+    @JsonProperty("dummyString")
+    private String dummyString;
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobData.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobData.java
new file mode 100644
index 0000000..4e9ceff
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobData.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import org.onap.osam.job.JobType;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.TreeMap;
+
+public class JobData {
+
+    private TreeMap<JobType, Map<String, Object>> commandData;
+    private JobSharedData sharedData;
+
+    public JobData() {
+        commandData = new TreeMap<>();
+        sharedData = new JobSharedData();
+    }
+
+    public JobData(TreeMap<JobType, Map<String, Object>> commandData, JobSharedData sharedData) {
+        this.commandData = commandData;
+        this.sharedData = sharedData;
+    }
+
+    public TreeMap<JobType, Map<String, Object>> getCommandData() {
+        return commandData;
+    }
+
+    public void setCommandData(TreeMap<JobType, Map<String, Object>> commandData) {
+        this.commandData = commandData;
+    }
+
+    public JobSharedData getSharedData() {
+        return sharedData;
+    }
+
+    public void setSharedData(JobSharedData sharedData) {
+        this.sharedData = sharedData;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof JobData)) return false;
+        JobData jobData = (JobData) o;
+        return Objects.equals(getCommandData(), jobData.getCommandData()) &&
+                Objects.equals(getSharedData(), jobData.getSharedData());
+    }
+
+    @Override
+    public int hashCode() {
+
+        return Objects.hash(getCommandData(), getSharedData());
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobFactory.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobFactory.java
new file mode 100644
index 0000000..a8ab0ce
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobFactory.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.JobType;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.UUID;
+
+@Component
+public class JobFactory implements IJobFactory {
+
+    @Override
+    public OsamJob createRootJob(JobType jobType, AsyncJobRequest request, String userId, Integer indexInBulk, Map<String, Object> jobData){
+        OsamJob job = new OsamJob();
+        job.setStatus(JobStatus.PENDING);
+        job.setUuid(UUID.randomUUID());
+        job.setUserId(userId);
+        job.setTypeAndData(jobType, jobData);
+        job.setSharedData(new JobSharedData(job.getUuid(), userId, request));
+        job.setIndexInBulk(indexInBulk);
+        return job;
+    }
+
+    @Override
+    public OsamJob createChildJob(JobType jobType, JobStatus jobStatus, AsyncJobRequest request, JobSharedData parentSharedData, Map<String, Object> jobData) {
+        OsamJob job = new OsamJob();
+        job.setStatus(jobStatus);
+        job.setUuid(UUID.randomUUID());
+        job.setUserId(parentSharedData.getUserId());
+        job.setTypeAndData(jobType, jobData);
+        job.setSharedData(new JobSharedData(job.getUuid(), request, parentSharedData));
+        return job;
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSchedulerInitializer.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSchedulerInitializer.java
new file mode 100644
index 0000000..526b823
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSchedulerInitializer.java
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.common.exception.GenericUncheckedException;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.IJobsDataAccessService;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.quartz.JobBuilder;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.SimpleTrigger;
+import org.quartz.TriggerBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
+
+@Slf4j
+@Component
+public class JobSchedulerInitializer {
+
+    private IJobsDataAccessService jobsDataAccessService;
+    private SchedulerFactoryBean schedulerFactoryBean;
+    private JobCommandFactory jobCommandFactory;
+
+    @Autowired
+    public JobSchedulerInitializer(
+            IJobsDataAccessService jobsDataAccessService,
+            SchedulerFactoryBean schedulerFactoryBean,
+            JobCommandFactory JobCommandFactory
+    ) {
+        this.jobsDataAccessService = jobsDataAccessService;
+        this.schedulerFactoryBean = schedulerFactoryBean;
+        this.jobCommandFactory = JobCommandFactory;
+
+    }
+
+    @PostConstruct
+    public void init() {
+        scheduleJobWorker(JobStatus.PENDING, 1);
+        scheduleJobWorker(JobStatus.CREATING, 1);
+        scheduleJobWorker(JobStatus.IN_PROGRESS, 1);
+        scheduleJobWorker(JobStatus.RESOURCE_IN_PROGRESS, 1);
+    }
+
+    private void scheduleJobWorker(JobStatus topic, int intervalInSeconds) {
+        final Scheduler scheduler = schedulerFactoryBean.getScheduler();
+        JobDetail jobDetail = JobBuilder.newJob().ofType(JobWorker.class)
+                .withIdentity("AsyncWorkersJob" + topic)
+                .withDescription("Job that run async worker for " + topic)
+                .setJobData(new JobDataMap(ImmutableMap.of(
+                        "jobsDataAccessService", jobsDataAccessService,
+                        "jobCommandFactory", jobCommandFactory,
+                        "topic", topic
+                )))
+                .build();
+        SimpleTrigger asyncWorkerTrigger = TriggerBuilder.newTrigger().forJob(jobDetail)
+                .withIdentity("AsyncWorkersTrigger" + topic)
+                .withDescription("Trigger to run async worker for " + topic)
+                .withSchedule(simpleSchedule().repeatForever().withIntervalInSeconds(intervalInSeconds))
+                .build();
+        try {
+            scheduler.scheduleJob(jobDetail, asyncWorkerTrigger);
+        } catch (SchedulerException e) {
+            log.error("Failed to schedule trigger for async worker jobs: {}", e.getMessage());
+            throw new GenericUncheckedException(e);
+        }
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSharedData.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSharedData.java
new file mode 100644
index 0000000..2c16c95
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobSharedData.java
@@ -0,0 +1,103 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.onap.osam.job.IJobFactory;
+
+import java.util.Objects;
+import java.util.UUID;
+
+public class JobSharedData {
+
+    protected UUID jobUuid;
+    protected String userId;
+    protected Class requestType;
+    protected UUID rootJobId;
+
+    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, property="class")
+    protected IJobFactory.AsyncJobRequest request;
+
+    public JobSharedData() {
+    }
+
+    public JobSharedData(UUID jobUuid, String userId, IJobFactory.AsyncJobRequest request) {
+        this.jobUuid = jobUuid;
+        this.userId = userId;
+        this.requestType = request.getClass();
+        this.request = request;
+        this.rootJobId = jobUuid;
+    }
+
+    public JobSharedData(UUID jobUuid, IJobFactory.AsyncJobRequest request, JobSharedData parentData) {
+        this(jobUuid, parentData.getUserId(), request);
+        rootJobId = parentData.getRootJobId() != null ? parentData.getRootJobId() : parentData.getJobUuid();
+    }
+
+
+    public UUID getJobUuid() {
+        return jobUuid;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public Class getRequestType() {
+        return requestType;
+    }
+
+    public void setRequestType(Class requestType) {
+        this.requestType = requestType;
+    }
+
+    public IJobFactory.AsyncJobRequest getRequest() {
+        return request;
+    }
+
+    public void setRequest(IJobFactory.AsyncJobRequest request) {
+        this.request = request;
+    }
+
+    public UUID getRootJobId() {
+        return rootJobId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof JobSharedData)) return false;
+        JobSharedData that = (JobSharedData) o;
+        return Objects.equals(getJobUuid(), that.getJobUuid()) &&
+                Objects.equals(getUserId(), that.getUserId()) &&
+                Objects.equals(getRequestType(), that.getRequestType()) &&
+                Objects.equals(getRootJobId(), that.getRootJobId()) &&
+                Objects.equals(getRequest(), that.getRequest());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getJobUuid(), getUserId(), getRequestType(), getRootJobId(), getRequest());
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobWorker.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobWorker.java
new file mode 100644
index 0000000..97d52a5
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobWorker.java
@@ -0,0 +1,162 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.onap.osam.job.exceptions.JobException;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.IJobsDataAccessService;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+import java.util.UUID;
+
+
+@Slf4j
+@Component
+public class JobWorker extends QuartzJobBean {
+
+    private IJobsDataAccessService jobsDataAccessService;
+    private JobCommandFactory jobCommandFactory;
+    private JobStatus topic;
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        Optional<OsamJob> job;
+
+        job = pullJob();
+
+        while (job.isPresent()) {
+            OsamJob nextStateOfJob = executeJobAndGetNext(job.get());
+            pushBack(nextStateOfJob);
+            job = pullJob();
+        }
+    }
+
+    private Optional<OsamJob> pullJob() {
+        try {
+            return jobsDataAccessService.pull(topic, UUID.randomUUID().toString());
+        } catch (Exception e) {
+            log.error("failed to pull job from queue, breaking: {}", e, e);
+            tryMutingJobFromException(e);
+
+            return Optional.empty();
+        }
+    }
+
+    private void pushBack(OsamJob nextJob) {
+        try {
+            jobsDataAccessService.pushBack(nextJob);
+        } catch (Exception e) {
+            log.error("failed pushing back job to queue: {}", e, e);
+        }
+    }
+
+    protected OsamJob executeJobAndGetNext(OsamJob job) {
+        //TODO Pavel find out about teplateId
+        log.debug("going to execute job {}: {}/{}",
+                //log.debug("going to execute job {} of {}: {}/{}",
+                String.valueOf(job.getUuid()).substring(0,8),
+                //String.valueOf(job.getTemplateId()).substring(0, 8),
+                job.getStatus(), job.getType());
+
+        NextCommand nextCommand = executeCommandAndGetNext(job);
+
+        return setNextCommandInJob(nextCommand, job);
+    }
+
+    private NextCommand executeCommandAndGetNext(OsamJob job) {
+        NextCommand nextCommand;
+        try {
+            final IJobCommand jobCommand = jobCommandFactory.toCommand(job);
+            nextCommand = jobCommand.call();
+        } catch (Exception e) {
+            log.error("error while executing job from queue: {}", e);
+            nextCommand = new NextCommand(JobStatus.FAILED);
+        }
+
+        if (nextCommand == null) {
+            nextCommand = new NextCommand(JobStatus.STOPPED);
+        }
+        return nextCommand;
+    }
+
+    private OsamJob setNextCommandInJob(NextCommand nextCommand, OsamJob job) {
+        log.debug("transforming job {}: {}/{} -> {}{}",
+                String.valueOf(job.getUuid()).substring(0, 8),
+                job.getStatus(), job.getType(),
+                nextCommand.getStatus(),
+                nextCommand.getCommand() != null ? ("/" + nextCommand.getCommand().getType()) : "");
+
+        job.setStatus(nextCommand.getStatus());
+
+        if (nextCommand.getCommand() != null) {
+            job.setTypeAndData(nextCommand.getCommand().getType(), nextCommand.getCommand().getData());
+        }
+
+        return job;
+    }
+
+
+    private void tryMutingJobFromException(Exception e) {
+        // If there's JobException in the stack, read job uuid from
+        // the exception, and mute it in DB.
+        final int indexOfJobException =
+                ExceptionUtils.indexOfThrowable(e, JobException.class);
+
+        if (indexOfJobException >= 0) {
+            try {
+                final JobException jobException = (JobException) ExceptionUtils.getThrowableList(e).get(indexOfJobException);
+                log.info("muting job: {} ({})", jobException.getJobUuid(), jobException.toString());
+                final boolean success = jobsDataAccessService.mute(jobException.getJobUuid());
+                if (!success) {
+                    log.error("failed to mute job {}", jobException.getJobUuid());
+                }
+            } catch (Exception e1) {
+                log.error("failed to mute job: {}", e1, e1);
+            }
+        }
+    }
+
+    //used by quartz to inject IJobsDataAccessService into the job
+    //see JobSchedulerInitializer
+    public void setJobsDataAccessService(IJobsDataAccessService jobsDataAccessService) {
+        this.jobsDataAccessService = jobsDataAccessService;
+    }
+
+    /*public void setFeatureManager(FeatureManager featureManager) {
+        this.featureManager = featureManager;
+    }*/
+
+    public void setJobCommandFactory(JobCommandFactory jobCommandFactory) {
+        this.jobCommandFactory = jobCommandFactory;
+    }
+
+    public void setTopic(JobStatus topic) {
+        this.topic = topic;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobsDataAccessService.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobsDataAccessService.java
new file mode 100644
index 0000000..18ae378
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/impl/JobsDataAccessService.java
@@ -0,0 +1,211 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.common.exception.GenericUncheckedException;
+import org.onap.osam.common.exception.InvalidOperationException;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobsDataAccessService;
+import org.onap.osam.job.repository.job.OsamJobRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.PostConstruct;
+import java.nio.ByteBuffer;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Optional;
+import java.util.UUID;
+
+@Slf4j
+@Service
+public class JobsDataAccessService implements IJobsDataAccessService {
+
+    private OsamJobRepository osamJobRepository;
+    private Long maxOpenedRequestsToAbstractOlt;
+    private int pollingIntervalSeconds;
+
+    @Autowired
+    public JobsDataAccessService(OsamJobRepository osamJobRepository,
+                                 @Value("0") Long maxOpenedRequestsToAbstractOlt,
+                                 @Value("10") int pollingIntervalSeconds) {
+        // tha @Value will inject conservative defaults; overridden in @PostConstruct from configuration
+        this.osamJobRepository = osamJobRepository;
+        this.maxOpenedRequestsToAbstractOlt = maxOpenedRequestsToAbstractOlt;
+        this.pollingIntervalSeconds = pollingIntervalSeconds;
+    }
+
+    @PostConstruct
+    public void configure() {
+        //TODO define defaults
+        /*maxOpenedRequestsToAbstractOlt = Integer.parseInt(System.getProperty(VidProperties.MSO_MAX_OPENED_INSTANTIATION_REQUESTS));
+        pollingIntervalSeconds = Integer.parseInt(System.getProperty(VidProperties.MSO_ASYNC_POLLING_INTERVAL_SECONDS));*/
+    }
+
+    public void deleteAll() {
+        osamJobRepository.deleteAll();
+    }
+
+    @Override
+    public UUID add(OsamJob job) {
+        osamJobRepository.save(job);
+        return job.getUuid();
+    }
+
+    @Override
+    public Optional<OsamJob> pull(JobStatus topic, String ownerId) {
+        OsamJob osamJob;
+        int updatedEntities;
+        do {
+
+            Optional<OsamJob> optionalOsamJob = selectQueryByJobStatus(topic);
+            if (!optionalOsamJob.isPresent()) {
+                return optionalOsamJob;
+            }
+
+            osamJob = optionalOsamJob.get();
+            final UUID uuid = osamJob.getUuid();
+            final Integer age = osamJob.getAge();
+
+            osamJob.setTakenBy(ownerId);
+
+            // It might become that a job was taken and pushed-back already, before we
+            // arrived here, so we're verifying the age was not pushed forward.
+            // Age is actually forwarded upon pushBack().
+            updatedEntities = osamJobRepository.updateOsamCoreJobsAge(ownerId, uuid, age);
+
+        } while (updatedEntities == 0);
+
+        return Optional.ofNullable(osamJob);
+    }
+
+    private java.sql.Timestamp nowMinusInterval() {
+        return Timestamp.valueOf(LocalDateTime.now().minusSeconds(pollingIntervalSeconds));
+    }
+
+    private Optional<OsamJob> selectQueryByJobStatus(JobStatus topic){
+        //TODO Pavel understand this interval
+        //String intervalCondition = (topic==JobStatus.CREATING) ? "" : (" and MODIFIED_DATE <= '" + nowMinusInterval()+"'");
+        return osamJobRepository.queryFirst1ByStatusAndTakenByIsNullAndDeletedAtIsNullOrderByModifiedDateAsc(topic).stream().findFirst();
+
+    }
+
+    private Optional<OsamJob> sqlQueryForTopic(JobStatus topic) {
+        switch (topic) {
+            case IN_PROGRESS:
+            case RESOURCE_IN_PROGRESS:
+            case CREATING:
+            case PENDING:
+                return selectQueryByJobStatus(topic);
+            //TODO Pavel - at first stage, using the naive query for pending topic
+            /*case PENDING:
+                return osamJobRepository.findOsamJobsPending(maxOpenedRequestsToAbstractOlt);*/
+            default:
+                throw new GenericUncheckedException("Unsupported topic to pull from: " + topic);
+        }
+    }
+
+
+    private byte[] getUuidAsByteArray(UUID owner) {
+        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
+        bb.putLong(owner.getMostSignificantBits());
+        bb.putLong(owner.getLeastSignificantBits());
+        return bb.array();
+    }
+
+    @Override
+    public void pushBack(OsamJob job) {
+        final Optional<OsamJob> remoteDaoJob = osamJobRepository.findByUuid(job.getUuid());
+
+        if (!remoteDaoJob.isPresent()) {
+            throw new IllegalStateException("Can push back only pulled jobs. Add new jobs using add()");
+        }
+
+        if (remoteDaoJob.get().getTakenBy() == null) {
+            throw new IllegalStateException("Can push back only pulled jobs. This one already pushed back.");
+        }
+
+        job.setTakenBy(null);
+
+        Integer age = job.getAge();
+        job.setAge(age + 1);
+
+        log.debug("{}/{}", job.getStatus(), job.getType());
+
+        osamJobRepository.save(job);
+    }
+
+    /*private OsamJob castToOsamJob(OsamJob job) {
+        if (!(job instanceof OsamJob)) {
+            throw new UnsupportedOperationException("Can't add " + job.getClass() + " to " + this.getClass());
+        }
+        return (OsamJob) job;
+    }*/
+
+    @Override
+    public Collection<OsamJob> peek() {
+        return Lists.newArrayList(osamJobRepository.findAll());
+    }
+
+    @Override
+    public OsamJob peek(UUID jobId) {
+        return osamJobRepository.findByUuid(jobId).orElse(null);
+    }
+
+    @Override
+    public void delete(UUID jobId) {
+        Date now = new Date();
+        Integer updatedEntities = osamJobRepository.updateOsamCoreJobToBeDeleted(now, jobId, JobStatus.PENDING.toString(), JobStatus.STOPPED.toString());
+
+        if (updatedEntities == 0) {
+            final Optional<OsamJob> remoteDaoJob = osamJobRepository.findByUuid(jobId);
+
+            if (!remoteDaoJob.isPresent() || remoteDaoJob.get().getUuid() == null) {
+                log.debug("jobId {}: Service does not exist", jobId);
+                throw new InvalidOperationException("Service does not exist");
+            }
+
+            if (!remoteDaoJob.get().equals(JobStatus.PENDING) && !remoteDaoJob.get().getStatus().equals(JobStatus.STOPPED) || !StringUtils.isEmpty(remoteDaoJob.get().getTakenBy())) {
+                log.debug("jobId {}: Service status does not allow deletion from the queue, status = {}", jobId, remoteDaoJob.get().getStatus() +
+                ", takenBy " + remoteDaoJob.get().getTakenBy());
+                throw new InvalidOperationException("Service status does not allow deletion from the queue");
+            }
+
+            throw new InvalidOperationException("Service deletion failed");
+        }
+    }
+
+    @Override
+    public boolean mute(UUID jobId) {
+        if (jobId == null) {
+            return false;
+        }
+        final String prefix = "DUMP";
+        Integer updatedEntities = osamJobRepository.muteOsamCoreJob(jobId, prefix);
+        return updatedEntities != 0;
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/repository/job/OsamJobRepository.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/repository/job/OsamJobRepository.java
new file mode 100644
index 0000000..f473c5d
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/repository/job/OsamJobRepository.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.repository.job;
+
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface OsamJobRepository extends CrudRepository<OsamJob, Long> {
+
+
+
+    Optional<OsamJob> findByUuid(UUID uuid);
+
+    List<OsamJob> findAllByUuid(Iterable<UUID> uuids);
+
+    //TODO Pavel add intervalCondition to the query
+    //String intervalCondition = (topic==JobStatus.CREATING) ? "" : (" and MODIFIED_DATE <= '" + nowMinusInterval()+"'");
+    //@Query("select o from OsamJob o where o.status = :status and o.takenBy is null and o.deletedAt is null order by o.modifiedDate asc")
+    //List<OsamJob> queryFirst1ByStatusAndTakenByIsNullAndDeleteAtIsNullOrderByModifiedDateAsc(@Param("status") JobStatus status);
+    List<OsamJob> queryFirst1ByStatusAndTakenByIsNullAndDeletedAtIsNullOrderByModifiedDateAsc(@Param("status") JobStatus status);
+
+    //Updates
+
+    @Transactional
+    @Modifying
+    @Query("update OsamJob job set job.takenBy = :takenBy where job.uuid = :uuid and job.age = :age and job.takenBy is null")
+    Integer updateOsamCoreJobsAge(@Param("takenBy") String takenBy, @Param("uuid") UUID uuid, @Param("age") Integer age);
+
+    @Transactional
+    @Modifying
+    @Query("update OsamJob job set job.deletedAt = :now where job.uuid = :uuid and job.status in(:pending, :stopped) and job.takenBy is null")
+    Integer updateOsamCoreJobToBeDeleted(@Param("now") Date date, @Param("uuid") UUID uuid, @Param("pending") String pending, @Param("stopped") String stopped);
+
+    @Transactional
+    @Modifying
+    @Query("update OsamJob job set job.status = concat(':prefix_',job.status), job.takenBy = null where job.uuid = :uuid and job.status not like ':prefix_%'")
+    Integer muteOsamCoreJob(@Param("uuid") UUID uuid, @Param("")String prefix);
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/Streams.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/Streams.java
new file mode 100644
index 0000000..35ffb98
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/Streams.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.utils;
+
+import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public class Streams {
+    public static <R> Predicate<R> not(Predicate<R> predicate) {
+        return predicate.negate();
+    }
+
+    public static <T> Stream<T> fromIterator(final Iterator<T> iterator) {
+        Iterable<T> iterable = () -> iterator;
+        return StreamSupport.<T>stream(iterable.spliterator(), false);
+    }
+
+
+    // https://stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate
+    private static <T> Spliterator<T> takeWhile(
+            Spliterator<T> splitr, Predicate<? super T> predicate) {
+        return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
+            boolean stillGoing = true;
+            @Override public boolean tryAdvance(Consumer<? super T> consumer) {
+                if (stillGoing) {
+                    boolean hadNext = splitr.tryAdvance(elem -> {
+                        if (predicate.test(elem)) {
+                            consumer.accept(elem);
+                        } else {
+                            stillGoing = false;
+                        }
+                    });
+                    return hadNext && stillGoing;
+                }
+                return false;
+            }
+        };
+    }
+
+    public static <T> Stream<T> takeWhile(Stream<T> stream, Predicate<? super T> predicate) {
+        return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false);
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/TimeUtils.java b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/TimeUtils.java
new file mode 100644
index 0000000..bbd7ec3
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/main/java/org/onap/osam/job/utils/TimeUtils.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.utils;
+
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class TimeUtils {
+    private static DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
+
+    private TimeUtils() {
+        // explicit private constructor, to hide the implicit public constructor
+    }
+
+    public static ZonedDateTime parseZonedDateTime(String time) {
+
+        return ZonedDateTime.from(formatter.parse(time));
+    }
+
+    public static String zonedDateTimeToString(ZonedDateTime time) {
+        return formatter.format(time);
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java
new file mode 100644
index 0000000..0ea9933
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/JobCommandFactoryTest.java
@@ -0,0 +1,122 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableMap;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.JobType;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.onap.osam.job.impl.JobSharedData;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class JobCommandFactoryTest {
+
+    private JobCommandFactory jobCommandFactory;
+
+    @Mock
+    private OsamJob job;
+
+    @Mock
+    private IJobCommand mockCommand;
+
+    @BeforeMethod
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @BeforeMethod
+    public void setUp() {
+        jobCommandFactory = new JobCommandFactory(any -> mockCommand);
+    }
+
+    @DataProvider
+    public Object[][] jobTypes() {
+        return Arrays.stream(
+                JobType.values()
+        ).map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
+
+    }
+
+    public static class MockedRequest implements IJobFactory.AsyncJobRequest {
+
+        final public int x;
+        final public String y;
+
+        @JsonCreator
+        public MockedRequest(@JsonProperty("x")int x, @JsonProperty("y")String y) {
+            this.x = x;
+            this.y = y;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof MockedRequest)) return false;
+            MockedRequest that = (MockedRequest) o;
+            return x == that.x &&
+                    Objects.equals(y, that.y);
+        }
+
+        @Override
+        public int hashCode() {
+
+            return Objects.hash(x, y);
+        }
+    }
+
+    @Test(dataProvider = "jobTypes")
+    public void givenJob_createCommandCallsTheInitAndReturnsTheInstance(JobType jobType) {
+
+        final UUID uuid = UUID.randomUUID();
+        final Map<String, Object> data = ImmutableMap.of("foo", "bar");
+        final JobSharedData sharedData = new JobSharedData(uuid, "userid", new MockedRequest(1,"a"));
+
+        when(job.getType()).thenReturn(jobType);
+        when(job.getUuid()).thenReturn(uuid);
+        when(job.getDataMap()).thenReturn(data);
+        when(job.getSharedData()).thenReturn(sharedData);
+
+        final IJobCommand command = jobCommandFactory.toCommand(job);
+
+        verify(mockCommand).init(sharedData, data);
+
+        assertThat(command, equalTo(mockCommand));
+    }
+
+}
diff --git a/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/WatchingCommandTest.java b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/WatchingCommandTest.java
new file mode 100644
index 0000000..0e595a6
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/command/WatchingCommandTest.java
@@ -0,0 +1,105 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.command;
+
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.AsyncJobService;
+import org.onap.osam.job.command.WatchingCommand;
+import org.onap.osam.job.impl.JobSharedData;
+import org.onap.osam.job.repository.job.OsamJobRepository;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.*;
+
+public class WatchingCommandTest {
+
+    @Mock
+    private AsyncJobService asyncInstantiationBL;
+
+    @Mock
+    private OsamJobRepository osamJobRepository;
+
+    @InjectMocks
+    private WatchingCommand watchingCommand = new WatchingCommand();
+
+    @DataProvider
+    public static Object[][] expectedJobStatusDataProvider() {
+        return new Object[][]{
+                {Arrays.asList(JobStatus.COMPLETED, JobStatus.COMPLETED), JobStatus.COMPLETED, true},
+                {Arrays.asList(JobStatus.FAILED, JobStatus.COMPLETED), JobStatus.COMPLETED_WITH_ERRORS, true},
+                {Arrays.asList(JobStatus.STOPPED, JobStatus.COMPLETED), JobStatus.COMPLETED_WITH_ERRORS, false},
+                {Arrays.asList(JobStatus.IN_PROGRESS, JobStatus.FAILED), JobStatus.IN_PROGRESS, true},
+                {Arrays.asList(JobStatus.IN_PROGRESS, JobStatus.COMPLETED), JobStatus.IN_PROGRESS, true},
+                {Arrays.asList(JobStatus.IN_PROGRESS, JobStatus.IN_PROGRESS), JobStatus.IN_PROGRESS, true},
+                {Arrays.asList(null, JobStatus.COMPLETED), JobStatus.COMPLETED_WITH_ERRORS, true},
+                {Arrays.asList(null, JobStatus.IN_PROGRESS), JobStatus.IN_PROGRESS, true},
+                {Arrays.asList(null, JobStatus.FAILED), JobStatus.COMPLETED_WITH_ERRORS, false},
+                {new ArrayList<>(), JobStatus.COMPLETED, true}
+        };
+    }
+
+    @BeforeMethod
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test(dataProvider = "expectedJobStatusDataProvider")
+    public void testAssertNextCommandIsValid(List<JobStatus> childJobs, JobStatus expectedCommandStatus, boolean isService) {
+        //init sql result mock
+        List<OsamJob> mockChildren = childJobs.stream().map(st -> {
+            OsamJob job = new OsamJob();
+            job.setUuid(UUID.randomUUID());
+            job.setStatus(st);
+            return job;
+        }).collect(Collectors.toList());
+        when(osamJobRepository.findAllByUuid(any()))
+                .thenReturn(mockChildren);
+
+        //init job data for watching command
+        UUID jobUUID = UUID.randomUUID();
+        JobSharedData sharedData = new JobSharedData(jobUUID, "mockedUserID", mock(TestRequest.class));
+        List<UUID> uuids = mockChildren.stream().map(job -> job.getUuid()).collect(Collectors.toList());
+        watchingCommand.init(sharedData, uuids, isService);
+
+        //execute command and verify
+        NextCommand nextCommand = watchingCommand.call();
+        assertThat(nextCommand.getStatus(), is(expectedCommandStatus));
+    }
+
+    public static class TestRequest implements IJobFactory.AsyncJobRequest{}
+}
diff --git a/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobAdapterTest.java b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobAdapterTest.java
new file mode 100644
index 0000000..289cd99
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobAdapterTest.java
@@ -0,0 +1,113 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang3.RandomUtils;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.JobType;
+import org.onap.osam.job.command.JobCommandFactoryTest;
+import org.testng.annotations.Test;
+
+import java.util.UUID;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotEquals;
+import static org.testng.AssertJUnit.assertNotNull;
+
+public class JobAdapterTest {
+
+    @Test
+    public void testCreateServiceInstantiationJob() {
+        IJobFactory jobAdapter = new JobFactory();
+
+        JobType jobType = JobType.NoOp;
+        IJobFactory.AsyncJobRequest request = new JobCommandFactoryTest.MockedRequest(42,"nothing");
+        String userId = "ou012t";
+        String optimisticUniqueServiceInstanceName = "optimisticUniqueServiceInstanceName";
+        int indexInBulk = RandomUtils.nextInt();
+        OsamJob job = jobAdapter.createRootJob(
+                jobType,
+                request,
+                userId,
+                indexInBulk,
+                ImmutableMap.of());
+
+        assertEquals(job.getType(), jobType);
+        assertEquals(job.getSharedData().getRequest(), request);
+        assertEquals(job.getSharedData().getRequestType(), request.getClass());
+        assertEquals(job.getSharedData().getUserId(), userId);
+        assertEquals(job.getSharedData().getJobUuid(), job.getUuid());
+        assertEquals(job.getSharedData().getRootJobId(), job.getUuid());
+        assertNotNull(job.getUuid());
+        assertEquals((int)job.getIndexInBulk(), indexInBulk );
+        assertEquals(job.getStatus(), JobStatus.PENDING);
+    }
+
+    @Test
+    public void testCreateChildJob() {
+
+        IJobFactory jobAdapter = new JobFactory();
+
+        String userId = "ou012t";
+        String optimisticUniqueServiceInstanceName = "optimisticUniqueServiceInstanceName";
+        int indexInBulk = RandomUtils.nextInt();
+        OsamJob grandJob = jobAdapter.createRootJob(
+                JobType.HttpCall,
+                new JobCommandFactoryTest.MockedRequest(99, "anything"),
+                userId,
+                indexInBulk,
+                ImmutableMap.of()
+        );
+
+        JobStatus jobStatus = JobStatus.PAUSE;
+        JobType jobType = JobType.NoOp;
+        IJobFactory.AsyncJobRequest request = new JobCommandFactoryTest.MockedRequest(42,"nothing");
+        OsamJob parentJob = jobAdapter.createChildJob(jobType, jobStatus, request, grandJob.getSharedData(), ImmutableMap.of());
+
+        assertEquals(parentJob.getType(), jobType);
+        assertEquals(parentJob.getSharedData().getRequest(), request);
+        assertEquals(parentJob.getSharedData().getRequestType(), request.getClass());
+        assertEquals(parentJob.getSharedData().getUserId(), userId);
+        assertEquals(parentJob.getSharedData().getJobUuid(), parentJob.getUuid());
+        assertNotNull(parentJob.getUuid());
+        assertNotEquals(parentJob.getUuid(), grandJob.getUuid());
+        assertEquals(parentJob.getStatus(), jobStatus);
+        assertEquals(parentJob.getSharedData().getRootJobId(), grandJob.getUuid());
+
+        JobStatus jobStatus2 = JobStatus.IN_PROGRESS;
+        JobType jobType2 = JobType.HttpCall;
+        IJobFactory.AsyncJobRequest request2 = new JobCommandFactoryTest.MockedRequest(66,"abc");
+        OsamJob job = jobAdapter.createChildJob(jobType2, jobStatus2, request2, parentJob.getSharedData(), ImmutableMap.of());
+
+        assertEquals(job.getType(), jobType2);
+        assertEquals(job.getSharedData().getRequest(), request2);
+        assertEquals(job.getSharedData().getRequestType(), request2.getClass());
+        assertEquals(job.getSharedData().getUserId(), userId);
+        assertEquals(job.getSharedData().getJobUuid(), job.getUuid());
+        assertNotNull(job.getUuid());
+        assertNotEquals(job.getUuid(), parentJob.getUuid());
+        assertEquals(job.getStatus(), jobStatus2);
+        assertEquals(job.getSharedData().getRootJobId(), grandJob.getUuid());
+
+    }
+}
diff --git a/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java
new file mode 100644
index 0000000..f38c238
--- /dev/null
+++ b/osam-core-framework/async-jobs/src/test/java/org/onap/osam/job/impl/JobWorkerTest.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.job.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang3.RandomUtils;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.hamcrest.Matcher;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.job.dao.job.JobStatus;
+import org.onap.osam.job.dao.job.OsamJob;
+import org.onap.osam.job.IJobFactory;
+import org.onap.osam.job.IJobCommand;
+import org.onap.osam.job.JobType;
+import org.onap.osam.job.NextCommand;
+import org.onap.osam.job.command.HttpCallCommand;
+import org.onap.osam.job.command.JobCommandFactory;
+import org.onap.osam.job.impl.JobFactory;
+import org.onap.osam.job.impl.JobWorker;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.Map;
+import java.util.UUID;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.hamcrest.core.Is.is;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class JobWorkerTest {
+
+
+    @Mock
+    private JobCommandFactory jobCommandFactory;
+
+    @InjectMocks
+    private JobWorker jobWorker = new JobWorker();
+
+    private final IJobCommand jobCommand = mock(IJobCommand.class);
+    private OsamJob jobUnderTest;
+    private IJobFactory.AsyncJobRequest originalData;
+    private JobType originalType;
+
+    @BeforeMethod
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+
+        when(jobCommandFactory.toCommand(any())).thenReturn(jobCommand);
+
+        originalData = new IJobFactory.AsyncJobRequest() {
+            public final Map datum = ImmutableMap.of("some", "data");
+            public final String foobar = "aux";
+        };
+
+        originalType = JobType.HttpCall;
+        jobUnderTest = new JobFactory().createRootJob(
+                originalType,
+                originalData,
+                "my user id",
+                RandomUtils.nextInt(),
+                ImmutableMap.of()
+        );
+    }
+
+    @Test
+    public void executeJobAndStepToNext_givenNull_onlyStatusModified() {
+
+        assertNextJobAfterExecuteJob(null, new String[]{"status"}, allOf(
+                hasProperty("status", is(JobStatus.STOPPED)),
+                hasProperty("sharedData", hasProperty("request", is(originalData))),
+                hasProperty("type", is(originalType)))
+        );
+    }
+
+    @Test
+    public void executeJobAndStepToNext_givenNextJob_jobDataIsModified() {
+
+        final JobStatus nextStatus = JobStatus.IN_PROGRESS;
+
+        final UUID jobUuid = UUID.randomUUID();
+        final NextCommand nextCommand = new NextCommand(nextStatus, new HttpCallCommand("my strange url", jobUuid));
+
+        String[] excludedFields = {"status", "data", "type"};
+
+        assertNextJobAfterExecuteJob(nextCommand, excludedFields, allOf(
+                hasProperty("status", is(nextStatus)),
+                hasProperty("dataMap", is(nextCommand.getCommand().getData())),
+                hasProperty("type", is(nextCommand.getCommand().getType())))
+        );
+    }
+
+    private void assertNextJobAfterExecuteJob(NextCommand nextCommand, String[] excludedFields, Matcher<OsamJob> jobMatcher) {
+        when(jobCommand.call()).thenReturn(nextCommand);
+
+        String jobBefore = new ReflectionToStringBuilder(jobUnderTest, ToStringStyle.SHORT_PREFIX_STYLE).setExcludeFieldNames(excludedFields).toString();
+
+        ////// FUNCTION UNDER TEST /////
+        OsamJob nextJob = jobWorker.executeJobAndGetNext(jobUnderTest);
+        ////////////////////////////////
+
+        String jobAfter = new ReflectionToStringBuilder(nextJob, ToStringStyle.SHORT_PREFIX_STYLE).setExcludeFieldNames(excludedFields).toString();
+
+        assertThat(nextJob, jobMatcher);
+        assertThat(jobAfter, equalTo(jobBefore));
+    }
+}
diff --git a/osam-core-framework/common/pom.xml b/osam-core-framework/common/pom.xml
new file mode 100644
index 0000000..f91bf82
--- /dev/null
+++ b/osam-core-framework/common/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>common</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>osam-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/AbstractOLTException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/AbstractOLTException.java
new file mode 100644
index 0000000..001198a
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/AbstractOLTException.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+public class AbstractOLTException extends GenericUncheckedException {
+    public AbstractOLTException(String message) {
+        super(message);
+    }
+    public AbstractOLTException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java
new file mode 100644
index 0000000..c7ef4df
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+
+/**
+ * Created by cemturker on 19.09.2018.
+ */
+public class BadFormatException extends GenericUncheckedException {
+    public BadFormatException(String message) {
+        super(message);
+    }
+    public BadFormatException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java
new file mode 100644
index 0000000..60183a2
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+public class GenericUncheckedException extends RuntimeException {
+    public GenericUncheckedException(String message) {
+        super(message);
+    }
+
+    public GenericUncheckedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public GenericUncheckedException(Throwable cause) {
+        super(cause);
+    }
+
+    public GenericUncheckedException(String format, Object... arguments) {
+        super(String.format(format, arguments));
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java
new file mode 100644
index 0000000..75447a4
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public class InvalidOperationException extends GenericUncheckedException {
+    public InvalidOperationException(String message) {
+        super(message);
+    }
+    public InvalidOperationException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java
new file mode 100644
index 0000000..10be17a
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public class NotFoundException extends GenericUncheckedException {
+    public NotFoundException(String message) {
+        super(message);
+    }
+    public NotFoundException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/ServerException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/ServerException.java
new file mode 100644
index 0000000..07bf68c
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/ServerException.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+
+/**
+ * Created by Zafer Kaban on 07.12.2018.
+ */
+public class ServerException extends GenericUncheckedException {
+    public ServerException(String message) {
+        super(message);
+    }
+    public ServerException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java
new file mode 100644
index 0000000..4781a72
--- /dev/null
+++ b/osam-core-framework/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.common.exception;
+
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public class UnknownTypeException extends GenericUncheckedException {
+    public UnknownTypeException(String message) {
+        super(message);
+    }
+    public UnknownTypeException(String format, Object... arguments) {
+        super(format,arguments);
+    }
+}
diff --git a/osam-core-framework/core/pom.xml b/osam-core-framework/core/pom.xml
new file mode 100644
index 0000000..ba559c1
--- /dev/null
+++ b/osam-core-framework/core/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>core</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>external</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
new file mode 100644
index 0000000..ef69df9
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.model.dao.BaseEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+
+public abstract class AbstractBaseServiceImpl {
+
+    protected Logger log = LoggerFactory.getLogger(this.getClass());
+
+    protected <T extends BaseEntity> T add(T t, CrudRepository<T, Long> repository) {
+        t = repository.save(t);
+        log.info("{} is added",t);
+        return t;
+    }
+
+    protected <T extends BaseEntity> void remove(Long id, CrudRepository<T, Long> repository, Class classz) {
+        repository.deleteById(id);
+        log.info("{} is deleted for {}", id, classz.getName());
+    }
+
+    protected <T extends BaseEntity> T get(Long id, CrudRepository<T, Long> repository) {
+        Optional<T> optional = repository.findById(id);
+        if (!optional.isPresent()) {
+            throw new NotFoundException("id:"+id+" is not found");
+        }
+        return optional.get();
+    }
+
+    protected <T extends BaseEntity> List<T> getAll(CrudRepository<T, Long> repository) {
+        List<T> ts = new ArrayList<>();
+        repository.findAll().iterator().forEachRemaining(ts::add);
+        return Collections.unmodifiableList(ts);
+    }
+
+    protected <T extends BaseEntity> Long count(CrudRepository<T, Long> repository) {
+        return repository.count();
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
new file mode 100644
index 0000000..4113d1b
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.external.aai.AaiClient;
+import org.onap.osam.external.aai.model.PNF;
+import org.onap.osam.model.dao.AccessPod;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.model.repository.AccessPodRepository;
+import org.onap.osam.api.service.AccessPodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+@Service
+public class AccessPodServiceImpl extends AbstractBaseServiceImpl implements AccessPodService {
+
+    private AccessPodRepository accessPodRepository;
+
+    private AaiClient aaiClient;
+
+    @Autowired
+    public AccessPodServiceImpl(AccessPodRepository accessPodRepository, AaiClient aaiClient) {
+        this.accessPodRepository = accessPodRepository;
+        this.aaiClient = aaiClient;
+    }
+
+
+    @Override
+    public AccessPod addOrUpdate(AccessPod value) {
+        //aai logic is commented out, to allow manual registering of SEBA PODs in OSAM Core
+        //PNF pnf = aaiClient.queryPnf(value.getPnfId());
+        Optional<AccessPod> accessPodOptional = accessPodRepository.findByPnfId(value.getPnfId());
+        if (accessPodOptional.isPresent()) {
+            AccessPod tmp = accessPodOptional.get();
+            value.setId(tmp.getId());
+        }
+        add(value,accessPodRepository);
+        //TODO need to update connection to grpc!!
+        return value;
+    }
+
+    @Override
+    public void removeById(Long key) {
+        remove(key,accessPodRepository,AccessPod.class);
+    }
+
+    @Override
+    public AccessPod getById(Long key) {
+        return get(key,accessPodRepository);
+    }
+
+    @Override
+    public List<AccessPod> getAll() {
+        return getAll(accessPodRepository);
+    }
+
+    @Override
+    public AccessPod findByPnfId(String pnfId) {
+        Optional<AccessPod> accessPodOp = accessPodRepository.findByPnfId(pnfId);
+        if (!accessPodOp.isPresent()) {
+            log.error("Access POD with pnfId : {} is not found", pnfId);
+            throw new NotFoundException("Access POD with pnfId : {} is not found", pnfId);
+        }
+        return accessPodOp.get();
+    }
+
+    @Override
+    public void removeByPnfId(String pnfId) {
+        accessPodRepository.removeByPnfId(pnfId);
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
new file mode 100644
index 0000000..57aa5f1
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.model.dao.AlarmsAndEvents;
+import org.onap.osam.api.service.AlarmService;
+import org.onap.osam.common.exception.UnknownTypeException;
+import org.onap.osam.model.dao.ActiveAlarmsAndEvents;
+import org.onap.osam.model.dao.HistoricalAlarmsAndEvents;
+import org.onap.osam.model.repository.ActiveAlarmsAndEventsRepository;
+import org.onap.osam.model.repository.HistoricalAlarmsAndEventsRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class AlarmServiceImpl extends AbstractBaseServiceImpl implements AlarmService {
+
+    ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository;
+    HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository;
+
+    @Autowired
+    public AlarmServiceImpl(ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository,
+                            HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository){
+        this.activeAlarmsAndEventsRepository = activeAlarmsAndEventsRepository;
+        this.historicalAlarmsAndEventsRepository = historicalAlarmsAndEventsRepository;
+    }
+
+    @Override
+    public List<ActiveAlarmsAndEvents> getActiveAlarmsAndEventsByDate(Date startDate, Date endDate) {
+        return activeAlarmsAndEventsRepository.findAllActiveAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual
+                (endDate,startDate);
+    }
+
+    @Override
+    public List<HistoricalAlarmsAndEvents> getHistoricalAlarmsAndEventsByDate(Date startDate, Date endDate) {
+        return historicalAlarmsAndEventsRepository.findAllHistoricalAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual(endDate,startDate);
+
+    }
+
+    @Override
+    public void addOrUpdate(AlarmsAndEvents alarmsAndEvents) {
+       switch (alarmsAndEvents.getAlarmStatus()){
+           case ACTIVE:
+               add(new ActiveAlarmsAndEvents(alarmsAndEvents),activeAlarmsAndEventsRepository);
+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents),historicalAlarmsAndEventsRepository);
+               break;
+           case DEACTIVE:
+               remove(alarmsAndEvents.getId(),activeAlarmsAndEventsRepository,AlarmsAndEvents.class);
+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents) ,historicalAlarmsAndEventsRepository);
+               break;
+           default:
+               throw new UnknownTypeException("alarm status is unknown" + alarmsAndEvents.getAlarmStatus());
+       }
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
new file mode 100644
index 0000000..fa0fdbc
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.model.dao.SpeedProfile;
+import org.onap.osam.model.dao.Service;
+import org.onap.osam.model.dao.TechnologyProfile;
+import org.onap.osam.model.repository.ServiceRepository;
+import org.onap.osam.model.repository.SpeedProfileRepository;
+import org.onap.osam.model.repository.TechnologyProfileRepository;
+import org.onap.osam.api.service.BroadBandService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@org.springframework.stereotype.Service
+public class BroadBandServiceImpl extends AbstractBaseServiceImpl implements BroadBandService {
+    private SpeedProfileRepository speedProfileRepository;
+    private TechnologyProfileRepository technologyProfileRepository;
+    private ServiceRepository serviceRepository;
+
+    @Autowired
+    public BroadBandServiceImpl(SpeedProfileRepository speedProfileRepository,
+                                TechnologyProfileRepository technologyProfileRepository,
+                                ServiceRepository serviceRepository) {
+        super();
+        this.speedProfileRepository = speedProfileRepository;
+        this.technologyProfileRepository = technologyProfileRepository;
+        this.serviceRepository = serviceRepository;
+    }
+
+    @Override
+    public SpeedProfile addSpeedProfile(SpeedProfile speedProfile) {
+        return add(speedProfile, speedProfileRepository);
+    }
+
+    @Override
+    public TechnologyProfile addTechnologyProfile(TechnologyProfile technologyProfile) {
+        return add(technologyProfile,technologyProfileRepository);
+    }
+
+    @Override
+    public Service addService(Service service) {
+        return add(service,serviceRepository);
+    }
+
+    @Override
+    public void removeSpeedProfile(Long id) {
+        remove(id, speedProfileRepository, SpeedProfile.class);
+
+    }
+
+    @Override
+    public void removeTechnologyProfile(Long id) {
+        remove(id, technologyProfileRepository, TechnologyProfile.class);
+    }
+
+    @Override
+    public void removeService(Long id) {
+        remove(id, serviceRepository, Service.class);
+    }
+
+    @Override
+    public SpeedProfile getSpeedProfile(Long id) {
+        return get(id, speedProfileRepository);
+    }
+
+    @Override
+    public TechnologyProfile getTechnologyProfile(Long id) {
+        return get(id, technologyProfileRepository);
+    }
+
+    @Override
+    public Service getService(Long id) {
+        return get(id, serviceRepository);
+    }
+
+    @Override
+    public List<SpeedProfile> getSpeedProfiles() {
+        return getAll(speedProfileRepository);
+    }
+
+    @Override
+    public List<TechnologyProfile> getTechnologyProfiles() {
+        return getAll(technologyProfileRepository);
+    }
+
+    @Override
+    public List<Service> getServices() {
+        return getAll(serviceRepository);
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
new file mode 100644
index 0000000..0d6828f
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
@@ -0,0 +1,312 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import com.google.common.collect.Lists;
+import org.onap.osam.api.service.AccessPodService;
+import org.onap.osam.common.exception.AbstractOLTException;
+import org.onap.osam.common.exception.InvalidOperationException;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.api.service.DeviceService;
+import org.onap.osam.common.exception.ServerException;
+import org.onap.osam.external.grpc.AbstractOLTClient;
+import org.onap.osam.model.dao.*;
+import org.onap.osam.model.repository.ChassisRepository;
+import org.onap.osam.model.repository.OLTPortRepository;
+import org.onap.osam.model.repository.OLTSlotRepository;
+import org.onap.osam.model.repository.ONTDeviceRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Service
+public class DeviceServiceImpl extends AbstractBaseServiceImpl implements DeviceService {
+
+    private ChassisRepository chassisRepository;
+    private OLTPortRepository oltPortRepository;
+    private OLTSlotRepository oltSlotRepository;
+    private ONTDeviceRepository ontDeviceRepository;
+    private AbstractOLTClient abstractOLTClient;
+    private AccessPodService accessPodService;
+
+    public static int NUMBER_OF_OLT_PORTS   = 16;
+    public static int NUMBER_OF_ONT_DEVICES = 64;
+
+    @Autowired
+    public DeviceServiceImpl(ChassisRepository chassisRepository,
+                             OLTPortRepository oltPortRepository,
+                             OLTSlotRepository oltSlotRepository,
+                             ONTDeviceRepository ontDeviceRepository,
+                             AbstractOLTClient abstractOLTClient,
+                             AccessPodService accessPodService) {
+        this.chassisRepository = chassisRepository;
+        this.oltPortRepository = oltPortRepository;
+        this.oltSlotRepository = oltSlotRepository;
+        this.ontDeviceRepository = ontDeviceRepository;
+        this.abstractOLTClient = abstractOLTClient;
+        this.accessPodService = accessPodService;
+    }
+
+    @Override
+    public Chassis addChassis(Chassis chassis) {
+        AccessPod accessPod = accessPodService.findByPnfId(chassis.getAccessPod().getPnfId());
+        chassis.setAccessPod(accessPod);
+        abstractOLTClient.createChassis(chassis);
+        return add(chassis, chassisRepository);
+    }
+
+    @Override
+    public void deleteChassis(Long id) {
+        log.info("Deleting chassis, id: {}", id);
+        remove(id, chassisRepository,Chassis.class);
+    }
+
+    public void deleteChassisByClli(String clli) {
+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);
+        if (chassis.isPresent()){
+            Long id = chassis.get().getId();
+            log.trace("Deleting chassis, clli: {}", clli);
+            remove(id, chassisRepository,Chassis.class);
+        } else {
+            log.error("Chassis not found for clli {}, nothing to delete", clli);
+            throw new NotFoundException("Chassis not found for clli {}",clli);
+        }
+    }
+
+    @Override
+    public Chassis getChassisById(Long id) {
+        Optional<Chassis> chassis = chassisRepository.findById(id);
+        if (!chassis.isPresent()) {
+            log.error("Chassis not found for id {}", id);
+            throw new NotFoundException("Chassis not found for id {}",id);
+        }
+        return chassis.get();
+    }
+
+    @Override
+    public Chassis getChassisByClli(String clli) {
+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);
+        if (!chassis.isPresent()) {
+            log.error("Chassis not found for clli {}", clli);
+            throw new NotFoundException("Chassis not found for clli {}",clli);
+        }
+        return chassis.get();
+    }
+
+    @Override
+    public Long getChassisCount() {
+        return chassisRepository.count();
+    }
+
+    @Override
+    public List<Chassis> getByPnfId(String pnfId) {
+        Optional<List<Chassis>> chassisList = chassisRepository.findByAccessPodPnfId(pnfId);
+        if (!chassisList.isPresent()) {
+            log.error("Chassis is not found with pnfId {}", pnfId);
+            throw new NotFoundException("Chassis is not found with pnfId : {}",pnfId);
+        }
+        return chassisList.get();
+    }
+
+    @Override
+    public List<Chassis> getAllChassis() {
+        return Lists.newArrayList(chassisRepository.findAll());
+    }
+
+    @Override
+    public OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis) {
+        Set<OLTSlot> oltSlots = Optional.ofNullable(chassis.getOltSlots()).orElse(new HashSet<>());
+        int size = oltSlots.size();
+        if (size == NUMBER_OF_OLT_PORTS) {
+            log.error("Maximum number of OLTs exceeded, max size per chassis: {}", NUMBER_OF_OLT_PORTS);
+            throw new InvalidOperationException("Maximum number of OLTs exceeded");
+        }
+        oltSlot.setNumber(size+1);
+        oltSlot.setAdminState(AdminState.ENABLED);
+        oltSlot.setOperationalState(ActivityState.ACTIVE);
+        oltSlot.setPortAuthState(ActivityState.ACTIVE);
+        abstractOLTClient.createOLTChassis(oltSlot);
+
+        oltSlot.setChassis(chassis);
+        log.trace("Adding OLT Slot, OLT slot: {}", oltSlot);
+        add(oltSlot, oltSlotRepository);
+        for (int j = 0; j < 16 ; j++) {
+            OLTPort oltPort = new OLTPort();
+            oltPort.setOltSlot(oltSlot);
+            oltPort.setPortNumber(j+1);
+            oltPort.setAdminState(AdminState.ENABLED);
+            oltPort.setPortAuthState(ActivityState.ACTIVE);
+            log.trace("Adding OLT Port on this slot, OLT port: {}", oltPort);
+            add(oltPort, oltPortRepository);
+        }
+        oltSlots.add(oltSlot);
+        chassis.setOltSlots(oltSlots);
+        log.trace("Adding this OLT slot to chassis {}", chassis);
+        chassisRepository.save(chassis);
+        return oltSlot;
+    }
+
+    @Override
+    public void deleteOLTSlot(Long id) {
+        log.info("Deleting OLT slot, id: {}", id);
+        oltSlotRepository.deleteById(id);
+    }
+
+    @Override
+    public OLTSlot getOLTSlotById(Long id) {
+        Optional<OLTSlot> oltSlot = oltSlotRepository.findById(id);
+        if (!oltSlot.isPresent()) {
+            log.error("OLT Slot not found with id {}", id);
+            throw new NotFoundException("OLT Slot not found with id "+id);
+        }
+        return oltSlot.get();
+    }
+
+    @Override
+    public OLTSlot getOLTSlotBySerialNumber(String serialNumber) {
+        Optional<OLTSlot> oltSlot = oltSlotRepository.findBySerialNumber(serialNumber);
+        if (!oltSlot.isPresent()) {
+            log.error("OLT Slot not found with serial number {}", serialNumber);
+            throw new NotFoundException("OLT Slot not found with serialNumber {}",serialNumber);
+        }
+        return oltSlot.get();
+    }
+
+    @Override
+    public List<OLTSlot> getAllOLTSlots() {
+        return Lists.newArrayList(oltSlotRepository.findAll());
+    }
+
+    @Override
+    public void deleteOLTPort(Long id) {
+        log.info("Deleting OLT port, id: {}", id);
+        oltPortRepository.deleteById(id);
+    }
+
+    @Override
+    public OLTPort getOLTPortById(Long id) {
+        Optional<OLTPort> oltPort = oltPortRepository.findById(id);
+        if (!oltPort.isPresent()) {
+            log.error("OLT Port not found, id: {}", id);
+            throw new NotFoundException("OLT Port not found, id {}",id);
+        }
+        return oltPort.get();
+    }
+
+    @Override
+    public ONTDevice provisionONTDevice(ONTDevice ont, OntProvisioningType provisioningType){
+        log.trace("ONT Device provisioning, ONT Device: {}, provisioning type: ");
+        OLTPort oltPort = ont.getOLTPort();
+        int portNumber = oltPort.getPortNumber();
+        OLTSlot oltSlot = oltPort.getOltSlot();
+        int slotNumber = oltSlot.getNumber();
+        Chassis chassis = oltSlot.getChassis();
+        String clli = chassis.getClli();
+        int ontNumber = ont.getNumber();
+        String serialNumber = ont.getSerialNumber();
+        Optional<OLTPort> thePort = oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(portNumber,slotNumber,clli);
+        if (thePort.isPresent()) {
+            OLTPort port = thePort.get();
+            log.trace("Port found : {}", thePort);
+            Set<ONTDevice> ontDevices = Optional.ofNullable(port.getOntDevices()).orElse(new HashSet<>());
+
+            ONTDevice ontDevice = new ONTDevice();
+            ontDevice.setSerialNumber(serialNumber);
+            ontDevice.setNumber(ontNumber);
+            ontDevice.setOLTPort(port);
+            ontDevice.setAdminState(AdminState.ENABLED);
+            ontDevice.setOperationalState(ActivityState.ACTIVE);
+            ontDevice.setPortAuthState(ActivityState.ACTIVE);
+            ontDevice.setCTag(ont.getCTag());
+            ontDevice.setSTag(ont.getSTag());
+            ontDevice.setCircuitId(ont.getCircuitId());
+            ontDevice.setNasPortId(ont.getNasPortId());
+
+            //TODO Handle technology and speed profiles later
+            ontDevice.setSpeedProfile(null);
+            ontDevice.setTechProfile(null);
+
+            boolean success =  false;
+            if (provisioningType == OntProvisioningType.FULL) {
+                success = abstractOLTClient.provisionOntFull(ont);
+            } else if (provisioningType == OntProvisioningType.PREPROVISION) {
+                success = abstractOLTClient.preProvisionOnt(ont);
+            } else {
+                success = abstractOLTClient.provisionONT(ont);
+            }
+
+            if (success){
+                ontDevice = add(ontDevice, ontDeviceRepository);
+                ontDevices.add(ontDevice);
+                port.setOntDevices(ontDevices);
+                oltPortRepository.save(port);
+            } else {
+                log.error("Failed to process ONTDevice at Abstract OLT, ONTDevice: {}", ont);
+                throw new ServerException("Failed to provision ONTDevice with serial number " + ont.getSerialNumber());
+            }
+
+        } else {
+            log.error("Port not found, port number: {}", portNumber);
+            throw new NotFoundException("Port not found, port number {}",portNumber);
+        }
+        return ont;
+    }
+
+    @Override
+    public void deleteONTDevice(Long id) {
+        log.info("Deleting ONT device port, id: {}", id);
+        ontDeviceRepository.deleteById(id);
+    }
+
+    @Override
+    public ONTDevice getONTDeviceById(Long id) {
+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findById(id);
+        if (!ontDevice.isPresent()) {
+            log.error("Couldn't find ONT Device with ID {}", id);
+            throw new NotFoundException("Couldn't find ONT Device with ID {}",id);
+        }
+        return ontDevice.get();
+    }
+
+    @Override
+    public ONTDevice getONTDeviceBySerialNumber(String serialNumber) {
+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findBySerialNumber(serialNumber);
+        if (!ontDevice.isPresent()) {
+            log.error("Couldn't find ONT Device with serialNumber {}", serialNumber);
+            throw new NotFoundException("Couldn't find ONT Device with serialNumber {}",serialNumber);
+        }
+        return ontDevice.get();
+    }
+
+    @Override
+    public List<ONTDevice> getAllONTDevices() {
+        return Lists.newArrayList(ontDeviceRepository.findAll());
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
new file mode 100644
index 0000000..b1e3f29
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.model.repository.PmConfigsRepository;
+import org.onap.osam.model.dao.PmConfig;
+import org.onap.osam.model.dao.PmConfigs;
+import org.onap.osam.model.dao.PmGroupConfig;
+import org.onap.osam.model.repository.PmConfigRepository;
+import org.onap.osam.model.repository.PmGroupConfigRepository;
+import org.onap.osam.api.service.PmConfigsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PmConfigsServiceImpl extends AbstractBaseServiceImpl implements PmConfigsService{
+
+    protected PmConfigRepository pmConfigRepository;
+    protected PmConfigsRepository pmConfigsRepository;
+    protected PmGroupConfigRepository pmGroupConfigRepository;
+
+    @Autowired
+    public PmConfigsServiceImpl(PmConfigRepository pmConfigRepository,PmConfigsRepository pmConfigsRepository,
+                                PmGroupConfigRepository pmGroupConfigRepository){
+
+        this.pmConfigRepository=pmConfigRepository;
+        this.pmGroupConfigRepository=pmGroupConfigRepository;
+        this.pmConfigsRepository=pmConfigsRepository;
+    }
+
+
+    @Override
+    public List<PmConfig> getPmConfigByPmConfigsId(Long pmConfigsId) {
+        return pmConfigRepository.getByPmConfigs_Id(pmConfigsId);
+    }
+
+    @Override
+    public List<PmConfig> getPmConfigByPmConfigGroupId(Long pmGroupConfigsId) {
+        return pmConfigRepository.getByPmGroupConfig_Id(pmGroupConfigsId);
+    }
+
+    @Override
+    public void addPmGroupConfig(PmConfig pmConfig) {
+        add(pmConfig,pmConfigRepository);
+    }
+
+    @Override
+    public void addPmGroupConfig(PmGroupConfig pmGroupConfig) {
+        add(pmGroupConfig,pmGroupConfigRepository);
+    }
+
+    @Override
+    public void removePmConfig(Long pmConfigId) {
+        remove(pmConfigId,pmConfigRepository,PmConfig.class);
+    }
+
+    @Override
+    public void removeGroupPmConfig(Long pmGroupConfigId) {
+        remove(pmGroupConfigId,pmGroupConfigRepository,PmGroupConfig.class);
+    }
+
+
+    @Override
+    public PmConfigs addOrUpdate(PmConfigs value) {
+        return add(value,pmConfigsRepository);
+    }
+
+    @Override
+    public void removeById(Long key) {
+        remove(key,pmConfigsRepository,PmConfigs.class);
+    }
+
+    @Override
+    public PmConfigs getById(Long key) {
+        return get(key,pmConfigsRepository);
+    }
+
+    @Override
+    public List<PmConfigs> getAll() {
+        return getAll(pmConfigsRepository);
+    }
+}
diff --git a/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java b/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
new file mode 100644
index 0000000..e295655
--- /dev/null
+++ b/osam-core-framework/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import org.onap.osam.model.dao.Subscriber;
+import org.onap.osam.model.repository.SubscriberRepository;
+import org.onap.osam.api.service.SubscriberService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Service
+public class SubscriberServiceImpl extends AbstractBaseServiceImpl implements SubscriberService {
+
+    private SubscriberRepository subscriberRepository;
+
+    @Autowired
+    public SubscriberServiceImpl(SubscriberRepository subscriberRepository) {
+        this.subscriberRepository = subscriberRepository;
+    }
+
+    @Override
+    public Subscriber addOrUpdate(Subscriber subscriber) {
+        //TODO Add Check the devices.....
+        return add(subscriber, subscriberRepository);
+    }
+
+    @Override
+    public void removeById(Long id) {
+        remove(id, subscriberRepository, Subscriber.class);
+    }
+
+    @Override
+    public Subscriber getById(Long id) {
+        return get(id, subscriberRepository);
+    }
+
+    @Override
+    public List<Subscriber> getAll() {
+        return getAll(subscriberRepository);
+    }
+
+    @Override
+    public Subscriber getBySubscriberIdentifier(String userIdentifier) {
+        return subscriberRepository.findByUserIdentifier(userIdentifier);
+    }
+}
diff --git a/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java b/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
new file mode 100644
index 0000000..3b974a5
--- /dev/null
+++ b/osam-core-framework/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
@@ -0,0 +1,440 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.core;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.osam.api.service.AccessPodService;
+import org.onap.osam.api.service.DeviceService;
+import org.onap.osam.common.exception.AbstractOLTException;
+import org.onap.osam.common.exception.InvalidOperationException;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.common.exception.ServerException;
+import org.onap.osam.external.grpc.AbstractOLTClient;
+import org.onap.osam.model.dao.*;
+import org.onap.osam.model.repository.ChassisRepository;
+import org.onap.osam.model.repository.OLTPortRepository;
+import org.onap.osam.model.repository.OLTSlotRepository;
+import org.onap.osam.model.repository.ONTDeviceRepository;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+/**
+ * Created by Zafer Kaban on 26.11.2018.
+ */
+
+@RunWith(JUnitParamsRunner.class)
+public class DeviceServiceImplTest {
+
+    private static String TEST_PNF_ID = "TEST_PNF_ID";
+    private static String TEST_CLLI   = "TEST_CLLI";
+    private static String TEST_SERIAL = "SERIAL_NUMBER";
+
+    @Mock
+    private ChassisRepository chassisRepository;
+    @Mock
+    private OLTPortRepository oltPortRepository;
+    @Mock
+    private OLTSlotRepository oltSlotRepository;
+    @Mock
+    private ONTDeviceRepository ontDeviceRepository;
+
+    @Mock
+    private AbstractOLTClient abstractOLTClient;
+
+    @Mock
+    private AccessPodService accessPodService;
+
+    @Captor
+    private ArgumentCaptor<ONTDevice> ontDeviceCaptor;
+
+    @Captor
+    private ArgumentCaptor<OLTPort> portCaptor;
+
+
+    private Chassis chassis;
+
+    private AccessPod accessPod;
+
+    private OLTSlot oltSlot;
+
+    private OLTPort oltPort;
+
+    private ONTDevice ontDevice;
+
+    @InjectMocks
+    private DeviceServiceImpl deviceService;
+
+    @Before
+    public void initMocks() {
+        MockitoAnnotations.initMocks(this);
+        accessPod = new AccessPod();
+        accessPod.setPnfId(TEST_PNF_ID);
+        chassis = new Chassis();
+        chassis.setClli(TEST_CLLI);
+        chassis.setAccessPod(accessPod);
+        chassis.setId(1L);
+        oltSlot = new OLTSlot();
+        oltSlot.setId(1L);
+        oltSlot.setNumber(1);
+        oltPort = new OLTPort();
+        oltPort.setId(1L);
+        oltPort.setPortNumber(1);
+        ontDevice = new ONTDevice();
+        ontDevice.setId(1L);
+        ontDevice.setOLTPort(oltPort);
+        oltPort.setOltSlot(oltSlot);
+        oltSlot.setChassis(chassis);
+
+        when(chassisRepository.findByClli(TEST_CLLI)).thenReturn(Optional.ofNullable(chassis));
+        when(chassisRepository.findById(1L)).thenReturn(Optional.ofNullable(chassis));
+    }
+
+    @Test
+    public void whenAddChassis_sunnyFlow(){
+
+        // TEST Sunshine scenario
+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenReturn(accessPod);
+        when(chassisRepository.save(chassis)).thenReturn(chassis);
+
+        Chassis chassisResult = deviceService.addChassis(chassis);
+        assertThat(chassisResult).isSameAs(chassis);
+    }
+
+
+    @Test
+    public void whenAddChassisPnfNotFound_shouldThrowException() {
+        // TEST when PNF registration does not exist so that Access POD does not exist in OSAM DB
+
+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenThrow(NotFoundException.class);
+        assertThatThrownBy(() -> deviceService.addChassis(chassis)).isInstanceOf(NotFoundException.class);
+        //verify we save nothing to DB
+        verifyZeroInteractions(chassisRepository);
+    }
+
+    @Test
+    public void whenAddChassisAbstractOltReturnsNull_shouldThrowException() {
+        // TEST grpc failure case
+
+        when(accessPodService.findByPnfId(TEST_PNF_ID)).thenReturn(accessPod);
+        doThrow(AbstractOLTException.class).when(abstractOLTClient).createChassis(chassis);
+        assertThatThrownBy(() -> deviceService.addChassis(chassis)).isInstanceOf(AbstractOLTException.class);
+        //verify we save nothing to DB
+        verifyZeroInteractions(chassisRepository);
+    }
+
+
+    @Test
+    public void whenDeleteChassisById_sunnyFlow() {
+        deviceService.deleteChassis(1L);
+        verify(chassisRepository, times(1)).deleteById(1L);
+    }
+
+    @Test
+    public void whenDeleteChassisByClli_sunnyFlow () {
+        deviceService.deleteChassisByClli(TEST_CLLI);
+        //Test chassis has clli TEST_CLLI and id 1L, thus the verify
+        verify(chassisRepository, times(1)).deleteById(1L);
+    }
+
+
+
+    @Test
+    public void whenGetChassisById_sunnyFlow(){
+        Chassis testChassis = deviceService.getChassisById(1L);
+        assertThat(testChassis).isSameAs(chassis);
+    }
+
+    @Test
+    public void whenGetChassisByNotExistingId_throwNotFoundException(){
+        assertThatThrownBy(() -> deviceService.getChassisById(100L)).isInstanceOf(NotFoundException.class);
+    }
+
+    @Test
+    public void whenGetChassisByTestClli_sunnyFlow(){
+        Chassis testChassis = deviceService.getChassisByClli(TEST_CLLI);
+        assertThat(testChassis).isSameAs(chassis);
+    }
+
+    @Test
+    public void whenGetChassisByNotExistingClli_throwNotFoundException(){
+        assertThatThrownBy(() -> deviceService.getChassisByClli("SOME_FAKE_CLLI")).isInstanceOf(NotFoundException.class);
+    }
+
+    @Test
+    public void whenCountChassis_sunnyFlow(){
+        when(chassisRepository.count()).thenReturn(1L);
+        long count = deviceService.getChassisCount();
+        assertThat(count).isEqualTo(1L);
+    }
+
+    @Test
+    public void whenGetByPnfId_sunnyFlow(){
+        when(chassisRepository.findByAccessPodPnfId(TEST_PNF_ID)).thenReturn(Optional.of(new ArrayList<Chassis>()));
+        ArrayList<Chassis> chassisResult = (ArrayList<Chassis>) deviceService.getByPnfId(TEST_PNF_ID);
+        assertThat(chassisResult).isNotNull();
+    }
+
+
+    @Test
+    public void whenGetByPnfIdNotExisting_shouldThrowException(){
+        assertThatThrownBy(() -> deviceService.getByPnfId("SOME_FAKE_PNFID")).isInstanceOf(NotFoundException.class);
+    }
+
+
+    @Test
+    public void whenGetAllChassis_sunnyFlow() {
+        when(chassisRepository.findAll()).thenReturn(new ArrayList<Chassis>());
+        ArrayList<Chassis> chassisResult = (ArrayList<Chassis>) deviceService.getAllChassis();
+        assertThat(chassisResult).isNotNull();
+    }
+
+
+    @Test
+    public void whenAddOLTSlot_sunnyFlow() {
+
+        Set<OLTSlot> oltSlots = new HashSet<OLTSlot>();
+        chassis.setOltSlots(oltSlots);
+        when(oltSlotRepository.save(oltSlot)).thenReturn(oltSlot);
+        when(abstractOLTClient.createOLTChassis(oltSlot)).thenReturn(TEST_CLLI);
+
+        OLTSlot oltResult = deviceService.addOLTSlot(oltSlot, chassis);
+
+        //verify creation of 16 ports
+        verify(oltPortRepository, times(16)).save(portCaptor.capture());
+        final List<OLTPort> allOltPortsValues = portCaptor.getAllValues();
+        allOltPortsValues.forEach(x -> {
+            assertThat(x.getOltSlot()).isSameAs(oltSlot);
+            assertThat(x.getAdminState()).isEqualTo(AdminState.ENABLED);
+            assertThat(x.getPortAuthState()).isEqualTo(ActivityState.ACTIVE);
+        });
+
+        //verify added to chassis
+        assertThat(chassis.getOltSlots()).hasSize(1);
+
+        //verify oltSlot logic
+        assertThat(oltResult).isSameAs(oltSlot);
+        assertThat(oltResult.getAdminState()).isEqualTo(AdminState.ENABLED);
+        assertThat(oltResult.getOperationalState()).isEqualTo(ActivityState.ACTIVE);
+        assertThat(oltResult.getPortAuthState()).isEqualTo(ActivityState.ACTIVE);
+
+    }
+
+    public void whenAddOLTSlotTooManySlotsOnChassis_shouldThrowException() {
+        //already add 16 slots, cannot add another one
+        Set<OLTSlot> oltSlots = new HashSet<OLTSlot>();
+        for (int i = 0; i < 16; i++) {
+            oltSlots.add(new OLTSlot());
+        }
+        chassis.setOltSlots(oltSlots);
+        assertThatThrownBy(()-> deviceService.addOLTSlot(oltSlot, chassis)).isInstanceOf(InvalidOperationException.class);
+        //verify no DB interactions
+        verifyZeroInteractions(oltSlotRepository, oltPortRepository, chassisRepository);
+    }
+
+    public void whenAddOLTSlotAbstractOLTReturnsNull_shouldThrowException() {
+        when(abstractOLTClient.createOLTChassis(oltSlot)).thenReturn(null);
+        assertThatThrownBy(()-> deviceService.addOLTSlot(oltSlot, chassis)).isInstanceOf(ServerException.class);
+        //verify no DB interactions
+        verifyZeroInteractions(oltSlotRepository, oltPortRepository, chassisRepository);
+    }
+
+    @Test
+    public void whenDeleteOLTSlot_repositoryMethodCalledOnce() {
+        deviceService.deleteOLTSlot(1L);
+        verify(oltSlotRepository, times(1)).deleteById(1L);
+    }
+
+
+    @Test
+    public void whenGetOLTSlotById_sunnyFlow(){
+        when(oltSlotRepository.findById(1L)).thenReturn(Optional.of(oltSlot));
+        OLTSlot oltActualSlot = deviceService.getOLTSlotById(1L);
+        assertThat(oltActualSlot).isSameAs(oltSlot);
+    }
+
+    @Test
+    public void whenGetOLTSlotByIdNotExisting_shouldThrowException(){
+        assertThatThrownBy(()-> deviceService.getOLTSlotById(100L)).isInstanceOf(NotFoundException.class);
+    }
+
+    @Test
+    public void whenGetOLTSlotBySerialId_sunnyFlow() {
+        when(oltSlotRepository.findBySerialNumber(TEST_SERIAL)).thenReturn(Optional.of(oltSlot));
+        OLTSlot oltActualSlot = deviceService.getOLTSlotBySerialNumber(TEST_SERIAL);
+        assertThat(oltActualSlot).isSameAs(oltSlot);
+    }
+
+    @Test
+    public void whenGetOLTSlotBySerialIdNotExisting_shouldThrowException(){
+        assertThatThrownBy(()-> deviceService.getOLTSlotBySerialNumber("SOME_FAKE_SERIAL")).isInstanceOf(NotFoundException.class);
+    }
+
+    @Test
+    public void whenGetAllOLTSlot_sunnyFlow() {
+        final ArrayList<OLTSlot> slotArrayList = new ArrayList<>();
+        when(oltSlotRepository.findAll()).thenReturn(slotArrayList);
+        ArrayList<OLTSlot> oltSlots = (ArrayList<OLTSlot>) deviceService.getAllOLTSlots();
+        assertThat(oltSlots).isEqualTo(slotArrayList);
+    }
+
+    @Test
+    public void whenDeleteOLTPort_sunnyFlow() {
+        deviceService.deleteOLTPort(1L);
+        verify(oltPortRepository, times(1)).deleteById(1L);
+    }
+
+    @Test
+    public void whenGetOLTPort_sunnyFlow() {
+        when(oltPortRepository.findById(1L)).thenReturn(Optional.of(oltPort));
+        final OLTPort actualPort = deviceService.getOLTPortById(1L);
+        assertThat(actualPort).isSameAs(oltPort);
+    }
+
+    @Test
+    public void whenGetOLTPortByIdNotExisting_shouldThrowException(){
+        assertThatThrownBy(()-> deviceService.getOLTPortById(100L)).isInstanceOf(NotFoundException.class);
+    }
+
+    @Test
+    @Parameters(method = "provTypeToTestForOnt")
+    public void whenProvisionONTDevice_sunnyFlow(DeviceService.OntProvisioningType provType) {
+
+
+        //setting up ontDevice
+        ontDevice.setSerialNumber("SOME_SERIAL_NUMBER");
+        ontDevice.setNumber(23);
+        ontDevice.setCTag(111);
+        ontDevice.setSTag(222);
+        ontDevice.setCircuitId("CIRCUIT_ID");
+        ontDevice.setNasPortId("NAS_PORT_ID");
+        ontDevice.setAdminState(AdminState.ENABLED);
+        ontDevice.setOperationalState(ActivityState.ACTIVE);
+        ontDevice.setPortAuthState(ActivityState.ACTIVE);
+
+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(oltPort));
+        when(abstractOLTClient.provisionONT(ontDevice)).thenReturn(true);
+        when(abstractOLTClient.preProvisionOnt(ontDevice)).thenReturn(true);
+        when(abstractOLTClient.provisionOntFull(ontDevice)).thenReturn(true);
+
+        //This is because in order to be inserted to hashset of oltSlots at the next command of tested function,
+        //the ONTDevice has to have ID
+        when(ontDeviceRepository.save(any())).thenReturn(ontDevice);
+
+       deviceService.provisionONTDevice(ontDevice, provType);
+
+       //checking that the copy to persisted object was as expected
+        verify(ontDeviceRepository, times(1)).save(ontDeviceCaptor.capture());
+        final ONTDevice capturedONTDevice = ontDeviceCaptor.getValue();
+
+        //TODO Pavel fix after discussion with Netsia regarding the returned object.
+        //Currently the assert will fail because internal object has no ID.
+        //I didn't want to use isEqualUsingSpecificFields, to catch set operations we might miss in the future
+        //assertThat(capturedONTDevice).isEqualToComparingFieldByField(ontDevice);
+
+        verify(oltPortRepository, times(1)).save(oltPort);
+    }
+
+    private Object[] provTypeToTestForOnt() {
+        return new Object[] {
+                new Object[] { DeviceService.OntProvisioningType.PROVISION },
+                new Object[] { DeviceService.OntProvisioningType.PREPROVISION },
+                new Object[] { DeviceService.OntProvisioningType.FULL }
+        };
+    }
+
+    @Test
+    @Parameters(method = "provTypeToTestForOnt")
+    public void whenAddONTDeviceNoPortFound_shouldThrowException(DeviceService.OntProvisioningType provType) {
+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(null));
+        assertThatThrownBy(()-> deviceService.provisionONTDevice(ontDevice, provType)).isInstanceOf(NotFoundException.class);
+
+    }
+
+    @Test
+    @Parameters(method = "provTypeToTestForOnt")
+    public void whenAddONTDeviceAbstractOLTError_shouldThrowException(DeviceService.OntProvisioningType provType) {
+        when(oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(1,1,TEST_CLLI)).thenReturn(Optional.ofNullable(oltPort));
+        when(abstractOLTClient.provisionONT(ontDevice)).thenReturn(false);
+        when(abstractOLTClient.preProvisionOnt(ontDevice)).thenReturn(false);
+        when(abstractOLTClient.provisionOntFull(ontDevice)).thenReturn(false);
+        assertThatThrownBy(()-> deviceService.provisionONTDevice(ontDevice, provType)).isInstanceOf(ServerException.class);
+
+    }
+
+    @Test
+    public void whenDeleteONTDevice_sunnyFlow() {
+        deviceService.deleteONTDevice(1L);
+        verify(ontDeviceRepository, times(1)).deleteById(1L);
+    }
+
+    @Test
+    public void whenGetONTDeviceById_sunnyFlow() {
+        when(ontDeviceRepository.findById(1L)).thenReturn(Optional.of(ontDevice));
+        ONTDevice actualOntDevice = deviceService.getONTDeviceById(1L);
+        assertThat(actualOntDevice).isSameAs(ontDevice);
+    }
+
+    @Test
+    public void whenGetONTDeviceNoId_shouldThrowException() {
+        assertThatThrownBy(()-> deviceService.getONTDeviceById(100L)).isInstanceOf(NotFoundException.class);
+
+    }
+
+    @Test
+    public void whenGetONTDeviceBySerialNumber_sunnyFlow() {
+        when(ontDeviceRepository.findBySerialNumber(TEST_SERIAL)).thenReturn(Optional.of(ontDevice));
+        ONTDevice actualOntDevice = deviceService.getONTDeviceBySerialNumber(TEST_SERIAL);
+        assertThat(actualOntDevice).isSameAs(ontDevice);
+    }
+
+    @Test
+    public void whenGetONTDeviceNoSerialNumber_shouldThrowException() {
+        assertThatThrownBy(()-> deviceService.getONTDeviceBySerialNumber(TEST_SERIAL)).isInstanceOf(NotFoundException.class);
+
+    }
+
+    @Test
+    public void whenGetAllONTDevices_sunnyFlow() {
+        final ArrayList<ONTDevice> devices = new ArrayList<>();
+        devices.add(ontDevice);
+        when(ontDeviceRepository.findAll()).thenReturn(devices);
+        ArrayList<ONTDevice> ontDevices = (ArrayList<ONTDevice>) deviceService.getAllONTDevices();
+        assertThat(ontDevices).isEqualTo(devices);
+    }
+}
diff --git a/osam-core-framework/external/pom.xml b/osam-core-framework/external/pom.xml
new file mode 100644
index 0000000..e81ff9b
--- /dev/null
+++ b/osam-core-framework/external/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>external</artifactId>
+
+    <repositories>
+        <repository>
+            <id>jcenter</id>
+            <url>https://jcenter.bintray.com/</url>
+        </repository>
+    </repositories>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webflux</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-reactor-netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.lognet</groupId>
+            <artifactId>grpc-spring-boot-starter</artifactId>
+            <version>${grpc-spring-boot-starter.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+    <pluginRepositories>
+        <pluginRepository>
+            <releases>
+                <updatePolicy>never</updatePolicy>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <id>central</id>
+            <name>Central Repository</name>
+            <url>https://repo.maven.apache.org/maven2</url>
+        </pluginRepository>
+        <pluginRepository>
+            <id>protoc-plugin</id>
+            <url>https://dl.bintray.com/sergei-ivanov/maven/</url>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>${os-maven-plugin.version}</version>
+            </extension>
+        </extensions>
+        <plugins>
+            <!-- protobuf-maven-plugin -->
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>${protobuf-maven-plugin.version}</version>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>grpc-java</pluginId>
+                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier}</pluginArtifact>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>compile-custom</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClient.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClient.java
new file mode 100644
index 0000000..2f7c7fd
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClient.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai;
+
+import org.onap.osam.external.aai.model.PNF;
+
+import javax.net.ssl.SSLException;
+import java.io.IOException;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+public interface AaiClient {
+    PNF queryPnf(String name);
+    void putPnf(PNF pnf);
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClientImpl.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClientImpl.java
new file mode 100644
index 0000000..066f109
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiClientImpl.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.common.exception.BadFormatException;
+import org.onap.osam.common.exception.InvalidOperationException;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.external.aai.config.AaiConfig;
+import org.onap.osam.external.aai.exception.ExternalSystemException;
+import org.onap.osam.external.aai.model.PNF;
+import org.onap.osam.external.aai.util.AaiHeaderUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.function.client.ClientResponse;
+
+import javax.net.ssl.SSLException;
+
+
+/**
+ * Created by cemturker on 12.04.2018.
+ */
+
+@Service
+@Slf4j
+public class AaiClientImpl implements AaiClient {
+
+    private AaiConfig aaiConfig;
+
+    @Autowired
+    public AaiClientImpl(AaiConfig aaiConfig) {
+        this.aaiConfig = aaiConfig;
+    }
+
+    @Override
+    public PNF queryPnf(String name) {
+        try {
+            ClientResponse response = AaiWebClient.webClient(aaiConfig).build().queryPNF(name);
+            commonErrorCheck(name,response);
+            log.info("Pnf query response code {} for {} id",response.statusCode(),name);
+            if (response.statusCode().is2xxSuccessful()) {
+                return AaiHeaderUtil.convertToPnf(response.bodyToMono(String.class).block());
+            }
+        } catch (SSLException e) {
+            log.error("",e);
+        }
+        throw new InvalidOperationException("");
+    }
+
+    @Override
+    public void putPnf(PNF pnf) {
+        try {
+            ClientResponse response = AaiWebClient.webClient(aaiConfig).build().putPNF(pnf);
+            commonErrorCheck(pnf,response);
+            log.info("Pnf query response code {} for {} ",response.statusCode(),pnf);
+            if (response.statusCode().is2xxSuccessful()) {
+                return;
+            }
+        } catch (SSLException e) {
+            log.error("",e);
+        }
+        throw new InvalidOperationException("");
+    }
+
+    private <T> void commonErrorCheck(T t, ClientResponse response){
+        if (response.statusCode().is5xxServerError()) {
+            throw new ExternalSystemException("Aai error code:"+response.statusCode().value());
+        }
+        if (HttpStatus.BAD_REQUEST.equals(response.statusCode())) {
+            throw new BadFormatException("Bad format exception is received from AAI");
+        }
+        if (HttpStatus.NOT_FOUND.equals(response.statusCode())) {
+            throw new NotFoundException(t+" is not found in AAI");
+        }
+    }
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiWebClient.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiWebClient.java
new file mode 100644
index 0000000..d548715
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/AaiWebClient.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai;
+
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.external.aai.config.AaiConfig;
+import org.onap.osam.external.aai.model.PNF;
+import org.onap.osam.external.aai.util.AaiHeaderUtil;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.util.DefaultUriBuilderFactory;
+import reactor.core.publisher.Mono;
+
+import javax.net.ssl.SSLException;
+import java.net.URI;
+
+import static org.springframework.web.reactive.function.client.ExchangeFilterFunctions.basicAuthentication;
+
+/**
+ * Created by cemturker on 01.10.2018.
+ */
+@Slf4j
+public class AaiWebClient {
+    private AaiConfig config;
+    private WebClient webClient;
+    private AaiWebClient(AaiConfig config) {
+        this.config = config;
+    }
+
+    public static AaiWebClient webClient(AaiConfig config) {
+        return new AaiWebClient(config);
+    }
+
+    public AaiWebClient build() throws SSLException {
+        SslContext sslContext;
+        sslContext = SslContextBuilder
+                .forClient()
+                .trustManager(InsecureTrustManagerFactory.INSTANCE)
+                .build();
+        log.debug("Setting ssl context");
+
+        this.webClient =  WebClient.builder()
+                .clientConnector(new ReactorClientHttpConnector(clientOptions -> {
+                    clientOptions.sslContext(sslContext);
+                    clientOptions.disablePool();
+                }))
+                .defaultHeaders(httpHeaders -> httpHeaders.setAll(AaiHeaderUtil.headers()))
+                .filter(basicAuthentication(config.getUsername(), config.getPassword()))
+                .build();
+        return this;
+    }
+
+    public ClientResponse queryPNF(String pnfId) {
+        return this.webClient.get().uri(getUri(pnfId)).exchange().block();
+    }
+
+    public ClientResponse putPNF(PNF pnf) {
+        String aai = AaiHeaderUtil.convertPnfToString(pnf);
+        log.debug(aai);
+        return this.webClient.put()
+                .uri(getUri(pnf.getPnfName()))
+                .body(Mono.just(aai),String.class)
+                .exchange().block();
+    }
+
+    private URI getUri(String pnfName) {
+        return new DefaultUriBuilderFactory().builder().scheme(config.getProtocol())
+                .host(config.getHost()).port(config.getPort())
+                .path(config.getBasePath() + config.getPnfPath() + "/" + pnfName).build();
+    }
+
+
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/config/AaiConfig.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/config/AaiConfig.java
new file mode 100644
index 0000000..08ee7e7
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/config/AaiConfig.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * Created by cemturker on 12.04.2018.
+ */
+@Configuration
+@PropertySource("classpath:aai.properties")
+@Slf4j
+@Getter
+@Setter
+public class AaiConfig {
+    private static final String AAI_HOST = "${aai.host}";
+    private static final String AAI_PORT = "${aai.port}";
+
+    private static final String AAI_PROTOCOL = "${aai.protocol}";
+
+    private static final String AAI_USERNAME = "${aai.username}";
+    private static final String AAI_PASSWORD = "${aai.password}";
+    private static final String AAI_BASE_PATH = "${aai.base.path}";
+    private static final String AAI_PNF_PATH = "${aai.pnf.path}";
+
+    @Value(AAI_HOST)
+    private String host;
+    @Value(AAI_PORT)
+    private int port;
+    @Value(AAI_PROTOCOL)
+    private String protocol;
+    @Value(AAI_USERNAME)
+    private String username;
+    @Value(AAI_PASSWORD)
+    private String password;
+    @Value(AAI_BASE_PATH)
+    private String basePath;
+    @Value(AAI_PNF_PATH)
+    private String pnfPath;
+
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/exception/ExternalSystemException.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/exception/ExternalSystemException.java
new file mode 100644
index 0000000..157539e
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/exception/ExternalSystemException.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai.exception;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+public class ExternalSystemException extends RuntimeException {
+    public ExternalSystemException(String message) {
+        super(message);
+    }
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/model/PNF.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/model/PNF.java
new file mode 100644
index 0000000..63b9042
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/model/PNF.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai.model;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+@Setter
+@Getter
+public class PNF {
+    @SerializedName("pnf-id")
+    private String pnfId;
+    @SerializedName("pnf-name")
+    private String pnfName;
+    @SerializedName("ipaddress-v4-oam")
+    private String ipaddressV4Oam;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("PNF{");
+        sb.append("pnfName='").append(pnfName).append('\'');
+        sb.append(", pnfId='").append(pnfId).append('\'');
+        sb.append(", ipaddressV4Oam='").append(ipaddressV4Oam).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/util/AaiHeaderUtil.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/util/AaiHeaderUtil.java
new file mode 100644
index 0000000..526a59f
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/aai/util/AaiHeaderUtil.java
@@ -0,0 +1,64 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai.util;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.onap.osam.external.aai.model.PNF;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.MediaType;
+
+
+import java.util.Map;
+
+/**
+ * Created by cemturker on 12.04.2018.
+ */
+public class AaiHeaderUtil {
+    private static final Logger logger = LoggerFactory.getLogger(AaiHeaderUtil.class);
+    private static final String X_FROM_APP_ID = "X-FromAppId";
+    private static final String X_TRANSACTION_ID = "X-TransactionId";
+    private static final String ACCEPT = "Accept";
+    private static final String CONTENT_TYPE = "Content-Type";
+    private AaiHeaderUtil(){}
+
+    public static Map<String, String> headers() {
+        return new ImmutableMap.Builder<String, String>()
+                .put(X_FROM_APP_ID,"OSAM")
+                .put(X_TRANSACTION_ID,"99")
+                .put(ACCEPT, MediaType.APPLICATION_JSON_VALUE)
+                .put(CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
+                .build();
+    }
+
+    public static PNF convertToPnf(String body) {
+        return new Gson().fromJson(body, PNF.class);
+    }
+
+    public static String convertPnfToString(PNF pnf) {
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        return gsonBuilder.create().toJson(pnf, PNF.class);
+    }
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java
new file mode 100644
index 0000000..073c69f
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java
@@ -0,0 +1,233 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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=========================================================
+ */
+
+
+
+/*
+ * Copyright 2015, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *    * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.onap.osam.external.grpc;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.common.exception.AbstractOLTException;
+import org.onap.osam.common.exception.ServerException;
+import org.onap.osam.grpc.AbstractOLTGrpc;
+import org.onap.osam.grpc.AddChassisMessage;
+import org.onap.osam.grpc.AddChassisReturn;
+import org.onap.osam.grpc.AddOLTChassisMessage;
+import org.onap.osam.grpc.AddOLTChassisReturn;
+import org.onap.osam.grpc.AddOntFullMessage;
+import org.onap.osam.grpc.AddOntMessage;
+import org.onap.osam.grpc.AddOntReturn;
+import org.onap.osam.grpc.PreProvisionOntMessage;
+import org.onap.osam.model.dao.Chassis;
+import org.onap.osam.model.dao.OLTSlot;
+import org.onap.osam.model.dao.ONTDevice;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.PostConstruct;
+
+@Component
+@PropertySource("classpath:abstractolt.properties")
+@Slf4j
+public class AbstractOLTClient {
+
+  private static final String ABSTRACTOLT_HOST = "${abstractolt.host}";
+  private static final String ABSTRACTOLT_PORT = "${abstractolt.port}";
+
+  public static int NUMBER_OF_OLT_PORTS = 16;
+
+  private AbstractOLTGrpc.AbstractOLTBlockingStub blockingStub;
+  @Value(ABSTRACTOLT_HOST)
+  private String host;
+  @Value(ABSTRACTOLT_PORT)
+  private int port;
+
+  @PostConstruct
+  private void init() {
+      log.info("Abstract OLT connection properties - host: {}, port: {}", host, port);
+      ManagedChannel managedChannel = ManagedChannelBuilder
+                .forAddress(host, port).usePlaintext().build();
+
+      blockingStub = AbstractOLTGrpc.newBlockingStub(managedChannel);
+  }
+
+  /** create chassis */
+  public void createChassis(Chassis chassis) {
+      try {
+          log.info("createChassis begin, chassis: {}", chassis);
+
+          String clli = chassis.getClli();
+          int rack = chassis.getRack();
+          int shelf = chassis.getShelf();
+          String xosIP = chassis.getAccessPod().getCoreIp();
+          int port = Integer.parseInt(chassis.getAccessPod().getCorePort());
+          String user = chassis.getAccessPod().getUsername();
+          String pass = chassis.getAccessPod().getPassword();
+
+          AddChassisMessage request = AddChassisMessage.newBuilder()
+                  .setCLLI(clli)
+                  .setRack(rack)
+                  .setShelf(shelf)
+                  .setXOSIP(xosIP)
+                  .setXOSPort(port)
+                  .setXOSUser(user)
+                  .setXOSPassword(pass)
+                  .build();
+
+          log.info("AddChassisMessage message: {}", request);
+
+          AddChassisReturn response = blockingStub.createChassis(request);
+          if (!StringUtils.isEmpty(response.getDeviceID())) {
+              log.info("Chassis created in AbstractOLT with clli : {}", clli);
+          } else {
+              log.error("DeviceId of created chassis in AbstractOLT is empty or null, chassis: {}", chassis);
+              throw new ServerException("DeviceId of created chassis in AbstractOLT is empty or null");
+          }
+      } catch (RuntimeException e){
+          log.error("Chassis creation failed", e);
+          throw new AbstractOLTException("Chassis creation failed for chassis : {}", chassis);
+      }
+  }
+
+    public String createOLTChassis(OLTSlot olt) {
+
+        String deviceID = null, chassisDeviceId = null;
+
+        try {
+            log.info("createOLTChassis begin, olt:{}", olt);
+
+            String clli = olt.getChassis().getClli();
+            AddOLTChassisMessage.OltDriver oltDriver =  AddOLTChassisMessage.OltDriver.forNumber((olt.getOltDriver().ordinal()));
+            AddOLTChassisMessage.OltType oltType = AddOLTChassisMessage.OltType.forNumber((olt.getOltType().ordinal()));
+
+            AddOLTChassisMessage request = AddOLTChassisMessage.newBuilder()
+                    .setCLLI(clli)
+                    .setDriver(oltDriver)
+                    .setNumPorts(NUMBER_OF_OLT_PORTS)
+                    .setSlotPort(olt.getPort())
+                    .setSlotIP(olt.getIpAddress())
+                    .setType(oltType)
+                    .build();
+
+            log.info("AddOLTChassisMessage message: {}", request);
+            AddOLTChassisReturn response = blockingStub.createOLTChassis(request);
+            deviceID = response.getDeviceID();
+            chassisDeviceId = response.getChassisDeviceID();
+            if(!StringUtils.isEmpty(response.getDeviceID()) && !StringUtils.isEmpty(response.getChassisDeviceID())) {
+                log.info("OLT Chassis created in AbstractOLT deviceId : {} chassisDeviceId : {}",deviceID,chassisDeviceId);
+            } else {
+                log.error("Invalid return argument from AbstractOLT, deviceId : {} chassisDeviceId : {}",deviceID,chassisDeviceId);
+                throw new ServerException("DeviceId of created chassis in AbstractOLT is empty or null");
+            }
+
+        } catch (RuntimeException e) {
+            log.error("OLT Chassis creation failed", e);
+            throw new AbstractOLTException("OLT Chassis creation failed for olt : {}", olt);
+        }
+
+        return deviceID;
+    }
+
+    public boolean preProvisionOnt(ONTDevice ontDevice) {
+
+      boolean result = false;
+
+        try {
+            PreProvisionOntMessage preProvisionOntMessage = OntMessageFactory.getPreProvisionOntMessage(ontDevice);
+            AddOntReturn response = blockingStub.preProvisionOnt(preProvisionOntMessage);
+            result = response.getSuccess();
+            log.info("preProvisionOnt with device id : {} success : {}" ,ontDevice.getSerialNumber(), result);
+        } catch (RuntimeException e) {
+            log.error("preProvisionOnt RPC failed", e);
+            throw new AbstractOLTException("preProvisionOnt failed for ont : {}", ontDevice);
+        }
+      return result;
+    }
+
+    public boolean provisionONT(ONTDevice ontDevice) {
+
+        boolean result = false;
+        try {
+            AddOntMessage request = OntMessageFactory.getOntMessage(ontDevice);
+            AddOntReturn response = blockingStub.provisionOnt(request);
+            result = response.getSuccess();
+            log.info("provisionONT with device id : {} success : {}",ontDevice.getSerialNumber(), result);
+
+        } catch (RuntimeException e) {
+            log.error("provisionONT RPC failed", e);
+            throw new AbstractOLTException("provisionONT failed for ont : {}", ontDevice);
+        }
+
+        return result;
+    }
+
+    public boolean provisionOntFull(ONTDevice ontDevice) {
+
+        boolean result = false;
+
+        try {
+            AddOntFullMessage addOntFullMessage = OntMessageFactory.getOntFullMessage(ontDevice);
+            AddOntReturn response = blockingStub.provisionOntFull(addOntFullMessage);
+            result = response.getSuccess();
+            log.info("provisionOntFull with device id : {} success : {}",ontDevice.getSerialNumber(), result);
+
+        } catch (RuntimeException e) {
+            log.error("provisionOntFull RPC failed", e);
+            throw new AbstractOLTException("provisionOntFull failed for ont : {}", ontDevice);
+        }
+
+        return result;
+    }
+
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTServer.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTServer.java
new file mode 100644
index 0000000..39c21c7
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTServer.java
@@ -0,0 +1,108 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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=========================================================
+ */
+
+
+
+/*
+ * Copyright 2015, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *    * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *    * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.onap.osam.external.grpc;
+
+import io.grpc.stub.StreamObserver;
+import lombok.extern.slf4j.Slf4j;
+import org.lognet.springboot.grpc.GRpcService;
+import org.onap.osam.grpc.*;
+
+import java.util.UUID;
+
+/**
+ * Server that manages startup/shutdown of a {@code AbstractOLTServer} server.
+ */
+
+@GRpcService
+@Slf4j
+public class AbstractOLTServer extends AbstractOLTGrpc.AbstractOLTImplBase {
+
+    @Override
+    public void echo(EchoMessage request, StreamObserver<EchoReplyMessage> responseObserver) {
+
+    }
+
+    @Override
+    public void createChassis(AddChassisMessage request, StreamObserver<AddChassisReturn> responseObserver) {
+        AddChassisReturn response = AddChassisReturn.newBuilder()
+                .setDeviceID(request.getCLLI())
+                .build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+        log.info("createChassis with clli : {}" , request.getCLLI());
+    }
+
+    @Override
+    public void createOLTChassis(AddOLTChassisMessage request, StreamObserver<AddOLTChassisReturn> responseObserver) {
+        AddOLTChassisReturn response = AddOLTChassisReturn.newBuilder()
+                .setDeviceID(UUID.randomUUID().toString())
+                .setChassisDeviceID(request.getCLLI()).build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+        log.info("createOLTChassis with clli : {}" , request.getCLLI());
+    }
+
+    @Override
+    public void provisionOnt(AddOntMessage request, StreamObserver<AddOntReturn> responseObserver) {
+        AddOntReturn response = AddOntReturn.newBuilder().setSuccess(true).build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+        log.info("provisionOnt success");
+    }
+
+    @Override
+    public void deleteOnt(DeleteOntMessage request, StreamObserver<DeleteOntReturn> responseObserver) {
+
+    }
+}
diff --git a/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/OntMessageFactory.java b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/OntMessageFactory.java
new file mode 100644
index 0000000..ff89f0b
--- /dev/null
+++ b/osam-core-framework/external/src/main/java/org/onap/osam/external/grpc/OntMessageFactory.java
@@ -0,0 +1,123 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.grpc;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.grpc.AddOntFullMessage;
+import org.onap.osam.grpc.AddOntMessage;
+import org.onap.osam.grpc.PreProvisionOntMessage;
+import org.onap.osam.model.dao.Chassis;
+import org.onap.osam.model.dao.OLTPort;
+import org.onap.osam.model.dao.OLTSlot;
+import org.onap.osam.model.dao.ONTDevice;
+
+@Slf4j
+public class OntMessageFactory {
+
+    public static PreProvisionOntMessage getPreProvisionOntMessage (ONTDevice ontDevice) {
+
+        OLTPort oltPort = ontDevice.getOLTPort();
+            OLTSlot oltSlot = oltPort.getOltSlot();
+            Chassis chassis = oltSlot.getChassis();
+            String clli = chassis.getClli();
+            String serialNumber = ontDevice.getSerialNumber();
+            int slotNumber = oltSlot.getNumber();
+            int portNumber = oltPort.getPortNumber();
+            int ontNumber = ontDevice.getNumber();
+            int stag = ontDevice.getSTag();
+            int ctag = ontDevice.getCTag();
+            String nasPortID = ontDevice.getNasPortId();
+            String circuitId = ontDevice.getCircuitId();
+            log.info("getPreProvisionOntMessage, clli: {}, serialNumber: {}, slotNumber: {}, portNumber:{}, ontNumber:{}, sTag:{}, cTag:{}, nasPortId:{}, circuitId:{}", clli, serialNumber, slotNumber, portNumber, ontNumber, stag, ctag,nasPortID, circuitId);
+
+            PreProvisionOntMessage preProvisionOntMessage = PreProvisionOntMessage.newBuilder()
+                    .setCLLI(clli)
+                    .setSlotNumber(slotNumber)
+                    .setPortNumber(portNumber)
+                    .setOntNumber(ontNumber)
+                    .setSTag(stag)
+                    .setCTag(ctag)
+                    .setNasPortID(nasPortID)
+                    .setCircuitID(circuitId)
+                    .build();
+            //TODO Handle technology and speed profiles later
+            log.info("PreProvisionOntMessage is {}", preProvisionOntMessage);
+            return  preProvisionOntMessage;
+
+    }
+
+
+    public static AddOntFullMessage getOntFullMessage (ONTDevice ontDevice) {
+
+        OLTPort oltPort = ontDevice.getOLTPort();
+        OLTSlot oltSlot = oltPort.getOltSlot();
+        Chassis chassis = oltSlot.getChassis();
+        String clli = chassis.getClli();
+        String serialNumber = ontDevice.getSerialNumber();
+        int slotNumber = oltSlot.getNumber();
+        int portNumber = oltPort.getPortNumber();
+        int ontNumber = ontDevice.getNumber();
+        int stag = ontDevice.getSTag();
+        int ctag = ontDevice.getCTag();
+        String nasPortID = ontDevice.getNasPortId();
+        String circuitId = ontDevice.getCircuitId();
+        log.info("getOntFullMessage, clli: {}, serialNumber: {}, slotNumber: {}, portNumber:{}, ontNumber:{}, sTag:{}, cTag:{}, nasPortId:{}, circuitId:{}", clli, serialNumber, slotNumber, portNumber, ontNumber, stag, ctag,nasPortID, circuitId);
+
+        AddOntFullMessage addOntFullMessage = AddOntFullMessage.newBuilder()
+                .setCLLI(clli)
+                .setSerialNumber(serialNumber)
+                .setSlotNumber(slotNumber)
+                .setPortNumber(portNumber)
+                .setOntNumber(ontNumber)
+                .setSTag(stag)
+                .setCTag(ctag)
+                .setNasPortID(nasPortID)
+                .setCircuitID(circuitId)
+                .build();
+        log.info("AddOntFullMessage is {}", addOntFullMessage);
+        return  addOntFullMessage;
+
+    }
+
+    public static AddOntMessage getOntMessage (ONTDevice ontDevice) {
+
+        OLTPort oltPort = ontDevice.getOLTPort();
+        OLTSlot oltSlot = oltPort.getOltSlot();
+        Chassis chassis = oltSlot.getChassis();
+        String clli = chassis.getClli();
+        String serialNumber = ontDevice.getSerialNumber();
+        int slotNumber = oltSlot.getNumber();
+        int portNumber = oltPort.getPortNumber();
+        int ontNumber = ontDevice.getNumber();
+        log.info("getOntFullMessage, clli: {}, serialNumber: {}, slotNumber: {}, portNumber:{}, ontNumber:{}", clli, serialNumber, slotNumber, portNumber, ontNumber);
+
+        AddOntMessage addOntMessage = AddOntMessage.newBuilder()
+                .setCLLI(clli)
+                .setSerialNumber(serialNumber)
+                .setSlotNumber(slotNumber)
+                .setPortNumber(portNumber)
+                .setOntNumber(ontNumber)
+                .build();
+        log.info("AddOntMessage is {}", addOntMessage);
+        return  addOntMessage;
+
+    }
+}
diff --git a/osam-core-framework/external/src/main/proto/abstract_olt_api.proto b/osam-core-framework/external/src/main/proto/abstract_olt_api.proto
new file mode 100644
index 0000000..055acd9
--- /dev/null
+++ b/osam-core-framework/external/src/main/proto/abstract_olt_api.proto
@@ -0,0 +1,222 @@
+//Copyright 2017 the original author or authors.
+//
+//  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.
+
+syntax = "proto3";
+package api;
+import "google/api/annotations.proto";
+
+option java_multiple_files = true;
+option java_package = "org.onap.osam.grpc";
+option java_outer_classname = "AbstractOLTProto";
+
+message EchoMessage{
+   string Ping =1;
+}
+message EchoReplyMessage{
+   string Pong =1;
+}
+
+message AddChassisMessage{
+   string CLLI =1;
+   string XOSIP =2;
+   int32 XOSPort=3;
+   string XOSUser=4;
+   string XOSPassword=5;
+   int32 Rack=6;
+   int32 Shelf=7;
+}
+message AddChassisReturn{
+   string DeviceID = 1;
+}
+message ChangeXOSUserPasswordMessage{
+   string CLLI =1;
+   string XOSUser=2;
+   string XOSPassword=3;
+}
+message ChangeXOSUserPasswordReturn{
+   bool Success=1;
+}
+
+message AddOLTChassisMessage{
+   string CLLI=1;
+   string SlotIP=2;
+   fixed32 SlotPort=3;
+   string Hostname=4;
+   fixed32 NumPorts = 5;
+   bool Activate = 6;
+   enum OltDriver {
+      openoltDriver= 0;
+      asfvolt16Driver=1;
+      adtranDriver=2;
+      tibitsDriver=3;
+   }
+   OltDriver Driver=7;
+   enum OltType{
+      edgecore=0;
+      adtran=1;
+      tibit=2;
+   }
+   OltType Type=8;
+
+}
+message AddOLTChassisReturn {
+   string DeviceID =1;
+   string ChassisDeviceID =2;
+}
+
+message AddOntMessage{
+   string CLLI=1;
+   int32 SlotNumber=2;
+   int32 PortNumber=3;
+   int32 OntNumber=4;
+   string SerialNumber=5;
+}
+message PreProvisionOntMessage{
+   string CLLI=1;
+   int32 SlotNumber=2;
+   int32 PortNumber=3;
+   int32 OntNumber=4;
+   uint32 STag=5;
+   uint32 CTag=6;
+   string NasPortID=7;
+   string CircuitID=8;
+   string TechProfile=9;
+   string SpeedProfile=10;
+}
+message AddOntFullMessage{
+   string CLLI=1;
+   int32 SlotNumber=2;
+   int32 PortNumber=3;
+   int32 OntNumber=4;
+   string SerialNumber=5;
+   uint32 STag=6;
+   uint32 CTag=7;
+   string NasPortID=8;
+   string CircuitID=9;
+}
+message AddOntReturn{
+   bool Success=1;
+}
+
+message DeleteOntMessage{
+   string CLLI=1;
+   int32 SlotNumber=2;
+   int32 PortNumber=3;
+   int32 OntNumber=4;
+   string SerialNumber=5;
+}
+message DeleteOntReturn{
+   bool Success=1;
+}
+message ReflowMessage{
+}
+message ReflowReturn{
+    bool Success=1;
+}
+message OutputMessage{
+   string Something=1;
+}
+message OutputReturn{
+   bool Success=1;
+}
+message FullInventoryMessage{
+}
+message InventoryMessage{
+   string Clli=1;
+}
+message InventoryReturn{
+   string JsonDump=1;
+}
+service AbstractOLT{
+   rpc Echo(EchoMessage) returns (EchoReplyMessage){
+      option(google.api.http)={
+        post:"/v1/Echo"
+	body:"*"
+      };
+   }
+   rpc CreateChassis(AddChassisMessage) returns (AddChassisReturn) {
+      option(google.api.http) = {
+         post: "/v1/CreateAbstractChassis"
+	 body:"*"
+      };
+   }
+   rpc ChangeXOSUserPassword(ChangeXOSUserPasswordMessage) returns(ChangeXOSUserPasswordReturn){
+      option(google.api.http)={
+        post:"/v1/ChangeXOSUserPassword"
+	body:"*"
+      };
+   }
+   rpc CreateOLTChassis(AddOLTChassisMessage) returns (AddOLTChassisReturn) {
+      option(google.api.http) = {
+         post: "/v1/CreateOLTChassis"
+	 body:"*"
+      };
+   }
+   rpc PreProvisionOnt(PreProvisionOntMessage) returns (AddOntReturn) {
+      option(google.api.http) = {
+         post:"/v1/PreProvsionOnt"
+	 body:"*"
+      };
+   }
+   rpc ActivateSerial(AddOntMessage) returns (AddOntReturn) {
+      option(google.api.http) = {
+         post:"/v1/ActivateSerial"
+	 body:"*"
+      };
+   }
+   rpc ProvisionOnt(AddOntMessage) returns (AddOntReturn) {
+      option(google.api.http) = {
+         post:"/v1/ProvsionOnt"
+	 body:"*"
+      };
+   }
+   rpc ProvisionOntFull(AddOntFullMessage) returns (AddOntReturn) {
+      option(google.api.http) = {
+         post:"/v1/ProvsionOtFull"
+	 body:"*"
+      };
+   }
+   rpc DeleteOnt(DeleteOntMessage) returns (DeleteOntReturn){
+      option(google.api.http)={
+        post:"/v1/DeleteOnt"
+	body:"*"
+      };
+   }
+   rpc Reflow(ReflowMessage)returns (ReflowReturn){
+       option(google.api.http)={
+           post:"/v1/Reflow"
+           body:"*"
+
+       };
+   }
+   rpc Output(OutputMessage)returns(OutputReturn){
+      option(google.api.http)={
+        post:"/v1/Output"
+	    body:"*"
+      };
+   }
+   rpc GetFullInventory(FullInventoryMessage)returns(InventoryReturn){
+      option(google.api.http)={
+        post:"/v1/FullInventory"
+	    body:"*"
+      };
+   }
+   rpc GetInventory(InventoryMessage)returns(InventoryReturn){
+      option(google.api.http)={
+        post:"/v1/Inventory"
+	    body:"*"
+      };
+   }
+}
+
diff --git a/osam-core-framework/external/src/main/proto/google/api/annotations.proto b/osam-core-framework/external/src/main/proto/google/api/annotations.proto
new file mode 100644
index 0000000..8430836
--- /dev/null
+++ b/osam-core-framework/external/src/main/proto/google/api/annotations.proto
@@ -0,0 +1,31 @@
+// Copyright (c) 2015, Google Inc.
+//
+// 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.
+
+syntax = "proto3";
+
+package google.api;
+
+import "google/api/http.proto";
+import "google/protobuf/descriptor.proto";
+
+option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations";
+option java_multiple_files = true;
+option java_outer_classname = "AnnotationsProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+extend google.protobuf.MethodOptions {
+  // See `HttpRule`.
+  HttpRule http = 72295728;
+}
diff --git a/osam-core-framework/external/src/main/proto/google/api/http.proto b/osam-core-framework/external/src/main/proto/google/api/http.proto
new file mode 100644
index 0000000..1c98236
--- /dev/null
+++ b/osam-core-framework/external/src/main/proto/google/api/http.proto
@@ -0,0 +1,370 @@
+// Copyright 2018 Google LLC.
+//
+// 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.
+//
+
+syntax = "proto3";
+
+package google.api;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations";
+option java_multiple_files = true;
+option java_outer_classname = "HttpProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+
+// Defines the HTTP configuration for an API service. It contains a list of
+// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method
+// to one or more HTTP REST API methods.
+message Http {
+  // A list of HTTP configuration rules that apply to individual API methods.
+  //
+  // **NOTE:** All service configuration rules follow "last one wins" order.
+  repeated HttpRule rules = 1;
+
+  // When set to true, URL path parmeters will be fully URI-decoded except in
+  // cases of single segment matches in reserved expansion, where "%2F" will be
+  // left encoded.
+  //
+  // The default behavior is to not decode RFC 6570 reserved characters in multi
+  // segment matches.
+  bool fully_decode_reserved_expansion = 2;
+}
+
+// # gRPC Transcoding
+//
+// gRPC Transcoding is a feature for mapping between a gRPC method and one or
+// more HTTP REST endpoints. It allows developers to build a single API service
+// that supports both gRPC APIs and REST APIs. Many systems, including [Google
+// APIs](https://github.com/googleapis/googleapis),
+// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC
+// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),
+// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature
+// and use it for large scale production services.
+//
+// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies
+// how different portions of the gRPC request message are mapped to the URL
+// path, URL query parameters, and HTTP request body. It also controls how the
+// gRPC response message is mapped to the HTTP response body. `HttpRule` is
+// typically specified as an `google.api.http` annotation on the gRPC method.
+//
+// Each mapping specifies a URL path template and an HTTP method. The path
+// template may refer to one or more fields in the gRPC request message, as long
+// as each field is a non-repeated field with a primitive (non-message) type.
+// The path template controls how fields of the request message are mapped to
+// the URL path.
+//
+// Example:
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//             get: "/v1/{name=messages/*"}"
+//         };
+//       }
+//     }
+//     message GetMessageRequest {
+//       string name = 1; // Mapped to URL path.
+//     }
+//     message Message {
+//       string text = 1; // The resource content.
+//     }
+//
+// This enables an HTTP REST to gRPC mapping as below:
+//
+// HTTP | gRPC
+// -----|-----
+// `GET /v1/messages/123456`  | `GetMessage(name: "messages/123456")`
+//
+// Any fields in the request message which are not bound by the path template
+// automatically become HTTP query parameters if there is no HTTP request body.
+// For example:
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//             get:"/v1/messages/{message_id}"
+//         };
+//       }
+//     }
+//     message GetMessageRequest {
+//       message SubMessage {
+//         string subfield = 1;
+//       }
+//       string message_id = 1; // Mapped to URL path.
+//       int64 revision = 2;    // Mapped to URL query parameter `revision`.
+//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.
+//     }
+//
+// This enables a HTTP JSON to RPC mapping as below:
+//
+// HTTP | gRPC
+// -----|-----
+// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))`
+//
+// Note that fields which are mapped to URL query parameters must have a
+// primitive type or a repeated primitive type or a non-repeated message type.
+// In the case of a repeated type, the parameter can be repeated in the URL
+// as `...?param=A&param=B`. In the case of a message type, each field of the
+// message is mapped to a separate parameter, such as
+// `...?foo.a=A&foo.b=B&foo.c=C`.
+//
+// For HTTP methods that allow a request body, the `body` field
+// specifies the mapping. Consider a REST update method on the
+// message resource collection:
+//
+//     service Messaging {
+//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//           patch: "/v1/messages/{message_id}"
+//           body: "message"
+//         };
+//       }
+//     }
+//     message UpdateMessageRequest {
+//       string message_id = 1; // mapped to the URL
+//       Message message = 2;   // mapped to the body
+//     }
+//
+// The following HTTP JSON to RPC mapping is enabled, where the
+// representation of the JSON in the request body is determined by
+// protos JSON encoding:
+//
+// HTTP | gRPC
+// -----|-----
+// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })`
+//
+// The special name `*` can be used in the body mapping to define that
+// every field not bound by the path template should be mapped to the
+// request body.  This enables the following alternative definition of
+// the update method:
+//
+//     service Messaging {
+//       rpc UpdateMessage(Message) returns (Message) {
+//         option (google.api.http) = {
+//           patch: "/v1/messages/{message_id}"
+//           body: "*"
+//         };
+//       }
+//     }
+//     message Message {
+//       string message_id = 1;
+//       string text = 2;
+//     }
+//
+//
+// The following HTTP JSON to RPC mapping is enabled:
+//
+// HTTP | gRPC
+// -----|-----
+// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")`
+//
+// Note that when using `*` in the body mapping, it is not possible to
+// have HTTP parameters, as all fields not bound by the path end in
+// the body. This makes this option more rarely used in practice when
+// defining REST APIs. The common usage of `*` is in custom methods
+// which don't use the URL at all for transferring data.
+//
+// It is possible to define multiple HTTP methods for one RPC by using
+// the `additional_bindings` option. Example:
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//           get: "/v1/messages/{message_id}"
+//           additional_bindings {
+//             get: "/v1/users/{user_id}/messages/{message_id}"
+//           }
+//         };
+//       }
+//     }
+//     message GetMessageRequest {
+//       string message_id = 1;
+//       string user_id = 2;
+//     }
+//
+// This enables the following two alternative HTTP JSON to RPC mappings:
+//
+// HTTP | gRPC
+// -----|-----
+// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
+// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")`
+//
+// ## Rules for HTTP mapping
+//
+// 1. Leaf request fields (recursive expansion nested messages in the request
+//    message) are classified into three categories:
+//    - Fields referred by the path template. They are passed via the URL path.
+//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP
+//      request body.
+//    - All other fields are passed via the URL query parameters, and the
+//      parameter name is the field path in the request message. A repeated
+//      field can be represented as multiple query parameters under the same
+//      name.
+//  2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL query parameter, all fields
+//     are passed via URL path and HTTP request body.
+//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all
+//     fields are passed via URL path and URL query parameters.
+//
+// ### Path template syntax
+//
+//     Template = "/" Segments [ Verb ] ;
+//     Segments = Segment { "/" Segment } ;
+//     Segment  = "*" | "**" | LITERAL | Variable ;
+//     Variable = "{" FieldPath [ "=" Segments ] "}" ;
+//     FieldPath = IDENT { "." IDENT } ;
+//     Verb     = ":" LITERAL ;
+//
+// The syntax `*` matches a single URL path segment. The syntax `**` matches
+// zero or more URL path segments, which must be the last part of the URL path
+// except the `Verb`.
+//
+// The syntax `Variable` matches part of the URL path as specified by its
+// template. A variable template must not contain other variables. If a variable
+// matches a single path segment, its template may be omitted, e.g. `{var}`
+// is equivalent to `{var=*}`.
+//
+// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`
+// contains any reserved character, such characters should be percent-encoded
+// before the matching.
+//
+// If a variable contains exactly one path segment, such as `"{var}"` or
+// `"{var=*}"`, when such a variable is expanded into a URL path on the client
+// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The
+// server side does the reverse decoding. Such variables show up in the
+// [Discovery Document](https://developers.google.com/discovery/v1/reference/apis)
+// as `{var}`.
+//
+// If a variable contains multiple path segments, such as `"{var=foo/*}"`
+// or `"{var=**}"`, when such a variable is expanded into a URL path on the
+// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.
+// The server side does the reverse decoding, except "%2F" and "%2f" are left
+// unchanged. Such variables show up in the
+// [Discovery Document](https://developers.google.com/discovery/v1/reference/apis)
+// as `{+var}`.
+//
+// ## Using gRPC API Service Configuration
+//
+// gRPC API Service Configuration (service config) is a configuration language
+// for configuring a gRPC service to become a user-facing product. The
+// service config is simply the YAML representation of the `google.api.Service`
+// proto message.
+//
+// As an alternative to annotating your proto file, you can configure gRPC
+// transcoding in your service config YAML files. You do this by specifying a
+// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same
+// effect as the proto annotation. This can be particularly useful if you
+// have a proto that is reused in multiple services. Note that any transcoding
+// specified in the service config will override any matching transcoding
+// configuration in the proto.
+//
+// Example:
+//
+//     http:
+//       rules:
+//         # Selects a gRPC method and applies HttpRule to it.
+//         - selector: example.v1.Messaging.GetMessage
+//           get: /v1/messages/{message_id}/{sub.subfield}
+//
+// ## Special notes
+//
+// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the
+// proto to JSON conversion must follow the [proto3
+// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).
+//
+// While the single segment variable follows the semantics of
+// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String
+// Expansion, the multi segment variable **does not** follow RFC 6570 Section
+// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion
+// does not expand special characters like `?` and `#`, which would lead
+// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding
+// for multi segment variables.
+//
+// The path variables **must not** refer to any repeated or mapped field,
+// because client libraries are not capable of handling such variable expansion.
+//
+// The path variables **must not** capture the leading "/" character. The reason
+// is that the most common use case "{var}" does not capture the leading "/"
+// character. For consistency, all path variables must share the same behavior.
+//
+// Repeated message fields must not be mapped to URL query parameters, because
+// no client library can support such complicated mapping.
+//
+// If an API needs to use a JSON array for request or response body, it can map
+// the request or response body to a repeated field. However, some gRPC
+// Transcoding implementations may not support this feature.
+message HttpRule {
+  // Selects a method to which this rule applies.
+  //
+  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
+  string selector = 1;
+
+  // Determines the URL pattern is matched by this rules. This pattern can be
+  // used with any of the {get|put|post|delete|patch} methods. A custom method
+  // can be defined using the 'custom' field.
+  oneof pattern {
+    // Maps to HTTP GET. Used for listing and getting information about
+    // resources.
+    string get = 2;
+
+    // Maps to HTTP PUT. Used for replacing a resource.
+    string put = 3;
+
+    // Maps to HTTP POST. Used for creating a resource or performing an action.
+    string post = 4;
+
+    // Maps to HTTP DELETE. Used for deleting a resource.
+    string delete = 5;
+
+    // Maps to HTTP PATCH. Used for updating a resource.
+    string patch = 6;
+
+    // The custom pattern is used for specifying an HTTP method that is not
+    // included in the `pattern` field, such as HEAD, or "*" to leave the
+    // HTTP method unspecified for this rule. The wild-card rule is useful
+    // for services that provide content to Web (HTML) clients.
+    CustomHttpPattern custom = 8;
+  }
+
+  // The name of the request field whose value is mapped to the HTTP request
+  // body, or `*` for mapping all request fields not captured by the path
+  // pattern to the HTTP body, or omitted for not having any HTTP request body.
+  //
+  // NOTE: the referred field must be present at the top-level of the request
+  // message type.
+  string body = 7;
+
+  // Optional. The name of the response field whose value is mapped to the HTTP
+  // response body. When omitted, the entire response message will be used
+  // as the HTTP response body.
+  //
+  // NOTE: The referred field must be present at the top-level of the response
+  // message type.
+  string response_body = 12;
+
+  // Additional HTTP bindings for the selector. Nested bindings must
+  // not contain an `additional_bindings` field themselves (that is,
+  // the nesting may only be one level deep).
+  repeated HttpRule additional_bindings = 11;
+}
+
+// A custom pattern is used for defining custom HTTP verb.
+message CustomHttpPattern {
+  // The name of this custom HTTP verb.
+  string kind = 1;
+
+  // The path matched by this custom verb.
+  string path = 2;
+}
diff --git a/osam-core-framework/external/src/main/resources/aai.properties b/osam-core-framework/external/src/main/resources/aai.properties
new file mode 100644
index 0000000..e8abfe0
--- /dev/null
+++ b/osam-core-framework/external/src/main/resources/aai.properties
@@ -0,0 +1,7 @@
+aai.host=192.168.62.68
+aai.port=8443
+aai.protocol=https
+aai.username=AAI
+aai.password=AAI
+aai.base.path=/aai/v12
+aai.pnf.path=/network/pnfs/pnf
diff --git a/osam-core-framework/external/src/main/resources/abstractolt.properties b/osam-core-framework/external/src/main/resources/abstractolt.properties
new file mode 100644
index 0000000..07392d8
--- /dev/null
+++ b/osam-core-framework/external/src/main/resources/abstractolt.properties
@@ -0,0 +1,2 @@
+abstractolt.host=135.25.86.132
+abstractolt.port=7777
diff --git a/osam-core-framework/external/src/test/java/org/onap/osam/external/aai/AaiClientTestIT.java b/osam-core-framework/external/src/test/java/org/onap/osam/external/aai/AaiClientTestIT.java
new file mode 100644
index 0000000..aadcd00
--- /dev/null
+++ b/osam-core-framework/external/src/test/java/org/onap/osam/external/aai/AaiClientTestIT.java
@@ -0,0 +1,73 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.external.aai;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.osam.external.aai.config.AaiConfig;
+import org.onap.osam.external.aai.model.PNF;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * Created by cemturker on 01.10.2018.
+ */
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ContextConfiguration(classes = {AaiConfig.class, AaiClientImpl.class})
+public class AaiClientTestIT {
+
+    @Autowired
+    private AaiClient aaiClient;
+
+    @Before
+    public void preProcess(){
+    }
+
+    @Test
+    public void aaiQueryTest(){
+        try {
+            //PNF pnf = aaiClient.queryPnf("1111");
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void aaiPutTest(){
+        try {
+            PNF pnf = new PNF();
+            pnf.setPnfId("111");
+            pnf.setPnfName("1111");
+            pnf.setIpaddressV4Oam("192.168.61.24");
+            //pnf = aaiClient.putPnf(pnf);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/osam-core-framework/main/pom.xml b/osam-core-framework/main/pom.xml
new file mode 100644
index 0000000..7186578
--- /dev/null
+++ b/osam-core-framework/main/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>main</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>web</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <finalName>osam-core-framework-${project.version}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/main/src/main/java/org/onap/osam/OsamApplication.java b/osam-core-framework/main/src/main/java/org/onap/osam/OsamApplication.java
new file mode 100644
index 0000000..fc207e4
--- /dev/null
+++ b/osam-core-framework/main/src/main/java/org/onap/osam/OsamApplication.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class OsamApplication {
+	public static void main(String[] args) {
+		SpringApplication.run(OsamApplication.class, args);
+	}
+}
diff --git a/osam-core-framework/main/src/main/resource/banner.txt b/osam-core-framework/main/src/main/resource/banner.txt
new file mode 100644
index 0000000..1ca3fcc
--- /dev/null
+++ b/osam-core-framework/main/src/main/resource/banner.txt
@@ -0,0 +1,5 @@
+ ,-----.   ,---.     ,---.   ,--.   ,--.    ,-----.  ,-----.  ,------.  ,------.
+'  .-.  ' '   .-'   /  O  \  |   `.'   |   '  .--./ '  .-.  ' |  .--. ' |  .---'
+|  | |  | `.  `-.  |  .-.  | |  |'.'|  |   |  |     |  | |  | |  '--'.' |  `--,
+'  '-'  ' .-'    | |  | |  | |  |   |  |   '  '--'\ '  '-'  ' |  |\  \  |  `---.
+ `-----'  `-----'  `--' `--' `--'   `--'    `-----'  `-----'  `--' '--' `------'
diff --git a/osam-core-framework/main/src/test/java/org/onap/osam/OsamApplicationTests.java b/osam-core-framework/main/src/test/java/org/onap/osam/OsamApplicationTests.java
new file mode 100644
index 0000000..9814086
--- /dev/null
+++ b/osam-core-framework/main/src/test/java/org/onap/osam/OsamApplicationTests.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class OsamApplicationTests {
+    @Test
+    public void contextLoads() {
+    }
+
+}*/
diff --git a/osam-core-framework/model/pom.xml b/osam-core-framework/model/pom.xml
new file mode 100644
index 0000000..2a32ecf
--- /dev/null
+++ b/osam-core-framework/model/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>model</artifactId>
+
+    <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>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AccessPod.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AccessPod.java
new file mode 100644
index 0000000..879e937
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AccessPod.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class AccessPod extends BaseEntity {
+
+    @Column(unique = true)
+    private String pnfId;
+    @Column(nullable = false)
+    private String coreIp;
+    @Column(nullable = false)
+    private String corePort;
+    @Column(nullable = false)
+    private String ip;
+    @Column(nullable = false)
+    private String port;
+    private String username;
+    private String password;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("AccessPod{");
+        sb.append("pnfId='").append(pnfId).append('\'');
+        sb.append(", coreIp='").append(coreIp).append('\'');
+        sb.append(", corePort='").append(corePort).append('\'');
+        sb.append(", id=").append(id);
+        sb.append(", ip='").append(ip).append('\'');
+        sb.append(", port='").append(port).append('\'');
+        sb.append(", username='").append(username).append('\'');
+        sb.append(", password='").append(password).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActiveAlarmsAndEvents.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActiveAlarmsAndEvents.java
new file mode 100644
index 0000000..d875d08
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActiveAlarmsAndEvents.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Table(name = "active_alarm_and_events")
+@Entity
+@NoArgsConstructor
+public class ActiveAlarmsAndEvents extends AlarmsAndEvents {
+
+    public ActiveAlarmsAndEvents(AlarmsAndEvents alarmsAndEvents){
+        super.setAlarmName(alarmsAndEvents.getAlarmName());
+        super.setDate(alarmsAndEvents.getDate());
+        super.setId(alarmsAndEvents.getId());
+        super.setAlarmStatus(alarmsAndEvents.getAlarmStatus());
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActivityState.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActivityState.java
new file mode 100644
index 0000000..436f5ac
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ActivityState.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public enum ActivityState {
+    ACTIVE, INACTIVE
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AdminState.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AdminState.java
new file mode 100644
index 0000000..bf92071
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AdminState.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public enum AdminState {
+    ENABLED, DISABLED,PREPROVISION
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmStatus.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmStatus.java
new file mode 100644
index 0000000..1c6f9b0
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmStatus.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+public enum AlarmStatus {
+    ACTIVE("active"),
+    DEACTIVE("deactive");
+    String type;
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmsAndEvents.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmsAndEvents.java
new file mode 100644
index 0000000..76e0f32
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/AlarmsAndEvents.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@MappedSuperclass
+public class AlarmsAndEvents extends BaseEntity {
+
+    @Enumerated(value = EnumType.STRING)
+    AlarmStatus alarmStatus;
+
+    String alarmName;
+
+    @Temporal(TemporalType.TIME)
+    Date date;
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/BaseEntity.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/BaseEntity.java
new file mode 100644
index 0000000..67e7fe3
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/BaseEntity.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import java.io.Serializable;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@MappedSuperclass
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class BaseEntity implements Serializable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    protected Long id;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("BaseEntity{");
+        sb.append("id=").append(id);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        BaseEntity that = (BaseEntity) o;
+
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Chassis.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Chassis.java
new file mode 100644
index 0000000..0a17b3a
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Chassis.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class Chassis extends BaseEntity {
+
+    @Column(unique = true)
+    private String clli;
+    private int rack;
+    private int shelf;
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState state;
+    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "chassis")
+    private Set<OLTSlot> oltSlots;
+    @ManyToOne
+    @JoinColumn(name="accessPod_pnfId", nullable=false)
+    private AccessPod accessPod;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("Chassis{");
+        sb.append("clli=").append(clli);
+        sb.append(", state='").append(state).append('\'');
+        sb.append(", rack='").append(rack).append('\'');
+        sb.append(", shelf='").append(shelf).append('\'');
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/HistoricalAlarmsAndEvents.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/HistoricalAlarmsAndEvents.java
new file mode 100644
index 0000000..c3b7b2d
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/HistoricalAlarmsAndEvents.java
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Table(name = "historical_alarms_and_events")
+@Entity
+public class HistoricalAlarmsAndEvents extends AlarmsAndEvents {
+    public HistoricalAlarmsAndEvents(AlarmsAndEvents alarmsAndEvents){
+        super.setAlarmName(alarmsAndEvents.getAlarmName());
+        super.setDate(alarmsAndEvents.getDate());
+        super.setId(alarmsAndEvents.getId());
+        super.setAlarmStatus(alarmsAndEvents.getAlarmStatus());
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTPort.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTPort.java
new file mode 100644
index 0000000..4783c9d
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTPort.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class OLTPort extends BaseEntity {
+
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState portAuthState;
+    @Enumerated(value = EnumType.STRING)
+    private AdminState adminState;
+    private Integer portNumber;
+    @ManyToOne
+    @JoinColumn(name="OLTSlot_id", nullable=false)
+    private OLTSlot oltSlot;
+    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "OLTPort")
+    private Set<ONTDevice> ontDevices;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("oltSlot{");
+        sb.append("id=").append(id);
+        sb.append(", portAuthState='").append(portAuthState).append('\'');
+        sb.append(", adminState='").append(adminState).append('\'');
+        sb.append(", portNumber=").append(portNumber);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTSlot.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTSlot.java
new file mode 100644
index 0000000..9d39503
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OLTSlot.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class OLTSlot extends BaseEntity {
+
+    private String serialNumber;
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState operationalState;
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState portAuthState;
+    @Enumerated(value = EnumType.STRING)
+    private AdminState adminState;
+    private String ipAddress;
+    private String hostname;
+    private String macAddress;
+    private Integer port;
+    private Integer number;
+    @Enumerated(value = EnumType.STRING)
+    private OltDriver oltDriver;
+    @Enumerated(value = EnumType.STRING)
+    private OltType oltType;
+    private String name;
+    @ManyToOne
+    @JoinColumn(name="chassis_id", nullable=false)
+    private Chassis chassis;
+    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "oltSlot")
+    private Set<OLTPort> oltPorts;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("oltSlot{");
+        sb.append("serialNumber=").append(serialNumber);
+        sb.append(", operationalState='").append(operationalState).append('\'');
+        sb.append(", portAuthState='").append(portAuthState).append('\'');
+        sb.append(", adminState='").append(adminState).append('\'');
+        sb.append(", ipAddress=").append(ipAddress);
+        sb.append(", hostname=").append(hostname);
+        sb.append(", macAddress=").append(macAddress);
+        sb.append(", port=").append(port);
+        sb.append(", number=").append(number);
+        sb.append(", name=").append(name);
+        sb.append(", oltDriver=").append(oltDriver);
+        sb.append(", oltType=").append(oltType);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java
new file mode 100644
index 0000000..804627f
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class ONTDevice extends BaseEntity {
+
+    private String serialNumber;
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState portAuthState;
+    @Enumerated(value = EnumType.STRING)
+    private AdminState adminState;
+    @Enumerated(value = EnumType.STRING)
+    private ActivityState operationalState;
+    private String ipAddress;
+    private String macAddress;
+    private int number;
+    private int sTag;
+    private int cTag;
+    private String nasPortId;
+    private String circuitId;
+    private TechnologyProfile techProfile;
+    private SpeedProfile speedProfile;
+    @ManyToOne
+    @JoinColumn(name="OLTPort_id", nullable=false)
+    private OLTPort OLTPort;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("oltSlot{");
+        sb.append("id=").append(id);
+        sb.append(", serialNumber='").append(serialNumber).append('\'');
+        sb.append(", portAuthState='").append(portAuthState).append('\'');
+        sb.append(", adminState='").append(adminState).append('\'');
+        sb.append(", operationalState='").append(operationalState).append('\'');
+        sb.append(", macAddress='").append(macAddress).append('\'');
+        sb.append(", number='").append(number).append('\'');
+        sb.append(", ipAddress=").append(ipAddress);
+        sb.append(", sTag=").append(ipAddress);
+        sb.append(", cTag=").append(cTag);
+        sb.append(", nasPortId=").append(nasPortId);
+        sb.append(", circuitId=").append(circuitId);
+        sb.append(", techProfile=").append(techProfile);
+        sb.append(", speedProfile=").append(speedProfile);
+        sb.append('}');
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltDriver.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltDriver.java
new file mode 100644
index 0000000..2418196
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltDriver.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public enum OltDriver {
+    OPENOLT,
+    ASFVOLT16,
+    ADTRAN,
+    TIBITS
+}
+
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltType.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltType.java
new file mode 100644
index 0000000..02de226
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/OltType.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public enum OltType {
+    EDGECORE,
+    ADTRAN,
+    TIBIT,
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfig.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfig.java
new file mode 100644
index 0000000..8cf9d25
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfig.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "pm_config")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class PmConfig extends BaseEntity {
+    @Enumerated(value = EnumType.STRING)
+    private PmConfigType type;
+
+    private String name;
+    private Boolean enabled;
+    private Integer sampleFreq;
+
+    @ManyToOne
+    @JoinColumn(name="pm_configs_id")
+    private PmConfigs pmConfigs;
+
+    @ManyToOne
+    @JoinColumn(name="pm_group_config_id")
+    private PmGroupConfig pmGroupConfig;
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigType.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigType.java
new file mode 100644
index 0000000..ac03d48
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigType.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+public enum PmConfigType {
+    COUNTER,
+    GAUGE,
+    STATE,
+    CONTEXT
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigs.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigs.java
new file mode 100644
index 0000000..fa76f80
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmConfigs.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "pm_configs")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class PmConfigs extends BaseEntity{
+    private Boolean grouped;
+    @OneToMany(mappedBy = "pmConfigs",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    List<PmGroupConfig> pmGroupConfig;
+    @OneToMany(mappedBy = "pmConfigs",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+    List<PmConfig> pmConfig;
+
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmGroupConfig.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmGroupConfig.java
new file mode 100644
index 0000000..a233886
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/PmGroupConfig.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "pm_group_config")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+public class PmGroupConfig extends BaseEntity {
+    private String groupName;
+    private Integer groupFreq;
+    private Boolean enabled;
+    @OneToMany(mappedBy = "pmGroupConfig",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+    private List<PmConfig> pmConfigList;
+
+    @ManyToOne
+    @JoinColumn(name="pm_configs_id")
+    private PmConfigs pmConfigs;
+
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Service.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Service.java
new file mode 100644
index 0000000..a8c5ea5
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Service.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToOne;
+import java.util.Set;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class Service extends BaseEntity {
+
+    private String name;
+    @OneToOne(fetch = FetchType.EAGER)
+    private TechnologyProfile technologyProfile;
+    @OneToOne(fetch = FetchType.EAGER)
+    private SpeedProfile upStreamProfile;
+    @OneToOne(fetch = FetchType.EAGER)
+    private SpeedProfile downStreamProfile;
+
+    @ManyToMany(mappedBy = "services")
+    private Set<Subscriber> subscribers;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("Service{");
+        sb.append("name='").append(name).append('\'');
+        sb.append(", technologyProfile=").append(technologyProfile);
+        sb.append(", id=").append(id);
+        sb.append(", upStreamProfile=").append(upStreamProfile);
+        sb.append(", downStreamProfile=").append(downStreamProfile);
+        sb.append(", subscribers=").append(subscribers);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java
new file mode 100644
index 0000000..a3994da
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class SpeedProfile extends BaseEntity {
+
+    @Enumerated(value = EnumType.STRING)
+    private StreamDirection streamDirection;
+    private String name;
+    private String data;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("SpeedProfile{");
+        sb.append("streamDirection=").append(streamDirection);
+        sb.append(", name='").append(name).append('\'');
+        sb.append(", data='").append(data).append('\'');
+        sb.append(", id=").append(id);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/StreamDirection.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/StreamDirection.java
new file mode 100644
index 0000000..d84c518
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/StreamDirection.java
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public enum  StreamDirection {
+    UPSTREAM, DOWNSTREAM
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Subscriber.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Subscriber.java
new file mode 100644
index 0000000..6da876d
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/Subscriber.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Entity
+@Setter
+@Getter
+public class Subscriber extends BaseEntity {
+
+    @Column(unique = true)
+    private String userIdentifier;
+    private Integer cTag;
+    private Integer sTag;
+    @ManyToMany
+    @JoinTable(name = "subscriber_service", joinColumns = @JoinColumn(name = "subscriber_id"),
+    inverseJoinColumns = @JoinColumn(name = "service_id"))
+    private Set<Service> services;
+
+    //TODO Configurations such as NAS and DHCP!
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("Subscriber{");
+        sb.append("userIdentifier='").append(userIdentifier).append('\'');
+        sb.append(", cTag=").append(cTag);
+        sb.append(", sTag=").append(sTag);
+        sb.append(", services=").append(services);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java
new file mode 100644
index 0000000..e13b245
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.dao;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Entity
+@Getter
+@Setter
+public class TechnologyProfile extends BaseEntity {
+
+    private String name;
+    private String data;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("TechnologyProfile{");
+        sb.append("id='").append(id).append('\'');
+        sb.append(", name=").append(name);
+        sb.append(", data=").append(data);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/AccessPodRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/AccessPodRepository.java
new file mode 100644
index 0000000..c4a400c
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/AccessPodRepository.java
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.AccessPod;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Optional;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+public interface AccessPodRepository extends CrudRepository<AccessPod, Long> {
+    Optional<AccessPod> findByPnfId(String pnfId);
+    void removeByPnfId(String pnfId);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ActiveAlarmsAndEventsRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ActiveAlarmsAndEventsRepository.java
new file mode 100644
index 0000000..f474c5b
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ActiveAlarmsAndEventsRepository.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.ActiveAlarmsAndEvents;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ActiveAlarmsAndEventsRepository extends CrudRepository<ActiveAlarmsAndEvents, Long> {
+    List<ActiveAlarmsAndEvents> findAllActiveAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual(Date endDate, Date startDate);
+
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ChassisRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ChassisRepository.java
new file mode 100644
index 0000000..73f1d5f
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ChassisRepository.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.Chassis;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public interface ChassisRepository extends CrudRepository<Chassis, Long> {
+
+    @Query("select c from Chassis c where c.clli = ?1")
+    Optional<Chassis> findByClli(String clli);
+    Optional<List<Chassis>> findByAccessPodPnfId(String pnfId);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/HistoricalAlarmsAndEventsRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/HistoricalAlarmsAndEventsRepository.java
new file mode 100644
index 0000000..8b1db77
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/HistoricalAlarmsAndEventsRepository.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.HistoricalAlarmsAndEvents;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Date;
+import java.util.List;
+
+public interface HistoricalAlarmsAndEventsRepository extends CrudRepository<HistoricalAlarmsAndEvents, Long> {
+    List<HistoricalAlarmsAndEvents> findAllHistoricalAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual(Date endDate, Date startDate);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTPortRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTPortRepository.java
new file mode 100644
index 0000000..06b7694
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTPortRepository.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.OLTPort;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public interface OLTPortRepository extends JpaRepository<OLTPort, Long> {
+
+    Optional<OLTPort> findByPortNumber(int number);
+
+    Optional<OLTPort> findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(int portNumber, int slotNumber, String clli);
+
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTSlotRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTSlotRepository.java
new file mode 100644
index 0000000..d8fcddf
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/OLTSlotRepository.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.OLTSlot;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Optional;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public interface OLTSlotRepository extends CrudRepository<OLTSlot, Long> {
+
+    Optional<OLTSlot> findByNumber(int number);
+    Optional<OLTSlot> findBySerialNumber(String serialNumber);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ONTDeviceRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ONTDeviceRepository.java
new file mode 100644
index 0000000..9aac009
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ONTDeviceRepository.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.ONTDevice;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.Optional;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+public interface ONTDeviceRepository extends CrudRepository<ONTDevice, Long> {
+
+    Optional<ONTDevice> findBySerialNumber(String serialNumber);
+
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigRepository.java
new file mode 100644
index 0000000..9964268
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigRepository.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.PmConfig;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.List;
+
+public interface PmConfigRepository extends CrudRepository<PmConfig, Long> {
+
+    List<PmConfig> getByPmConfigs_Id(Long pmConfigsId);
+
+    List<PmConfig> getByPmGroupConfig_Id(Long pmGroupConfigId);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigsRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigsRepository.java
new file mode 100644
index 0000000..249f0c5
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmConfigsRepository.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.PmConfigs;
+import org.springframework.data.repository.CrudRepository;
+
+public interface PmConfigsRepository extends CrudRepository<PmConfigs, Long> {
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmGroupConfigRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmGroupConfigRepository.java
new file mode 100644
index 0000000..4867afe
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/PmGroupConfigRepository.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.PmGroupConfig;
+import org.springframework.data.repository.CrudRepository;
+
+public interface PmGroupConfigRepository extends CrudRepository<PmGroupConfig, Long> {
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ServiceRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ServiceRepository.java
new file mode 100644
index 0000000..fbec2a3
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/ServiceRepository.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.Service;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public interface ServiceRepository extends CrudRepository<Service, Long> {
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SpeedProfileRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SpeedProfileRepository.java
new file mode 100644
index 0000000..ee4fb0e
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SpeedProfileRepository.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.SpeedProfile;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public interface SpeedProfileRepository extends CrudRepository<SpeedProfile, Long> {
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SubscriberRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SubscriberRepository.java
new file mode 100644
index 0000000..51da514
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/SubscriberRepository.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.Subscriber;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * Created by cemturker on 19.09.2018.
+ */
+public interface SubscriberRepository extends CrudRepository<Subscriber, Long> {
+    Subscriber findByUserIdentifier(String userIdentifier);
+    void deleteByUserIdentifier(String userIdentifier);
+}
diff --git a/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/TechnologyProfileRepository.java b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/TechnologyProfileRepository.java
new file mode 100644
index 0000000..302cd52
--- /dev/null
+++ b/osam-core-framework/model/src/main/java/org/onap/osam/model/repository/TechnologyProfileRepository.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.model.repository;
+
+import org.onap.osam.model.dao.TechnologyProfile;
+import org.springframework.data.repository.CrudRepository;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+public interface TechnologyProfileRepository extends CrudRepository<TechnologyProfile, Long> {
+}
diff --git a/osam-core-framework/model/src/main/resources/application.properties b/osam-core-framework/model/src/main/resources/application.properties
new file mode 100644
index 0000000..3d2b5cb
--- /dev/null
+++ b/osam-core-framework/model/src/main/resources/application.properties
@@ -0,0 +1,10 @@
+spring.datasource.url=jdbc:mariadb://localhost:3306/osam_core
+spring.datasource.username=root
+spring.datasource.password=123456
+
+spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
+spring.jpa.hibernate.ddl-auto=update
+server.port=8888
+logging.level.org.onap.osam=DEBUG
+#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
+#logging.level.org.hibernate.type=TRACE
\ No newline at end of file
diff --git a/osam-core-framework/mvnw b/osam-core-framework/mvnw
new file mode 100644
index 0000000..7778d42
--- /dev/null
+++ b/osam-core-framework/mvnw
@@ -0,0 +1,225 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+echo $MAVEN_PROJECTBASEDIR
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/osam-core-framework/mvnw.cmd b/osam-core-framework/mvnw.cmd
new file mode 100644
index 0000000..48c810e
--- /dev/null
+++ b/osam-core-framework/mvnw.cmd
@@ -0,0 +1,143 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/osam-core-framework/pom.xml b/osam-core-framework/pom.xml
new file mode 100644
index 0000000..102e411
--- /dev/null
+++ b/osam-core-framework/pom.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.onap.osam</groupId>
+	<artifactId>osam-core-framework</artifactId>
+	<version>0.0.2</version>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.0.6.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<modules>
+		<module>common</module>
+        <module>async-jobs</module>
+		<module>model</module>
+		<module>api</module>
+		<module>external</module>
+		<module>core</module>
+		<module>web</module>
+		<module>main</module>
+	</modules>
+	<packaging>pom</packaging>
+
+	<name>osam</name>
+	<description>OpenSource Access Manager</description>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+		<grpc-spring-boot-starter.version>2.3.2</grpc-spring-boot-starter.version>
+		<os-maven-plugin.version>1.6.0</os-maven-plugin.version>
+		<protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version>
+		<guava.version>20.0</guava.version>
+		<msb.sdk.version>1.2.0-SNAPSHOT</msb.sdk.version>
+		<swagger.version>2.8.0</swagger.version>
+        <junitparams.version>1.1.1</junitparams.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<optional>true</optional>
+		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+        <dependency>
+            <groupId>pl.pragmatists</groupId>
+            <artifactId>JUnitParams</artifactId>
+            <version>${junitparams.version}</version>
+            <scope>test</scope>
+        </dependency>
+	</dependencies>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>model</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>api</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>common</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>async-jobs</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>external</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>core</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>web</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>${project.groupId}</groupId>
+				<artifactId>main</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+	<build>
+		<plugins>
+            <!-- License plugin should only run once at the start of the project.
+             For new classes, the header should be added manually by the company which creates it.-->
+            <!--<plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>license-maven-plugin</artifactId>
+                <version>1.16</version>
+                <configuration>
+                    <addJavaLicenseAfterPackage>false</addJavaLicenseAfterPackage>
+                    <processStartTag>============LICENSE_START=======================================================</processStartTag>
+                    <processEndTag>============LICENSE_END=========================================================</processEndTag>
+                    <sectionDelimiter>================================================================================</sectionDelimiter>
+                    <licenseName>apache_v2</licenseName>
+                    <inceptionYear>2018</inceptionYear>
+                    <organizationName>Netsia</organizationName>
+                    <projectName>OSAM Core</projectName>
+                    <canUpdateCopyright>true</canUpdateCopyright>
+                    <canUpdateDescription>true</canUpdateDescription>
+                    <canUpdateLicense>true</canUpdateLicense>
+                    <emptyLineAfterHeader>true</emptyLineAfterHeader>
+                    <verbose>false</verbose>
+                    <includes>
+                        <include>**/*.java</include>
+                    </includes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>first</id>
+                        <goals>
+                            <goal>update-file-header</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                    </execution>
+                </executions>
+            </plugin>-->
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+		</plugins>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <configuration>
+                        <useSystemClassLoader>false</useSystemClassLoader>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+	</build>
+</project>
diff --git a/osam-core-framework/web/pom.xml b/osam-core-framework/web/pom.xml
new file mode 100644
index 0000000..f29c599
--- /dev/null
+++ b/osam-core-framework/web/pom.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>osam-core-framework</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>web</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- For the async jobs demo controller -->
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>async-jobs</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/AbstractController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AbstractController.java
new file mode 100644
index 0000000..474c2c9
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AbstractController.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import org.onap.osam.common.exception.BadFormatException;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.common.exception.ServerException;
+import org.onap.osam.common.exception.UnknownTypeException;
+import org.slf4j.Logger;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+/**
+ * Created by cemturker on 30.09.2018.
+ */
+public abstract class AbstractController {
+
+    private Logger logger;
+
+    public AbstractController(Logger logger) {
+        this.logger = logger;
+    }
+
+    public <T>  ResponseEntity<T> proceedException(Exception e) {
+        if (e instanceof BadFormatException || e instanceof UnknownTypeException) {
+            return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
+        } else if(e instanceof NotFoundException) {
+            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
+        } else if(e instanceof ServerException) {
+            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
+        } else {
+            logger.error("",e);
+            return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build();
+        }
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java
new file mode 100644
index 0000000..46b21f7
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.common.dto.AccessPodDTO;
+import org.onap.osam.helper.DTOMapper;
+import org.onap.osam.model.dao.AccessPod;
+import org.onap.osam.api.service.AccessPodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 27.09.2018.
+ */
+@RestController
+@RequestMapping("/accessPod")
+@Slf4j
+public class AccessPodRestController extends AbstractController {
+
+    private AccessPodService accessPodService;
+
+    @Autowired
+    public AccessPodRestController(AccessPodService accessPodService) {
+        super(log);
+        this.accessPodService = accessPodService;
+    }
+
+    @GetMapping
+    public List<AccessPodDTO> getAccessPods(){
+        return DTOMapper.covertAccessPodsToDtos(accessPodService.getAll());
+    }
+
+    @PostMapping
+    public ResponseEntity<AccessPodDTO> postAccessPod(@RequestBody AccessPodDTO accessPodDTO){
+        try {
+            log.info("Post request for {} is received",accessPodDTO);
+            AccessPod accessPod = DTOMapper.convertDtoToAccessPod(accessPodDTO);
+            accessPod = accessPodService.addOrUpdate(accessPod);
+            return new ResponseEntity<>(DTOMapper.convertAccessPodToDto(accessPod),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+    @DeleteMapping("pnf/{pnfId}")
+    public ResponseEntity deleteAccessPodByPnfId(@PathVariable("pnfId") String pnfId) {
+        try{
+            this.accessPodService.removeByPnfId(pnfId);
+            return ResponseEntity.ok().build();
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+
+    }
+
+    @DeleteMapping("/{id}")
+    public ResponseEntity deleteAccessPod(@PathVariable("id") Long id) {
+        try {
+            this.accessPodService.removeById(id);
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+        return ResponseEntity.ok().build();
+    }
+
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/AsyncJobDemoController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AsyncJobDemoController.java
new file mode 100644
index 0000000..77936e5
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/AsyncJobDemoController.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM
+ * ================================================================================
+ * Copyright (C) 2018 AT&T
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.job.AsyncJobService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.jackson.JsonComponent;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/async")
+@Slf4j
+public class AsyncJobDemoController extends AbstractController{
+    private AsyncJobService asyncJobService;
+
+    @Autowired
+    public AsyncJobDemoController(AsyncJobService asyncJobService) {
+        super(log);
+        this.asyncJobService = asyncJobService;
+    }
+
+    @PostMapping("/chassis")
+    public ResponseEntity<String> createChassisWithAsyncJob(@RequestBody AsyncJobDemoControllerData data){
+        try {
+            final List<UUID> asyncJob = asyncJobService.pushBulkJob("demoUser", data.getIsRootJobSuccessful(), data.getIsRootDependantOnChildren());
+            return new ResponseEntity<String>(asyncJob.get(0).toString(), HttpStatus.OK);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Setter
+    @Getter
+    @JsonAutoDetect
+    public static class AsyncJobDemoControllerData {
+        private Boolean isRootJobSuccessful;
+        private Boolean isRootDependantOnChildren;
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/DeviceController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/DeviceController.java
new file mode 100644
index 0000000..f6c7aec
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/DeviceController.java
@@ -0,0 +1,166 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.api.service.DeviceService;
+import org.onap.osam.common.dto.ChassisDTO;
+import org.onap.osam.common.dto.OLTChassisDTO;
+import org.onap.osam.common.dto.ONTDTO;
+import org.onap.osam.helper.DTOMapper;
+import org.onap.osam.model.dao.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Zafer Kaban on 27.09.2018.
+ */
+@CrossOrigin
+@RestController
+@RequestMapping("/device")
+@Slf4j
+public class DeviceController extends AbstractController {
+
+    private DeviceService deviceService;
+
+    @Autowired
+    public DeviceController(DeviceService deviceService) {
+        super(log);
+        this.deviceService = deviceService;
+    }
+
+    @PostMapping("/chassis")
+    public ResponseEntity<ChassisDTO> postChassis(@RequestBody ChassisDTO chassisDTO){
+        try {
+            log.info("postChassis request is received {}",chassisDTO);
+            Chassis chassis = DTOMapper.convertToChassis(chassisDTO);
+            chassis = deviceService.addChassis(chassis);
+            return new ResponseEntity<>(DTOMapper.convertChassisToDTO(chassis),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+
+    }
+
+    @DeleteMapping("chassis/{clli}")
+    public ResponseEntity deleteChassisByClli(@PathVariable("clli") String clli) {
+        try{
+            this.deviceService.deleteChassisByClli(clli);
+            return ResponseEntity.ok().build();
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+
+    }
+
+
+    @PostMapping("/chassis/olt")
+    public ResponseEntity<OLTChassisDTO> postOLTChassis(@RequestBody OLTChassisDTO oltChassisDTO){
+        try {
+            Chassis chassis = this.deviceService.getChassisByClli(oltChassisDTO.getClli());
+            OLTSlot oltSlot = DTOMapper.convertToOLT(oltChassisDTO);
+            oltSlot.setChassis(chassis);
+            this.deviceService.addOLTSlot(oltSlot, chassis);
+            return new ResponseEntity<> (DTOMapper.convertFromOLT(oltSlot),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+
+    }
+
+    @PostMapping("/chassis/olt/ont-provision")
+    public ResponseEntity<ONTDTO> provisionONTDevice(@RequestBody ONTDTO ontDTO){
+        try {
+            ONTDevice ont = deviceService.provisionONTDevice(DTOMapper.convertToONTDevice(ontDTO), DeviceService.OntProvisioningType.PROVISION);
+            return new ResponseEntity<> (DTOMapper.convertFromONTDevice(ont),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+
+    }
+
+    @PostMapping("/chassis/olt/ont-full")
+    public ResponseEntity<ONTDTO> provisionONTDeviceFull(@RequestBody ONTDTO ontDTO){
+        try {
+            ONTDevice ont = deviceService.provisionONTDevice(DTOMapper.convertToONTDevice(ontDTO), DeviceService.OntProvisioningType.FULL);
+            return new ResponseEntity<> (DTOMapper.convertFromONTDevice(ont),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+
+    }
+
+    @PostMapping("/chassis/olt/ont-preprovision")
+    public ResponseEntity<ONTDTO> preprovisionONTDevice(@RequestBody ONTDTO ontDTO){
+        try {
+            ONTDevice ont = deviceService.provisionONTDevice(DTOMapper.convertToONTDevice(ontDTO), DeviceService.OntProvisioningType.PREPROVISION);
+            return new ResponseEntity<> (DTOMapper.convertFromONTDevice(ont),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+
+    }
+
+    @DeleteMapping("chassis/olt/ont/{ontid}")
+    public ResponseEntity deleteOntById(@PathVariable("ontid") String ontid) {
+        try{
+            this.deviceService.deleteONTDevice(new Long(ontid));
+            return ResponseEntity.ok().build();
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+
+    }
+
+    @GetMapping("/chassis")
+    public ResponseEntity<List<ChassisDTO>> getAllChassis(){
+        try {
+            return new ResponseEntity<> (DTOMapper.convertChassisToDTO(deviceService.getAllChassis()), HttpStatus.OK);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+    @GetMapping("/chassis/olt")
+    public ResponseEntity<Map<String, List<OLTChassisDTO>>> getAllOLTDevices(){
+        try {
+            return new ResponseEntity<> (DTOMapper.convertFromOLT(deviceService.getAllOLTSlots()), HttpStatus.OK);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+    @GetMapping("/chassis/olt/ont")
+    public ResponseEntity<Map<String, List<ONTDTO>>> getAllONTDevices(){
+        try {
+            return new ResponseEntity<> (DTOMapper.convertFromONTDevice(deviceService.getAllONTDevices()), HttpStatus.OK);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/ServiceController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/ServiceController.java
new file mode 100644
index 0000000..d033a1a
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/ServiceController.java
@@ -0,0 +1,135 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.model.dao.SpeedProfile;
+import org.onap.osam.model.dao.TechnologyProfile;
+import org.onap.osam.api.service.BroadBandService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 19.09.2018.
+ */
+@RestController
+@RequestMapping("/service")
+@Slf4j
+public class ServiceController extends AbstractController {
+
+    private BroadBandService broadBandService;
+
+    //TODOs add validations for post reqs...
+
+    @Autowired
+    public ServiceController(BroadBandService broadBandService){
+        super(log);
+        this.broadBandService = broadBandService;
+    }
+
+    @GetMapping("/speedProfile")
+    public ResponseEntity<List<SpeedProfile>> getSpeedProfiles() {
+        try{
+            return ResponseEntity.ok(this.broadBandService.getSpeedProfiles());
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+    @GetMapping("/speedProfile/{id}")
+    public ResponseEntity<SpeedProfile> getSpeedProfile(@PathVariable("id") Long id) {
+        try {
+            return ResponseEntity.ok(this.broadBandService.getSpeedProfile(id));
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+    }
+
+    @DeleteMapping("/speedProfile/{id}")
+    public ResponseEntity deleteSpeedProfile(@PathVariable("id") Long id) {
+        try {
+            this.broadBandService.removeSpeedProfile(id);
+            return ResponseEntity.ok().build();
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+    }
+
+    @PostMapping("/speedProfile")
+    public ResponseEntity<SpeedProfile> createSpeedProfile(@RequestBody SpeedProfile speedProfile) {
+        try {
+            return new ResponseEntity<>(this.broadBandService.addSpeedProfile(speedProfile),
+                    HttpStatus.CREATED);
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+
+    }
+
+    @GetMapping("/technologyProfile")
+    public ResponseEntity<List<TechnologyProfile>> getTechnologyProfiles() {
+        try {
+            return ResponseEntity.ok(this.broadBandService.getTechnologyProfiles());
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+    }
+
+    @GetMapping("/technologyProfile/{id}")
+    public ResponseEntity<TechnologyProfile> getTechnologyProfile(@PathVariable("id") Long id) {
+        try {
+            return ResponseEntity.ok(this.broadBandService.getTechnologyProfile(id));
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+    }
+
+    @DeleteMapping("/technologyProfile/{id}")
+    public ResponseEntity deleteTechnologyProfile(@PathVariable("id") Long id) {
+        try {
+            this.broadBandService.removeSpeedProfile(id);
+            return ResponseEntity.ok().build();
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+
+    @PostMapping("/technologyProfile")
+    public ResponseEntity<TechnologyProfile> createTechnologyProfile(@RequestBody TechnologyProfile technologyProfile) {
+        try {
+            return new ResponseEntity<>(this.broadBandService.addTechnologyProfile(technologyProfile),HttpStatus.CREATED);
+        }catch (Exception e){
+            return super.proceedException(e);
+        }
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/TopologyController.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/TopologyController.java
new file mode 100644
index 0000000..18ea729
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/TopologyController.java
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.onap.osam.api.service.AccessPodService;
+import org.onap.osam.api.service.DeviceService;
+import org.onap.osam.common.dto.AccessPodDTO;
+import org.onap.osam.helper.DTOMapper;
+import org.onap.osam.model.dao.AccessPod;
+import org.onap.osam.model.dao.Chassis;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 03.10.2018.
+ */
+@RestController
+@RequestMapping("topology")
+@Slf4j
+public class TopologyController extends AbstractController {
+    private AccessPodService accessPodService;
+    private DeviceService deviceService;
+
+    @Autowired
+    public TopologyController(AccessPodService accessPodService,
+                              DeviceService deviceService) {
+        super(log);
+        this.accessPodService = accessPodService;
+        this.deviceService = deviceService;
+    }
+
+    @GetMapping("/accessPod/{pnfId}")
+    public ResponseEntity<AccessPodDTO> getTopologyWithPnfId(@PathVariable("pnfId") String pnfId) {
+        try{
+            log.info("GetTopology with pnfId:{} is received.",pnfId);
+            AccessPod accessPod = accessPodService.findByPnfId(pnfId);
+            List<Chassis> chassisList = deviceService.getByPnfId(pnfId);
+            return ResponseEntity.ok(DTOMapper.representTheAccessPod(chassisList,accessPod));
+        }catch (Exception e) {
+            return super.proceedException(e);
+        }
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/controller/config/SwaggerConfig.java b/osam-core-framework/web/src/main/java/org/onap/osam/controller/config/SwaggerConfig.java
new file mode 100644
index 0000000..20a538c
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/controller/config/SwaggerConfig.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.controller.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Created by cemturker on 04.10.2018.
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig extends WebMvcConfigurationSupport {
+    @Bean
+    public Docket osamApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .select()                 .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    @Override
+    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("swagger-ui.html")
+                .addResourceLocations("classpath:/META-INF/resources/");
+
+        registry.addResourceHandler("/webjars/**")
+                .addResourceLocations("classpath:/META-INF/resources/webjars/");
+    }
+}
diff --git a/osam-core-framework/web/src/main/java/org/onap/osam/helper/DTOMapper.java b/osam-core-framework/web/src/main/java/org/onap/osam/helper/DTOMapper.java
new file mode 100644
index 0000000..8a941ee
--- /dev/null
+++ b/osam-core-framework/web/src/main/java/org/onap/osam/helper/DTOMapper.java
@@ -0,0 +1,249 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.onap.osam.helper;
+
+import com.google.common.collect.Lists;
+import org.onap.osam.common.dto.AccessPodDTO;
+import org.onap.osam.common.dto.ChassisDTO;
+import org.onap.osam.common.dto.OLTChassisDTO;
+import org.onap.osam.common.dto.OLTPortDTO;
+import org.onap.osam.common.dto.ONTDTO;
+import org.onap.osam.model.dao.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+public final class DTOMapper {
+
+    private DTOMapper () {
+
+    }
+
+    public static Chassis convertToChassis (ChassisDTO chassisDTO) {
+        Chassis chassis = new Chassis();
+        chassis.setClli(chassisDTO.getClli());
+        chassis.setShelf(chassisDTO.getShelf());
+        chassis.setRack(chassisDTO.getRack());
+        chassis.setState(ActivityState.ACTIVE);
+        AccessPod accessPod = new AccessPod();
+        accessPod.setPnfId(chassisDTO.getPnfId());
+        chassis.setAccessPod(accessPod);
+        return chassis;
+    }
+
+
+
+
+    public static OLTSlot convertToOLT (OLTChassisDTO oltChassisDTO) {
+        OLTSlot oltSlot = new OLTSlot();
+        oltSlot.setIpAddress(oltChassisDTO.getIpAddress());
+        oltSlot.setPort(oltChassisDTO.getPortNumber());
+        oltSlot.setName(oltChassisDTO.getName());
+        oltSlot.setOltDriver(OltDriver.valueOf(oltChassisDTO.getOltDriver()));
+        oltSlot.setOltType(OltType.valueOf(oltChassisDTO.getOltType()));
+        return oltSlot;
+    }
+
+    public static ChassisDTO convertChassisToDTO(Chassis chassis) {
+        ChassisDTO chassisDTO = new ChassisDTO();
+        chassisDTO.setId(chassis.getId());
+        chassisDTO.setClli(chassis.getClli());
+        chassisDTO.setRack(chassis.getRack());
+        chassisDTO.setShelf(chassis.getShelf());
+        chassisDTO.setPnfId(chassis.getAccessPod().getPnfId());
+        return chassisDTO;
+    }
+
+    public static List<ChassisDTO> convertChassisToDTO(List<Chassis> chassises) {
+        return chassises.stream().map(x -> convertChassisToDTO(x)).collect(Collectors.toList());
+    }
+
+    public static Map<String, List<OLTChassisDTO>> convertFromOLT(List<OLTSlot> oltSlots){
+        return oltSlots.stream().map(x -> convertFromOLT(x)).collect(Collectors.toList()).stream().collect(Collectors.groupingBy(OLTChassisDTO::getClli));
+    }
+
+    public static OLTChassisDTO convertFromOLT (OLTSlot oltSlot) {
+        OLTChassisDTO oltChassisDTO = new OLTChassisDTO();
+        oltChassisDTO.setClli(oltSlot.getChassis().getClli());
+        oltChassisDTO.setIpAddress(oltSlot.getIpAddress());
+        oltChassisDTO.setName(oltSlot.getName());
+        oltChassisDTO.setOltDriver(oltSlot.getOltDriver().name());
+        oltChassisDTO.setOltType(oltSlot.getOltType().name());
+        oltChassisDTO.setPortNumber(oltSlot.getPort());
+        oltChassisDTO.setId(oltSlot.getId());
+        return oltChassisDTO;
+    }
+
+    public static ONTDTO convertFromONTDevice (ONTDevice ontDevice) {
+        ONTDTO ontdto = new ONTDTO();
+        ontdto.setSerialNumber(ontDevice.getSerialNumber());
+        ontdto.setPortNumber(ontDevice.getOLTPort().getPortNumber());
+        ontdto.setId(ontDevice.getId());
+        ontdto.setSlotNumber(ontDevice.getOLTPort().getOltSlot().getNumber());
+        ontdto.setClli(ontDevice.getOLTPort().getOltSlot().getChassis().getClli());
+        ontdto.setCtag(ontDevice.getCTag());
+        ontdto.setStag(ontDevice.getSTag());
+        ontdto.setCircuitId(ontDevice.getCircuitId());
+        ontdto.setNasPortId(ontDevice.getNasPortId());
+        if (ontDevice.getTechProfile() != null) {
+            ontdto.setTechnologyProfile(ontDevice.getTechProfile().getName());
+        }
+        if (ontDevice.getSpeedProfile() != null) {
+            ontdto.setSpeedProfile(ontDevice.getSpeedProfile().getName());
+        }
+        return ontdto;
+    }
+
+    public static ONTDevice convertToONTDevice (ONTDTO ontdto) {
+        ONTDevice ontDevice = new ONTDevice();
+        ontDevice.setNumber(ontdto.getOntNumber());
+        ontDevice.setSerialNumber(ontdto.getSerialNumber());
+        ontDevice.setCTag(ontdto.getCtag());
+        ontDevice.setSTag(ontdto.getStag());
+        ontDevice.setCircuitId(ontdto.getCircuitId());
+        ontDevice.setNasPortId(ontdto.getNasPortId());
+        TechnologyProfile technologyProfile = new TechnologyProfile();
+        technologyProfile.setName(ontdto.getTechnologyProfile());
+        ontDevice.setTechProfile(technologyProfile);
+        SpeedProfile speedProfile = new SpeedProfile();
+        speedProfile.setName(ontdto.getSpeedProfile());
+        ontDevice.setSpeedProfile(speedProfile);
+        Chassis chassis = new Chassis();
+        chassis.setClli(ontdto.getClli());
+        OLTSlot oltSlot = new OLTSlot();
+        oltSlot.setChassis(chassis);
+        OLTPort oltPort = new OLTPort();
+        oltPort.setPortNumber(ontdto.getPortNumber());
+        oltPort.setOltSlot(oltSlot);
+        ontDevice.setOLTPort(oltPort);
+        return ontDevice;
+    }
+
+    public static Map<String, List<ONTDTO>> convertFromONTDevice(List<ONTDevice> ontDevices){
+        return ontDevices.stream().map(x -> convertFromONTDevice(x)).collect(Collectors.toList()).stream().collect(Collectors.groupingBy(ONTDTO::getClli));
+    }
+
+    public static AccessPod convertDtoToAccessPod(AccessPodDTO dto) {
+        //TODO validate..
+        AccessPod accessPod = new AccessPod();
+        accessPod.setPnfId(dto.getPnfId());
+        accessPod.setId(dto.getId());
+        accessPod.setCoreIp(dto.getCoreIp());
+        accessPod.setCorePort(dto.getCorePort());
+        accessPod.setUsername(dto.getUsername());
+        accessPod.setPassword(dto.getPassword());
+        accessPod.setIp(dto.getIp());
+        accessPod.setPort(dto.getPort());
+        return accessPod;
+    }
+
+    public static AccessPodDTO convertAccessPodToDto(AccessPod accessPod) {
+        //TODO validate..
+        AccessPodDTO dto = new AccessPodDTO();
+        dto.setPnfId(accessPod.getPnfId());
+        dto.setCoreIp(accessPod.getCoreIp());
+        dto.setCorePort(accessPod.getCorePort());
+        dto.setUsername(accessPod.getUsername());
+        dto.setPassword(accessPod.getPassword());
+        dto.setIp(accessPod.getIp());
+        dto.setId(accessPod.getId());
+        dto.setPort(accessPod.getPort());
+        return dto;
+    }
+
+    private static OLTPortDTO convertOLTPortToDTO(OLTPort oltPort) {
+        OLTPortDTO oltPortDTO = new OLTPortDTO();
+        oltPortDTO.setId(oltPort.getId());
+        oltPortDTO.setAdminState(oltPort.getAdminState().name());
+        oltPortDTO.setPortAuthState(oltPort.getPortAuthState().name());
+        oltPortDTO.setPortNumber(oltPort.getPortNumber());
+        return oltPortDTO;
+    }
+
+    public static List<AccessPodDTO> covertAccessPodsToDtos(List<AccessPod> accessPodList) {
+        //TODO validate..
+        List<AccessPodDTO> dtos = new ArrayList<>();
+        for (AccessPod accessPod : accessPodList) {
+            dtos.add(convertAccessPodToDto(accessPod));
+        }
+        return dtos;
+    }
+
+    public static AccessPodDTO representTheAccessPod(List<Chassis> chassisList, AccessPod accessPod) {
+        if (accessPod == null) {
+            return null;
+        }
+        AccessPodDTO accessPodDTO = convertAccessPodToDto(accessPod);
+        if (chassisList == null || chassisList.isEmpty()) {
+            return accessPodDTO;
+        }
+        List<ChassisDTO> chassisDTOS = new ArrayList<>();
+        accessPodDTO.setChassises(chassisDTOS);
+        for (Chassis chassis : chassisList) {
+            chassisDTOS.add(representTheChassis(chassis));
+        }
+        return accessPodDTO;
+    }
+
+    public static ChassisDTO representTheChassis(Chassis chassis) {
+        ChassisDTO chassisDTO = convertChassisToDTO(chassis);
+        if (chassis.getOltSlots() == null || chassis.getOltSlots().isEmpty()) {
+            return chassisDTO;
+        }
+        List<OLTChassisDTO> oltChassisDTOS = Lists.newArrayList();
+        chassisDTO.setOlts(oltChassisDTOS);
+        for (OLTSlot oltSlot : chassis.getOltSlots()) {
+            oltChassisDTOS.add(representTheOLTSlot(oltSlot));
+        }
+        return chassisDTO;
+    }
+
+    public static OLTChassisDTO representTheOLTSlot(OLTSlot oltSlot) {
+        OLTChassisDTO oltChassisDTO = convertFromOLT(oltSlot);
+        if (oltSlot.getOltPorts() == null || oltSlot.getOltPorts().isEmpty()) {
+            return oltChassisDTO;
+        }
+        List<OLTPortDTO> oltPortDTOS = Lists.newArrayList();
+        oltChassisDTO.setOltPorts(oltPortDTOS);
+        for (OLTPort oltPort : oltSlot.getOltPorts()) {
+            oltPortDTOS.add(representTheOLTPort(oltPort));
+        }
+        return oltChassisDTO;
+    }
+
+    public static OLTPortDTO representTheOLTPort(OLTPort oltPort) {
+        OLTPortDTO portDTO = convertOLTPortToDTO(oltPort);
+        if (oltPort.getOntDevices() == null || oltPort.getOntDevices().isEmpty()) {
+            return portDTO;
+        }
+        List<ONTDTO> ontdtos = Lists.newArrayList();
+        portDTO.setOntDevices(ontdtos);
+        for (ONTDevice ontDevice : oltPort.getOntDevices()) {
+            ontdtos.add(convertFromONTDevice(ontDevice));
+        }
+        return portDTO;
+    }
+}
