diff --git a/tools/test/scenarios/bin/execute-tapi-delete-call.py b/tools/test/scenarios/bin/execute-tapi-delete-call.py
new file mode 100644
index 0000000..aa9abfc
--- /dev/null
+++ b/tools/test/scenarios/bin/execute-tapi-delete-call.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+
+import sys
+import tapiHelper
+import json
+import requests
+
+if len(sys.argv) != 3 and len(sys.argv) != 4:
+    print "usage: execute-tapi-delete-call <onos-node> <deletion-type> [uuid]"
+    print "\t- <onos-node> is onos IP. 'localhost' is invalid."
+    print "\t- <deletion-type> is one of {line, client, both}, which mean line-side deletion, " \
+          "client-side deletion, and all deletion respectively."
+    print "\t- [uuid] is the created service uuid, which is optional. If uuid is empty, " \
+          "all connectivity services with <deletion-type> will be deleted."
+    print "\t  If [uuid] is not empty, and <deletion-type> is 'both', this script doesn't work."
+    print "\t  Otherwise, delete line-side or client-side connectivity with specific uuid."
+    print "For example, if we want to delete all client-side services on local host, the command should be:"
+    print "\t python execute-tapi-delete-call.py 127.0.0.1 client"
+    sys.exit(1)
+
+
+#
+# Define the input json string for service deletion.
+#
+def tapi_deletion_input(service_uuid):
+    delete_input = {
+        "tapi-connectivity:input":
+        {
+            "service-id-or-name": service_uuid
+        }
+    }
+    return delete_input
+
+
+#
+# Return sip uuid pair of service structure
+#
+def parse_sip_uuid_pair(sv): return \
+    (sv["end-point"][0]["service-interface-point"]["service-interface-point-uuid"],
+     sv["end-point"][1]["service-interface-point"]["service-interface-point-uuid"])
+
+
+#
+# Find sip in sip array through sip uuid.
+#
+def find_sip(sip_uuid, sips):
+    for sip in sips:
+        if sip["uuid"] == sip_uuid:
+            return sip
+    return None
+
+
+#
+# Post service deletion request to ONOS.
+#
+def post_deletion(service_uuid, del_request):
+    delete_input_json = json.dumps(tapi_deletion_input(service_uuid))
+    print "\nThe json content of deletion operation for connectivity service is \n\t\t%s." % \
+          delete_input_json
+    headers = {'Content-type': 'application/json'}
+    resp = requests.post(del_request, data=delete_input_json, headers=headers, auth=('onos', 'rocks'))
+    if resp.status_code != 200:
+        raise Exception('POST {}'.format(resp.status_code))
+    return resp
+
+
+# 1. Parse the input params.
+node = sys.argv[1]
+del_type = sys.argv[2]
+serv_uuid = None
+assert del_type in {"line", "client", "both"}
+if len(sys.argv) == 4:
+    serv_uuid = sys.argv[3]
+# 2. Get the subtree of tapi-common:context
+context_request = 'http://' + node + ':8181/onos/restconf/data/tapi-common:context'
+delete_request = 'http://' + node + ':8181/onos/restconf/operations/tapi-connectivity:delete-connectivity-service'
+context = tapiHelper.get_context(context_request)["tapi-common:context"]
+sips = context["service-interface-point"]
+try:
+    services = context["tapi-connectivity:connectivity-context"]["connectivity-service"]
+except KeyError:
+    print "Warning - there is no connectivity service in ONOS (%s)." % node
+    sys.exit(0)
+# 3. handle deletion requests according to <deletion-type> and [uuid]
+if serv_uuid is None:
+    # If [uuid] is empty, traverse all services with <deletion-type>
+    service_map = {}
+    del_num = 0
+    for service in services:
+        src, _ = parse_sip_uuid_pair(service)
+        sip = find_sip(src, sips)
+        if ((del_type == "line" or del_type == "both") and tapiHelper.is_photonic_media(sip)) or \
+           ((del_type == "client" or del_type == "both") and tapiHelper.is_dsr_media(sip)):
+            json_resp = post_deletion(service["uuid"], delete_request)
+            del_num += 1
+            print "Returns json string for deletion operations is\n %s\n" % json_resp
+    if del_num == 0:
+        print "Warning - there is no %s-side connectivity servicein ONOS (%s)." % (del_type, node)
+else:
+    # If [uuid] is not empty, check the <deletion-type>
+    if del_type == "both":
+        print "Error - The option 'both' is illegal when [uuid] is assigned."
+    else:
+        is_del = False
+        for service in services:
+            if service["uuid"] == serv_uuid:
+                src, _ = parse_sip_uuid_pair(service)
+                sip = find_sip(src, sips)
+                if (del_type == "line" and tapiHelper.is_photonic_media(sip)) or \
+                   (del_type == "client" and tapiHelper.is_dsr_media(sip)):
+                    json_resp = post_deletion(service["uuid"], delete_request)
+                    is_del = True
+                    print "Returns json string for deletion operations is\n %s\n" % json_resp
+                    break
+        if not is_del:
+            print "Warning - Cannot find %s-side connectivity service with service uuid %s." % (del_type, serv_uuid)
