diff --git a/olt-sw-upgrade/install_onl.sh b/olt-sw-upgrade/install_onl.sh
new file mode 100755
index 0000000..69d9863
--- /dev/null
+++ b/olt-sw-upgrade/install_onl.sh
@@ -0,0 +1,554 @@
+#!/bin/bash
+
+#Copyright 2020-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
+# Description:
+#             Upgrade the NOS from Active to Standby partition, 
+#             This script checks if installed ONL on OLT has active and standby partions
+#             if yes, it extracts the ONL package and keep the
+#             required files to the Standby partition and start the NOS from Standby partition.
+#
+### END INIT INFO
+
+
+WORKING_DIR=$(pwd)
+# Name of the script
+SCRIPT_NAME="$(basename ${0})"
+UPGRADE=
+ONL_FILE=${1}
+ONL_ROOT="/mnt/onl"
+ACTIVE_BOOTDIR="${ONL_ROOT}/active_boot/"
+STANDBY_BOOTDIR="${ONL_ROOT}/standby_boot/"
+
+# Partition labels
+ONL_ACTIVE_BOOT="ONL-ACTIVE-BOOT"
+ONL_ACTIVE_DATA="ONL-ACTIVE-DATA"
+ONL_STANDBY_BOOT="ONL-STANDBY-BOOT"
+ONL_STANDBY_DATA="ONL-STANDBY-DATA"
+ONL_CONFIG="ONL-CONFIG"
+ONL_IMAGES="ONL-IMAGES"
+
+# Mount paths
+CONFIG="${ONL_ROOT}/config"
+IMAGES="${ONL_ROOT}/images"
+ACTIVE_DATA="${ONL_ROOT}/active_data"
+ACTIVE_BOOT="${ONL_ROOT}/active_boot"
+STANDBY_DATA="${ONL_ROOT}/standby_data"
+STANDBY_BOOT="${ONL_ROOT}/standby_boot"
+GRUB="grub"
+ONL_SOURCE="onl_source"
+
+ACTIVE_DATA_DEV_NAME=
+ACTIVE_DATA_MNT_PATH=
+ACTIVE_BOOT_DEV_NAME=
+ACTIVE_BOOT_MNT_PATH=
+STANDBY_DATA_DEV_NAME=
+STANDBY_DATA_MNT_PATH=
+STANDBY_BOOT_DEV_NAME=
+STANDBY_BOOT_MNT_PATH=
+
+# Configuration file about upgrade
+IMAGES="${ONL_ROOT}/images"
+ACTIVE_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
+STANDBY_GRUB_ENV_FILE="${ONL_ROOT}/active_boot/grub/grubenv"
+GRUB_CONFIG_FILE="${ONL_ROOT}/config/grub.cfg"
+GRUB_CONFIG_FILE_CHANGED="${ONL_ROOT}/config/grub.cfg.changed"
+ASF_VOLT16_VOLTHA_BAL=$(ls /*asfvolt16*.tar.gz 2>/dev/null)
+BROADCOM="/broadcom"
+OPT="/opt/bcm68620"
+DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
+OPENOLT="openolt"
+#------------------------------------------------------------------------------
+# Function : usage
+#
+# Description: 
+#    This function says how to use the script
+#                                                                               
+# Globals:                                                                 
+#    SCRIPT_NAME
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                 
+#    None        
+#------------------------------------------------------------------------------
+
+usage()
+{
+    echo "${SCRIPT_NAME}:usage:
+        ${SCRIPT_NAME} <ONL_IMAGE_WITH_ABSOLUTE_PATH>
+    "
+    exit 1
+}
+
+#------------------------------------------------------------------------------
+# 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: clean_up 
+#
+# Description: 
+#    This function delete the existing image in the standby boot partition. 
+#    In order to copy the the new image. also delete the onl source in the 
+#    working directory if it is there.
+#
+# Globals:                                                                 
+#    WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, ACTIVE_DATA_MNT_PATh
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                 
+#    None        
+#------------------------------------------------------------------------------
+clean_up()
+{
+     info_message "Deleting onl source"
+     rm -rf ${WORKING_DIR}/${ONL_SOURCE}
+     info_message "Deleting kernel and initrd files"
+     rm -rf ${STANDBY_BOOT_MNT_PATH}/kernel-*
+     rm -rf ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-*
+     echo "INFO: Deleting configuration files"
+     rm -rf /etc/onl/*
+     rm -rf /lib/vendor-config/
+     info_message "Deleting standby rootfs"
+     rm -rf ${STANDBY_DATA_MNT_PATH}/*
+}
+
+#------------------------------------------------------------------------------
+# Function: update_grub_cfg_for_temp_reboot
+#
+# Description: 
+#    This function updates the grub.cfg file in order to achieve the temporary 
+#    reboot. by making standby entry in the temporary reboot. once temporary 
+#    reboot happens successfully grub.cfg file will have only active entry.
+#                                                                               
+# Globals:                                                                 
+#    GRUB_CONFIG_FILE_CHANGED, ACTIVE_KERNEL_NAME, STANDBY_KERNEL_NAME
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                 
+#    None        
+#------------------------------------------------------------------------------
+update_grub_cfg_for_temp_reboot()
+{
+     cat > ${GRUB_CONFIG_FILE_CHANGED} <<- EOF
+serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
+terminal_input serial
+terminal_output serial
+set timeout=5
+
+# Always boot the saved_entry value
+load_env
+if [ \$saved_entry ] ; then
+   set default=\$saved_entry
+fi
+
+menuentry "Open Network Linux" {
+  search --no-floppy --label --set=root ONL-ACTIVE-BOOT
+  # Always return to this entry by default.
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading Open Network Linux ...'
+  insmod gzio
+  insmod part_msdos
+  linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
+  initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+menuentry "Open Network Linux Standby" {
+  search --no-floppy --label --set=root ONL-STANDBY-BOOT
+  # Always return to this entry by default.
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading Open Network Linux Standby...'
+  insmod gzio
+  insmod part_msdos
+  linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
+  initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+# Menu entry to chainload ONIE
+menuentry ONIE {
+  search --no-floppy --label --set=root ONIE-BOOT
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading ONIE ...'
+  chainloader +1
+}
+
+
+EOF
+}
+
+#------------------------------------------------------------------------------
+# Function: revert_grub_cfg 
+#
+# Description: 
+#    This function revert the original grub.cfg file which was affected
+#    by temporary reboot.
+#                                                                               
+# Globals:                                                                 
+#    GRUB_CONFIG_FILE, ACTIVE_KERNEL_NAME
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                 
+#    None        
+#------------------------------------------------------------------------------
+revert_grub_cfg()
+{
+     cat > ${GRUB_CONFIG_FILE}  <<- EOF
+serial --port=0x3f8 --speed=115200 --word=8 --parity=no --stop=1
+terminal_input serial
+terminal_output serial
+set timeout=5
+
+# Always boot the saved_entry value
+load_env
+if [ \$saved_entry ] ; then
+   set default=\$saved_entry
+fi
+
+menuentry "Open Network Linux" {
+  search --no-floppy --label --set=root ONL-ACTIVE-BOOT
+  # Always return to this entry by default.
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading Open Network Linux ...'
+  insmod gzio
+  insmod part_msdos
+  linux /${ACTIVE_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-active
+  initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+menuentry "Open Network Linux Standby" {
+  search --no-floppy --label --set=root ONL-STANDBY-BOOT
+  # Always return to this entry by default.
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading Open Network Linux Standby...'
+  insmod gzio
+  insmod part_msdos
+  linux /${STANDBY_KERNEL_NAME} nopat console=ttyS0,115200n8 tg3.short_preamble=1 tg3.bcm5718s_reset=1 intel_iommu=off onl_platform=x86-64-accton-asxvolt16-r0 data-standby
+  initrd /x86-64-accton-asxvolt16-r0.cpio.gz
+}
+
+# Menu entry to chainload ONIE
+menuentry ONIE {
+  search --no-floppy --label --set=root ONIE-BOOT
+  set saved_entry="0"
+  save_env saved_entry
+  echo 'Loading ONIE ...'
+  chainloader +1
+}
+
+EOF
+}
+#------------------------------------------------------------------------------
+# Function: grub_reboot 
+#
+# Description: 
+#    This function gives a temporary reboot using grub-reboot command, this will 
+#    set the boot menu entry from active default one to Standby. Now OS will 
+#    boot up in Standby mode.
+#                                                                               
+# Globals:
+#    ACTIVE_BOOTDIR, STANDBY_BOOTDIR, GRUB_CONFIG_FILE_CHANGED, ACTIVE_BOOT
+#    GRUB
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                
+#    None        
+#------------------------------------------------------------------------------
+grub_reboot()
+{
+    if [ -f "${ACTIVE_BOOTDIR}/grub/grubenv" ]; then
+        saved_entry=$(grub-editenv  ${ACTIVE_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
+        if [ ${saved_entry} -eq 0 ]; then
+            grub-editenv ${ACTIVE_BOOTDIR}/grub/grubenv set saved_entry=1
+            sed  -i '/next_entry=/a\prev_saved_entry=1' ${ACTIVE_BOOTDIR}/grub/grubenv
+        fi
+    fi
+
+    if [ -f "${STANDBY_BOOTDIR}/grub/grubenv" ]; then
+        saved_entry=$(grub-editenv  ${STANDBY_BOOTDIR}/grub/grubenv list | sed -n 's/^saved_entry=//p')
+        if [ ${saved_entry} -eq 0 ]; then
+            grub-editenv ${STANDBY_BOOTDIR}/grub/grubenv set saved_entry=1
+            sed  -i '/next_entry=/a\prev_saved_entry=1' ${STANDBY_BOOTDIR}/grub/grubenv
+        fi
+    fi
+
+    if [ -f ${GRUB_CONFIG_FILE_CHANGED} ]; then
+        if [ -f "${ACTIVE_BOOT}/${GRUB}/grub.cfg" ]; then
+            cp ${GRUB_CONFIG_FILE_CHANGED} ${ACTIVE_BOOT}/${GRUB}/grub.cfg
+        fi
+        if [ -f "${STANDBY_BOOT}/${GRUB}/grub.cfg" ]; then
+            cp ${GRUB_CONFIG_FILE_CHANGED} ${STANDBY_BOOT}/${GRUB}/grub.cfg
+        fi
+    fi
+    grub-reboot --boot-directory=${ACTIVE_BOOTDIR} 1
+    reboot
+}
+
+#------------------------------------------------------------------------------
+# Function: install_onl
+#
+# Description: 
+#    This function copy the upgrade image.
+#
+# Globals:
+#    WORKING_DIR, ONL_SOURCE, STANDBY_BOOT_MNT_PATH, IMAGES, ACTIVE_BOOT_MNT_PATH 
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                
+#    None        
+#------------------------------------------------------------------------------
+install_onl()
+{
+    if [ -f ${ONL_FILE} ]; then
+        clean_up
+        mkdir ${WORKING_DIR}/${ONL_SOURCE}
+        cd ${WORKING_DIR}/${ONL_SOURCE}
+        chmod 777 ${ONL_FILE}
+        # Extract onl package
+        unzip ${ONL_FILE}
+        # Copy kernel files to standby boot partition
+        cp kernel-* ${STANDBY_BOOT_MNT_PATH}/
+        # Copy initrd file to standby boot partition
+        cp onl-loader-initrd-amd64.cpio.gz ${STANDBY_BOOT_MNT_PATH}/x86-64-accton-asxvolt16-r0.cpio.gz
+        # Create upgrade directory in the images partition to copy upgrade image
+        if [ -d ${IMAGES}/upgrade ]; then
+            rm -rf ${IMAGES}/upgrade
+        fi
+        info_message "Creating Upgrade Directory"
+        mkdir ${IMAGES}/upgrade
+        info_message "Copying SWI file to Upgrade Directory"
+        cp *.swi ${IMAGES}/upgrade
+
+        # Update the kernel version
+        STANDBY_KERNEL_NAME=$(ls ${STANDBY_BOOT_MNT_PATH} | grep kernel-4.14)
+        ACTIVE_KERNEL_NAME=$(ls ${ACTIVE_BOOT_MNT_PATH} | grep kernel-4.14 )
+        update_grub_cfg_for_temp_reboot
+        revert_grub_cfg
+    else
+        error_message "ONL file not found"
+        exit 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function: upgrade_onl 
+#
+# Description: 
+#    This function get the labels, and install the upgrade NOS.
+#
+# Globals       :
+#    ACTIVE_DATA_DEV_NAME, ACTIVE_BOOT_DEV_NAME, ACTIVE_BOOT_MNT_PATH, 
+#    STANDBY_DATA_DEV_NAME, STANDBY_BOOT_MNT_PATH 
+#                                                                               
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                
+#    None        
+#------------------------------------------------------------------------------
+upgrade_onl()
+{
+
+    ACTIVE_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-DATA\"" | awk '{print $1}' | sed 's/://')
+    echo "active data dev - $ACTIVE_DATA_DEV_NAME"
+    ACTIVE_DATA_MNT_PATH=$(mount | grep $ACTIVE_DATA_DEV_NAME | awk '{print $3}')
+    echo $"active data mnt - $ACTIVE_DATA_MNT_PATH"
+    ACTIVE_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-ACTIVE-BOOT\"" | awk '{print $1}' | sed 's/://')
+    echo "active boot dev $ACTIVE_BOOT_DEV_NAME"
+    ACTIVE_BOOT_MNT_PATH=$(mount | grep $ACTIVE_BOOT_DEV_NAME | awk '{print $3}')
+    echo "active boot mnt - $ACTIVE_BOOT_MNT_PATH"
+    STANDBY_DATA_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-DATA\"" | awk '{print $1}' | sed 's/://')
+    echo "standby data dev - $STANDBY_DATA_DEV_NAME"
+    STANDBY_DATA_MNT_PATH=$(mount | grep $STANDBY_DATA_DEV_NAME | awk '{print $3}')
+    echo "standby data mnt - $STANDBY_DATA_MNT_PATH"
+    STANDBY_BOOT_DEV_NAME=$(blkid | grep " LABEL=\"ONL-STANDBY-BOOT\"" | awk '{print $1}' | sed 's/://')
+    echo "standby boot dev - $STANDBY_BOOT_DEV_NAME"
+    STANDBY_BOOT_MNT_PATH=$(mount | grep $STANDBY_BOOT_DEV_NAME | awk '{print $3}')
+    echo "standby boot mnt -$STANDBY_BOOT_MNT_PATH"
+
+    install_onl
+    grub_reboot
+}
+
+#------------------------------------------------------------------------------
+# Function: command_result 
+#
+# Description: 
+#    This function executes the blkid command.
+#
+# Globals:
+#    None
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                
+#    None        
+#------------------------------------------------------------------------------
+command_result(){
+    blkid | grep $1 > /dev/null
+    if [ $? -eq 0 ]; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function: is_onl_running 
+#
+# Description: 
+#    This function check the running NOS and  also check the Upgrade is required 
+#    or not.
+#
+# Globals:
+#    ONL_ACTIVE_BOOT, ONL_ACTIVE_DATA, ONL_STANDBY_BOOT, ONL_STANDBY_DATA
+#    ONL_CONFIG, ONL_IMAGES, IMAGES, ACTIVE_DATA, ACTIVE_BOOT, STANDBY_DATA
+#    STANDBY_BOOT
+#
+# Arguments:                                                                 
+#    None                                                                       
+#                                                                               
+# Returns:                                                                
+#    None        
+#------------------------------------------------------------------------------
+is_onl_running()
+{
+    info_message "Check all directories exist or not"
+    if command_result "$ONL_ACTIVE_BOOT" && command_result "$ONL_ACTIVE_DATA" && command_result "$ONL_STANDBY_BOOT" && command_result "$ONL_STANDBY_DATA" && command_result "$ONL_CONFIG" && command_result "$ONL_IMAGES" ; then
+        if [ \( -d "$CONFIG" -a -d "$IMAGES" \) -a \( -d "$ACTIVE_DATA" -a -d "$ACTIVE_BOOT" \) -a \( -d "$STANDBY_DATA" -a -d "$STANDBY_BOOT" \) ]; then 
+            info_message "All directories exist. Need Upgrade"
+            UPGRADE=1
+        fi
+    else
+        info_message "It is new installation"
+        UPGRADE=0
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function: main 
+#
+# Description: 
+#    This is the main function. which decides fresh installation is required or 
+#    upgrade is required.
+#
+# Globals       :
+#    UPGRADE, ONL_FILE
+# Arguments     :                                                                 
+#    None                                                                       
+#                                                                               
+# Returns       :                                                                
+#    None        
+#------------------------------------------------------------------------------
+main()
+{
+    echo "INFO: Check if image upgrade or new installation"
+    is_onl_running
+    if [ $UPGRADE -eq 0 ]; then
+        error_message "ONL does not have active and stand by partitions \
+        install ONL image with active and standby partitions"
+        exit 1    
+    else
+        info_message "Upgrade started"
+        upgrade_onl
+    fi
+}
+
+# main function call
+does_logger_exist
+if [ $? -eq 0 ]; then
+    main
+else
+   error_message "logger does not exist"
+   exit 1
+fi
