diff --git a/osam-core/api/src/main/java/org/onap/osam/api/service/DeviceService.java b/osam-core/api/src/main/java/org/onap/osam/api/service/DeviceService.java
index dd49993..921bf66 100644
--- a/osam-core/api/src/main/java/org/onap/osam/api/service/DeviceService.java
+++ b/osam-core/api/src/main/java/org/onap/osam/api/service/DeviceService.java
@@ -34,6 +34,12 @@
  */
 public interface DeviceService {
 
+     enum OntProvisioningType {
+        PREPROVISION,
+        FULL,
+        PROVISION
+    }
+
 
 /*
 Chassis Related Functionality
@@ -147,12 +153,10 @@
 
     /**
      *
-     * @param clli
-     * @param slotNumber
-     * @param portNumber
-     * @param serialNumber
+     * @param ontDevice
+     * @param provisioningType
      */
-    ONTDevice addONTDevice(String clli, int slotNumber, int portNumber, String serialNumber);
+    ONTDevice provisionONTDevice(ONTDevice ontDevice, OntProvisioningType provisioningType);
 
     /**
      *
diff --git a/osam-core/async-jobs/pom.xml b/osam-core/async-jobs/pom.xml
index 1cc2ec6..1fc4cca 100644
--- a/osam-core/async-jobs/pom.xml
+++ b/osam-core/async-jobs/pom.xml
@@ -34,7 +34,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>
         </dependency>
-        <dependency>
+      <!--  <dependency>
             <groupId>org.onap.osam</groupId>
             <artifactId>common</artifactId>
             <version>${project.version}</version>
@@ -43,6 +43,11 @@
             <groupId>org.onap.osam</groupId>
             <artifactId>model</artifactId>
             <version>${project.version}</version>
+        </dependency>-->
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>core</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/osam-core/common/src/main/java/org/onap/osam/common/exception/AbstractOLTException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/AbstractOLTException.java
new file mode 100644
index 0000000..001198a
--- /dev/null
+++ b/osam-core/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/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java
index 3bab403..c7ef4df 100644
--- a/osam-core/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java
+++ b/osam-core/common/src/main/java/org/onap/osam/common/exception/BadFormatException.java
@@ -26,8 +26,11 @@
 /**
  * Created by cemturker on 19.09.2018.
  */
-public class BadFormatException extends RuntimeException {
+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/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java
index 4db0147..60183a2 100644
--- a/osam-core/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java
+++ b/osam-core/common/src/main/java/org/onap/osam/common/exception/GenericUncheckedException.java
@@ -31,4 +31,8 @@
     public GenericUncheckedException(Throwable cause) {
         super(cause);
     }
+
+    public GenericUncheckedException(String format, Object... arguments) {
+        super(String.format(format, arguments));
+    }
 }
diff --git a/osam-core/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java
index 7ac9547..75447a4 100644
--- a/osam-core/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java
+++ b/osam-core/common/src/main/java/org/onap/osam/common/exception/InvalidOperationException.java
@@ -25,8 +25,11 @@
 /**
  * Created by Zafer Kaban on 18.09.2018.
  */
-public class InvalidOperationException extends RuntimeException {
+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/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java
index e850c43..10be17a 100644
--- a/osam-core/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java
+++ b/osam-core/common/src/main/java/org/onap/osam/common/exception/NotFoundException.java
@@ -26,8 +26,11 @@
 /**
  * Created by cemturker on 18.09.2018.
  */
-public class NotFoundException extends RuntimeException {
+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/common/src/main/java/org/onap/osam/common/exception/ServerException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/ServerException.java
new file mode 100644
index 0000000..07bf68c
--- /dev/null
+++ b/osam-core/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/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java b/osam-core/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java
index 7b13329..4781a72 100644
--- a/osam-core/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java
+++ b/osam-core/common/src/main/java/org/onap/osam/common/exception/UnknownTypeException.java
@@ -26,8 +26,11 @@
 /**
  * Created by cemturker on 18.09.2018.
  */
-public class UnknownTypeException extends RuntimeException {
+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/core/pom.xml b/osam-core/core/pom.xml
index 1db7193..3c5b21c 100644
--- a/osam-core/core/pom.xml
+++ b/osam-core/core/pom.xml
@@ -35,5 +35,10 @@
             <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/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
index b3e00c5..1ba8bad 100644
--- a/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
+++ b/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
@@ -83,7 +83,8 @@
     public AccessPod findByPnfId(String pnfId) {
         Optional<AccessPod> accessPodOp = accessPodRepository.findByPnfId(pnfId);
         if (!accessPodOp.isPresent()) {
-            throw new NotFoundException("pnfId:"+pnfId+ " is not found");
+            log.error("Access POD with pnfId : {} is not found", pnfId);
+            throw new NotFoundException("Access POD with pnfId : {} is not found", pnfId);
         }
         return accessPodOp.get();
     }
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
index 610e217..0d6828f 100644
--- a/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
+++ b/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
@@ -24,9 +24,11 @@
 
 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;
@@ -76,15 +78,13 @@
     public Chassis addChassis(Chassis chassis) {
         AccessPod accessPod = accessPodService.findByPnfId(chassis.getAccessPod().getPnfId());
         chassis.setAccessPod(accessPod);
-        String deviceId = abstractOLTClient.createChassis(chassis);
-        if (deviceId != null) {
-            return add(chassis, chassisRepository);
-        }
-        return null;
+        abstractOLTClient.createChassis(chassis);
+        return add(chassis, chassisRepository);
     }
 
     @Override
     public void deleteChassis(Long id) {
+        log.info("Deleting chassis, id: {}", id);
         remove(id, chassisRepository,Chassis.class);
     }
 
@@ -92,26 +92,32 @@
         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()) {
-            return chassis.get();
+        if (!chassis.isPresent()) {
+            log.error("Chassis not found for id {}", id);
+            throw new NotFoundException("Chassis not found for id {}",id);
         }
-        return null;
+        return chassis.get();
     }
 
     @Override
     public Chassis getChassisByClli(String clli) {
         Optional<Chassis> chassis = chassisRepository.findByClli(clli);
-        if (chassis.isPresent()) {
-            return chassis.get();
+        if (!chassis.isPresent()) {
+            log.error("Chassis not found for clli {}", clli);
+            throw new NotFoundException("Chassis not found for clli {}",clli);
         }
-        return null;
+        return chassis.get();
     }
 
     @Override
@@ -123,7 +129,8 @@
     public List<Chassis> getByPnfId(String pnfId) {
         Optional<List<Chassis>> chassisList = chassisRepository.findByAccessPodPnfId(pnfId);
         if (!chassisList.isPresent()) {
-            throw new NotFoundException("Chassis is not found with "+pnfId + ":pnfId");
+            log.error("Chassis is not found with pnfId {}", pnfId);
+            throw new NotFoundException("Chassis is not found with pnfId : {}",pnfId);
         }
         return chassisList.get();
     }
@@ -135,58 +142,61 @@
 
     @Override
     public OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis) {
-        Set<OLTSlot> oltSlots = chassis.getOltSlots();
+        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);
-        String deviceId = abstractOLTClient.createOLTChassis(oltSlot);
-        if (deviceId != null) {
-            oltSlot.setChassis(chassis);
-            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);
-                add(oltPort, oltPortRepository);
-            }
-            if (oltSlots.isEmpty()) {
-                oltSlots = new HashSet<>();
-            }
-            oltSlots.add(oltSlot);
-            chassis.setOltSlots(oltSlots);
-            chassisRepository.save(chassis);
+        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()) {
-            return oltSlot.get();
+        if (!oltSlot.isPresent()) {
+            log.error("OLT Slot not found with id {}", id);
+            throw new NotFoundException("OLT Slot not found with id "+id);
         }
-        return null;
+        return oltSlot.get();
     }
 
     @Override
     public OLTSlot getOLTSlotBySerialNumber(String serialNumber) {
         Optional<OLTSlot> oltSlot = oltSlotRepository.findBySerialNumber(serialNumber);
-        if (oltSlot.isPresent()) {
-            return oltSlot.get();
+        if (!oltSlot.isPresent()) {
+            log.error("OLT Slot not found with serial number {}", serialNumber);
+            throw new NotFoundException("OLT Slot not found with serialNumber {}",serialNumber);
         }
-        return null;
+        return oltSlot.get();
     }
 
     @Override
@@ -196,75 +206,103 @@
 
     @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()) {
-            return oltPort.get();
+        if (!oltPort.isPresent()) {
+            log.error("OLT Port not found, id: {}", id);
+            throw new NotFoundException("OLT Port not found, id {}",id);
         }
-        return null;
+        return oltPort.get();
     }
 
     @Override
-    public ONTDevice addONTDevice(String clli, int slotNumber, int portNumber, String serialNumber){
-        ONTDevice ont = null;
+    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.info("Port found : {}", thePort);
-            Set<ONTDevice> ontDevices = port.getOntDevices();
-            int size = ontDevices.size();
-            if (size == NUMBER_OF_ONT_DEVICES) {
-                throw new InvalidOperationException("Maximum number of ONTs exceeded");
+            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);
             }
-            int ontNumber = size+1;
-            boolean result =  abstractOLTClient.provisionONT(clli, slotNumber, portNumber,ontNumber,serialNumber);
-            if (result){
-                ont = new ONTDevice();
-                ont.setSerialNumber(serialNumber);
-                ont.setNumber(ontNumber);
-                ont.setOLTPort(port);
-                ont.setAdminState(AdminState.ENABLED);
-                ont.setOperationalState(ActivityState.ACTIVE);
-                ont.setPortAuthState(ActivityState.ACTIVE);
-                add(ont,ontDeviceRepository);
-                ontDevices.add(ont);
+
+            if (success){
+                ontDevice = add(ontDevice, ontDeviceRepository);
+                ontDevices.add(ontDevice);
+                port.setOntDevices(ontDevices);
                 oltPortRepository.save(port);
             } else {
-                log.error("Error rpc failed");
-                throw new NotFoundException("Operation failed");
+                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");
-            throw new NotFoundException("Operation failed");
+            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()) {
-            ontDevice.get();
+        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 null;
+        return ontDevice.get();
     }
 
     @Override
     public ONTDevice getONTDeviceBySerialNumber(String serialNumber) {
         Optional<ONTDevice> ontDevice = ontDeviceRepository.findBySerialNumber(serialNumber);
-        if (ontDevice.isPresent()) {
-            ontDevice.get();
+        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 null;
+        return ontDevice.get();
     }
 
     @Override
diff --git a/osam-core/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java b/osam-core/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
new file mode 100644
index 0000000..5abeb8f
--- /dev/null
+++ b/osam-core/core/src/test/java/org/onap/osam/core/DeviceServiceImplTest.java
@@ -0,0 +1,439 @@
+/*-
+ * ============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.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(AbstractOLTException.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(AbstractOLTException.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/external/pom.xml b/osam-core/external/pom.xml
index 13724aa..9f1c4f1 100644
--- a/osam-core/external/pom.xml
+++ b/osam-core/external/pom.xml
@@ -53,7 +53,12 @@
         </dependency>
         <dependency>
             <groupId>org.onap.osam</groupId>
-            <artifactId>api</artifactId>
+            <artifactId>model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>common</artifactId>
             <version>${project.version}</version>
         </dependency>
     </dependencies>
diff --git a/osam-core/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java b/osam-core/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java
index 688f00a..27c697d 100644
--- a/osam-core/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java
+++ b/osam-core/external/src/main/java/org/onap/osam/external/grpc/AbstractOLTClient.java
@@ -56,13 +56,17 @@
 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.NotFoundException;
 import org.onap.osam.grpc.*;
 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 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;
 
@@ -91,18 +95,13 @@
   }
 
   /** create chassis */
-  public String createChassis(Chassis chassis) {
-
-      String deviceID = null;
+  public void createChassis(Chassis chassis) {
 
       log.info("createChassis begin, chassis: {}", chassis);
 
       String clli = chassis.getClli();
       int rack = chassis.getRack();
       int shelf = chassis.getShelf();
-      if (chassis.getAccessPod() == null) {
-          throw new NotFoundException("Access pod not found");
-      }
       String xosIP = chassis.getAccessPod().getCoreIp();
       int port = Integer.parseInt(chassis.getAccessPod().getCorePort());
       String user = chassis.getAccessPod().getUsername();
@@ -119,9 +118,12 @@
               .build();
 
       AddChassisReturn response = blockingStub.createChassis(request);
-      deviceID = response.getDeviceID();
-      log.info("createChassis with device id : " + deviceID);
-      return deviceID;
+      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 AbstractOLTException("DeviceId of created chassis in AbstractOLT is empty or null");
+      }
   }
 
     public String createOLTChassis(OLTSlot olt) {
@@ -147,35 +149,69 @@
             AddOLTChassisReturn response = blockingStub.createOLTChassis(request);
             deviceID = response.getDeviceID();
             chassisDeviceId = response.getChassisDeviceID();
-            log.info("createOLTChassis with device id : {} chassisDeviceId : {}",chassisDeviceId,deviceID);
+            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 AbstractOLTException("DeviceId of created chassis in AbstractOLT is empty or null");
+            }
 
         } catch (RuntimeException e) {
-            log.error("createOLTChassis RPC failed", e);
+            log.error("OLT Chassis creation failed", e);
+            throw new AbstractOLTException("OLT Chassis creation failed for olt : {}", olt);
         }
 
         return deviceID;
     }
 
-    public boolean provisionONT(String clli, int slotNumber, int portNumber, int ontNumber, String serialNumber) {
+    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 {
-            log.info("provisionONT begin, clli: {}, slotNumber: {}, portNumber:{}, ontNumber:{}, serialNumber:{}", clli, slotNumber, portNumber, ontNumber, serialNumber);
-            AddOntMessage request = AddOntMessage.newBuilder()
-                    .setCLLI(clli)
-                    .setPortNumber(portNumber)
-                    .setSlotNumber(slotNumber)
-                    .setOntNumber(ontNumber)
-                    .setSerialNumber(serialNumber)
-                    .build();
-
+            AddOntMessage request = OntMessageFactory.getOntMessage(ontDevice);
             AddOntReturn response = blockingStub.provisionOnt(request);
             result = response.getSuccess();
-            log.info("provisionONT with device id : {} success : {}" + serialNumber, result);
+            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/external/src/main/java/org/onap/osam/external/grpc/OntMessageFactory.java b/osam-core/external/src/main/java/org/onap/osam/external/grpc/OntMessageFactory.java
new file mode 100644
index 0000000..ff89f0b
--- /dev/null
+++ b/osam-core/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/external/src/main/proto/abstract_olt_api.proto b/osam-core/external/src/main/proto/abstract_olt_api.proto
index ce9a322..055acd9 100644
--- a/osam-core/external/src/main/proto/abstract_olt_api.proto
+++ b/osam-core/external/src/main/proto/abstract_olt_api.proto
@@ -1,149 +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 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 OutputMessage{
-   string Something=1;
-}
-message OutputReturn{
-   bool Success=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 ProvisionOnt(AddOntMessage) returns (AddOntReturn) {
-      option(google.api.http) = {
-         post:"/v1/ProvsionOnt"
-	 body:"*"
-      };
-   }
-   rpc DeleteOnt(DeleteOntMessage) returns (DeleteOntReturn){
-      option(google.api.http)={
-        post:"/v1/DeleteOnt"
-	body:"*"
-      };
-   }
-   rpc Output(OutputMessage)returns(OutputReturn){
-      option(google.api.http)={
-        post:"/v1/Output"
-	body:"*"
-      };
-   }
-}
-
+//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/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java b/osam-core/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java
index 17666a6..804627f 100644
--- a/osam-core/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java
+++ b/osam-core/model/src/main/java/org/onap/osam/model/dao/ONTDevice.java
@@ -45,6 +45,12 @@
     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;
@@ -60,7 +66,13 @@
         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/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java b/osam-core/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java
index d4bf1c1..a3994da 100644
--- a/osam-core/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java
+++ b/osam-core/model/src/main/java/org/onap/osam/model/dao/SpeedProfile.java
@@ -39,13 +39,14 @@
 
     @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('}');
diff --git a/osam-core/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java b/osam-core/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java
index f352bd4..e13b245 100644
--- a/osam-core/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java
+++ b/osam-core/model/src/main/java/org/onap/osam/model/dao/TechnologyProfile.java
@@ -35,13 +35,15 @@
 @Setter
 public class TechnologyProfile extends BaseEntity {
 
+    private String name;
     private String data;
 
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder("TechnologyProfile{");
-        sb.append("data='").append(data).append('\'');
-        sb.append(", id=").append(id);
+        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/pom.xml b/osam-core/pom.xml
index c207ad8..90b8377 100644
--- a/osam-core/pom.xml
+++ b/osam-core/pom.xml
@@ -37,6 +37,7 @@
 		<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>
@@ -64,6 +65,12 @@
 			<scope>test</scope>
 		</dependency>
         <dependency>
+            <groupId>pl.pragmatists</groupId>
+            <artifactId>JUnitParams</artifactId>
+            <version>${junitparams.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
             <version>6.14.3</version>
diff --git a/osam-core/web/src/main/java/org/onap/osam/controller/AbstractController.java b/osam-core/web/src/main/java/org/onap/osam/controller/AbstractController.java
index 97bfa7c..474c2c9 100644
--- a/osam-core/web/src/main/java/org/onap/osam/controller/AbstractController.java
+++ b/osam-core/web/src/main/java/org/onap/osam/controller/AbstractController.java
@@ -24,6 +24,7 @@
 
 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;
@@ -45,6 +46,8 @@
             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/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java b/osam-core/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java
index b4fbec0..ad901c5 100644
--- a/osam-core/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java
+++ b/osam-core/web/src/main/java/org/onap/osam/controller/AccessPodRestController.java
@@ -65,9 +65,9 @@
     public ResponseEntity<AccessPodDTO> postAccessPod(@RequestBody AccessPodDTO accessPodDTO){
         try {
             log.info("Post request for {} is received",accessPodDTO);
-            AccessPod accessPod = DTOMapper.covertDtoToAccessPod(accessPodDTO);
+            AccessPod accessPod = DTOMapper.convertDtoToAccessPod(accessPodDTO);
             accessPod = accessPodService.addOrUpdate(accessPod);
-            return new ResponseEntity<>(DTOMapper.covertAccessPodToDto(accessPod),HttpStatus.CREATED);
+            return new ResponseEntity<>(DTOMapper.convertAccessPodToDto(accessPod),HttpStatus.CREATED);
         }catch (Exception e){
             return super.proceedException(e);
         }
diff --git a/osam-core/web/src/main/java/org/onap/osam/controller/DeviceController.java b/osam-core/web/src/main/java/org/onap/osam/controller/DeviceController.java
index 026ec17..b5b0103 100644
--- a/osam-core/web/src/main/java/org/onap/osam/controller/DeviceController.java
+++ b/osam-core/web/src/main/java/org/onap/osam/controller/DeviceController.java
@@ -93,13 +93,10 @@
 
     }
 
-    @PostMapping("/chassis/olt/ont")
-    public ResponseEntity<ONTDTO> postONTDevice(@RequestBody ONTDTO ontDTO){
+    @PostMapping("/chassis/olt/ont-provision")
+    public ResponseEntity<ONTDTO> provisionONTDevice(@RequestBody ONTDTO ontDTO){
         try {
-            ONTDevice ont = deviceService.addONTDevice(ontDTO.getClli()
-                    ,ontDTO.getSlotNumber()
-                    ,ontDTO.getPortNumber()
-                    ,ontDTO.getSerialNumber());
+            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);
@@ -107,6 +104,39 @@
 
     }
 
+    @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 {
diff --git a/osam-core/web/src/main/java/org/onap/osam/dto/ONTDTO.java b/osam-core/web/src/main/java/org/onap/osam/dto/ONTDTO.java
index d21d9e3..d6fd982 100644
--- a/osam-core/web/src/main/java/org/onap/osam/dto/ONTDTO.java
+++ b/osam-core/web/src/main/java/org/onap/osam/dto/ONTDTO.java
@@ -39,5 +39,12 @@
     private String serialNumber;
     private int slotNumber;
     private int portNumber;
+    private int ontNumber;
     private Long id;
+    private int stag;
+    private int ctag;
+    private String nasPortId;
+    private String circuitId;
+    private String technologyProfile;
+    private String speedProfile;
 }
diff --git a/osam-core/web/src/main/java/org/onap/osam/helper/DTOMapper.java b/osam-core/web/src/main/java/org/onap/osam/helper/DTOMapper.java
index 3a8784f..81d14f5 100644
--- a/osam-core/web/src/main/java/org/onap/osam/helper/DTOMapper.java
+++ b/osam-core/web/src/main/java/org/onap/osam/helper/DTOMapper.java
@@ -28,19 +28,11 @@
 import org.onap.osam.dto.OLTChassisDTO;
 import org.onap.osam.dto.OLTPortDTO;
 import org.onap.osam.dto.ONTDTO;
-import org.onap.osam.model.dao.AccessPod;
-import org.onap.osam.model.dao.ActivityState;
-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 org.onap.osam.model.dao.OltDriver;
-import org.onap.osam.model.dao.OltType;
+import org.onap.osam.model.dao.*;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -112,14 +104,49 @@
         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 covertDtoToAccessPod(AccessPodDTO dto) {
+    public static AccessPod convertDtoToAccessPod(AccessPodDTO dto) {
         //TODO validate..
         AccessPod accessPod = new AccessPod();
         accessPod.setPnfId(dto.getPnfId());
@@ -133,7 +160,7 @@
         return accessPod;
     }
 
-    public static AccessPodDTO covertAccessPodToDto(AccessPod accessPod) {
+    public static AccessPodDTO convertAccessPodToDto(AccessPod accessPod) {
         //TODO validate..
         AccessPodDTO dto = new AccessPodDTO();
         dto.setPnfId(accessPod.getPnfId());
@@ -160,7 +187,7 @@
         //TODO validate..
         List<AccessPodDTO> dtos = new ArrayList<>();
         for (AccessPod accessPod : accessPodList) {
-            dtos.add(covertAccessPodToDto(accessPod));
+            dtos.add(convertAccessPodToDto(accessPod));
         }
         return dtos;
     }
@@ -169,7 +196,7 @@
         if (accessPod == null) {
             return null;
         }
-        AccessPodDTO accessPodDTO = covertAccessPodToDto(accessPod);
+        AccessPodDTO accessPodDTO = convertAccessPodToDto(accessPod);
         if (chassisList == null || chassisList.isEmpty()) {
             return accessPodDTO;
         }
