diff --git a/Makefile b/Makefile
index 591f6bb..c4fd8f3 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@
 PKG_LIST := $(shell go list ${PKG}/... | grep -v /vendor/)
 
 
-.PHONY: all api server client
+.PHONY: all api server client test
 
 all: server client
 
@@ -43,7 +43,15 @@
 	--grpc-gateway_out=logtostderr=true:api \
 	 api/abstract_olt_api.proto
 
-api/xos.go:
+api/xos.pb.go:
+	@protoc -I seba-api/ \
+	   -I${GOPATH}/src \
+	  -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
+	  -I${GOPATH}/src/github.com/googleapis/google/api \
+	  -I${GOPATH}/src/github.com/googleapis/ \
+	  --go_out=plugins=grpc:seba-api \
+	  seba-api/xos.proto
+
 
 swagger:
 	@protoc -I api/ \
diff --git a/api/abstract_olt_api.proto b/api/abstract_olt_api.proto
index cf6e378..86f9a72 100644
--- a/api/abstract_olt_api.proto
+++ b/api/abstract_olt_api.proto
@@ -65,8 +65,8 @@
    Error error = 2;
 }
 message AddOntMessage{
-   string ChassisDeviceID=1;
-   string SlotDeviceID=2;
+   string CLLI=1;
+   int32 SlotNumber=2;
    int32 PortNumber=3;
    int32 OntNumber=4;
    string SerialNumber=5;
@@ -76,32 +76,31 @@
    Error error = 2;
 }
 
-service AddChassis{
+service AbstractOLT{
    rpc CreateChassis(AddChassisMessage) returns (AddChassisReturn) {
       option(google.api.http) = {
-         post: "/1/CreateAbstractChassis"
+         post: "/v1/CreateAbstractChassis"
 	 body:"*"
       };
    }
-}
 
-service AddOLTChassis {
    rpc CreateOLTChassis(AddOLTChassisMessage) returns (AddOLTChassisReturn) {
       option(google.api.http) = {
-         post: "/1/CreateOLTChassis"
+         post: "/v1/CreateOLTChassis"
 	 body:"*"
       };
    }
-}
-service ActivateSlot{
    rpc EnableSlot(ActivateSlotMessage) returns (ActivateSlotReturn){
       option(google.api.http) = {
-         post: "/1/EnableSlot"
+         post: "/v1/EnableSlot"
 	 body:"*"
       };
    }
-}
-service ActivateOnt {
-   rpc ProvisionOnt(AddOntMessage) returns (AddOntReturn) {}
+   rpc ProvisionOnt(AddOntMessage) returns (AddOntReturn) {
+      option(google.api.http) = {
+         post:"/v1/ProvsionOnt"
+	 body:"*"
+      };
+   }
 }
 
diff --git a/api/handler.go b/api/handler.go
index 7414e19..4aeae13 100644
--- a/api/handler.go
+++ b/api/handler.go
@@ -17,6 +17,7 @@
 package api
 
 import (
+	"errors"
 	"fmt"
 	"log"
 	"net"
@@ -47,7 +48,7 @@
 		return &AddChassisReturn{DeviceID: chassis.CLLI}, nil
 	}
 	abstractChassis := abstract.GenerateChassis(clli)
-	phyChassis := &physical.Chassis{CLLI: clli}
+	phyChassis := &physical.Chassis{CLLI: clli, VCoreAddress: net.TCPAddr{IP: net.ParseIP(in.GetVCoreIP()), Port: int(in.GetVCorePort())}}
 	if settings.GetDebug() {
 		output := fmt.Sprintf("%v", abstractChassis)
 		formatted := strings.Replace(output, "{", "\n{", -1)
@@ -71,7 +72,7 @@
 	}
 	oltType := in.GetType()
 	address := net.TCPAddr{IP: net.ParseIP(in.GetSlotIP()), Port: int(in.GetSlotPort())}
-	sOlt := physical.SimpleOLT{CLLI: clli, Hostname: in.GetHostname(), Address: address}
+	sOlt := physical.SimpleOLT{CLLI: clli, Hostname: in.GetHostname(), Address: address, Parent: chassis}
 
 	var olt physical.OLT
 	switch oltType {
@@ -95,7 +96,7 @@
 in the physical card to those in the abstract model
 */
 func AddCard(physChassis *physical.Chassis, olt physical.OLT) error {
-	physChassis.Linecards = append(physChassis.Linecards, olt)
+	physChassis.AddOLTChassis(olt)
 
 	ports := olt.GetPorts()
 	absChassis := (*models.GetAbstractChassisMap())[physChassis.CLLI]
@@ -105,7 +106,28 @@
 		absPort.PhysPort = &ports[i]
 		//AssignTraits(&ports[i], absPort)
 	}
-
 	//should probably worry about error at some point
 	return nil
 }
+
+/*
+EnableSlot - activates an OLT Chassis
+*/
+func (s *Server) EnableSlot(ctx context.Context, in *ActivateSlotMessage) (*ActivateSlotReturn, error) {
+	return nil, errors.New("garbage error")
+}
+
+/*
+ProvisionOnt provisions an ONT on a specific Chassis/LineCard/Port
+*/
+func (s *Server) ProvisionOnt(ctx context.Context, in *AddOntMessage) (*AddOntReturn, error) {
+	absChassisMap := models.GetAbstractChassisMap()
+	clli := in.GetCLLI()
+	chassis := (*absChassisMap)[clli]
+	err := chassis.ActivateONT(int(in.GetSlotNumber()), int(in.GetPortNumber()), int(in.GetPortNumber()), in.GetSerialNumber())
+
+	if err != nil {
+		return nil, err
+	}
+	return &AddOntReturn{Success: true}, nil
+}
diff --git a/api/handler_test.go b/api/handler_test.go
index 6121242..50c5355 100644
--- a/api/handler_test.go
+++ b/api/handler_test.go
@@ -21,10 +21,12 @@
 	"testing"
 
 	"gerrit.opencord.org/abstract-olt/api"
+	"gerrit.opencord.org/abstract-olt/models/abstract"
 	"golang.org/x/net/context"
 )
 
 var clli string
+var slotHostname = "SlotOne"
 var ctx context.Context
 var server api.Server
 
@@ -41,8 +43,9 @@
 
 }
 func TestHandler_CreateOLTChassis(t *testing.T) {
+	fmt.Println("in handlerTest_CreateChassis")
 	message := &api.AddOLTChassisMessage{CLLI: clli, SlotIP: "12.2.2.0", SlotPort: 9191,
-		Hostname: "SlotOne", Type: api.AddOLTChassisMessage_edgecore}
+		Hostname: slotHostname, Type: api.AddOLTChassisMessage_edgecore}
 	ret, err := server.CreateOLTChassis(ctx, message)
 	if err != nil {
 		t.Fatalf("CreateOLTChassis failed %v\n", err)
@@ -50,3 +53,30 @@
 	fmt.Printf("CreateOLTChassis success %v\n", ret)
 
 }
+func TestHandler_ProvisionOnt(t *testing.T) {
+	ctx = context.Background()
+	server = api.Server{}
+	fmt.Println("in handlerTest_CreateChassis")
+	// this one should succeed
+	message := &api.AddOntMessage{CLLI: clli, SlotNumber: 1, PortNumber: 3, OntNumber: 2, SerialNumber: "2033029402"}
+	ret, err := server.ProvisionOnt(ctx, message)
+	if err != nil {
+		t.Fatalf("ProvisionOnt failed %v\n", err)
+	}
+	// this one should fail
+	fmt.Println("here")
+	message = &api.AddOntMessage{CLLI: clli, SlotNumber: 2, PortNumber: 3, OntNumber: 2, SerialNumber: "2033029402"}
+	ret, err = server.ProvisionOnt(ctx, message)
+	if err != nil {
+		switch err.(type) {
+		case *abstract.UnprovisonedPortError:
+			fmt.Printf("ProvisionOnt failed as it should with %v\n", err)
+		default:
+			t.Fatalf("ProvsionOnt test failed with %v\n", err)
+		}
+	} else {
+		t.Fatalf("ProvsionOnt should have failed but didn't")
+	}
+	fmt.Printf("ProvisionOnt success %v\n", ret)
+
+}
diff --git a/client/main.go b/client/main.go
index 5594a09..94cd1e5 100644
--- a/client/main.go
+++ b/client/main.go
@@ -63,15 +63,14 @@
 	}
 	defer conn.Close()
 
-	c := api.NewAddChassisClient(conn)
+	c := api.NewAbstractOLTClient(conn)
 
 	response, err := c.CreateChassis(context.Background(), &api.AddChassisMessage{CLLI: "my cilli", VCoreIP: "192.168.0.1", VCorePort: 9191})
 	if err != nil {
 		log.Fatalf("Error when calling SayHello: %s", err)
 	}
 	log.Printf("Response from server: %s", response.GetDeviceID())
-	d := api.NewAddOLTChassisClient(conn)
-	newResponse, err := d.CreateOLTChassis(context.Background(), &api.AddOLTChassisMessage{CLLI: "my cilli", SlotIP: "12.2.2.0", SlotPort: 9191, Hostname: "SlotOne", Type: api.AddOLTChassisMessage_edgecore})
+	newResponse, err := c.CreateOLTChassis(context.Background(), &api.AddOLTChassisMessage{CLLI: "my cilli", SlotIP: "12.2.2.0", SlotPort: 9191, Hostname: "SlotOne", Type: api.AddOLTChassisMessage_edgecore})
 	if err != nil {
 		debug.PrintStack()
 		log.Fatalf("Error when calling SayHello: %s", err)
diff --git a/cmd/AbstractOLT/AbstractOLT.go b/cmd/AbstractOLT/AbstractOLT.go
index 19acd72..57ef9cd 100644
--- a/cmd/AbstractOLT/AbstractOLT.go
+++ b/cmd/AbstractOLT/AbstractOLT.go
@@ -109,8 +109,7 @@
 	grpcServer := grpc.NewServer(opts...)
 
 	// attach the Ping service to the server
-	api.RegisterAddChassisServer(grpcServer, &s)
-	api.RegisterAddOLTChassisServer(grpcServer, &s)
+	api.RegisterAbstractOLTServer(grpcServer, &s)
 
 	// start the server
 	log.Printf("starting HTTP/2 gRPC server on %s", address)
@@ -133,8 +132,7 @@
 
 	// Setup the client gRPC options
 	opts := []grpc.DialOption{grpc.WithTransportCredentials(creds)}
-	err = api.RegisterAddChassisHandlerFromEndpoint(ctx, mux, grpcAddress, opts)
-	_ = api.RegisterAddOLTChassisHandlerFromEndpoint(ctx, mux, grpcAddress, opts)
+	err = api.RegisterAbstractOLTHandlerFromEndpoint(ctx, mux, grpcAddress, opts)
 	if err != nil {
 		return fmt.Errorf("could not register service Ping: %s", err)
 	}
diff --git a/models/abstract/ChassisUtils.go b/models/abstract/ChassisUtils.go
index 4c41698..2377453 100644
--- a/models/abstract/ChassisUtils.go
+++ b/models/abstract/ChassisUtils.go
@@ -16,8 +16,6 @@
 
 package abstract
 
-import "errors"
-
 /*
 GenerateChassis - constructs a new AbstractOLT Chassis
 */
@@ -82,24 +80,3 @@
 /*
 NextPort pulls the first unMapped port in the abstract chassis so the next physical port can be mapped to it
 */
-func (chassis *Chassis) NextPort() (*Port, error) {
-	info := &chassis.AllocInfo
-
-	if info.outOfPorts {
-		return nil, errors.New("Abstract chassis out of ports")
-	}
-
-	nextPort := &chassis.Slots[info.slot].Ports[info.port]
-
-	info.port++
-	if info.port == MAX_PORTS {
-		info.port = 0
-		info.slot++
-		if info.slot == MAX_SLOTS {
-			info.slot = 0
-			info.outOfPorts = true
-		}
-	}
-
-	return nextPort, nil
-}
diff --git a/models/abstract/chassis.go b/models/abstract/chassis.go
index 52de90d..74a288c 100644
--- a/models/abstract/chassis.go
+++ b/models/abstract/chassis.go
@@ -16,6 +16,8 @@
 
 package abstract
 
+import "errors"
+
 const MAX_SLOTS int = 16
 const MAX_PORTS int = 16
 
@@ -34,3 +36,29 @@
 	port       int
 	outOfPorts bool
 }
+
+func (chassis *Chassis) NextPort() (*Port, error) {
+	info := &chassis.AllocInfo
+
+	if info.outOfPorts {
+		return nil, errors.New("Abstract chassis out of ports")
+	}
+
+	nextPort := &chassis.Slots[info.slot].Ports[info.port]
+
+	info.port++
+	if info.port == MAX_PORTS {
+		info.port = 0
+		info.slot++
+		if info.slot == MAX_SLOTS {
+			info.slot = 0
+			info.outOfPorts = true
+		}
+	}
+
+	return nextPort, nil
+}
+func (chassis *Chassis) ActivateONT(slotNumber int, portNumber int, ontNumber int, serialNumber string) error {
+	err := chassis.Slots[slotNumber-1].Ports[portNumber].provisionOnt(ontNumber, serialNumber)
+	return err
+}
diff --git a/models/abstract/port.go b/models/abstract/port.go
index c23249a..5dfa195 100644
--- a/models/abstract/port.go
+++ b/models/abstract/port.go
@@ -16,7 +16,11 @@
 
 package abstract
 
-import "gerrit.opencord.org/abstract-olt/models/physical"
+import (
+	"fmt"
+
+	"gerrit.opencord.org/abstract-olt/models/physical"
+)
 
 /*
 Port represents a single PON port on the OLT chassis
@@ -28,3 +32,26 @@
 	PhysPort *physical.PONPort
 	Parent   *Slot `json:"-"`
 }
+
+type UnprovisonedPortError struct {
+	oltNum  int
+	clli    string
+	portNum int
+}
+
+func (e *UnprovisonedPortError) Error() string {
+	return fmt.Sprintf("Port %d for olt %d on AbstractChasis  %s is not provisioned", e.portNum, e.oltNum, e.clli)
+}
+func (port *Port) provisionOnt(ontNumber int, serialNumber string) error {
+	if port.PhysPort == nil {
+		slot := port.Parent
+		chassis := slot.Parent
+		err := UnprovisonedPortError{oltNum: slot.Number, clli: chassis.CLLI, portNum: port.Number}
+		return &err
+	}
+
+	phyPort := port.PhysPort
+	ont := port.Onts[ontNumber-1]
+	phyPort.ActivateOnt(ontNumber, ont.Svlan, ont.Cvlan, serialNumber)
+	return nil
+}
diff --git a/models/physical/chassis.go b/models/physical/chassis.go
index 339a610..3f050aa 100644
--- a/models/physical/chassis.go
+++ b/models/physical/chassis.go
@@ -16,7 +16,10 @@
 
 package physical
 
-import "net"
+import (
+	"fmt"
+	"net"
+)
 
 /*
 Chassis is a model that takes up to 16 discreet OLT chassis as if it is a 16 slot OLT chassis
@@ -27,3 +30,16 @@
 	Dataswitch   DataSwitch
 	Linecards    []OLT
 }
+
+/*
+AddOLTChassis - adds a reference to a new olt chassis
+*/
+func (chassis *Chassis) AddOLTChassis(olt OLT) {
+	chassis.Linecards = append(chassis.Linecards, olt)
+	//TODO - api call to add olt i.e. preprovision_olt
+	fmt.Printf("chassis.AddOLTChassis(%s)\n", olt.GetHostname())
+}
+func (chassis *Chassis) provisionONT(ont Ont) {
+	//TODO - api call to provison s/c vlans and ont serial number etc
+	fmt.Printf("chassis.provisionONT(%s,SVlan:%d,CVlan:%d)\n", ont.SerialNumber, ont.Svlan, ont.Cvlan)
+}
diff --git a/models/physical/edgecore.go b/models/physical/edgecore.go
index 196d44e..cded2dc 100644
--- a/models/physical/edgecore.go
+++ b/models/physical/edgecore.go
@@ -29,6 +29,9 @@
 func CreateEdgecore(olt *SimpleOLT) *Edgecore {
 	var newPorts [16]PONPort
 	edge := Edgecore{SimpleOLT: *olt}
+	for i := 0; i < 16; i++ {
+		newPorts[i].Parent = &edge
+	}
 	edge.Ports = newPorts[:]
 	return &edge
 }
diff --git a/models/physical/olt.go b/models/physical/olt.go
index 3c2094d..beffec8 100644
--- a/models/physical/olt.go
+++ b/models/physical/olt.go
@@ -41,6 +41,7 @@
 	Address        net.TCPAddr
 	Number         int
 	Ports          []PONPort
+	Active         bool
 	Parent         *Chassis `json:"-"`
 	DataSwitchPort int
 }
diff --git a/models/physical/ont.go b/models/physical/ont.go
index 4bd47ac..4a9ca89 100644
--- a/models/physical/ont.go
+++ b/models/physical/ont.go
@@ -20,8 +20,9 @@
 Ont represents a single ont/onu connect to a splitter on a Port
 */
 type Ont struct {
-	Number int
-	Svlan  int
-	Cvlan  int
-	Parent *PONPort `json:"-"`
+	Number       int
+	Svlan        int
+	Cvlan        int
+	SerialNumber string
+	Parent       *PONPort `json:"-"`
 }
diff --git a/models/physical/ponport.go b/models/physical/ponport.go
index 99c282a..e17a07e 100644
--- a/models/physical/ponport.go
+++ b/models/physical/ponport.go
@@ -17,7 +17,7 @@
 package physical
 
 /*
-Port represents a single PON port on the OLT chassis
+PONPort represents a single PON port on the OLT chassis
 */
 type PONPort struct {
 	Number   int
@@ -25,3 +25,10 @@
 	Onts     [64]Ont
 	Parent   *Edgecore `json:"-"`
 }
+
+func (port *PONPort) ActivateOnt(number int, sVlan int, cVlan int, serialNumber string) {
+	ont := Ont{Number: number, Svlan: sVlan, Cvlan: cVlan, SerialNumber: serialNumber, Parent: port}
+	port.Onts[number-1] = ont
+	port.Parent.Parent.provisionONT(ont)
+
+}
