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:"*"
+      };
+   }
+}
+
