diff --git a/agent/inband/scripts/fetch_olt_sw_hw_details.py b/agent/inband/scripts/fetch_olt_sw_hw_details.py
new file mode 100644
index 0000000..78f4d44
--- /dev/null
+++ b/agent/inband/scripts/fetch_olt_sw_hw_details.py
@@ -0,0 +1,297 @@
+#!/usr/bin/python
+
+"""
+Copyright 2018-present Open Networking Foundation
+
+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.
+"""
+
+"""
+:Description:  Module for fetching OLT information.
+
+               This module is used to fetch OLT software and hardware information.
+               The OLT software information includes Operating system, OS Version,
+               and ONIE version.
+               The hardware information includes OLT Serial Number, OLT Hardware Model,
+               Vendor ID, OLT Hardware Part Number and In-band interfaces MAC addresses.
+
+               The gathered information will be output to the screen as a json string.
+               When passed through a JSON processor (like jq) the output would look
+               like below(sample output, the keys remain same and values change based on
+               OLT model and binary versions)
+               {
+                   "hardware_information": {
+                   "vendor": "Accton",
+                   "hw_part_number": "FN1EC0816400Z",
+                   "hw_version": "0.0.0.3",
+                   "inband_interface": "34:12:78:56:01:00",
+                   "hw_model": "ASXvOLT16-O-AC-F",
+                   "serial_number": "EC1729003537"
+                   },
+                   "software_information": {
+                   "onie_version": "2017.02.00.06",
+                   "os_version": "3.7.10",
+                   "os_name": "OpenNetworkLinux",
+                   "openolt_version": "2.0.0",
+                   "bal_version": "2.6.0.1"
+                   }
+               }
+
+               This script exits with exit code 0 in case of success and 1 in case of failure.
+"""
+
+import os
+import re
+import json
+import syslog
+import yaml
+
+# dictionary containing OLT information with hardware_information and
+# software_information as keys and holds the respective data values
+OLT_INFORMATION = {}
+
+# Path where BAL libraries, configuration files, bal_core_dist
+# and openolt binaries are located.
+BRCM_DIR = '/broadcom'
+
+# Path to vlan config file
+VLAN_CONFIG_FILE = BRCM_DIR+"/vlan.config"
+
+# Operating system name which is running at OLT.
+# By default Open Network Linux (ONL) is used as operating
+# system at OLT
+OS_NAME = 'OpenNetworkLinux'
+
+# BAL library version running at OLT
+
+# openOLT version from OLT when available
+OPENOLT_VERSION = " "
+
+# in-band interface incase of device asgvolt64
+ETH_1 = 'eth1'
+
+# in-band interface incase of device asfvolt16
+ETH_2 = 'eth2'
+
+# Constants for the name of the keys in the JSON being printed
+VENDOR = "vendor"
+SERIAL_NUMBER = "serial_number"
+HARDWARE_MODEL = "hw_model"
+HARDWARE_PART_NUMBER = "hw_part_number"
+HARDWARE_VERSION = "hw_version"
+OPERATING_SYSTEM = "os_name"
+OPERATING_SYSTEM_VERSION = "os_version"
+ONIE_VERSION = "onie_version"
+SOFTWARE_INFORMATION = "software_information"
+HARDWARE_INFORMATION = "hardware_information"
+INBAND_INTERFACE = "inband_interface"
+BAL_VER = "bal_version"
+OPENOLT_VER = "openolt_version"
+OLT_MODEL=None
+ASX_16 = "ASXvOLT16"
+ASG_64 = "ASGvOLT64"
+
+# log to syslog
+syslog.openlog(facility=syslog.LOG_SYSLOG)
+
+def get_olt_board_name():
+    """
+    Reads the bal package name
+
+    This function fetchs bal package whether asfvolt16 or asgvolt64
+
+    :return :  packge names if successful and None in case of failure.
+    :rtype : tuple of package name in case of success, else None in case of failure.
+    """
+
+    try:
+       OLT_MODEL = os.popen("cat /sys/devices/virtual/dmi/id/board_name").read().strip("\n")
+       syslog.syslog(syslog.LOG_INFO, "successfully-read-olt-board-name")
+       return OLT_MODEL
+    except (IOError, NameError) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-executing-command-{}".format(exception))
+        return None
+
+
+def retreive_vlan_id():
+    """
+    Retrieves VLAN ids of in-band interfaces.
+
+    This function fetchs vlan ids from OLT /broadcom/bal_config.ini file.
+
+    :return : vlan id of in-band interface if successfull and None in case of failure.
+    :rtype : integer(valid vlan_id) in case of success, else None in case of failure.
+    """
+
+    eth_vlan = None
+
+    # retrieving vlan ids based on the below two keys in bal_config.ini
+    asf16_vlan = 'asfvolt16_vlan_id_eth2'
+    asg64_vlan = 'asgvolt64_vlan_id_eth1'
+    olt_model=get_olt_board_name()
+    try:
+        if os.path.exists(VLAN_CONFIG_FILE):
+            with open(VLAN_CONFIG_FILE, "r") as file_descriptor:
+                lines = file_descriptor.readlines()
+                for line in lines:
+                    if olt_model == ASX_16:
+                        if re.search(asf16_vlan, line):
+                            eth_vlan = int(line.split('=')[1].strip())
+                    else if olt_model == ASG_64:
+                        if re.search(asg64_vlan, line):
+                            eth_vlan = int(line.split('=')[1].strip())
+        else:
+            syslog.syslog(syslog.LOG_ERR, "{}-file-does-not-exist".format(VLAN_CONFIG_FILE))
+            return None, None
+    except(EnvironmentError, re.error) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-retreving-vlan-ids-{}".format(exception))
+        return None, None
+
+    if eth_vlan > 4094 or eth_vlan < 1:
+        syslog.syslog(syslog.LOG_ERR, "vlan-id-not-in-range-{}-{}".format(eth_vlan, eth_vlan_2))
+        return None, None
+
+    return eth_vlan
+
+
+def get_olt_basic_info():
+    """
+     Fetch OLT basic information
+
+     This function retireves OLT's basic information using the command 'onlpdump -s'
+
+    :return: OLT's basic info in case of success and None in case of failure
+    :rtype: json if success and None if failure
+    """
+    # fetch OLT basic information
+    try:
+        olt_info = os.popen('onlpdump -s').read()
+        out = yaml.dump(yaml.load(olt_info)['System Information'])
+        json_data = json.dumps(yaml.load(out))
+        data = json.loads(json_data)
+    except (IOError, TypeError, ValueError, yaml.YAMLError, yaml.MarkedYAMLError) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-fetching-olt-information-{}".format(exception))
+        return None
+    return data
+
+def get_bal_openolt_version():
+    """
+     Fetch bal and openolt version
+
+     This function retireves OLT's basic information using the command 'onlpdump -s'
+
+     :return : bal and openolt version if successfull and None in case of failure.
+     :rtype : tuple of bal and opneolt version in case of success, else None in case of failure.
+    """
+    try:
+        os.chdir('/')
+        os.environ["LD_LIBRARY_PATH"] = "."
+        version_string = os.popen("./broadcom/openolt --version").read()
+        version_tuple = tuple(version_string.split("\n"))
+        openolt_v = version_tuple[0].split(":")
+        OPENOLT_VERSION = openolt_v[1].split(" ")
+        bal_v = version_tuple[1].split(":")
+        BAL_VERSION = bal_v[1].split(" ")
+        return OPENOLT_VERSION[1], BAL_VERSION[1]
+    except (IOError, NameError) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-executing-command-{}".format(exception))
+        return None, None
+
+
+def fetch_olt_info():
+    """
+    Gather OLT software and hardware information.
+
+    This function gather OLT information and returns  OLT
+    software and hardware information.
+
+    :return: OLT's software and hardware information in case of successful execution
+             and returns None in case of failure
+    :rtype: JSON string in case of success and None in case of failure.
+    """
+
+    hw_facts = {}
+    sw_facts = {}
+
+    # fetch olt basic information
+    data = get_olt_basic_info()
+    if data is None:
+        return None
+
+    olt_model=get_olt_board_name()
+    # retrieving VLAN ids of in-band interfaces
+    vlan = retreive_vlan_id()
+    try:
+        if vlan is not None:
+            # Retreiving MAC address for in-band interfaces
+            if olt_model == ASX_16:
+                macaddr = os.popen("ifconfig " + ETH_2 + "." + str(vlan) +
+                                     " | grep -Po 'HWaddr " + r"\K.*$'").read().strip()
+            else if olt_model == ASG_64:
+                macaddr = os.popen("ifconfig " + ETH_1 + "." + str(vlan) +
+                                     " | grep -Po 'HWaddr " + r"\K.*$'").read().strip()
+        else:
+            return None
+
+        # get the operating system version details from olt
+        operating_sys = os.popen("uname -a").read()
+        os_tuple = tuple(operating_sys.split(" "))
+        os_and_version = os_tuple[2].split("-")
+        os_version = os_and_version[0]
+    except (IOError, NameError) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-executing-command-{}".format(exception))
+        return None
+
+    openolt_v, bal_v = get_bal_openolt_version()
+
+    # adding OLT hardware details to dictionary
+    try:
+        # adding OLT's in-band interfaces mac addresses
+        hw_facts[INBAND_INTERFACE] = macaddr
+        hw_facts[VENDOR] = data.get("Manufacturer", "")
+        hw_facts[SERIAL_NUMBER] = data.get("Serial Number", "")
+        hw_facts[HARDWARE_MODEL] = data.get("Product Name", "")
+        hw_facts[HARDWARE_PART_NUMBER] = data.get("Part Number", "")
+        hw_facts[HARDWARE_VERSION] = data.get("Diag Version", "")
+
+        # adding OLT software details to dictionary
+        sw_facts[OPERATING_SYSTEM] = OS_NAME
+        sw_facts[OPERATING_SYSTEM_VERSION] = os_version
+        sw_facts[ONIE_VERSION] = data.get('ONIE Version', "")
+        sw_facts[BAL_VER] = bal_v
+        sw_facts[OPENOLT_VER] = openolt_v
+
+        # adding OLT hardware and software information to OLT_INFORMATION dictionary
+        OLT_INFORMATION[SOFTWARE_INFORMATION] = sw_facts
+        OLT_INFORMATION[HARDWARE_INFORMATION] = hw_facts
+
+        # converting OLT information to json object
+        olt_json_string = json.dumps(OLT_INFORMATION)
+
+    except (TypeError, NameError) as exception:
+        syslog.syslog(syslog.LOG_ERR, "error-serializing-to-json-data-{}".format(exception))
+        return None
+
+    return olt_json_string
+
+
+if __name__ == "__main__":
+    str_data = fetch_olt_info()
+    if str_data is not None:
+        print(str_data)
+        syslog.syslog(syslog.LOG_INFO, "successfull-execution-printing-OLT-information")
+        exit(0)
+    else:
+        print("error-occurred-exiting")
+        syslog.syslog(syslog.LOG_ERR, "error-occurred-exiting")
+        exit(1)
diff --git a/agent/inband/scripts/start_inband_oltservices.sh b/agent/inband/scripts/start_inband_oltservices.sh
new file mode 100644
index 0000000..4a8b433
--- /dev/null
+++ b/agent/inband/scripts/start_inband_oltservices.sh
@@ -0,0 +1,587 @@
+#!/bin/bash
+
+#Copyright 2018-present Open Networking Foundation
+#
+#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.
+
+### BEGIN INIT INFO
+# Provides:          start_inband_oltservices.sh
+# Required-Start:    $all
+# Required-Stop:     $network $local_fs $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Sets up inband management channel and starts device management and Openolt services
+# Description:
+#                    This script does the following things
+#                    1) Extracts bal package and keep the files in appropriate paths.
+#                    2) Starts svk_init which installs required drivers needed by the MAC devices
+#                    3) Starts device management daemon which initializes all maple, qumran chip sets
+#                       and brings up access terminal.
+#                    4) Sets up inband management channel
+#                    5) Creates inband vlan tagged interface which will be used to communicate to
+#                       Openolt service from vOLTHA via NNI
+#                    6) Sets up dhcp-client-identifier in "/etc/dhcp/dhclient.conf" for each inband
+#                       tagged interface so that it can obtain IP address from DHCP server
+#                    7) Sets up DHCP IP configuration in "/etc/network/interfaces" for inband tagged
+#                       interface so that it can initiate DHCPREQUEST to DHCP server once network
+#                       restart triggered.
+#                    8) Starts openolt service which enables all PON and NNI interfaces and creates
+#                       respective PON and NNI schedulers and Queues.
+### END INIT INFO
+
+#------------------------------------------------------------------------------
+# GLOBAL VARIABLES
+#------------------------------------------------------------------------------
+
+# Root path where required bal directories are located
+BRCM_OPT_DIR='/opt/bcm68620'
+BRCM_DIR='/broadcom'
+
+# olt service files
+SVK_INIT_FILE="${BRCM_OPT_DIR}/svk_init.sh"
+
+# vlan config file
+VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
+DHCLIENT_CONF="/etc/dhcp/dhclient.conf"
+
+# olt serial number
+SERIAL_NUMBER="/sys/devices/virtual/dmi/id/product_serial"
+
+OLT_MODEL=$(cat /sys/devices/virtual/dmi/id/board_name)
+NETWORK_INTERFACE="/etc/network/interfaces"
+BAL_OPENOLT_DEB_16="/openolt_asfvolt16.deb"
+BAL_OPENOLT_DEB_64="/openolt_asgvolt64.deb"
+
+DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
+OPENOLT="openolt"
+ASFVOLT16="asfvolt16"
+ASGVOLT64="asgvolt64"
+ASF16_MODEL="ASXvOLT16"
+
+# vlan id for asfvolt16
+ASFVOLT16_VLAN_ID_ETH2=
+
+# vlan id for asgvolt64
+ASGVOLT64_VLAN_ID_ETH1=
+
+# File used to set/get argument to openolt service
+OPENOLT_ARG_INPUT_FILE=/etc/default/openolt
+
+# Wait time for BAL to get ready
+WAIT_TIME_BAL_READY=20
+
+#------------------------------------------------------------------------------
+# Function Name: does_logger_exist
+# Description:
+#    This function check if logger exist and executable.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    returns 0 if exist and executable else 1
+#------------------------------------------------------------------------------
+does_logger_exist() {
+    cmd=/usr/bin/logger
+    if [ -x ${cmd} ]; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: info_message
+# Description:
+#    This function print the info message information to the console
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    string message
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+info_message() {
+    echo "INFO: $1"
+    logger -p user.info "$1"
+}
+
+#------------------------------------------------------------------------------
+# Function Name: error_message
+# Description:
+#    This function print the error message information to the console
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    string message
+#
+# Returns:
+#    returns 1
+#------------------------------------------------------------------------------
+error_message() {
+    echo "ERROR: $1"
+    logger -p user.err "$1"
+    return 1
+}
+
+#------------------------------------------------------------------------------
+# Function Name: get_vlan_ids
+# Description:
+#    This function facilitates to fetch vlan id from vlan configuration file
+#    located at /broadcom/vlan.config
+#
+# Globals:
+#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
+#    ASGVOLT64_VLAN_ID_ETH1, ASGVOLT64_VLAN_ID_ETH2
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+get_vlan_ids() {
+    # Read vlan.config file to fetch vlan id information
+    if [ -f ${VLAN_CONFIG_FILE} ]; then
+        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+        if [ -z ${ASFVOLT16_VLAN_ID_ETH2} ] || [ -z ${ASGVOLT64_VLAN_ID_ETH1} ]; then
+            error_message "ERROR: vlan ids not valid"
+            exit 1
+        fi
+    else
+        error_message "ERROR: ${VLAN_CONFIG_FILE} not found, using default value 4093"
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: setup_nw_configuration
+# Description:
+#    This function read the "/broadcom/vlan.config" file to get VLAND IDs
+#    for the interface eth1 and eth2 based on the OLT model  and update
+#    these VLAN ID to /etc/network/interfaces file for dhcp request.
+# Globals:
+#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+setup_nw_configuration() {
+    # Dynamic vlan entry in /etc/network/interfaces file
+    # Should have only one entry in the file in case of multiple reboot
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        set_dhcp_ip_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
+    else
+        set_dhcp_ip_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
+    fi
+    # Restart the networking services
+    /etc/init.d/networking restart
+}
+
+#------------------------------------------------------------------------------
+# Function Name: set_dhcp_ip_configuration
+# Description:
+#    This function facilitates setup_nw_configuration function and accepts interface
+#    vlan id as an argumnet to modify network interfaces file
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+set_dhcp_ip_configuration() {
+    interface=$1
+    vlan_id=$2
+    grep -q "iface ${interface}.${vlan_id}" $NETWORK_INTERFACE
+    if [ $? -ne 0 ]; then
+        echo "auto ${interface}.${vlan_id}" >>${NETWORK_INTERFACE}
+        echo "iface ${interface}.${vlan_id} inet dhcp" >>${NETWORK_INTERFACE}
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: start_dev_mgmt_service
+# Description:
+#    This function starts svk_init.sh script and device management service.
+#    Device management service initializes all maple, qumran chip sets and
+#    brings up access terminal.
+#
+# Globals:
+#    SVK_INIT_FILE, BRCM_DIR, DEV_MGMT_DAEMON
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+start_dev_mgmt_service() {
+    info_message "Starting device management service"
+    chmod +x ${SVK_INIT_FILE}
+    ${SVK_INIT_FILE}
+
+    # starts the device_management deamon and openolt services
+    service dev_mgmt_daemon start
+    service dev_mgmt_daemon status
+    if [ $? -eq 0 ]; then
+        info_message "${DEV_MGMT_DAEMON} service is running"
+        setup_inband_mgmt_channel
+    else
+        error_message "${DEV_MGMT_DAEMON} is not running"
+        exit 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: setup_inband_mgmt_channel
+# Description:
+#    This function sets up inband management channel.
+#
+# Globals:
+#    BRCM_DIR, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+setup_inband_mgmt_channel() {
+    local interface_type="inband"
+
+    # Extracting vlan ids from file
+    get_vlan_ids
+
+    cd ${BRCM_DIR}
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        # Waiting till interface eth2 get initialized & RUNNING state
+        check_interface_is_up eth2 $interface_type
+
+        # wait for BAL to get ready
+        sleep WAIT_TIME_BAL_READY
+
+        # enabling in-band communication through broadcom API on NIC interface id 14 for eth2 interface
+        echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
+        vlan_id=${ASFVOLT16_VLAN_ID_ETH2} action=none" | ./example_user_appl
+        if [ $? -ne 0 ]; then
+            error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASFVOLT16_VLAN_ID_ETH2}"
+        fi
+    else
+        # Waiting till interface eth1 get initialized & RUNNING state
+        check_interface_is_up eth1 $interface_type
+        # wait for BAL to get ready
+        sleep WAIT_TIME_BAL_READY
+        # enabling in-band communication through broadcom API on NIC interface id 14 for eth1 interface
+        echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
+        vlan_id=${ASGVOLT64_VLAN_ID_ETH1} action=none" | ./example_user_appl
+        if [ $? -ne 0 ]; then
+            error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASGVOLT64_VLAN_ID_ETH1}"
+        fi
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: create_vlan_tagged_Iface
+# Description:
+#    This function create the VLAN interfaces and brings them UP.
+#
+# Globals:
+#    ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+create_vlan_tagged_Iface() {
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        # Adding vlan to the interface eth2
+        ip link add link eth2 name eth2.${ASFVOLT16_VLAN_ID_ETH2} type vlan id ${ASFVOLT16_VLAN_ID_ETH2}
+        ifconfig eth2.${ASFVOLT16_VLAN_ID_ETH2} up
+    else
+        # Adding vlan to the interface eth1
+        ip link add link eth1 name eth1.${ASGVOLT64_VLAN_ID_ETH1} type vlan id ${ASGVOLT64_VLAN_ID_ETH1}
+        ifconfig eth1.${ASGVOLT64_VLAN_ID_ETH1} up
+    fi
+    info_message "Inband tagged interfaces created succesfully"
+}
+
+#------------------------------------------------------------------------------
+# Function Name: setup_dhcpd_configuration
+# Description:
+#    This function updates /etc/dhcp/dhclient.conf file for dhcp
+#    request for eth2.ASFVOLT16_VLAN_ID_ETH2, eth3.ASFVOLT16_VLAN_ID_ETH3,
+#    eth1.ASGVOLT64_VLAN_ID_ETH1 and eth2.ASGVOLT64_VLAN_ID_ETH2 interfaces
+#
+# Globals:
+#    ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3, ASGVOLT64_VLAN_ID_ETH1,
+#    ASGVOLT64_VLAN_ID_ETH2,  DHCLIENT_CONF
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+setup_dhcpd_configuration() {
+    if [ -f ${DHCLIENT_CONF} ]; then
+        if [ -f ${SERIAL_NUMBER} ]; then
+            serial_num=$(cat ${SERIAL_NUMBER})
+            if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+                # dhcient.conf file should have only one entry for eth2.<ASFVOLT16_VLAN_ID_ETH2> interface
+                set_dhclient_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
+            else
+                # dhcient.conf file should have only one entry for eth1.<ASGVOLT64_VLAN_ID_ETH1> interface
+                set_dhclient_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
+            fi
+        else
+            error_message "ERROR: serial number of olt not found"
+        fi
+    else
+        error_message "ERROR: DHCP config file not found"
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: set_dhclient_configuration
+# Description:
+#    This function updates dhclient conf file with in-band interfaces.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+set_dhclient_configuration() {
+    interface=$1
+    vlan_id=$2
+    grep -q "interface \"${interface}.${vlan_id}\"" $DHCLIENT_CONF
+    if [ $? -ne 0 ]; then
+        echo "interface \"${interface}.${vlan_id}\" {" >>$DHCLIENT_CONF
+        echo "    send dhcp-client-identifier \"${serial_num}.${vlan_id}\";" >>$DHCLIENT_CONF
+        echo "}" >>$DHCLIENT_CONF
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: check_interface_is_up
+# Description:
+#    This function checks if provided inband interface is up and running
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+check_interface_is_up()
+{
+    interface=$1
+    interface_type=$2
+    count=0
+
+    while true; do
+        if [ $interface_type = "inband" ]; then
+            ifconfig ${interface} | grep 'RUNNING' &>/dev/null
+            if [ $? -eq 0 ]; then
+                info_message "${interface} is up and running"
+                break
+            fi
+        elif [ $interface_type = "inband-tagged" ]; then
+            while true; do
+                ifconfig ${interface} | grep 'RUNNING' &>/dev/null
+                if [ $? -eq 0 ]; then
+                    ip=$(ifconfig $interface | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
+                    if [ ! -z "$ip" ]; then
+                        info_message "${interface} is up and running with valid IP address"
+                        return 0
+                    else
+                        info_message "Inband interface ${interface} is not up, continuously retrying for DHCP IP assignment"
+                        info_message "Inband interface ${interface} is not up with valid IP hence not starting openolt service"
+                        sleep 10
+                        continue
+                    fi
+                fi
+            done
+        fi
+    done
+}
+
+#------------------------------------------------------------------------------
+# Function Name: stop_olt_services
+# Description:
+#    This function informs about inband interface error status and stops device management service.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+stop_olt_services()
+{
+    error_message "Inband tagged interface $1 is not up with valid IP address"
+    info_message "Not starting openolt service and stopping device menagement service"
+    service dev_mgmt_daemon stop
+    exit 1
+}
+
+#------------------------------------------------------------------------------
+# Function Name: start_openolt_service
+# Description:
+#    This function checks whether inband interfaces are up with IP address, then
+#    appends inband interface name to a file which later will be used by openolt
+#    service as command line option then starts openolt service.
+#    Openolt service enables all PON and NNI interfaces and creates respective PON
+#    and NNI schedulers and Queues.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+start_openolt_service()
+{
+    info_message "Starting openolt service"
+    local interface_type="inband-tagged"
+
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        check_interface_is_up eth2.${ASFVOLT16_VLAN_ID_ETH2} $interface_type
+        if [ $? -ne 0 ]; then stop_olt_services eth2.${ASFVOLT16_VLAN_ID_ETH2}; fi
+        openolt_grpc_interface=eth2.${ASFVOLT16_VLAN_ID_ETH2}
+    else
+        check_interface_is_up eth1.${ASGVOLT64_VLAN_ID_ETH1} $interface_type
+        if [ $? -ne 0 ]; then stop_olt_services eth1.${ASGVOLT64_VLAN_ID_ETH1}; fi
+        openolt_grpc_interface=eth1.${ASGVOLT64_VLAN_ID_ETH1}
+    fi
+
+    # Inband interface name appended to this file. Interface name will be
+    # used as command line argument by openolt service while running the binary.
+    if [ -f "$OPENOLT_ARG_INPUT_FILE" ]; then
+        info_message "$OPENOLT_ARG_INPUT_FILE exist"
+        echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
+    else
+        info_message "$OPENOLT_ARG_INPUT_FILE does not exist, creating it"
+        touch $OPENOLT_ARG_INPUT_FILE
+        echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
+    fi
+
+    service openolt start
+    service openolt status
+    if [ $? -eq 0 ]; then
+        info_message "${OPENOLT} service is running"
+    else
+        error_message "${OPENOLT} is not running"
+        exit 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: start_olt_services
+# Description:
+#    This function triggers services to create vlan interfaces, to run BAL services
+#    and to trigger DHCP requets on eth2.VLAN_ID_1 and eth3.VLAN_ID_2 interfaces.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+start_olt_services() {
+    start_dev_mgmt_service
+    create_vlan_tagged_Iface
+    setup_dhcpd_configuration
+    setup_nw_configuration
+    start_openolt_service
+}
+
+#------------------------------------------------------------------------------
+# Function Name: copy_config_files
+# Description:
+#    This function copy config files to /broadcom directory
+#
+# Globals:
+#     BRCM_DIR
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+copy_config_files() {
+    info_message "copying config files to ${BRCM_DIR}"
+    # if [ "${OLT_MODEL}" != ${ASF16_MODEL} ]; then
+    #     [ -f /qax.soc ] && cp "/qax.soc" "${BRCM_DIR}/"
+    # fi
+    # [ -f /config.bcm ] && cp "/config.bcm" "${BRCM_DIR}/"
+    [ -f /vlan.config ] && cp "/vlan.config" "${BRCM_DIR}/"
+}
+
+# Execution starts from here
+does_logger_exist
+if [ $? -eq 0 ]; then
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        # check if debian package is already installed.
+        dpkg -l | grep ${ASFVOLT16}
+        if [ $? -ne 0 ]; then
+            # installs openolt debian package for asfvolt16 model
+            dpkg -i ${BAL_OPENOLT_DEB_16}
+        fi
+    else
+        dpkg -l | grep ${ASGVOLT64}
+        if [ $? -ne 0 ]; then
+            # installs openolt debian package for asgvolt64 model
+            dpkg -i ${BAL_OPENOLT_DEB_64}
+        fi
+    fi
+    copy_config_files
+    start_olt_services
+else
+    error_message "logger does not exist"
+    exit 1
+fi
diff --git a/agent/inband/scripts/validate_onl_installation.sh b/agent/inband/scripts/validate_onl_installation.sh
new file mode 100644
index 0000000..8cbccbc
--- /dev/null
+++ b/agent/inband/scripts/validate_onl_installation.sh
@@ -0,0 +1,338 @@
+#!/bin/bash
+
+#Copyright 2018-present Open Networking Foundation
+#
+#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.
+
+### BEGIN INIT INFO
+# Provides:          validate_onl_installation.sh
+# Required-Start:    $all
+# Required-Stop:     $network $local_fs $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: This script validates ONL installation by checking if expected interfaces and
+#                    services are UP and RUNNING.
+# Description:
+#                    Following are the interafces and services considered for validation:
+#                    1. Based on the device type(asfvolt16/asgvolt64) this script validates whether
+#                       eth2.<VLAN_ID>/eth1.<VLAN_ID> is up and running
+#                    3. Validate system services
+#                       a. openolt driver
+#                       b. dev_mgmt_daemon
+#                       c. onlp
+#                       d. sshd
+#                       e. dhclient
+#                       returns the current status if service is up or not.
+### END INIT INFO
+
+#------------------------------------------------------------------------------
+# GLOBAL VARIABLES
+#------------------------------------------------------------------------------
+
+# Time interval in seconds to execute each function call for validation.
+TIME_INTERVAL=2
+
+# Total time required to validate all services.
+TOTAL_VALIDATION_TIME=20
+
+# Root path where required bal directories are located
+BRCM_DIR='/broadcom'
+
+# Path to vlan config file
+VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
+
+# vlan id for asfvolt16
+ASFVOLT16_VLAN_ID_ETH2=
+
+# vlan id for asgvolt64
+ASGVOLT64_VLAN_ID_ETH1=
+
+OLT_MODEL=$(cat /sys/devices/virtual/dmi/id/board_name)
+ASF16_MODEL="ASXvOLT16"
+# interfaces
+ETH1=eth1
+ETH2=eth2
+
+#------------------------------------------------------------------------------
+# Function Name: does_logger_exist
+# Description:
+#    This function check if logger exist and executable.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    returns 0 if exist and executable else 1
+#------------------------------------------------------------------------------
+does_logger_exist()
+{
+cmd=/usr/bin/logger
+if [ -x ${cmd} ]; then
+     return 0
+   else
+     return 1
+   fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: info_message
+# Description:
+#    This function print the info message information to the console
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    string message
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+info_message()
+{
+    echo "INFO: $1"
+    logger -p user.info "$1"
+}
+
+#------------------------------------------------------------------------------
+# Function Name: error_message
+# Description:
+#    This function print the error message information to the console
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    string message
+#
+# Returns:
+#    returns 1
+#------------------------------------------------------------------------------
+error_message()
+{
+    echo "ERROR: $1"
+    logger -p user.err "$1"
+    return 1
+}
+
+#------------------------------------------------------------------------------
+# Function Name: is_interface_up_running
+# Description:
+#    This function validate the interface whether it is UP and RUNNING or DOWN.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    interface name
+#
+# Returns:
+#    returns 0 if interface is up and running and returns 1 if interface is down
+#------------------------------------------------------------------------------
+is_interface_up_running()
+{
+    info_message "Validating interface - $1"
+    interface_name=$1
+    ifconfig ${interface_name} | grep -q "UP BROADCAST RUNNING MULTICAST"
+    if [ $? -eq 0 ]; then
+        info_message "${interface_name} UP & RUNNING"
+        echo "---------------------------------------------------------------------"
+        return 0
+    else
+        error_message "${interface_name} is DOWN"
+        echo "---------------------------------------------------------------------"
+        return 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name : validate_interfaces
+# Description:
+#    This function validate interfaces ${ETH2}.${ASFVOLT16_VLAN_ID_ETH2} and
+#    ${ETH3}.${ASFVOLT16_VLAN_ID_ETH3} or ${ETH1}.${ASGVOLT64_VLAN_ID_ETH1} and
+#    ${ETH2}.${ASGVOLT64_VLAN_ID_ETH2} based on OLT model.
+#    Basically it validates if these interfaces are UP and RUNNING or not
+#
+# Globals:
+#    ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3, ASGVOLT64_VLAN_ID_ETH1,
+#    ASGVOLT64_VLAN_ID_ETH2, ETH1, ETH2, ETH3
+#
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    return 1 if interface are down else returns 0
+#------------------------------------------------------------------------------
+validate_interfaces()
+{
+    # Validating interfaces whether they are UP and RUNNING or not
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+        is_interface_up_running ${ETH2}.${ASFVOLT16_VLAN_ID_ETH2}
+        if [ $? -eq 0 ]; then
+            return 0
+        else
+            return 1
+        fi
+    else
+       is_interface_up_running ${ETH1}.${ASGVOLT64_VLAN_ID_ETH1}
+       if [ $? -eq 0 ]; then
+           return 0
+       else
+           return 1
+       fi
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: validate_system_services
+# Description:
+#    This function checks if the below services/processes are running or not.
+#    1. dev_mgmt_daemon
+#    2. openolt
+#    3. onlp
+#    4. sshd
+#    5. dhclient
+# Globals:
+#    ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3, ASGVOLT64_VLAN_ID_ETH1,
+#    ASGVOLT64_VLAN_ID_ETH2, ETH1, ETH2, ETH3
+#
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    returns 0
+#------------------------------------------------------------------------------
+validate_system_services()
+{
+    echo "---------------------------------------------------------------------"
+    echo "Validating Services"
+    echo "---------------------------------------------------------------------"
+
+    dhclient_interface dhclient_val1
+    for service_name in dev_mgmt_daemon openolt onlpd ssh ${dhclient_val1}
+    do
+        echo "---------------------------------------------------------------------"
+        ps -ef | grep -v grep | grep ${service_name}
+        #service ${service_name} status
+        if [ $? -eq 0 ]; then
+          info_message "${service_name} service is running"
+        else
+          error_message "${service_name} is not running"
+          return 1
+        fi
+        echo "---------------------------------------------------------------------"
+    done
+    return 0
+}
+
+#------------------------------------------------------------------------------
+# Function Name: dhclient_interface
+# Description:
+#    This function sets values to which tagged interface dhclient service need
+#    to be tested based on the OLT model package.
+#
+# Globals:
+#    ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16
+#    ASGVOLT64_VLAN_ID_ETH1, ETH1, ETH2
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+dhclient_interface()
+{
+    local value1=$1
+    if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+       dhclient1=dhclient.${ETH2}.${ASFVOLT16_VLAN_ID_ETH2}
+       eval $value1="'$dhclient1'"
+    else
+       dhclient2=dhclient.${ETH1}.${ASGVOLT64_VLAN_ID_ETH1}
+       eval $value1="'$dhclient2'"
+    fi
+
+}
+
+#------------------------------------------------------------------------------
+# Function Name: check_services
+# Description:
+#    This function checks if the expected services like onlp, sshd, dev_mgmt_daemon, dhclient
+#    and also checks that physical and vlan interfaces are up.
+#    This script times out and returns an error code of 1 if all vaildations don't turn out to be successful
+#    in counter a number is equal to 20
+#
+# Globals:
+#     VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1,
+#     TIME_INTERVAL, ASFVOLT16
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+check_services()
+{
+    if [ -f ${VLAN_CONFIG_FILE} ]; then
+        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+        if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+            if [ ${ASFVOLT16_VLAN_ID_ETH2} -gt 4094 ] || [ ${ASFVOLT16_VLAN_ID_ETH2} -lt 1 ]; then
+                error_message "vlan ids not in range"
+                exit 1
+            fi
+        else
+            if [ ${ASGVOLT64_VLAN_ID_ETH1} -gt 4094 ] || [ ${ASGVOLT64_VLAN_ID_ETH1} -lt 1 ]; then
+                error_message "vlan ids not in range"
+                exit 1
+           fi
+       fi
+    else
+        error_message "${VLAN_CONFIG_FILE} does not exist"
+        exit 1
+    fi
+    echo "*********************************************************************"
+    info_message "Validating ONL Installation"
+    echo "*********************************************************************"
+    for func_name in validate_interfaces validate_system_services
+    do
+        counter=0
+        while true; do
+            sleep ${TIME_INTERVAL}
+            $func_name
+            if [ $? -eq 0 ]; then
+                break
+            fi
+            if [ $counter -eq $TOTAL_VALIDATION_TIME ]; then
+                error_message "Time out ,vlan interfaces or all services may not be up"
+                return 1
+            fi
+            counter=$((counter+${TIME_INTERVAL}))
+        done
+    done
+    return 0
+}
+
+does_logger_exist
+if [ $? -eq 0 ]; then
+   check_services
+else
+   error_message "logger does not exist"
+   exit 1
+fi
