diff --git a/api/abstract_olt_api.proto b/api/abstract_olt_api.proto
index 72dad9b..6da61c8 100644
--- a/api/abstract_olt_api.proto
+++ b/api/abstract_olt_api.proto
@@ -20,6 +20,8 @@
    string CLLI =1;
    string VCoreIP =2;
    int32 VCorePort=3;
+   int32 Rack=4;
+   int32 Shelf=5;
 }
 message AddChassisReturn{
    string DeviceID = 1;
@@ -32,7 +34,7 @@
    fixed32 NumPorts = 5;
    bool Activate = 6;
    enum OltDriver {
-      openoltDriver = 0;
+      openoltDriver= 0;
       asfvolt16Driver=1;
       adtranDriver=2;
       tibitsDriver=3;
diff --git a/api/handler.go b/api/handler.go
index 6beba76..bb1a9b3 100644
--- a/api/handler.go
+++ b/api/handler.go
@@ -17,6 +17,7 @@
 package api
 
 import (
+	"errors"
 	"fmt"
 	"log"
 	"net"
@@ -46,8 +47,8 @@
 	if chassis != nil {
 		return &AddChassisReturn{DeviceID: chassis.CLLI}, nil
 	}
-	abstractChassis := abstract.GenerateChassis(clli)
-	phyChassis := &physical.Chassis{CLLI: clli, VCoreAddress: net.TCPAddr{IP: net.ParseIP(in.GetVCoreIP()), Port: int(in.GetVCorePort())}}
+	abstractChassis := abstract.GenerateChassis(clli, int(in.GetRack()), int(in.GetShelf()))
+	phyChassis := &physical.Chassis{CLLI: clli, VCoreAddress: net.TCPAddr{IP: net.ParseIP(in.GetVCoreIP()), Port: int(in.GetVCorePort())}, Rack: int(in.GetRack()), Shelf: int(in.GetShelf())}
 	if settings.GetDebug() {
 		output := fmt.Sprintf("%v", abstractChassis)
 		formatted := strings.Replace(output, "{", "\n{", -1)
@@ -68,6 +69,8 @@
 	clli := in.GetCLLI()
 	chassis := (*phyChassisMap)[clli]
 	if chassis == nil {
+		errString := fmt.Sprintf("There is no chassis with CLLI of %s", clli)
+		return &AddOLTChassisReturn{DeviceID: "", ChassisDeviceID: ""}, errors.New(errString)
 	}
 	oltType := in.GetType()
 	address := net.TCPAddr{IP: net.ParseIP(in.GetSlotIP()), Port: int(in.GetSlotPort())}
@@ -80,12 +83,10 @@
 	case AddOLTChassisMessage_adtran:
 	case AddOLTChassisMessage_tibit:
 	}
-
 	err := AddCard(chassis, olt)
 	if err != nil {
 		//TODO do something
 	}
-
 	return &AddOLTChassisReturn{DeviceID: in.GetHostname(), ChassisDeviceID: clli}, nil
 
 }
@@ -102,6 +103,7 @@
 
 	for i := 0; i < len(ports); i++ {
 		absPort, _ := absChassis.NextPort()
+
 		absPort.PhysPort = &ports[i]
 		//AssignTraits(&ports[i], absPort)
 	}
@@ -116,6 +118,10 @@
 	absChassisMap := models.GetAbstractChassisMap()
 	clli := in.GetCLLI()
 	chassis := (*absChassisMap)[clli]
+	if chassis == nil {
+		errString := fmt.Sprintf("There is no chassis with CLLI of %s", clli)
+		return &AddOntReturn{Success: false}, errors.New(errString)
+	}
 	err := chassis.ActivateONT(int(in.GetSlotNumber()), int(in.GetPortNumber()), int(in.GetOntNumber()), in.GetSerialNumber())
 
 	if err != nil {
diff --git a/api/handler_test.go b/api/handler_test.go
deleted file mode 100644
index 59aad10..0000000
--- a/api/handler_test.go
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- 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.
-*/
-
-package api_test
-
-import (
-	"fmt"
-	"testing"
-
-	"gerrit.opencord.org/abstract-olt/api"
-	"gerrit.opencord.org/abstract-olt/models/abstract"
-	"gerrit.opencord.org/abstract-olt/models/physical"
-	"golang.org/x/net/context"
-)
-
-var clli string
-var slotHostname = "SlotOne"
-var ctx context.Context
-var server api.Server
-
-func TestHandler_CreateChassis(t *testing.T) {
-	fmt.Println("in handlerTest_CreateChassis")
-	ctx = context.Background()
-	server = api.Server{}
-	message := &api.AddChassisMessage{CLLI: "my cilli", VCoreIP: "192.168.0.1", VCorePort: 9191}
-	ret, err := server.CreateChassis(ctx, message)
-	if err != nil {
-		t.Fatalf("CreateChassis failed %v\n", err)
-	}
-	clli = ret.DeviceID
-}
-func TestHandler_CreateOLTChassis(t *testing.T) {
-	fmt.Println("in handlerTest_CreateOltChassis")
-	message := &api.AddOLTChassisMessage{CLLI: clli, SlotIP: "12.2.2.0", SlotPort: 9191,
-		Hostname: slotHostname, Type: api.AddOLTChassisMessage_edgecore}
-	ret, err := server.CreateOLTChassis(ctx, message)
-	if err != nil {
-		t.Fatalf("CreateOLTChassis failed %v\n", err)
-	}
-	fmt.Printf("CreateOLTChassis success %v\n", ret)
-}
-func TestHandler_ProvisionOnt(t *testing.T) {
-	ctx = context.Background()
-	server = api.Server{}
-	fmt.Println("in handlerTest_ProvisonOnt")
-	// 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)
-	}
-	// do it again on same ont/port should fail with AllReadyActiveError
-	ret, err = server.ProvisionOnt(ctx, message)
-	if err != nil {
-		switch err.(type) {
-		case *physical.AllReadyActiveError:
-			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 with AllReadyActiveError but didn't")
-	}
-
-	// this one should fail
-	//SlotNumber 1 hasn't been provisioned
-	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)
-}
-func TestHandler_DeleteOnt(t *testing.T) {
-	ctx = context.Background()
-	server = api.Server{}
-	fmt.Println("in handlerTest_DeleteOnt")
-	// this one should succeed
-	//De-Activate ONT 3 on PONPort 0 Slot 0 on my cilli but not active
-	message := &api.DeleteOntMessage{CLLI: clli, SlotNumber: 1, PortNumber: 3, OntNumber: 2, SerialNumber: "2033029402"}
-	ret, err := server.DeleteOnt(ctx, message)
-	if err != nil {
-		t.Fatalf("DeleteOnt failed %v\n", err)
-	}
-	// This should fail with AllReadyDeactivatedError
-	ret, err = server.DeleteOnt(ctx, message)
-	if err != nil {
-		switch err.(type) {
-		case *physical.AllReadyDeactivatedError:
-			fmt.Printf("DeleteOnt failed as expected with %v\n", err)
-		default:
-			t.Fatalf("DeleteOnt failed with %v\n", err)
-		}
-	} else {
-		t.Fatal("DeleteOnt should have failed with AllReadyDeactivatedError")
-	}
-
-	// this one should fail
-	//SlotNumber 1 hasn't been provisioned
-	message = &api.DeleteOntMessage{CLLI: clli, SlotNumber: 2, PortNumber: 3, OntNumber: 2, SerialNumber: "2033029402"}
-	ret, err = server.DeleteOnt(ctx, message)
-	if err != nil {
-		switch err.(type) {
-		case *abstract.UnprovisonedPortError:
-			fmt.Printf("DeleteOnt failed as it should with %v\n", err)
-		default:
-			t.Fatalf("DeleteOnt test failed with %v\n", err)
-		}
-	} else {
-		t.Fatalf("DeleteOnt should have failed but didn't")
-	}
-	fmt.Printf("DeletenOnt success %v\n", ret)
-}
