diff --git a/src/test/onboarding/__init__.py b/src/test/onboarding/__init__.py
new file mode 100644
index 0000000..8da76c4
--- /dev/null
+++ b/src/test/onboarding/__init__.py
@@ -0,0 +1,32 @@
+#
+# Copyright 2016-present Ciena Corporation
+#
+# 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.
+#
+import os,sys
+import logging
+logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
+##add the python path to lookup the utils
+working_dir = os.path.dirname(os.path.realpath(sys.argv[-1]))
+utils_dir = os.path.join(working_dir, '../utils')
+fsm_dir = os.path.join(working_dir, '../fsm')
+subscriber_dir = os.path.join(working_dir, '../subscriber')
+__path__.append(utils_dir)
+__path__.append(fsm_dir)
+__path__.append(subscriber_dir)
+cli_dir = os.path.join(working_dir, '../cli')
+__path__.append(cli_dir)
+
+#from nose import main as nosetest_main
+#from CordTestConfig import CordTestConfigRestore
+#nosetest_main(addplugins = [ CordTestConfigRestore() ])
diff --git a/src/test/onboarding/onboardingTest.py b/src/test/onboarding/onboardingTest.py
new file mode 100644
index 0000000..d5f1fcb
--- /dev/null
+++ b/src/test/onboarding/onboardingTest.py
@@ -0,0 +1,92 @@
+#
+# Copyright 2016-present Ciena Corporation
+#
+# 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.
+#
+import unittest
+import os,sys
+import keystoneclient.v2_0.client as ksclient
+import keystoneclient.apiclient.exceptions
+import neutronclient.v2_0.client as nclient
+import neutronclient.common.exceptions
+from novaclient import client as nova_client
+from neutronclient.v2_0 import client as neutron_client
+import neutronclient.v2_0.client as neutronclient
+from nose.tools import assert_equal
+from CordTestUtils import get_mac, log_test
+from OnosCtrl import OnosCtrl
+from OnosFlowCtrl import OnosFlowCtrl
+from credentials import *
+from OnboardingServiceUtils import OnboardingServiceUtils
+from SSHTestAgent import SSHTestAgent
+import requests
+import time
+import json
+
+class onboarding_exchange():
+
+    @classmethod
+    def setUpClass(cls):
+        OnboardingServiceUtils.setUp()
+
+    @classmethod
+    def tearDownClass(cls):
+        OnboardingServiceUtils.tearDown()
+
+    def cliEnter(self, controller = None):
+        retries = 0
+        while retries < 30:
+            self.cli = OnosCliDriver(controller = controller, connect = True)
+            if self.cli.handle:
+                break
+            else:
+                retries += 1
+                time.sleep(2)
+
+    def cliExit(self):
+        self.cli.disconnect()
+
+    def onos_shutdown(self, controller = None):
+        status = True
+        self.cliEnter(controller = controller)
+        try:
+            self.cli.shutdown(timeout = 10)
+        except:
+            log.info('Graceful shutdown of ONOS failed for controller: %s' %controller)
+            status = False
+
+        self.cliExit()
+        return status
+
+    def test_exampleservice_health(self):
+        """
+        Algo:
+        1. Login to compute node VM
+        2. Get all exampleservice
+        3. Ping to all exampleservice
+        4. Verifying Ping success
+        """
+        status = OnboardingServiceUtils.health_check()
+        assert_equal(status, True)
+
+    def test_exampleservice_onboarding(self):
+        pass
+
+    def test_exampleservice_connectivity(self):
+        pass
+
+    def test_exampleservice_for_apache_service(self):
+        pass
+
+    def test_exampleservice_using__curl(self):
+        pass
