diff --git a/models/physical/chassis.go b/models/physical/chassis.go
index 0c164e9..8f76a5e 100644
--- a/models/physical/chassis.go
+++ b/models/physical/chassis.go
@@ -125,5 +125,54 @@
 }
 func (chassis *Chassis) deleteONT(ont Ont) {
 	//TODO - api call to provison s/c vlans and ont serial number etc
+	//TODO - api call to provison s/c vlans and ont serial number etc
 	log.Printf("chassis.deleteONT(%s,SVlan:%d,CVlan:%d)\n", ont.SerialNumber, ont.Svlan, ont.Cvlan)
+	ponPort := ont.Parent
+	slot := ponPort.Parent
+
+	//func NewOntProvision(serialNumber string, oltIP net.IP, ponPortNumber int) OntProvision {
+	ontStruct := tosca.NewOntProvision(ont.SerialNumber, slot.Address.IP, ponPort.Number)
+	yaml, _ := ontStruct.ToYaml()
+	fmt.Println(yaml)
+
+	requestList := fmt.Sprintf("http://%s:%d/delete", chassis.XOSAddress.IP.String(), chassis.XOSAddress.Port)
+	client := &http.Client{}
+	if settings.GetDummy() {
+		log.Printf("yaml:%s\n", yaml)
+		log.Println("YAML IS NOT BEING SET TO XOS")
+	} else {
+
+		log.Println(requestList)
+		log.Println(yaml)
+		if settings.GetDummy() {
+			return
+		}
+		req, err := http.NewRequest("POST", requestList, strings.NewReader(yaml))
+		req.Header.Add("xos-username", chassis.XOSUser)
+		req.Header.Add("xos-password", chassis.XOSPassword)
+		resp, err := client.Do(req)
+		if err != nil {
+			log.Printf("ERROR :) %v\n", err)
+			// handle error
+		}
+		log.Printf("Response is %v\n", resp)
+	}
+	deleteOntStruct := tosca.NewOntDelete(ont.SerialNumber)
+	yaml, _ = deleteOntStruct.ToYaml()
+	fmt.Println(yaml)
+	if settings.GetDummy() {
+		log.Printf("yaml:%s\n", yaml)
+		log.Println("YAML IS NOT BEING SET TO XOS")
+		return
+	} else {
+		req, err := http.NewRequest("POST", requestList, strings.NewReader(yaml))
+		req.Header.Add("xos-username", chassis.XOSUser)
+		req.Header.Add("xos-password", chassis.XOSPassword)
+		resp, err := client.Do(req)
+		if err != nil {
+			log.Printf("ERROR :) %v\n", err)
+			// handle error
+		}
+		log.Printf("Response is %v\n", resp)
+	}
 }
diff --git a/models/tosca/deleteOnt.go b/models/tosca/deleteOnt.go
new file mode 100644
index 0000000..5854d57
--- /dev/null
+++ b/models/tosca/deleteOnt.go
@@ -0,0 +1,78 @@
+/*
+   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 tosca
+
+import (
+	"fmt"
+
+	yaml "gopkg.in/yaml.v2"
+)
+
+// type: tosca.nodes.ONUDevice
+var ontDeleteTemplate = `tosca_definitions_version: tosca_simple_yaml_1_0
+imports:
+  - custom_types/onudevice.yaml
+description: Delete an ont
+topology_template:
+  node_templates:
+    device#onu:
+      type: tosca.nodes.ONUDevice
+      properties:
+        serial_number:`
+
+/*var ontDeleteTemplate = `tosca_definitions_version: tosca_simple_yaml_1_0
+imports:
+  - custom_types/onudevice.yaml
+description: Create a simulated OLT Device in VOLTHA
+topology_template:
+  node_templates:
+    device#onu:
+      type: something
+      properties:
+        serial_number:`*/
+
+type OntDelete struct {
+	ToscaDefinitionsVersion string   `yaml:"tosca_definitions_version"`
+	Imports                 []string `yaml:"imports"`
+	Description             string   `yaml:"description"`
+	TopologyTemplate        struct {
+		NodeTemplates struct {
+			DeviceOnt struct {
+				DeviceType string `yaml:"type"`
+				Properties struct {
+					SerialNumber string `yaml:"serial_number"`
+				} `yaml:"properties"`
+			} `yaml:"device#onu"`
+		} `yaml:"node_templates"`
+	} `yaml:"topology_template"`
+}
+
+func NewOntDelete(serialNumber string) OntDelete {
+	o := OntDelete{}
+	err := yaml.Unmarshal([]byte(ontDeleteTemplate), &o)
+	if err != nil {
+		fmt.Println(err)
+	}
+	props := &o.TopologyTemplate.NodeTemplates.DeviceOnt.Properties
+	props.SerialNumber = serialNumber
+	return o
+
+}
+func (ont *OntDelete) ToYaml() (string, error) {
+	b, err := yaml.Marshal(ont)
+	ret := string(b)
+	return ret, err
+}
diff --git a/models/tosca/deleteOnt_test.go b/models/tosca/deleteOnt_test.go
new file mode 100644
index 0000000..e9f9c82
--- /dev/null
+++ b/models/tosca/deleteOnt_test.go
@@ -0,0 +1,46 @@
+/*
+   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 tosca_test
+
+import (
+	"testing"
+
+	"gerrit.opencord.org/abstract-olt/models/tosca"
+)
+
+var deleteExpected = `tosca_definitions_version: tosca_simple_yaml_1_0
+imports:
+- custom_types/onudevice.yaml
+description: Delete an ont
+topology_template:
+  node_templates:
+    device#onu:
+      type: tosca.nodes.ONUDevice
+      properties:
+        serial_number: some_serial
+`
+var ontToDelete tosca.OntDelete
+
+//func NewOntProvision(serialNumber string, oltIP net.IP, ponPortNumber int) OntProvision {
+
+func TestOntDelete_NewOntDelete(t *testing.T) {
+	ontToDelete = tosca.NewOntDelete("some_serial")
+	ontYaml, _ := ontToDelete.ToYaml()
+	if ontYaml != deleteExpected {
+		t.Fatalf("Didn't generate the expected yaml\n Generated:\n%s \nExpected:\n%s\n", ontYaml, deleteExpected)
+	}
+}
