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
diff --git a/src/test/utils/OnboardingServiceUtils.py b/src/test/utils/OnboardingServiceUtils.py
new file mode 100644
index 0000000..08398f8
--- /dev/null
+++ b/src/test/utils/OnboardingServiceUtils.py
@@ -0,0 +1,183 @@
+import os
+import shutil
+import re
+from novaclient import client as nova_client
+from SSHTestAgent import SSHTestAgent
+from CordTestUtils import *
+from CordTestUtils import log_test as log
+
+log.setLevel('INFO')
+
+class OnboardingServiceUtils(object):
+
+    @classmethod
+    def setUp(cls):
+        pass
+
+    @classmethod
+    def tearDown(cls):
+        pass
+
+    '''
+    @method: get_nova_credentials_v2
+    @Description: Get nova credentials
+    @params:
+    returns credential from env
+    '''
+    @classmethod
+    def get_nova_credentials_v2(cls):
+        credential = {}
+        credential['username'] = os.environ['OS_USERNAME']
+        credential['api_key'] = os.environ['OS_PASSWORD']
+        credential['auth_url'] = os.environ['OS_AUTH_URL']
+        credential['project_id'] = os.environ['OS_TENANT_NAME']
+        return credential
+
+    '''
+    @method: get_compute_nodes
+    @Description: Get the list of compute nodes
+    @params:
+    returns  node list
+    '''
+    @classmethod
+    def get_compute_nodes(cls):
+        credentials = cls.get_nova_credentials_v2()
+        nvclient = nova_client.Client('2', **credentials)
+        return nvclient.hypervisors.list()
+
+    '''
+    @method: get_exampleservices
+    @Description: Get list of exampleservice's running in compute node
+    @params: status of exampleservice
+    returns exampleservice wrappers
+    '''
+    @classmethod
+    def get_exampleservices(cls, active = True):
+        credentials = cls.get_nova_credentials_v2()
+        nvclient = nova_client.Client('2', **credentials)
+        exampleservices = nvclient.servers.list(search_opts = {'all_tenants': 1})
+        if active is True:
+            exampleservices = filter(lambda exampleservice: exampleservice.status == 'ACTIVE', exampleservices)
+        exampleservice_wrappers = []
+        for exampleservice in exampleservices:
+            exampleservice_wrappers.append(ExampleSeviceWrapper(exampleservice))
+        return exampleservice_wrappers
+
+    '''
+    @method: health_check
+    @Description: Check if exampleservices are reachable
+    @params:
+    returns True
+    '''
+    @classmethod
+    def health_check(cls):
+        '''Returns 0 if all active exampleservices are reachable through the compute node'''
+        exampleservices = cls.get_exampleservices()
+        exampleservice_status = []
+        for exampleservice in exampleservices:
+            exampleservice_status.append(exampleservice.get_health())
+        unreachable = filter(lambda st: st == False, exampleservice_status)
+        return len(unreachable) == 0
+
+class ExampleSevicesWrapper(object):
+
+    def __init__(self, exampleservice):
+        self.exampleservice = exampleservice
+        self.name = self.exampleservice.name
+        self.compute_node = self.get_compute_node()
+        self.ip = self.get_ip()
+
+    '''
+    @method: get_compute_node
+    @Description:
+    @params:
+    returns compute node name
+    '''
+    def get_compute_node(self):
+        return self.exampleservice._info['OS-EXT-SRV-ATTR:hypervisor_hostname']
+
+    '''
+    @method: get_ip
+    @Description:
+    @params:
+    returns ip of network
+    '''
+    def get_ip(self):
+        if 'management' in self.exampleservice.networks:
+            ips = self.exampleservice.networks['management']
+            if len(ips) > 0:
+                return ips[0]
+        return None
+
+    '''
+    @method: run_cmd_compute
+    @Description:
+    @params:
+    returns Status & output
+    '''
+    def run_cmd_compute(self, cmd, timeout = 5):
+        ssh_agent = SSHTestAgent(self.compute_node)
+        st, output = ssh_agent.run_cmd(cmd, timeout = timeout)
+        if st == True and output:
+            output = output.strip()
+        else:
+            output = None
+
+        return st, output
+
+    '''
+    @method: get_health
+    @Description:
+    @params:
+    returns Status
+    '''
+    def get_health(self):
+        if self.ip is None:
+            return True
+        cmd = 'ping -c 1 {}'.format(self.ip)
+        log.info('Pinging ONBOARDED SERVICE %s at IP %s' %(self.name, self.ip))
+        st, _ = self.run_cmd_compute(cmd)
+        log.info('ONBOARDED SERVICE %s at IP %s is %s' %(self.name, self.ip, 'reachable' if st == True else 'unreachable'))
+        return st
+
+    '''
+    @method: check_access
+    @Description: validates access
+    @params:
+    returns Status
+    '''
+    def check_access(self):
+        if self.ip is None:
+           return True
+        ssh_agent = SSHTestAgent(self.compute_node)
+        st, _ = ssh_agent.run_cmd('ls', timeout=10)
+        if st == False:
+            log.error('Compute node at %s is not accessible' %(self.compute_node))
+            return st
+        log.info('Checking if ONBOARDING SERVICE at %s is accessible from compute node %s' %(self.ip, self.compute_node))
+        st, _ = ssh_agent.run_cmd('ssh {} ls'.format(self.ip), timeout=30)
+        if st == True:
+            log.info('OK')
+        return st
+
+    '''
+    @method: Validate services
+    @Description: This validates if expected service is running in example service VM
+    @params:
+    returns Status
+    '''
+    def validate_service_in_vm(self):
+        if self.ip is None:
+           return True
+        ssh_agent = SSHTestAgent(self.compute_node)
+        st, _ = ssh_agent.run_cmd('ls', timeout=10)
+        if st == False:
+            log.error('Compute node at %s is not accessible' %(self.compute_node))
+            return st
+        log.info('Checking if APACHE SERVICE at %s is running %s' %(self.ip, self.compute_node))
+        st, _ = ssh_agent.run_cmd('ssh {} ls /var/run/apache2/apache2.pid'.format(self.ip), timeout=30)
+        if st == True:
+            log.info('OK')
+        return st
+
+
