diff --git a/README.md b/README.md
index a6b3082..465d6aa 100644
--- a/README.md
+++ b/README.md
@@ -145,6 +145,18 @@
 * The two executables will remain open in the terminals, unless they are put
   in background.
 
+## Inband ONL Note
+
+* Inband ONL image built by packaging Openolt debian package and some startup
+  scripts. The startup scripts serve to enable inband channels, create inband
+  tagged interfaces, install Openolt debian package and run dev_mgmt_daemon
+  and Openolt services.
+* Startup script named "start_inband_oltservices.sh" will be executed in
+  background after ONL installation. Script execution could be watched in a
+  log file located in /var/log/startup.log.
+* Follow the procedure specified below in Build OpenOLT section to build
+  integrated Inband ONL image.
+
 ### Connect from VOLTHA
 
 At the VOLTHA CLI, preprovision and enable the OLT:
@@ -276,6 +288,27 @@
 If the build process succeeds, a `.deb` package will be created as well in the
 `openolt/agent/build` directory.
 
+Run make with inband option as specified below to build all-in-one ONL image
+packed with Openolt debian package and Inband OLT startup scripts(Scripts
+to enable Inband channel and start dev_mgmt_daemon and openolt services).
+This can take a while to complete the first time, since it builds
+ONL and the Broadcom SDKs. Following runs will be much faster, as they try to
+build OpenOLT agent source and Inband ONL with modified Openolt deb package.
+
+```shell
+make OPENOLTDEVICE=asfvolt16 INBAND=y VLAN_ID=<INBAND_VLAN>
+e.g:
+make OPENOLTDEVICE=asfvolt16 INBAND=y VLAN_ID=5
+```
+
+If no VLAN_ID is specified in above command it defaults to 4093.
+
+Note that the required INBAND ONL version `4.14` is built as part of the above
+build procedure and is available at path
+`build/onl/OpenNetworkLinux/RELEASE/jessie/amd64/ONL-onl-4.14_ONL-OS8_2020-04-22.
+2206-b4af32e_AMD64_INSTALLED_INSTALLER\.
+This ONL Installer should be used to flash the OS on the OLT.
+
 NOTE: To compile for ASGvOLT 64 port GPON OLT, set `OPENOLTDEVICE` to
 `asgvolt64` during build procedure like below.
 
diff --git a/VERSION b/VERSION
index 35cee72..79a6144 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.4.3
+2.4.4
diff --git a/agent/Makefile.in b/agent/Makefile.in
index 6068c4e..3cbe94d 100644
--- a/agent/Makefile.in
+++ b/agent/Makefile.in
@@ -44,6 +44,10 @@
 # openolt.proto and tech_profile.proto
 OPENOLT_PROTO_VER ?= v3.3.4
 
+# Variables used for Inband build
+INBAND = "n"
+VLAN_ID = 4093
+
 #
 # Build directory
 BUILD_DIR = build
@@ -143,7 +147,11 @@
 		git clone https://github.com/opencomputeproject/OpenNetworkLinux.git $(ONL_DIR)/OpenNetworkLinux; \
 		cp download/Makefile.onl $(ONL_DIR)/Makefile; \
 		install -m 755 download/build-onl.sh $(ONL_DIR)/OpenNetworkLinux; \
-		make -C $(ONL_DIR) onl-$(ONL_KERN_VER_MAJOR); \
+		make -C $(ONL_DIR) onl-$(ONL_KERN_VER_MAJOR) INBAND=n; \
+	else \
+		if [ "$(INBAND)" = n -a "$$(grep "inband" $(ONL_DIR)/onl_build.mode | cut -d= -f 2)" = y ]; then \
+			make -C $(ONL_DIR) onl-$(ONL_KERN_VER_MAJOR) INBAND=n; \
+		fi; \
 	fi;
 onl-force:
 	make -C $(ONL_DIR) $(OPENOLTDEVICE)-$(ONL_KERN_VER_MAJOR)
@@ -294,6 +302,13 @@
 	ln -sf $(LIBGRPC_PATH)/libgrpc++.so.1 $(BUILD_DIR)/libgrpc++.so.1
 	ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 $(BUILD_DIR)/libstdc++.so.6
 	strip $(BUILD_DIR)/openolt
+	echo "inband=n" > $(ONL_DIR)/onl_build.mode
+	if [ $(INBAND) = y ]; then \
+	    echo "Building ONL+BAL+OpenoltAgent allinone image"; \
+	    make deb; \
+	    make inband-onl; \
+	fi;
+
 src/%.o: src/%.cc
 	$(CXX) $(CXXFLAGS) $(CXXFLAGSDEVICE) $(CPPFLAGS) -I./common -c $< -o $@
 
@@ -309,6 +324,40 @@
 	mv device/$(OPENOLTDEVICE)/*.deb $(BUILD_DIR)/openolt_$(OPENOLTDEVICE)-$(VERSION)-$(LABEL_VCS_REF).deb
 	make deb-cleanup
 
+inband-onl:
+	# Clean previous ONL build and build freshly
+	sudo rm -rf $(ONL_DIR)
+	mkdir -p $(ONL_DIR)
+	git clone https://github.com/opencomputeproject/OpenNetworkLinux.git $(ONL_DIR)/OpenNetworkLinux
+	cp download/Makefile.onl $(ONL_DIR)/Makefile
+	install -m 755 download/build-onl.sh $(ONL_DIR)/OpenNetworkLinux
+
+	# Check ONL commit equals to Inband patch commit
+	ONL_COMMIT_ID=$(awk \'/COMMIT_ID = /{print $0}\' $(ONL_DIR)/Makefile | awk -F \"=\" \'{print $2}\')
+	INBAND_PATCH_COMMIT_ID=$(echo cp $(TOP_DIR)/inband/patch/*.patch | cut -d- -f 2 | cut -d. -f 1)
+	if [ "$(ONL_COMMIT_ID)" = "$(INBAND_PATCH_COMMIT_ID)" ]; then \
+	    echo "ONL commit and inband patch commit matched."; \
+	    cp $(TOP_DIR)/inband/patch/*.patch $(ONL_DIR)/OpenNetworkLinux; \
+	else \
+	    echo "ONL commit and inband patch commit does not match. Exiting."; \
+	    exit 1; \
+	fi;
+
+	# Update vlan.config file with VLAN ID argument passed
+	sed -i 's/asfvolt16_vlan_id_eth2=.*/asfvolt16_vlan_id_eth2=$(VLAN_ID)/' $(TOP_DIR)/inband/config/vlan.config
+	sed -i 's/asgvolt64_vlan_id_eth1=.*/asgvolt64_vlan_id_eth1=$(VLAN_ID)/' $(TOP_DIR)/inband/config/vlan.config
+
+	# Copy Inband config files and olt startup scripts to ONL source code and build
+	cd $(TOP_DIR)  && mkdir -p $(ONL_DIR)/OpenNetworkLinux/bal_packages
+	cp $(TOP_DIR)/inband/scripts/* $(ONL_DIR)/OpenNetworkLinux/bal_packages
+	cp $(TOP_DIR)/inband/config/vlan.config $(ONL_DIR)/OpenNetworkLinux/bal_packages
+	cp $(BUILD_DIR)/openolt_$(OPENOLTDEVICE)-$(VERSION)-$(LABEL_VCS_REF).deb $(ONL_DIR)/OpenNetworkLinux/bal_packages/openolt_$(OPENOLTDEVICE).deb
+
+	# Rebuild ONL packed with already built BAL+Openolt debian package
+	make -C $(ONL_DIR) onl-$(ONL_KERN_VER_MAJOR) INBAND=y
+	echo "inband=y" > $(ONL_DIR)/onl_build.mode
+	make inband-onl-cleanup
+
 src/%.o: %.cpp
 	$(CXX) -MMD -c $< -o $@
 
@@ -329,6 +378,10 @@
 	@rm -rf device/$(OPENOLTDEVICE)/mkdebian/debian/tmp/
 	@rm -f device/$(OPENOLTDEVICE)/$(OPENOLTDEVICE)_$(BAL_VER)+edgecore-V$(DEV_VER)_amd64.changes
 
+inband-onl-cleanup:
+	@rm -f $(ONL_DIR)/OpenNetworkLinux/*.patch
+	@rm -rf $(ONL_DIR)/OpenNetworkLinux/bal_packages
+
 clean: protos-clean deb-cleanup
 	@rm -f $(OBJS) $(DEPS)
 	@rm -rf $(OPENOLT_PROTOS_DIR)/googleapis
@@ -345,4 +398,4 @@
 distclean: clean-src clean
 	@rm -rf $(BUILD_DIR)
 
-.PHONY: onl sdk bal protos prereqs-system prereqs-local sim .FORCE
+.PHONY: onl sdk bal protos prereqs-system prereqs-local sim inband-onl .FORCE
diff --git a/agent/download/Makefile.onl b/agent/download/Makefile.onl
index b99f354..9f87264 100644
--- a/agent/download/Makefile.onl
+++ b/agent/download/Makefile.onl
@@ -13,6 +13,11 @@
 # limitations under the License.
 
 COMMIT_ID = 72b95a7
+INBAND = "n"
 
 onl-4.14:
-	cd OpenNetworkLinux && git checkout -b $@ $(COMMIT_ID) && docker/tools/onlbuilder --non-interactive -8 -c ./build-onl.sh
+	if [ $(INBAND) = y ]; then \
+	    cd OpenNetworkLinux && git checkout -B $@ $(COMMIT_ID) && git apply inband-$(COMMIT_ID).patch && docker/tools/onlbuilder --non-interactive -8 -c ./build-onl.sh; \
+	else \
+	    cd OpenNetworkLinux && git stash && git checkout -B $@ $(COMMIT_ID) && docker/tools/onlbuilder --non-interactive -8 -c ./build-onl.sh; \
+	fi;
diff --git a/agent/inband/config/vlan.config b/agent/inband/config/vlan.config
new file mode 100644
index 0000000..e0dd6c2
--- /dev/null
+++ b/agent/inband/config/vlan.config
@@ -0,0 +1,10 @@
+### BEGIN INIT INFO
+# Description: This file utilized by olt inband init script and onl validation script to
+#              know what VLAN configured by the user for inband CTRL and MGMT interface
+### END INIT INFO
+
+#asfvolt16
+asfvolt16_vlan_id_eth2=4093
+
+#asgvolt64
+asgvolt64_vlan_id_eth1=4093
diff --git a/agent/inband/patch/inband-72b95a7.patch b/agent/inband/patch/inband-72b95a7.patch
new file mode 100644
index 0000000..529bbf4
--- /dev/null
+++ b/agent/inband/patch/inband-72b95a7.patch
@@ -0,0 +1,94 @@
+diff --git a/builds/any/rootfs/jessie/common/all-base-packages.yml b/builds/any/rootfs/jessie/common/all-base-packages.yml
+index bbeab6b4..ca5a45cd 100644
+--- a/builds/any/rootfs/jessie/common/all-base-packages.yml
++++ b/builds/any/rootfs/jessie/common/all-base-packages.yml
+@@ -81,3 +81,7 @@
+ - sysstat
+ - ipmitool
+ - lm-sensors
++- python3.4
++- python3-yaml
++- cron
++- logrotate
+diff --git a/packages/base/all/initrds/loader-initrd-files/src/bin/swiprep b/packages/base/all/initrds/loader-initrd-files/src/bin/swiprep
+index d5a72f8e..0b0583e1 100755
+--- a/packages/base/all/initrds/loader-initrd-files/src/bin/swiprep
++++ b/packages/base/all/initrds/loader-initrd-files/src/bin/swiprep
+@@ -173,7 +173,46 @@ if test "$mode_install"; then
+     echo "*** invalid squashfs contents" 1>&2
+     exit 1
+   fi
++  cp "$swipath" "$workdir"/
++  cd "$workdir"
++  unzip "$swipath"
++  target=$(find . -name bal_packages)
++  for f in "$target"/*
++  do
++     main_file_name=$(basename $f)
++     full_path_name=$(echo $f | cut -c 3-)
++     cp $full_path_name "$workdir"/$main_file_name
++  done
++  echo "Moving validation script to /root/"
++  mv  "$workdir"/validate_onl_installation.sh "$destdir"/root/
++  mv  "$workdir"/fetch_olt_sw_hw_details.py "$destdir"/root/
++  mv  "$workdir"/openolt* "$destdir"/
++  echo "INFO: Copying init scripts to init.d"
++  cp  "$workdir"/start_inband_oltservices.sh "$destdir"/etc/init.d/
++  cp "$workdir"/vlan.config "$destdir"/
++  cd -
+ fi
++cat > "$destdir"/etc/rc.local  <<- EOF
++#!/bin/sh -e
++#
++# rc.local
++#
++# This script is executed at the end of each multiuser runlevel.
++# Make sure that the script will "exit 0" on success or any other
++# value on error.
++#
++# In order to enable or disable this script just change the execution
++# bits.
++#
++# By default this script does nothing.
++
++chmod 0777 /etc/init.d/start_inband_oltservices.sh
++chmod 0777 /root/validate_onl_installation.sh
++nohup sh /etc/init.d/start_inband_oltservices.sh > /var/log/startup.log &
++exit 0
++
++EOF
++
+ if test "$mode_overlay"; then
+   # keep the squashfs file around
+   mv $workdir/rootfs.sqsh /tmp/.rootfs
+diff --git a/tools/switool.py b/tools/switool.py
+index 26eb2fb1..6c783c3d 100755
+--- a/tools/switool.py
++++ b/tools/switool.py
+@@ -79,6 +79,26 @@ if ops.create or ops.overwrite:
+     swi = OnlSwitchImage(ops.swi, 'w')
+     swi.add_rootfs(ops.rootfs)
+     swi.add_manifest(ops.manifest)
++
++    try:
++       bal_files = []
++       onl_path = os.environ.get("ONL")
++       bal_package_path=onl_path+"/bal_packages"
++       cwd = os.getcwd()
++       if os.path.isdir(bal_package_path):
++           os.chdir(bal_package_path)
++           for root, dirs, files in os.walk(bal_package_path):
++               for file_name in files:
++                   file_real_path = os.path.realpath(file_name)
++                   bal_files.append(file_real_path)
++
++       os.chdir(cwd)
++       for f_name in bal_files:
++           print("INFO: File Name - ", f_name)
++           swi.add(f_name)
++    except KeyError:
++       print("Not exist environment value for %s" % "key_maybe_not_exist")
++
+     for f in ops.add_files:
+         swi.add(f, arcname=f)
+ 
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
