The upgrade scripts goes in a tarball with local.conf at the top level. log.txt shows what happens when the package is installed. The script build.sh is used to create the binary update package used by mlinux-firmware-update. The tree is a follows: upgrade-4.0.0-4.0.1/ ├── install_list.txt ├── local.conf └── repo ├── arm926ejste │   ├── bluez5_5.47-m3.0_arm926ejste.ipk │   ├── bluez5-noinst-tools_5.47-m3.0_arm926ejste.ipk │   ├── bluez5-obex_5.47-m3.0_arm926ejste.ipk │   ├── bluez5-pand_5.47-m3.0_arm926ejste.ipk │   ├── bluez5-rfcomm_5.47-m3.0_arm926ejste.ipk │   ├── bluez5-testtools_5.47-m3.0_arm926ejste.ipk │   ├── libasound-module-bluez_5.47-m3.0_arm926ejste.ipk │   ├── libmts-io0_1.0.8-r0.0_arm926ejste.ipk │   ├── lora-network-server_2.0.19-r4.0_arm926ejste.ipk │   ├── Packages │   ├── Packages.gz │   ├── Packages.stamps │   └── python-pybluez_0.22-r0.0_arm926ejste.ipk ├── mtcap │   ├── mlinux-version_4.0.1_ea6ba1e5fb287003fea33522af39a771102713b2-r2.0_mtcap.ipk │   ├── mts-id-eeprom_0.3.8-r1.0.0_mtcap.ipk │   ├── Packages │   ├── Packages.gz │   └── Packages.stamps ├── mtcdt │   ├── mlinux-version_4.0.1_ea6ba1e5fb287003fea33522af39a771102713b2-r2.0_mtcdt.ipk │   ├── mts-id-eeprom_0.3.8-r1.0.0_mtcdt.ipk │   ├── Packages │   ├── Packages.gz │   └── Packages.stamps └── Packages If one puts the packages in a build tree at build/tmp/deploy/ipk, and run bitbake package-index, the Packages* files are refreshed. In this example, all MTCDT-like models as of today are supported. That is MTCDT, MTCDTIP, MTCDTIPHP, and MTCAP are supported in this update. install_list.txt would be a list of extra packages to install. We should probably have a remove_list.txt for cases where packages are obsolete.