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