diff --git a/lib/liblynq-fota/rock_ua/rock_ua.c b/lib/liblynq-fota/rock_ua/rock_ua.c
index 81cfe22..c970ce1 100755
--- a/lib/liblynq-fota/rock_ua/rock_ua.c
+++ b/lib/liblynq-fota/rock_ua/rock_ua.c
@@ -133,6 +133,7 @@
 #define FOTA_UCI_MODULE "lynq_fota"
 #define FOTA_UCI_FILE "lynq_uci"
 #define FOTA_UCI_ADDR "lynq_fota_addr"
+#define FOTA_UCI_STATE "lynq_fota_state"
 
 #define FILE_UPDATE_STATE  "/data/.update_status"
 #define FILE_UPDATE_FLAG   "/tmp/update_flag"
@@ -179,6 +180,13 @@
 #define DEV_MEDMCU_A        "/dev/disk/by-partlabel/medmcu_a"
 #define DEV_MEDMCU_B        "/dev/disk/by-partlabel/medmcu_b"
 
+#define DEV_OEMAPP_A        "/dev/disk/by-partlabel/oemapp_a"
+#define DEV_OEMAPP_B        "/dev/disk/by-partlabel/oemapp_b"
+
+#define DEV_OEMAPP2_A        "/dev/disk/by-partlabel/oemapp2_a"
+#define DEV_OEMAPP2_B        "/dev/disk/by-partlabel/oemapp2_b"
+
+
 #define DEV_MISC        "/dev/disk/by-partlabel/misc"
 
 #define BACKUP_UBI_NUM  31 //max ubi number
@@ -746,7 +754,8 @@
 
 
 
-static int rock_update_main(unsigned int rom_base,  unsigned int backup_base, unsigned int backup_len, int read_rom_directly, int first_run, int switch_slot_flag, int reboot_flag) {
+static int rock_update_main(unsigned int rom_base,  unsigned int backup_base, unsigned int backup_len, int read_rom_directly, int first_run, int switch_slot_flag, int 
+reboot_flag, int backup_mode) {
     int status,err,start,fd;
     int ret = 0;
     int i = 0;
@@ -844,11 +853,18 @@
 #endif 
 
     up_info.ota_run = 0;
-    if((up_info.fota_flag[0]=='A')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='B')){
-        update_mode = MODE_A2B;
-    }else if((up_info.fota_flag[0]=='B')&&(up_info.fota_flag[1]=='-')&&(up_info.fota_flag[2]=='A')){
-        update_mode = MODE_B2A;
-    }else{
+    if(backup_mode == 1)
+    {
+        if(current_slot == 0)
+        {
+            update_mode = MODE_A2B;
+        }else
+        {
+            update_mode = MODE_B2A;
+        }
+    }
+    else
+    {
         update_mode = MODE_NORMAL;
     }
     
@@ -1219,15 +1235,13 @@
     
 
 
-    if(update_mode == MODE_NORMAL){ //need A VS B
+    if(update_mode != MODE_NORMAL){ //need backup
         if(current_slot == SLOT_A) {
-
             up_info.fota_flag[0] = 'B';
             up_info.fota_flag[1] = '-';
             up_info.fota_flag[2] = 'A';
 
         }else{
-
             up_info.fota_flag[0] = 'A';
             up_info.fota_flag[1] = '-';
             up_info.fota_flag[2] = 'B';
@@ -1308,7 +1322,7 @@
 
 #endif 
     
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 1);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 1, 1);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret)
         {
@@ -1658,6 +1672,18 @@
             RLOGD("+[UA]: backup bl33_a fail\n");
             return 1;
         }
+        ret = backup_nand_copyto_nand(DEV_OEMAPP_B,DEV_OEMAPP_A);
+        if(ret != 0)
+        {
+            RLOGD("+[UA]: backup oemapp_a fail\n");
+            return 1;
+        }
+        ret = backup_nand_copyto_nand(DEV_OEMAPP2_B,DEV_OEMAPP2_A);
+        if(ret != 0)
+        {
+            RLOGD("+[UA]: backup oemapp2_a fail\n");
+            return 1;
+        }
     }
     else
     {
@@ -1717,12 +1743,55 @@
             RLOGD("+[UA]: backup bl33_a fail\n");
             return 1;
         }
+        ret = backup_nand_copyto_nand(DEV_OEMAPP_A,DEV_OEMAPP_B);
+        if(ret != 0)
+        {
+            RLOGD("+[UA]: backup oemapp_b fail\n");
+            return 1;
+        }
+        ret = backup_nand_copyto_nand(DEV_OEMAPP2_A,DEV_OEMAPP2_B);
+        if(ret != 0)
+        {
+            RLOGD("+[UA]: backup oemapp2_b fail\n");
+            return 1;
+        }
     }
     RLOGD("+[UA]: lynq_backup_main success \n");
     return 0;
 }
 //xf.li@20230822 add for ab rollback end
 
+
+int lynq_check_oemapp(char* name)
+{
+    FILE *fp;
+    char check_result[64];
+    if(strcmp(name, "oemapp") == 0)
+    {
+        RLOGD("lynq_check_oemapp oemapp");
+        if(system("df -lh|grep oemapp |grep -v oemapp2") != 0)
+        {
+            return 0;
+        }
+        else
+        {
+            return 1;
+        }
+    }
+    else if(strcmp(name, "oemapp2") == 0)
+    {
+        RLOGD("lynq_check_oemapp oemapp2");
+        if(system("df -lh|grep oemapp2") != 0)
+        {
+            return 0;
+        }
+        else
+        {
+            return 1;
+        }
+    }
+}
+
 //lt add @2021.9.23 for  deal with power down \ backup or upgrade.
 int lynq_fota_func(void) 
 {
@@ -1736,27 +1805,6 @@
     const hw_module_t* hw_module;
     //xf.li@20230822 add for ab backup end
     RLOGD("[+UP]: ******lynq_fota_func start******\n");
-    memset(&lynq_up_info, 0, sizeof(lynq_up_info));
-    fd = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
-    if (fd < 0)
-    {
-        return -1;
-    }
-    read(fd,(unsigned char *)&lynq_up_info,sizeof(lynq_up_info));
-    close(fd);
-
-    RLOGD("[+UP]: lynq_up_info.ota_run=%d\n",lynq_up_info.ota_run);
-    if(lynq_up_info.ota_run != 0)
-    { 
-        //Power off, call UA
-        RLOGD("[+UP]: ***Power off, call UA***\n");
-        ret = rock_update_main(0, 0, 0, 0, first_run, 1,0);
-        RLOGD("rock_update_main ret = %d\n", ret);
-        if(ret) 
-        {
-            RLOGD("fota update fail!\n");
-        }
-    }
     //xf.li@20230822 add for ab backup start
     //----------get current slot and whether other slot  is bootable
     hw_module = &HAL_MODULE_INFO_SYM;
@@ -1778,15 +1826,58 @@
     other_slot = (current_slot == 0) ? 1 : 0;
     is_other_slot_bootable = module->isSlotBootable(module, other_slot);
     //-----------end
-    RLOGD("current slot:%u, is_other_slot_bootable : %d, lynq_up_info.fota_flag[3] is %c\n",current_slot, is_other_slot_bootable, lynq_up_info.fota_flag[3]);
+    RLOGD("current slot:%u, is_other_slot_bootable : %d\n",current_slot, is_other_slot_bootable);
     //xf.li@20230822 add for ab backup end
 
+    memset(&lynq_up_info, 0, sizeof(lynq_up_info));
+    fd = open(FILE_UPDATE_STATE,O_RDWR | O_CREAT,0777);
+    if (fd < 0)
+    {
+        return -1;
+    }
+    read(fd,(unsigned char *)&lynq_up_info,sizeof(lynq_up_info));
+    close(fd);
+
+    RLOGD("[+UP]: lynq_up_info.ota_run=%d\n",lynq_up_info.ota_run);
+    if((lynq_check_oemapp("oemapp") == 0) || (lynq_check_oemapp("oemapp2") == 0))
+    {
+        RLOGD("ENTER LYNQ_CHECK_OEMAPP\n");
+        system("echo mode 001 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
+        system("echo dir 001 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
+        system("echo out 001 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
+        RLOGD("need setUnbootable.\n");
+        module->setSlotAsUnbootable(module,current_slot);
+        RLOGD("+[UA]: setSlotAsUnbootable!!!!\n");
+        sync();
+        if(((lynq_up_info.fota_flag[0]=='A')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='B'))||
+        ((lynq_up_info.fota_flag[0]=='B')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='A')))
+        {
+            RLOGD("mark oemapp mount fail\n");
+            lynq_set_value(FOTA_UCI_MODULE,FOTA_UCI_STATE, "1");
+        }
+        sleep(5);
+        reboot_device();
+    }
+
+
+    if(lynq_up_info.ota_run != 0)
+    { 
+        //Power off, call UA
+        RLOGD("[+UP]: ***Power off, call UA***\n");
+        ret = rock_update_main(0, 0, 0, 0, first_run, 1, 0, 1);
+        RLOGD("rock_update_main ret = %d\n", ret);
+        if(ret) 
+        {
+            RLOGD("fota update fail!\n");
+        }
+    }
+
     if(((lynq_up_info.fota_flag[0]=='A')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='B'))||
         ((lynq_up_info.fota_flag[0]=='B')&&(lynq_up_info.fota_flag[1]=='-')&&(lynq_up_info.fota_flag[2]=='A')))
     {
         //Upgrade the other side and call UA
         RLOGD("[+UP]: ***Upgrade the other side and call UA***\n");
-        ret = rock_update_main(0, 0, 0, 0, first_run, 0, 0);
+        ret = rock_update_main(0, 0, 0, 0, first_run, 0, 0, 0);
         RLOGD("rock_update_main ret = %d\n", ret);
         if(ret)
         {
@@ -1897,7 +1988,7 @@
     test_write_delta("/data/delta",DEV_DELTA);
 #endif
 
-    ret = rock_update_main(0, 0, 0, 0, 1, 1, 0);
+    ret = rock_update_main(0, 0, 0, 0, 1, 1, 0, 1);
     RLOGD("rock_update_nrestart ret = %d\n", ret);
     if(ret)
     {
