According to the datasheet, the ATMega168 can only execute self-programming instructions when running code from the bootloader block.

Once the bootloader is complete and the application starts, can the application then jump back into a subroutine in the bootloader block and have it write to the flash?

Or, is it the case that once the program leaves the boot block it's not allowed to self-program again until after a reset?