Merge "Revert "dice: add sign and encode with CoseSign1"" into main
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 8cb01d7..5dd060a 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -49,6 +49,12 @@
     },
     {
       "name": "vm_accessor_test"
+    },
+    {
+      "name": "avf_backcompat_tests"
+    },
+    {
+      "name": "old_images_avf_test"
     }
   ],
   "avf-postsubmit": [
diff --git a/android/TerminalApp/Android.bp b/android/TerminalApp/Android.bp
index 545ba0f..2bac412 100644
--- a/android/TerminalApp/Android.bp
+++ b/android/TerminalApp/Android.bp
@@ -16,6 +16,7 @@
         "androidx-constraintlayout_constraintlayout",
         "androidx.window_window",
         "apache-commons-compress",
+        "avf_aconfig_flags_java",
         "com.google.android.material_material",
         "debian-service-grpclib-lite",
         "gson",
@@ -40,6 +41,7 @@
         //optimize: true,
         proguard_flags_files: ["proguard.flags"],
         shrink_resources: true,
+        keep_runtime_invisible_annotations: true,
     },
     apex_available: [
         "com.android.virt",
diff --git a/android/TerminalApp/AndroidManifest.xml b/android/TerminalApp/AndroidManifest.xml
index 53fdafc..c11b1a0 100644
--- a/android/TerminalApp/AndroidManifest.xml
+++ b/android/TerminalApp/AndroidManifest.xml
@@ -47,6 +47,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+        <activity android:name=".DisplayActivity"
+            android:screenOrientation="landscape"
+            android:resizeableActivity="false"
+            android:theme="@style/FullscreenTheme"
+            android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation|uiMode|screenLayout|smallestScreenSize" />
         <activity android:name=".SettingsActivity"
             android:label="@string/action_settings" />
         <activity android:name=".SettingsDiskResizeActivity"
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/DisplayActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/DisplayActivity.kt
new file mode 100644
index 0000000..290cf5a
--- /dev/null
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/DisplayActivity.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * 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.
+ */
+package com.android.virtualization.terminal
+
+import android.os.Bundle
+import android.system.virtualmachine.VirtualMachineManager
+import android.view.SurfaceView
+import android.view.WindowInsets
+import android.view.WindowInsetsController
+
+class DisplayActivity : BaseActivity() {
+    private lateinit var displayProvider: DisplayProvider
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_display)
+        val mainView = findViewById<SurfaceView>(R.id.surface_view)
+        val cursorView = findViewById<SurfaceView>(R.id.cursor_surface_view)
+        makeFullscreen()
+        // Connect the views to the VM
+        displayProvider = DisplayProvider(mainView, cursorView)
+        val vmm =
+            applicationContext.getSystemService<VirtualMachineManager>(
+                VirtualMachineManager::class.java
+            )
+        val debianVm = vmm.get("debian")
+        if (debianVm != null) {
+            InputForwarder(
+                this,
+                debianVm,
+                findViewById(R.id.background_touch_view),
+                findViewById(R.id.surface_view),
+                findViewById(R.id.surface_view),
+            )
+        }
+    }
+
+    override fun onPause() {
+        super.onPause()
+        displayProvider.notifyDisplayIsGoingToInvisible()
+    }
+
+    private fun makeFullscreen() {
+        val w = window
+        w.setDecorFitsSystemWindows(false)
+        val insetsCtrl = w.insetsController
+        insetsCtrl?.hide(WindowInsets.Type.systemBars())
+        insetsCtrl?.setSystemBarsBehavior(
+            WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+        )
+    }
+}
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/DisplayProvider.kt b/android/TerminalApp/java/com/android/virtualization/terminal/DisplayProvider.kt
index fed8e5a..a04e056 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/DisplayProvider.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/DisplayProvider.kt
@@ -39,7 +39,10 @@
     private val mainView: SurfaceView,
     private val cursorView: SurfaceView,
 ) {
-    private val virtService: IVirtualizationServiceInternal
+    private val virtService: IVirtualizationServiceInternal by lazy {
+        val b = ServiceManager.waitForService("android.system.virtualizationservice")
+        IVirtualizationServiceInternal.Stub.asInterface(b)
+    }
     private var cursorHandler: CursorHandler? = null
 
     init {
@@ -50,14 +53,6 @@
         cursorView.holder.setFormat(PixelFormat.RGBA_8888)
         // TODO: do we need this z-order?
         cursorView.setZOrderMediaOverlay(true)
-        val b = ServiceManager.waitForService("android.system.virtualizationservice")
-        virtService = IVirtualizationServiceInternal.Stub.asInterface(b)
-        try {
-            // To ensure that the previous display service is removed.
-            virtService.clearDisplayService()
-        } catch (e: RemoteException) {
-            throw RuntimeException("Failed to clear prior display service", e)
-        }
     }
 
     fun notifyDisplayIsGoingToInvisible() {
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
index 1ae6ec5..71f10f9 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/MainActivity.kt
@@ -56,6 +56,7 @@
 import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
 import com.android.internal.annotations.VisibleForTesting
 import com.android.microdroid.test.common.DeviceProperties
+import com.android.system.virtualmachine.flags.Flags.terminalGuiSupport
 import com.android.virtualization.terminal.CertificateUtils.createOrGetKey
 import com.android.virtualization.terminal.CertificateUtils.writeCertificateToFile
 import com.android.virtualization.terminal.ErrorActivity.Companion.start
@@ -87,6 +88,7 @@
     private val bootCompleted = ConditionVariable()
     private lateinit var manageExternalStorageActivityResultLauncher: ActivityResultLauncher<Intent>
     private lateinit var modifierKeysController: ModifierKeysController
+    private var displayMenu: MenuItem? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -256,6 +258,10 @@
                                     Trace.endAsyncSection("executeTerminal", 0)
                                     findViewById<View?>(R.id.boot_progress).visibility = View.GONE
                                     terminalContainer.visibility = View.VISIBLE
+                                    if (terminalGuiSupport()) {
+                                        displayMenu?.setVisible(true)
+                                        displayMenu?.setEnabled(true)
+                                    }
                                     bootCompleted.open()
                                     modifierKeysController.update()
                                     terminalView.mapTouchToMouseEvent()
@@ -344,6 +350,11 @@
 
     override fun onCreateOptionsMenu(menu: Menu?): Boolean {
         menuInflater.inflate(R.menu.main_menu, menu)
+        displayMenu =
+            menu?.findItem(R.id.menu_item_display).also {
+                it?.setVisible(terminalGuiSupport())
+                it?.setEnabled(false)
+            }
         return true
     }
 
@@ -353,6 +364,10 @@
             val intent = Intent(this, SettingsActivity::class.java)
             this.startActivity(intent)
             return true
+        } else if (id == R.id.menu_item_display) {
+            val intent = Intent(this, DisplayActivity::class.java)
+            this.startActivity(intent)
+            return true
         }
         return super.onOptionsItemSelected(item)
     }
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
index f8b1b45..346056a 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.kt
@@ -36,6 +36,7 @@
 import android.system.virtualmachine.VirtualMachineException
 import android.util.Log
 import android.widget.Toast
+import com.android.system.virtualmachine.flags.Flags.terminalGuiSupport
 import com.android.virtualization.terminal.MainActivity.Companion.TAG
 import com.android.virtualization.terminal.Runner.Companion.create
 import com.android.virtualization.terminal.VmLauncherService.VmLauncherServiceCallback
@@ -217,6 +218,21 @@
             changed = true
         }
 
+        // TODO(jeongik): let it configurable
+        if (terminalGuiSupport()) {
+            builder
+                .setDisplayConfig(
+                    VirtualMachineCustomImageConfig.DisplayConfig.Builder()
+                        .setWidth(1920)
+                        .setHeight(1080)
+                        .build()
+                )
+                .useKeyboard(true)
+                .useMouse(true)
+                .useTouch(true)
+            changed = true
+        }
+
         val image = InstalledImage.getDefault(this)
         if (image.hasBackup()) {
             val backup = image.backupFile
diff --git a/android/TerminalApp/proguard.flags b/android/TerminalApp/proguard.flags
index 88b8a9c..04a2140 100644
--- a/android/TerminalApp/proguard.flags
+++ b/android/TerminalApp/proguard.flags
@@ -4,7 +4,10 @@
 -keepattributes Signature
 
 # For using GSON @Expose annotation
--keepattributes *Annotation*
+-keepattributes RuntimeVisibleAnnotations,
+                RuntimeVisibleParameterAnnotations,
+                RuntimeVisibleTypeAnnotations,
+                AnnotationDefault
 
 # Gson specific classes
 -dontwarn sun.misc.**
diff --git a/android/TerminalApp/res/drawable/ic_display.xml b/android/TerminalApp/res/drawable/ic_display.xml
new file mode 100644
index 0000000..86bdb5d
--- /dev/null
+++ b/android/TerminalApp/res/drawable/ic_display.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright 2025 The Android Open Source Project
+
+     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.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="960"
+    android:viewportHeight="960"
+    android:tint="?attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M240,840L240,760L280,720L160,720Q127,720 103.5,696.5Q80,673 80,640L80,200Q80,167 103.5,143.5Q127,120 160,120L800,120Q833,120 856.5,143.5Q880,167 880,200L880,640Q880,673 856.5,696.5Q833,720 800,720L680,720L720,760L720,840L240,840ZM160,640L800,640Q800,640 800,640Q800,640 800,640L800,200Q800,200 800,200Q800,200 800,200L160,200Q160,200 160,200Q160,200 160,200L160,640Q160,640 160,640Q160,640 160,640ZM160,640Q160,640 160,640Q160,640 160,640L160,200Q160,200 160,200Q160,200 160,200L160,200Q160,200 160,200Q160,200 160,200L160,640Q160,640 160,640Q160,640 160,640Z" />
+</vector>
\ No newline at end of file
diff --git a/android/TerminalApp/res/layout/activity_display.xml b/android/TerminalApp/res/layout/activity_display.xml
new file mode 100644
index 0000000..48e49fe
--- /dev/null
+++ b/android/TerminalApp/res/layout/activity_display.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright 2024 The Android Open Source Project
+
+     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.
+ -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".DisplayActivity">
+    <View
+        android:id="@+id/background_touch_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
+    <!-- the size should be match_parent -->
+    <SurfaceView
+        android:id="@+id/surface_view"
+        android:layout_width="1920px"
+        android:layout_height="1080px"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:focusedByDefault="true"
+        android:defaultFocusHighlightEnabled="true">
+        <requestFocus />
+    </SurfaceView>
+    <!-- A cursor size in virtio-gpu spec is always 64x64 -->
+    <SurfaceView
+        android:id="@+id/cursor_surface_view"
+        android:layout_width="64px"
+        android:layout_height="64px">
+    </SurfaceView>
+
+</merge>
\ No newline at end of file
diff --git a/android/TerminalApp/res/menu/main_menu.xml b/android/TerminalApp/res/menu/main_menu.xml
index 42ba85d..dbb788c 100644
--- a/android/TerminalApp/res/menu/main_menu.xml
+++ b/android/TerminalApp/res/menu/main_menu.xml
@@ -20,4 +20,9 @@
         android:icon="@drawable/ic_settings"
         android:title="@string/action_settings"
         app:showAsAction="always"/>
+    <item android:id="@+id/menu_item_display"
+        android:icon="@drawable/ic_display"
+        android:enabled="false"
+        android:title="@string/action_display"
+        app:showAsAction="always"/>
 </menu>
diff --git a/android/TerminalApp/res/values-af/strings.xml b/android/TerminalApp/res/values-af/strings.xml
index 1e8d8ff..e8871fd 100644
--- a/android/TerminalApp/res/values-af/strings.xml
+++ b/android/TerminalApp/res/values-af/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Kon nie installeer nie omdat wi-fi nie beskikbaar is nie"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Kon nie installeer nie. Probeer asseblief weer"</string>
     <string name="action_settings" msgid="5729342767795123227">"Instellings"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Maak terminaal gereed"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stop tans terminaal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminaal het omgeval"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminaal maak toe"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Verplig toemaak"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is geaktiveer"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Take wat lank neem"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Stelselgebeurtenisse"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-am/strings.xml b/android/TerminalApp/res/values-am/strings.xml
index faa7339..d388d49 100644
--- a/android/TerminalApp/res/values-am/strings.xml
+++ b/android/TerminalApp/res/values-am/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi ስለማይገኝ መጫን አልተሳካም"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"መጫን አልተሳካም። እባክዎ እንደገና ይሞክሩ"</string>
     <string name="action_settings" msgid="5729342767795123227">"ቅንብሮች"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ተርሚናልን በማዘጋጀት ላይ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ተርሚናልን በማቆም ላይ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ተርሚናል ተበላሽቷል"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ተርሚናል በመዝጋት ላይ ነው"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"በግድ ዝጋ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ነቅቷል"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ረዥም የሚያሄዱ ተግባሮች"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"የሥርዓት ክስተቶች"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ar/strings.xml b/android/TerminalApp/res/values-ar/strings.xml
index 9d1f2b7..4df4afc 100644
--- a/android/TerminalApp/res/values-ar/strings.xml
+++ b/android/TerminalApp/res/values-ar/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"تعذَّر التثبيت لأنّ شبكة Wi-Fi غير متاحة"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"تعذَّر التثبيت. يُرجى إعادة المحاولة"</string>
     <string name="action_settings" msgid="5729342767795123227">"الإعدادات"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"جارٍ تحضير Terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"جارٍ إيقاف Terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"تعطَّل Terminal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"جارٍ إغلاق الوحدة الطرفية"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"فرض الإغلاق"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"تم تفعيل <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"المهام الطويلة المدى"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"أحداث النظام"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-as/strings.xml b/android/TerminalApp/res/values-as/strings.xml
index 630efc4..e4a4a50 100644
--- a/android/TerminalApp/res/values-as/strings.xml
+++ b/android/TerminalApp/res/values-as/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ৱাই-ফাই উপলব্ধ নোহোৱাৰ কাৰণে ইনষ্টল কৰিব পৰা নগ’ল"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ইনষ্টল কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক"</string>
     <string name="action_settings" msgid="5729342767795123227">"ছেটিং"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"টাৰ্মিনেল সাজু কৰি থকা হৈছে"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"টাৰ্মিনেল বন্ধ কৰি থকা হৈছে"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"টাৰ্মিনেল ক্ৰেশ্ব হৈছে"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"টাৰ্মিনেলটো বন্ধ কৰি থকা হৈছে"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"বলেৰে বন্ধ কৰক"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> সক্ষম কৰা আছে"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"দীঘলীয়া সময় জুৰি চলা কাৰ্য"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ছিষ্টেমৰ ঘটনা"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-az/strings.xml b/android/TerminalApp/res/values-az/strings.xml
index 7c134f0..2b33cd8 100644
--- a/android/TerminalApp/res/values-az/strings.xml
+++ b/android/TerminalApp/res/values-az/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi əlçatan olmadığı üçün quraşdırmaq alınmadı"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Quraşdırmaq alınmadı. Yenidən cəhd edin"</string>
     <string name="action_settings" msgid="5729342767795123227">"Ayarlar"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal hazırlanır"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal dayandırılır"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal çökdü"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal bağlanır"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Məcburi bağlanma"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> aktivləşdirilib"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzunmüddətli tapşırıqlar"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistem tədbirləri"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-b+sr+Latn/strings.xml b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
index 0e77081..1778e4c 100644
--- a/android/TerminalApp/res/values-b+sr+Latn/strings.xml
+++ b/android/TerminalApp/res/values-b+sr+Latn/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instaliranje nije uspelo jer WiFi nije dostupan"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Instaliranje nije uspelo. Probajte ponovo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Podešavanja"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal se priprema"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal se zaustavlja"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal je otkazao"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal se zatvara"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Prinudno zatvori"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> je omogućen"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemski događaji"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-be/strings.xml b/android/TerminalApp/res/values-be/strings.xml
index 31d1341..9b0dd00 100644
--- a/android/TerminalApp/res/values-be/strings.xml
+++ b/android/TerminalApp/res/values-be/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Не ўдалося ўсталяваць, бо сетка Wi-Fi недаступная"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Не ўдалося ўсталяваць. Паўтарыце спробу."</string>
     <string name="action_settings" msgid="5729342767795123227">"Налады"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Ідзе падрыхтоўка тэрмінала"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Спыненне тэрмінала"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Збой тэрмінала"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Тэрмінал закрываецца"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Закрыць прымусова"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Модуль <xliff:g id="ID_1">VirGL</xliff:g> уключаны"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Працяглыя задачы"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Сістэмныя падзеі"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-bg/strings.xml b/android/TerminalApp/res/values-bg/strings.xml
index 5112c08..d9efb58 100644
--- a/android/TerminalApp/res/values-bg/strings.xml
+++ b/android/TerminalApp/res/values-bg/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Инсталирането не бе успешно, защото не е налице Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Инсталирането не бе успешно. Моля, опитайте отново"</string>
     <string name="action_settings" msgid="5729342767795123227">"Настройки"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминалът се подготвя"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминалът спира"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминалът претърпя срив"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминалът се затваря"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Принудително затваряне"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> е активирано"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Продължителни задачи"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системни събития"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-bn/strings.xml b/android/TerminalApp/res/values-bn/strings.xml
index fdf59b3..5f23dbd 100644
--- a/android/TerminalApp/res/values-bn/strings.xml
+++ b/android/TerminalApp/res/values-bn/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ওয়াই-ফাই উপলভ্য না থাকায় ইনস্টল করা যায়নি"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ইনস্টল করা যায়নি। আবার চেষ্টা করুন"</string>
     <string name="action_settings" msgid="5729342767795123227">"সেটিংস"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"টার্মিনাল তৈরি করা হচ্ছে"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"টার্মিনাল বন্ধ করা হচ্ছে"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"টার্মিনাল ক্র্যাশ করেছে"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"টার্মিনাল বন্ধ হচ্ছে"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"জোর করে বন্ধ করুন"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> চালু করা আছে"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"দীর্ঘ সময় ধরে চালানো টাস্ক"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"সিস্টেম ইভেন্ট"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-bs/strings.xml b/android/TerminalApp/res/values-bs/strings.xml
index b59bdf5..df1cfbb 100644
--- a/android/TerminalApp/res/values-bs/strings.xml
+++ b/android/TerminalApp/res/values-bs/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instaliranje nije uspjelo jer WiFi nije dostupan"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Instaliranje nije uspjelo. Pokušajte ponovo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Postavke"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Priprema terminala"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Zaustavljanje terminala"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal je pao"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal je zatvoren"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Prisilno zatvori"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Omogućeno: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Događaji sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ca/strings.xml b/android/TerminalApp/res/values-ca/strings.xml
index 58fdeaf..bab288f 100644
--- a/android/TerminalApp/res/values-ca/strings.xml
+++ b/android/TerminalApp/res/values-ca/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"No s\'ha pogut instal·lar perquè la Wi‑Fi no està disponible"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"No s\'ha pogut instal·lar. Torna-ho a provar."</string>
     <string name="action_settings" msgid="5729342767795123227">"Configuració"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"S\'està preparant el terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"S\'està aturant el terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"El terminal s\'ha bloquejat"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"El terminal s\'està tancant"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Força el tancament"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> està activat"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tasques de llarga durada"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Esdeveniments del sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-cs/strings.xml b/android/TerminalApp/res/values-cs/strings.xml
index 563ad9f..bf036f1 100644
--- a/android/TerminalApp/res/values-cs/strings.xml
+++ b/android/TerminalApp/res/values-cs/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instalace se nezdařila, protože není k dispozici Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Instalace se nezdařila. Zkuste to znovu"</string>
     <string name="action_settings" msgid="5729342767795123227">"Nastavení"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Probíhá příprava terminálu"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Ukončování terminálu"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminál selhal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminál se zavírá"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Vynutit ukončení"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Modul <xliff:g id="ID_1">VirGL</xliff:g> je aktivován"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dlouho spuštěné úlohy"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systémové události"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-da/strings.xml b/android/TerminalApp/res/values-da/strings.xml
index 2382c4b..772f040 100644
--- a/android/TerminalApp/res/values-da/strings.xml
+++ b/android/TerminalApp/res/values-da/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Installationen mislykkedes, fordi Wi-Fi ikke er tilgængeligt"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installationen mislykkedes. Prøv igen"</string>
     <string name="action_settings" msgid="5729342767795123227">"Indstillinger"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Forbereder terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopper terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalen er gået ned"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminalen lukker"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Tving til at lukke"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> er aktiveret"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Længerevarende opgaver"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhændelser"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-de/strings.xml b/android/TerminalApp/res/values-de/strings.xml
index bb71de3..5248d02 100644
--- a/android/TerminalApp/res/values-de/strings.xml
+++ b/android/TerminalApp/res/values-de/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Die Installation ist fehlgeschlagen, weil kein WLAN verfügbar ist"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Die Installation ist fehlgeschlagen. Bitte versuche es noch einmal."</string>
     <string name="action_settings" msgid="5729342767795123227">"Einstellungen"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal wird vorbereitet"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal wird beendet"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal ist abgestürzt"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal wird geschlossen"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Schließen erzwingen"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ist aktiviert"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Aufgaben mit langer Ausführungszeit"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemereignisse"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-el/strings.xml b/android/TerminalApp/res/values-el/strings.xml
index 72882b8..8e2f628 100644
--- a/android/TerminalApp/res/values-el/strings.xml
+++ b/android/TerminalApp/res/values-el/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Η εγκατάσταση απέτυχε, επειδή το Wi-Fi δεν είναι διαθέσιμο"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Η εγκατάσταση απέτυχε. Δοκιμάστε ξανά"</string>
     <string name="action_settings" msgid="5729342767795123227">"Ρυθμίσεις"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Προετοιμασία τερματικού σε εξέλιξη"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Διακοπή τερματικού σε εξέλιξη"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Το τερματικό παρουσίασε σφάλμα"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Το τερματικό κλείνει"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Αναγκαστικό κλείσιμο"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Το <xliff:g id="ID_1">VirGL</xliff:g> είναι ενεργοποιημένο"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Εργασίες μεγάλης διάρκειας"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Συμβάντα συστήματος"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-en-rAU/strings.xml b/android/TerminalApp/res/values-en-rAU/strings.xml
index f208e38..387eb2b 100644
--- a/android/TerminalApp/res/values-en-rAU/strings.xml
+++ b/android/TerminalApp/res/values-en-rAU/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Failed to install because Wi-Fi is not available"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Failed to install. Please try again"</string>
     <string name="action_settings" msgid="5729342767795123227">"Settings"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparing terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopping terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal crashed"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal is closing"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Force close"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-en-rCA/strings.xml b/android/TerminalApp/res/values-en-rCA/strings.xml
index f208e38..5842cb2 100644
--- a/android/TerminalApp/res/values-en-rCA/strings.xml
+++ b/android/TerminalApp/res/values-en-rCA/strings.xml
@@ -33,6 +33,7 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Failed to install because Wi-Fi is not available"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Failed to install. Please try again"</string>
     <string name="action_settings" msgid="5729342767795123227">"Settings"</string>
+    <string name="action_display" msgid="8487008779926038139">"Display"</string>
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparing terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopping terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal crashed"</string>
@@ -87,4 +88,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal is closing"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Force close"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long running tasks"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-en-rGB/strings.xml b/android/TerminalApp/res/values-en-rGB/strings.xml
index f208e38..387eb2b 100644
--- a/android/TerminalApp/res/values-en-rGB/strings.xml
+++ b/android/TerminalApp/res/values-en-rGB/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Failed to install because Wi-Fi is not available"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Failed to install. Please try again"</string>
     <string name="action_settings" msgid="5729342767795123227">"Settings"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparing terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopping terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal crashed"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal is closing"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Force close"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-en-rIN/strings.xml b/android/TerminalApp/res/values-en-rIN/strings.xml
index f208e38..387eb2b 100644
--- a/android/TerminalApp/res/values-en-rIN/strings.xml
+++ b/android/TerminalApp/res/values-en-rIN/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Failed to install because Wi-Fi is not available"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Failed to install. Please try again"</string>
     <string name="action_settings" msgid="5729342767795123227">"Settings"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparing terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopping terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal crashed"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal is closing"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Force close"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> is enabled"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Long-running tasks"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"System events"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-es-rUS/strings.xml b/android/TerminalApp/res/values-es-rUS/strings.xml
index ff2ae6d..fe907df 100644
--- a/android/TerminalApp/res/values-es-rUS/strings.xml
+++ b/android/TerminalApp/res/values-es-rUS/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"La instalación falló porque no hay una conexión Wi-Fi disponible"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"No se pudo instalar; vuelve a intentarlo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Configuración"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparando la terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Deteniendo la terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Se produjo un error en la terminal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Se está cerrando la terminal"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forzar cierre"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Se habilitó <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tareas extensas"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos del sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-es/strings.xml b/android/TerminalApp/res/values-es/strings.xml
index 0a8932e..3ac451a 100644
--- a/android/TerminalApp/res/values-es/strings.xml
+++ b/android/TerminalApp/res/values-es/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"No se ha podido instalar porque no hay conexión Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"No se ha podido instalar. Vuelve a intentarlo."</string>
     <string name="action_settings" msgid="5729342767795123227">"Ajustes"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparando terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Deteniendo terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Fallo del terminal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"El terminal se está cerrando"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forzar cierre"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> se ha habilitado"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tareas de larga duración"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos del sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-et/strings.xml b/android/TerminalApp/res/values-et/strings.xml
index d6754d8..eeb17ef 100644
--- a/android/TerminalApp/res/values-et/strings.xml
+++ b/android/TerminalApp/res/values-et/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Installimine ebaõnnestus, kuna WiFi pole saadaval"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installimine ebaõnnestus. Proovige uuesti"</string>
     <string name="action_settings" msgid="5729342767795123227">"Seaded"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminali ettevalmistamine"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminali peatamine"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal jooksis kokku"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal suletakse"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Rakenda sulgemine"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> on lubatud"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Pikalt kestvad ülesanded"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Süsteemisündmused"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-eu/strings.xml b/android/TerminalApp/res/values-eu/strings.xml
index 0cdcca5..a983e26 100644
--- a/android/TerminalApp/res/values-eu/strings.xml
+++ b/android/TerminalApp/res/values-eu/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Ezin izan da instalatu, wifi-sarerik erabilgarri ez dagoelako"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Ezin izan da instalatu. Saiatu berriro"</string>
     <string name="action_settings" msgid="5729342767795123227">"Ezarpenak"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminala prestatzen"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminala geldiarazten"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalak huts egin du"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal ixten ari da"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Behartu ixtera"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> gaituta dago"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Luze exekutatzen diren zereginak"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemako gertaerak"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-fa/strings.xml b/android/TerminalApp/res/values-fa/strings.xml
index 4ec4d0a..d6dc255 100644
--- a/android/TerminalApp/res/values-fa/strings.xml
+++ b/android/TerminalApp/res/values-fa/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"نصب نشد چون Wi-Fi دردسترس نیست"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"نصب نشد. لطفاً دوباره امتحان کنید"</string>
     <string name="action_settings" msgid="5729342767795123227">"تنظیمات"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"درحال آماده‌سازی پایانه"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"پایانه درحال توقف است"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"پایانه ازکار افتاد"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"پایانه درحال بسته شدن است"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"بستن اجباری"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"‫<xliff:g id="ID_1">VirGL</xliff:g> فعال شد"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"تکالیف بلندمدت"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"رویدادهای سیستم"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-fi/strings.xml b/android/TerminalApp/res/values-fi/strings.xml
index aec6a47..63b91a5 100644
--- a/android/TerminalApp/res/values-fi/strings.xml
+++ b/android/TerminalApp/res/values-fi/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Asennus epäonnistui, koska Wi-Fi ei ole käytettävissä"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Asennus epäonnistui. Yritä uudelleen"</string>
     <string name="action_settings" msgid="5729342767795123227">"Asetukset"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Valmistellaan päätettä"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Pysäytetään terminaalia"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminaali kaatui"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal sulkeutuu"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Pakota sulkeutumaan"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> on käytössä"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Pitkäkestoiset tehtävät"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Järjestelmätapahtumat"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-fr-rCA/strings.xml b/android/TerminalApp/res/values-fr-rCA/strings.xml
index 7d54372..684cc28 100644
--- a/android/TerminalApp/res/values-fr-rCA/strings.xml
+++ b/android/TerminalApp/res/values-fr-rCA/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Échec de l\'installation parce que le Wi-Fi n\'est pas disponible"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Échec de l\'installation. Veuillez réessayer"</string>
     <string name="action_settings" msgid="5729342767795123227">"Paramètres"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Préparation du terminal en cours…"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Arrêt du terminal en cours…"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Le terminal a planté"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Le terminal se fermera"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forcer la fermeture"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> est activé"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tâches de longue durée"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Événements système"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-fr/strings.xml b/android/TerminalApp/res/values-fr/strings.xml
index 3fe8772..94beb27 100644
--- a/android/TerminalApp/res/values-fr/strings.xml
+++ b/android/TerminalApp/res/values-fr/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Échec de l\'installation, car le Wi-Fi n\'est pas disponible"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Échec de l\'installation. Veuillez réessayer."</string>
     <string name="action_settings" msgid="5729342767795123227">"Paramètres"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Préparation du terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Arrêt du terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Le terminal a planté"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal se ferme"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forcer la fermeture"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> est activé"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tâches de longue durée"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Événements système"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-gl/strings.xml b/android/TerminalApp/res/values-gl/strings.xml
index ec98910..9bc7fbd 100644
--- a/android/TerminalApp/res/values-gl/strings.xml
+++ b/android/TerminalApp/res/values-gl/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Produciuse un erro durante a instalación porque non hai ningunha wifi dispoñible"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Produciuse un erro durante a instalación. Téntao de novo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Configuración"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparando terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Parando terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Produciuse un fallo no terminal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"A aplicación Terminal estase pechando"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forzar peche"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Activouse <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duración"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-gu/strings.xml b/android/TerminalApp/res/values-gu/strings.xml
index d53d3eb..2f11bf7 100644
--- a/android/TerminalApp/res/values-gu/strings.xml
+++ b/android/TerminalApp/res/values-gu/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"વાઇ-ફાઇ ઉપલબ્ધ ન હોવાથી ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ઇન્સ્ટૉલ કરવામાં નિષ્ફળ રહ્યાં. કૃપા કરીને ફરી પ્રયાસ કરો"</string>
     <string name="action_settings" msgid="5729342767795123227">"સેટિંગ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ટર્મિનલ તૈયાર કરી રહ્યાં છીએ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ટર્મિનલ બંધ કરી રહ્યાં છીએ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ટર્મિનલ ક્રૅશ થયું"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ટર્મિનલ ઍપ બંધ થઈ રહી છે"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ફરજિયાત બંધ કરો"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ચાલુ કરેલું છે"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"લાંબો સમય ચાલનારા કાર્યો"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"સિસ્ટમ ઇવેન્ટ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-hi/strings.xml b/android/TerminalApp/res/values-hi/strings.xml
index b644e1f..f54ff86 100644
--- a/android/TerminalApp/res/values-hi/strings.xml
+++ b/android/TerminalApp/res/values-hi/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"वाई-फ़ाई उपलब्ध न होने की वजह से, इंस्टॉल नहीं किया जा सका"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"इंस्टॉल नहीं किया जा सका. कृपया फिर से कोशिश करें"</string>
     <string name="action_settings" msgid="5729342767795123227">"सेटिंग"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"टर्मिनल तैयार किया जा रहा है"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"टर्मिनल को रोका जा रहा है"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"टर्मिनल क्रैश हो गया"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"टर्मिनल ऐप्लिकेशन बंद हो रहा है"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ज़बरदस्ती बंद करें"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> चालू है"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"लंबे समय तक चलने वाले टास्क"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टम इवेंट"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-hr/strings.xml b/android/TerminalApp/res/values-hr/strings.xml
index 8ce5af5..4ff5fd4 100644
--- a/android/TerminalApp/res/values-hr/strings.xml
+++ b/android/TerminalApp/res/values-hr/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instaliranje nije uspjelo jer Wi-Fi nije dostupan"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Instaliranje nije uspjelo. Pokušajte ponovo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Postavke"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Priprema terminala"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Zaustavljanje terminala"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal se srušio"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal se zatvara"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Prisilno zatvori"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Omogućeno je: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dugotrajni zadaci"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Događaji sustava"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-hu/strings.xml b/android/TerminalApp/res/values-hu/strings.xml
index f3058d0..6af50ee 100644
--- a/android/TerminalApp/res/values-hu/strings.xml
+++ b/android/TerminalApp/res/values-hu/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Nem sikerült a telepítés, mert nincs Wi-Fi-kapcsolat"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Nem sikerült a telepítés. Próbálkozzon újra."</string>
     <string name="action_settings" msgid="5729342767795123227">"Beállítások"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"A terminál előkészítése…"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"A terminál leállítása…"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"A terminál összeomlott"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"A terminál bezárul"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Bezárás kényszerítése"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"A(z) <xliff:g id="ID_1">VirGL</xliff:g> engedélyezve van"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Hosszan futó feladatok"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Rendszeresemények"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-hy/strings.xml b/android/TerminalApp/res/values-hy/strings.xml
index f11469b..3369b7e 100644
--- a/android/TerminalApp/res/values-hy/strings.xml
+++ b/android/TerminalApp/res/values-hy/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Չհաջողվեց տեղադրել, քանի որ Wi-Fi ցանցը հասանելի չէ"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Չհաջողվեց տեղադրել: Նորից փորձեք"</string>
     <string name="action_settings" msgid="5729342767795123227">"Կարգավորումներ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Տերմինալի նախապատրաստում"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Տերմինալը կանգնեցվում է"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Տերմինալը խափանվել է"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Տերմինալը փակվում է"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Ստիպողաբար փակել"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>-ը միացված է"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Երկար աշխատող առաջադրանքներ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Համակարգի իրադարձություններ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-in/strings.xml b/android/TerminalApp/res/values-in/strings.xml
index a2c4b01..9c2be8d 100644
--- a/android/TerminalApp/res/values-in/strings.xml
+++ b/android/TerminalApp/res/values-in/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Gagal menginstal karena Wi-Fi tidak tersedia"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Gagal menginstal. Coba lagi"</string>
     <string name="action_settings" msgid="5729342767795123227">"Setelan"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Menyiapkan terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Menghentikan terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal error"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal ditutup"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Tutup paksa"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> diaktifkan"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tugas yang berjalan lama"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Peristiwa sistem"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-is/strings.xml b/android/TerminalApp/res/values-is/strings.xml
index 2e97d0c..3cb32e0 100644
--- a/android/TerminalApp/res/values-is/strings.xml
+++ b/android/TerminalApp/res/values-is/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Uppsetning tókst ekki vegna þess að Wi-Fi er ekki tiltækt"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Uppsetning tókst ekki. Reyndu aftur"</string>
     <string name="action_settings" msgid="5729342767795123227">"Stillingar"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Undirbýr útstöð"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stöðvar tengi"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Tengi hrundi"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal er að loka"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Þvinga fram lokun"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Kveikt er á <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langvarandi verkefni"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Kerfistilvik"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-it/strings.xml b/android/TerminalApp/res/values-it/strings.xml
index 1cfd2b5..b375706 100644
--- a/android/TerminalApp/res/values-it/strings.xml
+++ b/android/TerminalApp/res/values-it/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Impossibile installare: Wi-Fi non disponibile"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installazione non riuscita. Riprova"</string>
     <string name="action_settings" msgid="5729342767795123227">"Impostazioni"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparazione terminale in corso…"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Arresto del terminale in corso…"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Arresto anomalo del terminale"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Chiusura del terminale in corso…"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Termina"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> è abilitata"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Attività di lunga durata"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventi di sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-iw/strings.xml b/android/TerminalApp/res/values-iw/strings.xml
index 729b22b..45f9162 100644
--- a/android/TerminalApp/res/values-iw/strings.xml
+++ b/android/TerminalApp/res/values-iw/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ההתקנה נכשלה כי אין חיבור ל-Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ההתקנה נכשלה. אפשר לנסות שוב."</string>
     <string name="action_settings" msgid="5729342767795123227">"הגדרות"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"הטרמינל בהכנה"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"המערכת עוצרת את הטרמינל"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"הטרמינל קרס"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"הטרמינל בתהליך סגירה"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"אילוץ סגירה"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"‫<xliff:g id="ID_1">VirGL</xliff:g> מופעל"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"משימות ממושכות"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"אירועי מערכת"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ja/strings.xml b/android/TerminalApp/res/values-ja/strings.xml
index 19c4af8..30be359 100644
--- a/android/TerminalApp/res/values-ja/strings.xml
+++ b/android/TerminalApp/res/values-ja/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi が利用できないためインストールできませんでした"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"インストールできませんでした。もう一度お試しください"</string>
     <string name="action_settings" msgid="5729342767795123227">"設定"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ターミナルを準備しています"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ターミナルを停止しています"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ターミナルがクラッシュしました"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ターミナルを閉じています"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"強制終了"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>は有効です"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間実行タスク"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"システム イベント"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ka/strings.xml b/android/TerminalApp/res/values-ka/strings.xml
index be79f8b..600ce7f 100644
--- a/android/TerminalApp/res/values-ka/strings.xml
+++ b/android/TerminalApp/res/values-ka/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi მიუწვდომელია, ამიტომ ინსტალაცია ვერ მოხერხდა"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ვერ მოახერხდა ინსტალაცია. გთხოვთ, ცადოთ ხელახლა"</string>
     <string name="action_settings" msgid="5729342767795123227">"პარამეტრები"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"მიმდინარეობს ტერმინალის მომზადება"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"მიმდინარეობს ტერმინალის შეწყვეტა"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ტერმინალი გაჭედილია"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ტერმინალი იხურება"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"იძულებით დახურვა"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ჩართულია"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ხანგრძლივად გაშვებული ამოცანები"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"სისტემური მოვლენები"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-kk/strings.xml b/android/TerminalApp/res/values-kk/strings.xml
index 5477c04..d4a246d 100644
--- a/android/TerminalApp/res/values-kk/strings.xml
+++ b/android/TerminalApp/res/values-kk/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Орнатылмады, себебі Wi-Fi желісі жоқ."</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Орнату мүмкін болмады. Қайталап көріңіз."</string>
     <string name="action_settings" msgid="5729342767795123227">"Параметрлер"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминал дайындалып жатыр."</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминал тоқтатылып жатыр."</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминал бұзылды."</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминал жабылып жатыр"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Қолмен жабу"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> қосылды."</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ұзақ орындалатын тапсырмалар"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Жүйе оқиғалары"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-km/strings.xml b/android/TerminalApp/res/values-km/strings.xml
index 1ec9a0a..72316ae 100644
--- a/android/TerminalApp/res/values-km/strings.xml
+++ b/android/TerminalApp/res/values-km/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"មិនអាចដំឡើងបានទេ ដោយសារមិនមាន Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"មិនអាច​ដំឡើងបានទេ។ សូមព្យាយាមម្ដងទៀត"</string>
     <string name="action_settings" msgid="5729342767795123227">"ការកំណត់"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"កំពុងរៀបចំទែមីណាល់"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"កំពុងបញ្ឈប់ទែមីណាល់"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ទែមីណាល់បានគាំង"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ទែមីណាល់កំពុងបិទ"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"បង្ខំ​ឱ្យ​បិទ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ត្រូវបានបើក"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"កិច្ចការដែលដំណើរការរយៈពេលយូរ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ព្រឹត្តិការណ៍ប្រព័ន្ធ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-kn/strings.xml b/android/TerminalApp/res/values-kn/strings.xml
index 3c53299..5f63626 100644
--- a/android/TerminalApp/res/values-kn/strings.xml
+++ b/android/TerminalApp/res/values-kn/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ವೈ-ಫೈ ಲಭ್ಯವಿಲ್ಲದ ಕಾರಣ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="action_settings" msgid="5729342767795123227">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ಟರ್ಮಿನಲ್‌ ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ಟರ್ಮಿನಲ್ ಅನ್ನು ನಿಲ್ಲಿಸಲಾಗುತ್ತಿದೆ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ಟರ್ಮಿನಲ್ ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ಟರ್ಮಿನಲ್ ಮುಚ್ಚಲಾಗುತ್ತಿದೆ"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ಬಲವಂತವಾಗಿ ಮುಚ್ಚಿ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ದೀರ್ಘಾವಧಿಯ ಕಾರ್ಯಗಳು"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ಸಿಸ್ಟಮ್ ಈವೆಂಟ್‌ಗಳು"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ko/strings.xml b/android/TerminalApp/res/values-ko/strings.xml
index 4ec1613..404c1d9 100644
--- a/android/TerminalApp/res/values-ko/strings.xml
+++ b/android/TerminalApp/res/values-ko/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi를 사용할 수 없어 설치하지 못했습니다."</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"설치할 수 없습니다. 다시 시도해 보세요."</string>
     <string name="action_settings" msgid="5729342767795123227">"설정"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"터미널 준비 중"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"터미널 중지 중"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"터미널 다운됨"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"터미널 앱 종료 중"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"강제 종료"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>이(가) 사용 설정되었습니다."</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"장기 실행 태스크"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"시스템 이벤트"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ky/strings.xml b/android/TerminalApp/res/values-ky/strings.xml
index 17fc4ea..53cdc3b 100644
--- a/android/TerminalApp/res/values-ky/strings.xml
+++ b/android/TerminalApp/res/values-ky/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi жеткиликсиз болгондуктан, орнотулбай калды"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Орнотулган жок. Кайталап көрүңүз"</string>
     <string name="action_settings" msgid="5729342767795123227">"Параметрлер"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминал даярдалууда"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминал токтотулууда"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминал бузулду"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминал жабылып жатат"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Мажбурлап жабуу"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> иштетилди"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Узак тапшырмалар"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Тутумдук иш-чаралар"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-lo/strings.xml b/android/TerminalApp/res/values-lo/strings.xml
index cb8bc0c..e8f1993 100644
--- a/android/TerminalApp/res/values-lo/strings.xml
+++ b/android/TerminalApp/res/values-lo/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ຕິດຕັ້ງບໍ່ສຳເລັດເນື່ອງຈາກບໍ່ມີ Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ຕິດຕັ້ງບໍ່ສໍາເລັດ. ກະລຸນາລອງໃໝ່"</string>
     <string name="action_settings" msgid="5729342767795123227">"ການຕັ້ງຄ່າ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ກຳລັງກະກຽມເທີມິນອນ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ກຳລັງຢຸດເທີມິນອນ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ເທີມິນອນຫຼົ້ມ"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ເທີມິນອນກຳລັງຈະປິດ"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ບັງຄັບປິດ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"ເປີດການນຳໃຊ້ <xliff:g id="ID_1">VirGL</xliff:g> ແລ້ວ"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ວຽກທີ່ດຳເນີນເປັນເວລາດົນ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ກິດຈະກຳລະບົບ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-lt/strings.xml b/android/TerminalApp/res/values-lt/strings.xml
index 76f5158..aabd487 100644
--- a/android/TerminalApp/res/values-lt/strings.xml
+++ b/android/TerminalApp/res/values-lt/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Nepavyko įdiegti, nes „Wi-Fi“ nepasiekiamas"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Nepavyko įdiegti. Bandykite dar kartą"</string>
     <string name="action_settings" msgid="5729342767795123227">"Nustatymai"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Ruošiamas terminalas"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminalas sustabdomas"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalas užstrigo"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminalas uždaromas"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Priverstinai uždaryti"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"„<xliff:g id="ID_1">VirGL</xliff:g>“ įgalinta"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ilgai vykdomos užduotys"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemos įvykiai"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-lv/strings.xml b/android/TerminalApp/res/values-lv/strings.xml
index a0730a1..9f0d902 100644
--- a/android/TerminalApp/res/values-lv/strings.xml
+++ b/android/TerminalApp/res/values-lv/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instalēšana neizdevās, jo nav pieejams Wi‑Fi savienojums"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Neizdevās instalēt — mēģiniet vēlreiz"</string>
     <string name="action_settings" msgid="5729342767795123227">"Iestatījumi"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Notiek termināļa sagatavošana."</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Notiek termināļa apturēšana."</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminālis avarēja."</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminālis tiek aizvērts"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Veikt piespiedu aizvēršanu"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ir iespējots"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Ilgstoši uzdevumi"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistēmas notikumi"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-mk/strings.xml b/android/TerminalApp/res/values-mk/strings.xml
index ac328d7..0a14e42 100644
--- a/android/TerminalApp/res/values-mk/strings.xml
+++ b/android/TerminalApp/res/values-mk/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Не можеше да се инсталира бидејќи не е достапна Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Не можеше да се инсталира. Обидете се повторно"</string>
     <string name="action_settings" msgid="5729342767795123227">"Поставки"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминалот се подготвува"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминалот се сопира"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминалот падна"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминалот се затвора"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Затвори присилно"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Овозможено: <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Задачи што се извршуваат долго"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системски настани"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ml/strings.xml b/android/TerminalApp/res/values-ml/strings.xml
index 1ff795d..4f8ec14 100644
--- a/android/TerminalApp/res/values-ml/strings.xml
+++ b/android/TerminalApp/res/values-ml/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"വൈഫൈ ലഭ്യമല്ലാത്തതിനാൽ ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="action_settings" msgid="5729342767795123227">"ക്രമീകരണം"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ടെർമിനൽ തയ്യാറാക്കുന്നു"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ടെർമിനൽ നിർത്തുന്നു"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ടെർമിനൽ ക്രാഷായി"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ടെർമിനൽ അടയ്ക്കുകയാണ്"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"നിർബന്ധിതമായി അടയ്ക്കുക"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> പ്രവർത്തനക്ഷമമാക്കി"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ദീർഘസമയം റൺ ചെയ്യുന്ന ടാസ്ക്കുകൾ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"സിസ്റ്റം ഇവന്റുകൾ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-mn/strings.xml b/android/TerminalApp/res/values-mn/strings.xml
index 5b6ce4a..75983d4 100644
--- a/android/TerminalApp/res/values-mn/strings.xml
+++ b/android/TerminalApp/res/values-mn/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi боломжгүй тул суулгаж чадсангүй"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Суулгаж чадсангүй. Дахин оролдоно уу"</string>
     <string name="action_settings" msgid="5729342767795123227">"Тохиргоо"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминалыг бэлтгэж байна"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминалыг зогсоож байна"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминал гэмтсэн"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминал хаагдаж байна"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Хүчээр хаах"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> идэвхэжсэн"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Удаан ажиллаж буй ажил"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системийн үйл явдал"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-mr/strings.xml b/android/TerminalApp/res/values-mr/strings.xml
index 1701983..19c27f5 100644
--- a/android/TerminalApp/res/values-mr/strings.xml
+++ b/android/TerminalApp/res/values-mr/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"वाय-फाय उपलब्ध नसल्यामुळे इंस्टॉल करता आले नाही"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"इंस्टॉल करता आले नाही. कृपया पुन्हा प्रयत्न करा"</string>
     <string name="action_settings" msgid="5729342767795123227">"सेटिंग्ज"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"टर्मिनल तयार करत आहे"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"टर्मिनल थांबवत आहे"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"टर्मिनल क्रॅश झाले आहे"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"टर्मिनल बंद होत आहे"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"सक्तीने बंद करा"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> सुरू केले आहे"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"दीर्घवेळ रन होणाऱ्या टास्क"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टीम इव्‍हेंट"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ms/strings.xml b/android/TerminalApp/res/values-ms/strings.xml
index 1709e51..1a97ac0 100644
--- a/android/TerminalApp/res/values-ms/strings.xml
+++ b/android/TerminalApp/res/values-ms/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Gagal melakukan pemasangan kerana Wi-Fi tidak tersedia"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Gagal melakukan pemasangan. Sila cuba lagi"</string>
     <string name="action_settings" msgid="5729342767795123227">"Tetapan"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Menyediakan terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Menghentikan terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal ranap"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal ditutup"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Tutup paksa"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> didayakan"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tugasan yang memakan masa yang lama"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Peristiwa sistem"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-my/strings.xml b/android/TerminalApp/res/values-my/strings.xml
index dc3e555..a723a0a 100644
--- a/android/TerminalApp/res/values-my/strings.xml
+++ b/android/TerminalApp/res/values-my/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi မရနိုင်သောကြောင့် ထည့်သွင်း၍မရလိုက်ပါ"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ထည့်သွင်း၍ မရလိုက်ပါ။ ထပ်စမ်းကြည့်ပါ"</string>
     <string name="action_settings" msgid="5729342767795123227">"ဆက်တင်များ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"တာမီနယ်ကို ပြင်ဆင်နေသည်"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"တာမီနယ်ကို ရပ်နေသည်"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"တာမီနယ် ရပ်တန့်သွားသည်"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"တာမီနယ် ပိတ်နေသည်"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"မဖြစ်မနေပိတ်ရန်"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ဖွင့်ထားသည်"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"အချိန်ကြာသော လုပ်ဆောင်စရာများ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"စနစ်ဖြစ်စဉ်များ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-nb/strings.xml b/android/TerminalApp/res/values-nb/strings.xml
index c0a84e5..7041a85 100644
--- a/android/TerminalApp/res/values-nb/strings.xml
+++ b/android/TerminalApp/res/values-nb/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Kunne ikke installere fordi wifi ikke er tilgjengelig"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installasjonen mislyktes. Prøv igjen"</string>
     <string name="action_settings" msgid="5729342767795123227">"Innstillinger"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Forbereder terminalen"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stopper terminalen"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalen krasjet"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminalen lukkes"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Tving avslutning"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> er aktivert"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langvarige oppgaver"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhendelser"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ne/strings.xml b/android/TerminalApp/res/values-ne/strings.xml
index 8cbda87..23ee146 100644
--- a/android/TerminalApp/res/values-ne/strings.xml
+++ b/android/TerminalApp/res/values-ne/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi उपलब्ध नभएकाले इन्स्टल गर्न सकिएन"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"इन्स्टल गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्"</string>
     <string name="action_settings" msgid="5729342767795123227">"सेटिङ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"टर्मिनल तयार पारिँदै छ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"टर्मिनल रोकिँदै छ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"टर्मिनल क्र्यास भयो"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"टर्मिनल एप बन्द हुँदै छ"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"बलपूर्वक बन्द गर्नुहोस्"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> अन गरिएको छ"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"लामो समयसम्म चलिरहने कार्यहरू"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"सिस्टमसम्बन्धी गतिविधिहरू"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-nl/strings.xml b/android/TerminalApp/res/values-nl/strings.xml
index 27fbc26..f6c0c7b 100644
--- a/android/TerminalApp/res/values-nl/strings.xml
+++ b/android/TerminalApp/res/values-nl/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Kan niet installeren omdat wifi niet beschikbaar is"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installatie mislukt. Probeer het opnieuw."</string>
     <string name="action_settings" msgid="5729342767795123227">"Instellingen"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal voorbereiden"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal stoppen"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal gecrasht"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal wordt gesloten"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Geforceerd sluiten"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> staat aan"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Langlopende taken"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systeemgebeurtenissen"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-or/strings.xml b/android/TerminalApp/res/values-or/strings.xml
index 034849f..5918183 100644
--- a/android/TerminalApp/res/values-or/strings.xml
+++ b/android/TerminalApp/res/values-or/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ନଥିବା ଯୋଗୁଁ ଇନଷ୍ଟଲ କରିବାରେ ବିଫଳ ହୋଇଛି"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ଇନଷ୍ଟଲ କରିବାରେ ବିଫଳ ହୋଇଛି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="action_settings" msgid="5729342767795123227">"ସେଟିଂସ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ଟର୍ମିନାଲକୁ ପ୍ରସ୍ତୁତ କରାଯାଉଛି"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminalକୁ ବନ୍ଦ କରାଯାଉଛି"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ଟର୍ମିନାଲ କ୍ରାସ ହୋଇଛି"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ଟର୍ମିନାଲ ବନ୍ଦ ହେବାକୁ ଯାଉଛି"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ଫୋର୍ସ କ୍ଲୋଜ କରନ୍ତୁ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>କୁ ସକ୍ଷମ କରାଯାଇଛି"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ଅଧିକ ସମୟ ଚାଲୁଥିବା ଟାସ୍କ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ସିଷ୍ଟମ ଇଭେଣ୍ଟ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-pa/strings.xml b/android/TerminalApp/res/values-pa/strings.xml
index b6af472..904f0e2 100644
--- a/android/TerminalApp/res/values-pa/strings.xml
+++ b/android/TerminalApp/res/values-pa/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ਵਾਈ-ਫਾਈ ਉਪਲਬਧ ਨਾ ਹੋਣ ਕਰਕੇ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="action_settings" msgid="5729342767795123227">"ਸੈਟਿੰਗਾਂ"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ਟਰਮੀਨਲ ਨੂੰ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ਟਰਮੀਨਲ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ਟਰਮੀਨਲ ਕ੍ਰੈਸ਼ ਹੋ ਗਿਆ"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ਟਰਮੀਨਲ ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ਚਾਲੂ ਹੈ"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਚੱਲਣ ਵਾਲੇ ਕਾਰਜ"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"ਸਿਸਟਮ ਇਵੈਂਟ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-pl/strings.xml b/android/TerminalApp/res/values-pl/strings.xml
index 92a6dea..fc2c879 100644
--- a/android/TerminalApp/res/values-pl/strings.xml
+++ b/android/TerminalApp/res/values-pl/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Nie udało się zainstalować, ponieważ Wi-Fi jest niedostępne"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Nie udało się zainstalować. Spróbuj jeszcze raz"</string>
     <string name="action_settings" msgid="5729342767795123227">"Ustawienia"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Przygotowuję terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Zatrzymuję terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal uległ awarii"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal się zamyka"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Wymuś zamknięcie"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Układ <xliff:g id="ID_1">VirGL</xliff:g> jest włączony"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Długotrwałe zadania"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Zdarzenia systemowe"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-pt-rPT/strings.xml b/android/TerminalApp/res/values-pt-rPT/strings.xml
index 337e355..b1660e5 100644
--- a/android/TerminalApp/res/values-pt-rPT/strings.xml
+++ b/android/TerminalApp/res/values-pt-rPT/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Falha ao instalar porque o Wi-Fi não está disponível"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Falha ao instalar. Tente novamente"</string>
     <string name="action_settings" msgid="5729342767795123227">"Definições"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"A preparar o terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"A parar o terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"O terminal falhou"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"A app Terminal está a ser fechada"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forçar fecho"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"A <xliff:g id="ID_1">VirGL</xliff:g> está ativada"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duração"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-pt/strings.xml b/android/TerminalApp/res/values-pt/strings.xml
index b223c9f..6afd19a 100644
--- a/android/TerminalApp/res/values-pt/strings.xml
+++ b/android/TerminalApp/res/values-pt/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Falha ao instalar porque o Wi-Fi não está disponível"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Falha ao instalar. Tente de novo"</string>
     <string name="action_settings" msgid="5729342767795123227">"Configurações"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Preparando o terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Interrompendo o terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"O terminal falhou"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"O terminal está fechando"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forçar fechamento"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"O <xliff:g id="ID_1">VirGL</xliff:g> está ativado"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tarefas de longa duração"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Eventos do sistema"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ro/strings.xml b/android/TerminalApp/res/values-ro/strings.xml
index 9cfa4bc..cd8697f 100644
--- a/android/TerminalApp/res/values-ro/strings.xml
+++ b/android/TerminalApp/res/values-ro/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Nu s-a putut instala deoarece nu este disponibilă o conexiune Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Nu s-a instalat. Încearcă din nou."</string>
     <string name="action_settings" msgid="5729342767795123227">"Setări"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Se pregătește terminalul"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Se oprește terminalul"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalul s-a blocat"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminalul se închide"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Forțează închiderea"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> este activat"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Activități de durată"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Evenimente de sistem"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ru/strings.xml b/android/TerminalApp/res/values-ru/strings.xml
index c3dfec3..036baea 100644
--- a/android/TerminalApp/res/values-ru/strings.xml
+++ b/android/TerminalApp/res/values-ru/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Не удалось выполнить установку, так как сеть Wi-Fi недоступна."</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Сбой установки. Повторите попытку."</string>
     <string name="action_settings" msgid="5729342767795123227">"Настройки"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминал подготавливается."</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Работа терминала останавливается."</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Произошел сбой терминала."</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминал закрывается"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Закрыть принудительно"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g>: включено."</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Длительные задачи"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системные события"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-si/strings.xml b/android/TerminalApp/res/values-si/strings.xml
index 1b4ffc3..8987cac 100644
--- a/android/TerminalApp/res/values-si/strings.xml
+++ b/android/TerminalApp/res/values-si/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi නොමැති නිසා ස්ථාපනය කිරීමට අසමත් විය"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ස්ථාපනය කිරීමට අසමත් විය. නැවත උත්සාහ කරන්න"</string>
     <string name="action_settings" msgid="5729342767795123227">"සැකසීම්"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ටර්මිනලය සූදානම් කිරීම"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ටර්මිනලය නතර කිරීම"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ටර්මිනලය බිඳ වැටුණි"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ටර්මිනලය වැසෙමින් පවතී"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"බලෙන් වසන්න"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> සබලයි"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"දිගු කාලයක් ධාවනය වන කාර්යයන්"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"පද්ධති සිදුවීම්"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sk/strings.xml b/android/TerminalApp/res/values-sk/strings.xml
index d77433e..b975f75 100644
--- a/android/TerminalApp/res/values-sk/strings.xml
+++ b/android/TerminalApp/res/values-sk/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Inštalácia sa nepodarila, pretože nie je k dispozícii Wi‑Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Nepodarilo sa nainštalovať. Skúste to znova."</string>
     <string name="action_settings" msgid="5729342767795123227">"Nastavenia"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminál sa pripravuje"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminál sa zastavuje"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminál spadol"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminál sa zatvára"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Vynútiť zavretie"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Procesor <xliff:g id="ID_1">VirGL</xliff:g> je aktivovaný"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dlho spustené úlohy"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systémové udalosti"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sl/strings.xml b/android/TerminalApp/res/values-sl/strings.xml
index 0583a0f..bd20f4e 100644
--- a/android/TerminalApp/res/values-sl/strings.xml
+++ b/android/TerminalApp/res/values-sl/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Namestitev ni uspela, ker Wi-Fi ni na voljo"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Namestitev ni uspela. Poskusite znova."</string>
     <string name="action_settings" msgid="5729342767795123227">"Nastavitve"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Pripravljanje terminala"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Ustavljanje terminala"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal se je zrušil"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal se zapira"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Vsili zapiranje"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> je omogočen"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Dolgotrajna opravila"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistemski dogodki"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sq/strings.xml b/android/TerminalApp/res/values-sq/strings.xml
index 3bac355..efcecc9 100644
--- a/android/TerminalApp/res/values-sq/strings.xml
+++ b/android/TerminalApp/res/values-sq/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Instalimi dështoi për shkak se Wi-Fi nuk ofrohet"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Instalimi dështoi. Provo përsëri"</string>
     <string name="action_settings" msgid="5729342767795123227">"Cilësimet"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminali po përgatitet"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminali po ndalohet"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminali u ndërpre aksidentalisht"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"\"Terminali\" po mbyllet"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Ndalo me forcë"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> është aktivizuar"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Detyrat afatgjata"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Ngjarjet e sistemit"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sr/strings.xml b/android/TerminalApp/res/values-sr/strings.xml
index 97a2e4b..41d8d84 100644
--- a/android/TerminalApp/res/values-sr/strings.xml
+++ b/android/TerminalApp/res/values-sr/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Инсталирање није успело јер WiFi није доступан"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Инсталирање није успело. Пробајте поново"</string>
     <string name="action_settings" msgid="5729342767795123227">"Подешавања"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Терминал се припрема"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Терминал се зауставља"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Терминал је отказао"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Терминал се затвара"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Принудно затвори"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> је омогућен"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Дуготрајни задаци"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Системски догађаји"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sv/strings.xml b/android/TerminalApp/res/values-sv/strings.xml
index 3b1b4f0..9829814 100644
--- a/android/TerminalApp/res/values-sv/strings.xml
+++ b/android/TerminalApp/res/values-sv/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Det gick inte att installera eftersom att wifi inte är tillgängligt"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Installationen misslyckades. Försök igen"</string>
     <string name="action_settings" msgid="5729342767795123227">"Inställningar"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminalen förbereds"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Stoppar terminalen"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminalen kraschade"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminalen stängs av"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Tvinga avstängning"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> har aktiverats"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Långvariga uppgifter"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Systemhändelser"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-sw/strings.xml b/android/TerminalApp/res/values-sw/strings.xml
index c8ffd12..2da2dbf 100644
--- a/android/TerminalApp/res/values-sw/strings.xml
+++ b/android/TerminalApp/res/values-sw/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Imeshindwa kuweka kwenye kifaa kwa sababu Wi-Fi haipatikani"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Imeshindwa kuweka kwenye kifaa. Tafadhali jaribu tena"</string>
     <string name="action_settings" msgid="5729342767795123227">"Mipangilio"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Inaandaa temino"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Inafunga temino"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Temino imeacha kufanya kazi"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Kituo kinafungwa"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Lazimisha kufunga"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> imewashwa"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Majukumu yanayodumu zaidi"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Matukio ya mfumo"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ta/strings.xml b/android/TerminalApp/res/values-ta/strings.xml
index 44d0fad..b6e7715 100644
--- a/android/TerminalApp/res/values-ta/strings.xml
+++ b/android/TerminalApp/res/values-ta/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"வைஃபை கிடைக்காததால் நிறுவ முடியவில்லை"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"நிறுவ முடியவில்லை. மீண்டும் முயலவும்."</string>
     <string name="action_settings" msgid="5729342767795123227">"அமைப்புகள்"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"டெர்மினலைத் தயார்செய்கிறது"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"டெர்மினல் நிறுத்தப்படுகிறது"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"டெர்மினல் சிதைவடைந்தது"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"டெர்மினல் மூடப்படுகிறது"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"உடனே மூடு"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> இயக்கப்பட்டது"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"நீண்ட நேரம் இயங்கும் பணிகள்"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"சிஸ்டம் நிகழ்வுகள்"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-te/strings.xml b/android/TerminalApp/res/values-te/strings.xml
index 6a3d646..fd48d50 100644
--- a/android/TerminalApp/res/values-te/strings.xml
+++ b/android/TerminalApp/res/values-te/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi అందుబాటులో లేని కారణంగా ఇన్‌స్టాల్ చేయడం విఫలమైంది"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ఇన్‌స్టాల్ చేయడం విఫలమైంది. దయచేసి మళ్లీ ట్రై చేయండి"</string>
     <string name="action_settings" msgid="5729342767795123227">"సెట్టింగ్‌లు"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"టెర్మినల్‌ను సిద్ధం చేస్తోంది"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"టెర్మినల్‌ను ఆపివేస్తోంది"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"టెర్మినల్ క్రాష్ అయింది"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal మూసివేయబడుతోంది"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"బలవంతంగా మూసివేయండి"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> ప్రారంభించబడింది"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"ఎక్కువసేపు రన్ అయ్యే టాస్క్‌లు"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"సిస్టమ్ ఈవెంట్‌లు"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-th/strings.xml b/android/TerminalApp/res/values-th/strings.xml
index 66716ec..6ff2595 100644
--- a/android/TerminalApp/res/values-th/strings.xml
+++ b/android/TerminalApp/res/values-th/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"ติดตั้งไม่สำเร็จเนื่องจากไม่มี Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"ติดตั้งไม่สำเร็จ โปรดลองอีกครั้ง"</string>
     <string name="action_settings" msgid="5729342767795123227">"การตั้งค่า"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"กำลังเตรียมเทอร์มินัล"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"กำลังหยุดเทอร์มินัล"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"เทอร์มินัลขัดข้อง"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"เทอร์มินัลกำลังจะปิด"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"บังคับปิด"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"เปิดใช้งาน <xliff:g id="ID_1">VirGL</xliff:g> แล้ว"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"งานที่ใช้เวลานาน"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"เหตุการณ์ของระบบ"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-tl/strings.xml b/android/TerminalApp/res/values-tl/strings.xml
index 56b2679..16be869 100644
--- a/android/TerminalApp/res/values-tl/strings.xml
+++ b/android/TerminalApp/res/values-tl/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Hindi na-install dahil walang Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Hindi na-install. Pakisubukan ulit"</string>
     <string name="action_settings" msgid="5729342767795123227">"Mga Setting"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Inihahanda ang terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Hinihinto ang terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Nag-crash ang terminal"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Nagsasara ang terminal"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Sapilitang isara"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"Na-enable ang <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Mga gawaing matagal gawin"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Mga event ng system"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-tr/strings.xml b/android/TerminalApp/res/values-tr/strings.xml
index 4374923..30cf1a1 100644
--- a/android/TerminalApp/res/values-tr/strings.xml
+++ b/android/TerminalApp/res/values-tr/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Kablosuz bağlantı olmadığından yükleme işlemi başarısız oldu"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Yüklenemedi. Lütfen tekrar deneyin"</string>
     <string name="action_settings" msgid="5729342767795123227">"Ayarlar"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal hazırlanıyor"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal durduruluyor"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal kilitlendi"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal kapanıyor"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Uygulamayı kapat"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> etkinleştirildi"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzun süredir çalışan görevler"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sistem etkinlikleri"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-uk/strings.xml b/android/TerminalApp/res/values-uk/strings.xml
index bd2d574..748b3a5 100644
--- a/android/TerminalApp/res/values-uk/strings.xml
+++ b/android/TerminalApp/res/values-uk/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Не вдалося встановити, оскільки немає Wi-Fi-з’єднання"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Не вдалося встановити. Повторіть спробу."</string>
     <string name="action_settings" msgid="5729342767795123227">"Налаштування"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Підготовка термінала"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Зупинка термінала"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Збій термінала"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Термінал закривається"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Примусово закрити"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> увімкнено"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Довготривалі завдання"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Події системи"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-ur/strings.xml b/android/TerminalApp/res/values-ur/strings.xml
index 3ad7c39..e5552c3 100644
--- a/android/TerminalApp/res/values-ur/strings.xml
+++ b/android/TerminalApp/res/values-ur/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"‫Wi-Fi دستیاب نہ ہونے کی وجہ سے انسٹال نہیں کیا جا سکا"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"انسٹال نہیں کیا جا سکا۔ براہ کرم دوبارہ کوشش کریں"</string>
     <string name="action_settings" msgid="5729342767795123227">"ترتیبات"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"ٹرمینل تیار ہو رہا ہے"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"ٹرمینل کو روکا جا رہا ہے"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"ٹرمینل کریش ہو گیا"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"ٹرمینل بند ہو رہا ہے"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"زبردستی بند کریں"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"‫<xliff:g id="ID_1">VirGL</xliff:g> فعال ہے"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"لمبے وقت تک چلنے والے ٹاسکس"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"سسٹم ایونٹس"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-uz/strings.xml b/android/TerminalApp/res/values-uz/strings.xml
index 159d04c..85ce628 100644
--- a/android/TerminalApp/res/values-uz/strings.xml
+++ b/android/TerminalApp/res/values-uz/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Wi-Fi mavjud emasligi sababli oʻrnatilmadi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Oʻrnatilmadi. Qayta urining"</string>
     <string name="action_settings" msgid="5729342767795123227">"Sozlamalar"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Terminal tayyorlanmoqda"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Terminal toʻxtatilmoqda"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal ishdan chiqdi"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal yopilmoqda"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Majburiy yopish"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> yoniq"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Uzoq davom etuvchi vazifalar"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Tizim tadbirlari"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-vi/strings.xml b/android/TerminalApp/res/values-vi/strings.xml
index d7d6c93..de91f41 100644
--- a/android/TerminalApp/res/values-vi/strings.xml
+++ b/android/TerminalApp/res/values-vi/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Không cài đặt được do không có Wi-Fi"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Không cài đặt được. Vui lòng thử lại"</string>
     <string name="action_settings" msgid="5729342767795123227">"Cài đặt"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Đang chuẩn bị Terminal"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Đang dừng Terminal"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Terminal gặp sự cố"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Terminal đang đóng"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Buộc đóng"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> đã được bật"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Tác vụ chạy trong thời gian dài"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Sự kiện hệ thống"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-zh-rCN/strings.xml b/android/TerminalApp/res/values-zh-rCN/strings.xml
index 31cf746..c7ae604 100644
--- a/android/TerminalApp/res/values-zh-rCN/strings.xml
+++ b/android/TerminalApp/res/values-zh-rCN/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"由于 WLAN 不可用,安装失败"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"安装失败,请重试"</string>
     <string name="action_settings" msgid="5729342767795123227">"设置"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"正在准备终端"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"正在停止终端"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"终端已崩溃"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"终端即将关闭"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"强行关闭"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> 已启用"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"长时间运行的任务"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"系统事件"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-zh-rHK/strings.xml b/android/TerminalApp/res/values-zh-rHK/strings.xml
index 1284ecc..8cb447e 100644
--- a/android/TerminalApp/res/values-zh-rHK/strings.xml
+++ b/android/TerminalApp/res/values-zh-rHK/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"由於沒有可用的 Wi-Fi,因此無法安裝"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"無法安裝,請再試一次"</string>
     <string name="action_settings" msgid="5729342767795123227">"設定"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"正在準備終端機"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"正在停止終端機"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"終端機當機"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"終端機正在關閉"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"強制關閉"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"已啟用 <xliff:g id="ID_1">VirGL</xliff:g>"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間執行的工作"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"系統活動"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-zh-rTW/strings.xml b/android/TerminalApp/res/values-zh-rTW/strings.xml
index 7391300..bab47d3 100644
--- a/android/TerminalApp/res/values-zh-rTW/strings.xml
+++ b/android/TerminalApp/res/values-zh-rTW/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"無法連上 Wi-Fi,因此無法安裝"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"無法安裝,請再試一次"</string>
     <string name="action_settings" msgid="5729342767795123227">"設定"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"正在準備終端機"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"正在停止終端機"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"終端機當機"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"終端機正在關閉"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"強制關閉"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"<xliff:g id="ID_1">VirGL</xliff:g> 已啟用"</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"長時間執行的工作"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"系統事件"</string>
 </resources>
diff --git a/android/TerminalApp/res/values-zu/strings.xml b/android/TerminalApp/res/values-zu/strings.xml
index 4036ec1..111db1a 100644
--- a/android/TerminalApp/res/values-zu/strings.xml
+++ b/android/TerminalApp/res/values-zu/strings.xml
@@ -33,6 +33,8 @@
     <string name="installer_error_no_wifi" msgid="1180164894845030969">"Yehlulekile ukufaka ngoba i-Wi-Fi ayitholakali"</string>
     <string name="installer_error_unknown" msgid="5657920711470180224">"Yehlulekile ukufaka. Sicela uzame futhi"</string>
     <string name="action_settings" msgid="5729342767795123227">"Amasethingi"</string>
+    <!-- no translation found for action_display (8487008779926038139) -->
+    <skip />
     <string name="vm_creation_message" msgid="6594953532721367502">"Ilungiselela itheminali"</string>
     <string name="vm_stop_message" msgid="3978349856095529255">"Itheminali yokumisa"</string>
     <string name="vm_error_message" msgid="5231867246177661525">"Itheminali iphahlazekile"</string>
@@ -87,4 +89,6 @@
     <string name="service_notification_close_title" msgid="1442526433361428844">"Itheminali iyavalwa"</string>
     <string name="service_notification_force_quit_action" msgid="3462226330416157775">"Phoqelela ukuvala"</string>
     <string name="virgl_enabled" msgid="5242525588039698086">"I-<xliff:g id="ID_1">VirGL</xliff:g> inikwe amandla."</string>
+    <string name="notification_channel_long_running_name" msgid="7916541360369402952">"Imisebenzi esebenza isikhathi eside"</string>
+    <string name="notification_channel_system_events_name" msgid="1004951444029742137">"Imicimbi yesistimu"</string>
 </resources>
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index bdebb83..44009c3 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -55,6 +55,9 @@
     <!-- Action bar icon name for the settings view CHAR LIMIT=none] -->
     <string name="action_settings">Settings</string>
 
+    <!-- Action bar icon name for showing the display activity CHAR LIMIT=none] -->
+    <string name="action_display">Display</string>
+
     <!-- Toast message to notify that preparing terminal to start [CHAR LIMIT=none] -->
     <string name="vm_creation_message">Preparing terminal</string>
     <!-- Toast message to notify that terminal is stopping [CHAR LIMIT=none] -->
diff --git a/android/TerminalApp/res/values/styles.xml b/android/TerminalApp/res/values/styles.xml
index 3fb8e7d..13f070f 100644
--- a/android/TerminalApp/res/values/styles.xml
+++ b/android/TerminalApp/res/values/styles.xml
@@ -27,4 +27,15 @@
     <style name="VmTerminalAppTheme" parent="@style/Theme.Material3.DayNight.NoActionBar">
         <item name="android:windowLightStatusBar" tools:targetApi="m">?android:attr/isLightTheme</item>
     </style>
+    <style name="FullscreenTheme" parent="@style/Theme.Material3.DayNight.NoActionBar">
+        <item name="android:navigationBarColor">
+            @android:color/transparent
+        </item>
+        <item name="android:statusBarColor">
+            @android:color/transparent
+        </item>
+        <item name="android:windowLayoutInDisplayCutoutMode">
+            always
+        </item>
+    </style>
 </resources>
diff --git a/build/debian/build.sh b/build/debian/build.sh
index a426d22..48459a2 100755
--- a/build/debian/build.sh
+++ b/build/debian/build.sh
@@ -218,35 +218,49 @@
 		return
 	fi
 
+	local deb_base_url="https://deb.debian.org/debian"
+	local deb_security_base_url="https://security.debian.org/debian-security"
+
+	local pool_dir="pool/main/l/linux"
+	local ksrc_base_url="${deb_base_url}/${pool_dir}"
+	local ksrc_security_base_url="${deb_security_base_url}/${pool_dir}"
+
 	# NOTE: 6.1 is the latest LTS kernel for which Debian's kernel build scripts
 	#       work on Python 3.10, the default version on our Ubuntu 22.04 builders.
 	local debian_kver="6.1.119-1"
-	local custom_flavour="avf"
-	local ksrc_base_url="https://deb.debian.org/debian/pool/main/l/linux"
 
-	local dsc_url="${ksrc_base_url}/linux_${debian_kver}.dsc"
-	local debian_ksrc_url="${ksrc_base_url}/linux_${debian_kver}.debian.tar.xz"
-	local orig_ksrc_url="${ksrc_base_url}/linux_${debian_kver%-*}.orig.tar.xz"
+	local dsc_file="linux_${debian_kver}.dsc"
+	local orig_ksrc_file="linux_${debian_kver%-*}.orig.tar.xz"
+	local debian_ksrc_file="linux_${debian_kver}.debian.tar.xz"
 
 	# 0. Grab the kernel sources, and the latest debian keyrings
 	mkdir -p "${workdir}/kernel"
 	pushd "${workdir}/kernel" > /dev/null
-	wget "$dsc_url"
-	wget "$orig_ksrc_url"
-	wget "$debian_ksrc_url"
+
+	wget "${ksrc_security_base_url}/${dsc_file}" || \
+	wget "${ksrc_base_url}/${dsc_file}"
+
+	wget "${ksrc_security_base_url}/${orig_ksrc_file}" || \
+	wget "${ksrc_base_url}/${orig_ksrc_file}"
+
+	wget "${ksrc_security_base_url}/${debian_ksrc_file}" || \
+	wget "${ksrc_base_url}/${debian_ksrc_file}"
+
 	rsync -az --progress keyring.debian.org::keyrings/keyrings/ /usr/share/keyrings/
 
 	# 1. Verify, extract and merge patches into the original kernel sources
 	dpkg-source --require-strong-checksums \
 	            --require-valid-signature \
-	            --extract linux_${debian_kver}.dsc
+	            --extract "${dsc_file}"
 	pushd "linux-${debian_kver%-*}" > /dev/null
 	# TODO: Copy our own kernel patches to debian/patches
 	#       and add patch file names in the desired order to debian/patches/series
 	./debian/rules orig
 
-	local abi_kver="$(sed -nE 's;Package: linux-support-(.*);\1;p' debian/control)"
+	local custom_flavour="avf"
 	local debarch_flavour="${custom_flavour}-${debian_arch}"
+
+	local abi_kver="$(sed -nE 's;Package: linux-support-(.*);\1;p' debian/control)"
 	local abi_flavour="${abi_kver}-${debarch_flavour}"
 
 	# 2. Define our custom flavour and regenerate control file
diff --git a/build/debian/fai_config/package_config/AVF b/build/debian/fai_config/package_config/AVF
index 98b558b..bf51fdb 100644
--- a/build/debian/fai_config/package_config/AVF
+++ b/build/debian/fai_config/package_config/AVF
@@ -8,3 +8,5 @@
 forwarder-guest
 forwarder-guest-launcher
 shutdown-runner
+weston
+xwayland
diff --git a/guest/apkdmverity/src/main.rs b/guest/apkdmverity/src/main.rs
index d2f88ae..2fc964b 100644
--- a/guest/apkdmverity/src/main.rs
+++ b/guest/apkdmverity/src/main.rs
@@ -27,6 +27,7 @@
 use apkverify::{HashAlgorithm, V4Signature};
 use clap::{arg, Arg, ArgAction, Command};
 use dm::loopdevice;
+use dm::loopdevice::LoopConfigOptions;
 use dm::util;
 use dm::verity::{DmVerityHashAlgorithm, DmVerityTargetBuilder};
 use itertools::Itertools;
@@ -109,9 +110,13 @@
         }
         (
             loopdevice::attach(
-                &apk, 0, apk_size, /* direct_io */ true, /* writable */ false,
+                &apk,
+                0,
+                apk_size,
+                &LoopConfigOptions { direct_io: true, ..Default::default() },
             )
-            .context("Failed to attach APK to a loop device")?,
+            .context("Failed to attach APK to a loop device")?
+            .path,
             apk_size,
         )
     };
@@ -125,10 +130,9 @@
     // Due to unknown reason(b/191344832), we can't enable "direct IO" for the IDSIG file (backing
     // the hash). For now we don't use "direct IO" but it seems OK since the IDSIG file is very
     // small and the benefit of direct-IO would be negliable.
-    let hash_device = loopdevice::attach(
-        &idsig, offset, size, /* direct_io */ false, /* writable */ false,
-    )
-    .context("Failed to attach idsig to a loop device")?;
+    let hash_device = loopdevice::attach(&idsig, offset, size, &LoopConfigOptions::default())
+        .context("Failed to attach idsig to a loop device")?
+        .path;
 
     // Build a dm-verity target spec from the information from the idsig file. The apk and the
     // idsig files are used as the data device and the hash device, respectively.
@@ -347,18 +351,17 @@
         // of the data device is done in the scopeguard for the return value of `enable_verity`
         // below. Only the idsig_loop_device needs detatching.
         let apk_loop_device = loopdevice::attach(
-            &apk_path, 0, apk_size, /* direct_io */ true, /* writable */ false,
+            &apk_path,
+            0,
+            apk_size,
+            &LoopConfigOptions { direct_io: true, ..Default::default() },
         )
-        .unwrap();
+        .unwrap()
+        .path;
         let idsig_loop_device = scopeguard::guard(
-            loopdevice::attach(
-                &idsig_path,
-                0,
-                idsig_size,
-                /* direct_io */ false,
-                /* writable */ false,
-            )
-            .unwrap(),
+            loopdevice::attach(&idsig_path, 0, idsig_size, &LoopConfigOptions::default())
+                .unwrap()
+                .path,
             |dev| loopdevice::detach(dev).unwrap(),
         );
 
diff --git a/guest/microdroid_launcher/Android.bp b/guest/microdroid_launcher/Android.bp
index 42c18cb..893ee98 100644
--- a/guest/microdroid_launcher/Android.bp
+++ b/guest/microdroid_launcher/Android.bp
@@ -12,5 +12,10 @@
         "libdl_android",
         "liblog",
     ],
+    static_libs: [
+        "libapexutil",
+        "libprotobuf-cpp-lite",
+        "lib_apex_manifest_proto_lite",
+    ],
     header_libs: ["vm_payload_headers"],
 }
diff --git a/guest/microdroid_launcher/main.cpp b/guest/microdroid_launcher/main.cpp
index 5ae9956..8e3d4e4 100644
--- a/guest/microdroid_launcher/main.cpp
+++ b/guest/microdroid_launcher/main.cpp
@@ -16,7 +16,9 @@
 
 #include <android-base/logging.h>
 #include <android-base/result.h>
+#include <android-base/strings.h>
 #include <android/dlext.h>
+#include <apexutil.h>
 #include <dlfcn.h>
 
 #include <cstdlib>
@@ -25,8 +27,11 @@
 
 #include "vm_main.h"
 
+using android::apex::GetActivePackages;
 using android::base::Error;
+using android::base::Join;
 using android::base::Result;
+using android::base::StringReplace;
 
 extern "C" {
 enum {
@@ -43,6 +48,8 @@
 extern bool android_link_namespaces(struct android_namespace_t* from,
                                     struct android_namespace_t* to,
                                     const char* shared_libs_sonames);
+
+extern struct android_namespace_t* android_get_exported_namespace(const char* name);
 } // extern "C"
 
 static Result<void*> load(const std::string& libname);
@@ -108,6 +115,32 @@
         return Error() << "Failed to link namespace: " << dlerror();
     }
 
+    // Make libraries provided by APEXes available to the payload
+    for (const auto& [_path, manifest] : GetActivePackages("/apex")) {
+        std::string namespace_name = StringReplace(manifest.name(), ".", "_", /* all */ true);
+        android_namespace_t* apex_ns = android_get_exported_namespace(namespace_name.c_str());
+        if (apex_ns == nullptr) {
+            // This means the namespace is configured as 'visible=false'. We can't link to an
+            // invisible namespace.
+            continue;
+        }
+
+        std::vector<std::string> libs = {manifest.providenativelibs().begin(),
+                                         manifest.providenativelibs().end()};
+        if (libs.size() == 0) {
+            continue;
+        }
+        std::string shared_lib_sonames = Join(libs, ':');
+
+        if (!android_link_namespaces(new_ns, apex_ns, shared_lib_sonames.c_str())) {
+            return Error() << "Failed to link APEX namespace " << namespace_name << ": "
+                           << dlerror();
+        }
+
+        LOG(INFO) << "Linked APEX namespace " << namespace_name << " with shared libs "
+                  << shared_lib_sonames;
+    }
+
     const android_dlextinfo info = {
             .flags = ANDROID_DLEXT_USE_NAMESPACE,
             .library_namespace = new_ns,
diff --git a/guest/microdroid_manager/src/vm_secret.rs b/guest/microdroid_manager/src/vm_secret.rs
index 56b3482..5999122 100644
--- a/guest/microdroid_manager/src/vm_secret.rs
+++ b/guest/microdroid_manager/src/vm_secret.rs
@@ -171,7 +171,11 @@
             return Err(anyhow!("Rollback protected data is not available with V1 secrets"));
         };
         let payload_id = sha::sha512(instance_id);
-        secretkeeper_session.get_secret(payload_id)
+        secretkeeper_session.get_secret(payload_id).or_else(|e| {
+            log::info!("Secretkeeper get failed with {e:?}. Refreshing connection & retrying!");
+            secretkeeper_session.refresh()?;
+            secretkeeper_session.get_secret(payload_id)
+        })
     }
 
     pub fn write_payload_data_rp(&self, data: &[u8; SECRET_SIZE]) -> Result<()> {
@@ -180,7 +184,12 @@
             return Err(anyhow!("Rollback protected data is not available with V1 secrets"));
         };
         let payload_id = sha::sha512(instance_id);
-        secretkeeper_session.store_secret(payload_id, data)
+        if let Err(e) = secretkeeper_session.store_secret(payload_id, data.clone()) {
+            log::info!("Secretkeeper store failed with {e:?}. Refreshing connection & retrying!");
+            secretkeeper_session.refresh()?;
+            secretkeeper_session.store_secret(payload_id, data)?;
+        }
+        Ok(())
     }
 }
 
@@ -276,6 +285,11 @@
         Ok(Self { session, sealing_policy })
     }
 
+    fn refresh(&self) -> Result<()> {
+        let mut session = self.session.lock().unwrap();
+        Ok(session.refresh()?)
+    }
+
     fn store_secret(&self, id: [u8; ID_SIZE], secret: Zeroizing<[u8; SECRET_SIZE]>) -> Result<()> {
         let store_request = StoreSecretRequest {
             id: Id(id),
diff --git a/guest/pvmfw/src/dice.rs b/guest/pvmfw/src/dice.rs
index 78bd6b8..4df10b3 100644
--- a/guest/pvmfw/src/dice.rs
+++ b/guest/pvmfw/src/dice.rs
@@ -156,9 +156,7 @@
     fn generate_config_descriptor(&self, instance_hash: Option<Hash>) -> Result<Vec<u8>> {
         let mut config = Vec::with_capacity(4);
         config.push((cbor!(COMPONENT_NAME_KEY)?, cbor!("vm_entry")?));
-        if cfg!(dice_changes) {
-            config.push((cbor!(SECURITY_VERSION_KEY)?, cbor!(self.security_version)?));
-        }
+        config.push((cbor!(SECURITY_VERSION_KEY)?, cbor!(self.security_version)?));
         if self.rkp_vm_marker {
             config.push((cbor!(RKP_VM_MARKER_KEY)?, Value::Null))
         }
@@ -245,14 +243,7 @@
         assert_eq!(config_map.get(&COMPONENT_NAME_KEY).unwrap().as_text().unwrap(), "vm_entry");
         assert_eq!(config_map.get(&COMPONENT_VERSION_KEY), None);
         assert_eq!(config_map.get(&RESETTABLE_KEY), None);
-        if cfg!(dice_changes) {
-            assert_eq!(
-                config_map.get(&SECURITY_VERSION_KEY).unwrap().as_integer().unwrap(),
-                42.into()
-            );
-        } else {
-            assert_eq!(config_map.get(&SECURITY_VERSION_KEY), None);
-        }
+        assert_eq!(config_map.get(&SECURITY_VERSION_KEY).unwrap().as_integer().unwrap(), 42.into());
         assert_eq!(config_map.get(&RKP_VM_MARKER_KEY), None);
     }
 
diff --git a/guest/pvmfw/src/fdt.rs b/guest/pvmfw/src/fdt.rs
index 29212f9..818d342 100644
--- a/guest/pvmfw/src/fdt.rs
+++ b/guest/pvmfw/src/fdt.rs
@@ -112,6 +112,24 @@
     Ok(None)
 }
 
+/// Read /avf/untrusted/instance-id, if present.
+pub fn read_instance_id(fdt: &Fdt) -> libfdt::Result<Option<&[u8]>> {
+    read_avf_untrusted_prop(fdt, c"instance-id")
+}
+
+/// Read /avf/untrusted/defer-rollback-protection, if present.
+pub fn read_defer_rollback_protection(fdt: &Fdt) -> libfdt::Result<Option<&[u8]>> {
+    read_avf_untrusted_prop(fdt, c"defer-rollback-protection")
+}
+
+fn read_avf_untrusted_prop<'a>(fdt: &'a Fdt, prop: &CStr) -> libfdt::Result<Option<&'a [u8]>> {
+    if let Some(node) = fdt.node(c"/avf/untrusted")? {
+        node.getprop(prop)
+    } else {
+        Ok(None)
+    }
+}
+
 fn patch_initrd_range(fdt: &mut Fdt, initrd_range: &Range<usize>) -> libfdt::Result<()> {
     let start = u32::try_from(initrd_range.start).unwrap();
     let end = u32::try_from(initrd_range.end).unwrap();
diff --git a/guest/pvmfw/src/main.rs b/guest/pvmfw/src/main.rs
index 0a3dca6..afa64e0 100644
--- a/guest/pvmfw/src/main.rs
+++ b/guest/pvmfw/src/main.rs
@@ -35,22 +35,20 @@
 use crate::bcc::Bcc;
 use crate::dice::PartialInputs;
 use crate::entry::RebootReason;
-use crate::fdt::{modify_for_next_stage, sanitize_device_tree};
+use crate::fdt::{modify_for_next_stage, read_instance_id, sanitize_device_tree};
 use crate::rollback::perform_rollback_protection;
 use alloc::borrow::Cow;
 use alloc::boxed::Box;
 use bssl_avf::Digester;
 use diced_open_dice::{bcc_handover_parse, DiceArtifacts, DiceContext, Hidden, VM_KEY_ALGORITHM};
-use libfdt::{Fdt, FdtNode};
+use libfdt::Fdt;
 use log::{debug, error, info, trace, warn};
 use pvmfw_avb::verify_payload;
 use pvmfw_avb::DebugLevel;
 use pvmfw_embedded_key::PUBLIC_KEY;
-use vmbase::fdt::pci::{PciError, PciInfo};
 use vmbase::heap;
-use vmbase::memory::{flush, init_shared_pool, SIZE_4KB};
+use vmbase::memory::{flush, SIZE_4KB};
 use vmbase::rand;
-use vmbase::virtio::pci;
 
 fn main<'a>(
     untrusted_fdt: &mut Fdt,
@@ -77,8 +75,6 @@
     })?;
     trace!("BCC: {bcc_handover:x?}");
 
-    let cdi_seal = bcc_handover.cdi_seal();
-
     let bcc = Bcc::new(bcc_handover.bcc()).map_err(|e| {
         error!("{e}");
         RebootReason::InvalidBcc
@@ -102,19 +98,8 @@
     }
 
     let guest_page_size = verified_boot_data.page_size.unwrap_or(SIZE_4KB);
-    let fdt_info = sanitize_device_tree(untrusted_fdt, vm_dtbo, vm_ref_dt, guest_page_size)?;
+    let _ = sanitize_device_tree(untrusted_fdt, vm_dtbo, vm_ref_dt, guest_page_size)?;
     let fdt = untrusted_fdt; // DT has now been sanitized.
-    let pci_info = PciInfo::from_fdt(fdt).map_err(handle_pci_error)?;
-    debug!("PCI: {:#x?}", pci_info);
-    // Set up PCI bus for VirtIO devices.
-    let mut pci_root = pci::initialize(pci_info).map_err(|e| {
-        error!("Failed to initialize PCI: {e}");
-        RebootReason::InternalError
-    })?;
-    init_shared_pool(fdt_info.swiotlb_info.fixed_range()).map_err(|e| {
-        error!("Failed to initialize shared pool: {e}");
-        RebootReason::InternalError
-    })?;
 
     let next_bcc_size = guest_page_size;
     let next_bcc = heap::aligned_boxed_slice(next_bcc_size, guest_page_size).ok_or_else(|| {
@@ -129,13 +114,12 @@
         RebootReason::InternalError
     })?;
 
-    let instance_hash = Some(salt_from_instance_id(fdt)?);
+    let instance_hash = salt_from_instance_id(fdt)?;
     let (new_instance, salt, defer_rollback_protection) = perform_rollback_protection(
         fdt,
         &verified_boot_data,
         &dice_inputs,
-        &mut pci_root,
-        cdi_seal,
+        bcc_handover.cdi_seal(),
         instance_hash,
     )?;
     trace!("Got salt for instance: {salt:x?}");
@@ -204,8 +188,14 @@
 
 // Get the "salt" which is one of the input for DICE derivation.
 // This provides differentiation of secrets for different VM instances with same payloads.
-fn salt_from_instance_id(fdt: &Fdt) -> Result<Hidden, RebootReason> {
-    let id = instance_id(fdt)?;
+fn salt_from_instance_id(fdt: &Fdt) -> Result<Option<Hidden>, RebootReason> {
+    let Some(id) = read_instance_id(fdt).map_err(|e| {
+        error!("Failed to get instance-id in DT: {e}");
+        RebootReason::InvalidFdt
+    })?
+    else {
+        return Ok(None);
+    };
     let salt = Digester::sha512()
         .digest(&[&b"InstanceId:"[..], id].concat())
         .map_err(|e| {
@@ -214,46 +204,5 @@
         })?
         .try_into()
         .map_err(|_| RebootReason::InternalError)?;
-    Ok(salt)
-}
-
-fn instance_id(fdt: &Fdt) -> Result<&[u8], RebootReason> {
-    let node = avf_untrusted_node(fdt)?;
-    let id = node.getprop(c"instance-id").map_err(|e| {
-        error!("Failed to get instance-id in DT: {e}");
-        RebootReason::InvalidFdt
-    })?;
-    id.ok_or_else(|| {
-        error!("Missing instance-id");
-        RebootReason::InvalidFdt
-    })
-}
-
-fn avf_untrusted_node(fdt: &Fdt) -> Result<FdtNode, RebootReason> {
-    let node = fdt.node(c"/avf/untrusted").map_err(|e| {
-        error!("Failed to get /avf/untrusted node: {e}");
-        RebootReason::InvalidFdt
-    })?;
-    node.ok_or_else(|| {
-        error!("/avf/untrusted node is missing in DT");
-        RebootReason::InvalidFdt
-    })
-}
-
-/// Logs the given PCI error and returns the appropriate `RebootReason`.
-fn handle_pci_error(e: PciError) -> RebootReason {
-    error!("{}", e);
-    match e {
-        PciError::FdtErrorPci(_)
-        | PciError::FdtNoPci
-        | PciError::FdtErrorReg(_)
-        | PciError::FdtMissingReg
-        | PciError::FdtRegEmpty
-        | PciError::FdtRegMissingSize
-        | PciError::CamWrongSize(_)
-        | PciError::FdtErrorRanges(_)
-        | PciError::FdtMissingRanges
-        | PciError::RangeAddressMismatch { .. }
-        | PciError::NoSuitableRange => RebootReason::InvalidFdt,
-    }
+    Ok(Some(salt))
 }
diff --git a/guest/pvmfw/src/rollback.rs b/guest/pvmfw/src/rollback.rs
index f7723d7..74b2cd8 100644
--- a/guest/pvmfw/src/rollback.rs
+++ b/guest/pvmfw/src/rollback.rs
@@ -16,16 +16,20 @@
 
 use crate::dice::PartialInputs;
 use crate::entry::RebootReason;
+use crate::fdt::read_defer_rollback_protection;
 use crate::instance::EntryBody;
 use crate::instance::Error as InstanceError;
 use crate::instance::{get_recorded_entry, record_instance_entry};
 use diced_open_dice::Hidden;
-use libfdt::{Fdt, FdtNode};
+use libfdt::Fdt;
 use log::{error, info};
 use pvmfw_avb::Capability;
 use pvmfw_avb::VerifiedBootData;
 use virtio_drivers::transport::pci::bus::PciRoot;
+use vmbase::fdt::{pci::PciInfo, SwiotlbInfo};
+use vmbase::memory::init_shared_pool;
 use vmbase::rand;
+use vmbase::virtio::pci;
 
 /// Performs RBP based on the input payload, current DICE chain, and host-controlled platform.
 ///
@@ -37,7 +41,6 @@
     fdt: &Fdt,
     verified_boot_data: &VerifiedBootData,
     dice_inputs: &PartialInputs,
-    pci_root: &mut PciRoot,
     cdi_seal: &[u8],
     instance_hash: Option<Hidden>,
 ) -> Result<(bool, Hidden, bool), RebootReason> {
@@ -53,7 +56,7 @@
         skip_rollback_protection()?;
         Ok((false, instance_hash.unwrap(), false))
     } else {
-        perform_legacy_rollback_protection(dice_inputs, pci_root, cdi_seal, instance_hash)
+        perform_legacy_rollback_protection(fdt, dice_inputs, cdi_seal, instance_hash)
     }
 }
 
@@ -92,17 +95,18 @@
 
 /// Performs RBP using instance.img where updates require clearing old entries, causing new CDIs.
 fn perform_legacy_rollback_protection(
+    fdt: &Fdt,
     dice_inputs: &PartialInputs,
-    pci_root: &mut PciRoot,
     cdi_seal: &[u8],
     instance_hash: Option<Hidden>,
 ) -> Result<(bool, Hidden, bool), RebootReason> {
     info!("Fallback to instance.img based rollback checks");
-    let (recorded_entry, mut instance_img, header_index) = get_recorded_entry(pci_root, cdi_seal)
-        .map_err(|e| {
-        error!("Failed to get entry from instance.img: {e}");
-        RebootReason::InternalError
-    })?;
+    let mut pci_root = initialize_instance_img_device(fdt)?;
+    let (recorded_entry, mut instance_img, header_index) =
+        get_recorded_entry(&mut pci_root, cdi_seal).map_err(|e| {
+            error!("Failed to get entry from instance.img: {e}");
+            RebootReason::InternalError
+        })?;
     let (new_instance, salt) = if let Some(entry) = recorded_entry {
         check_dice_measurements_match_entry(dice_inputs, &entry)?;
         let salt = instance_hash.unwrap_or(entry.salt);
@@ -155,24 +159,34 @@
 }
 
 fn should_defer_rollback_protection(fdt: &Fdt) -> Result<bool, RebootReason> {
-    let node = avf_untrusted_node(fdt)?;
-    let defer_rbp = node
-        .getprop(c"defer-rollback-protection")
-        .map_err(|e| {
-            error!("Failed to get defer-rollback-protection property in DT: {e}");
-            RebootReason::InvalidFdt
-        })?
-        .is_some();
-    Ok(defer_rbp)
-}
-
-fn avf_untrusted_node(fdt: &Fdt) -> Result<FdtNode, RebootReason> {
-    let node = fdt.node(c"/avf/untrusted").map_err(|e| {
-        error!("Failed to get /avf/untrusted node: {e}");
+    let defer_rbp = read_defer_rollback_protection(fdt).map_err(|e| {
+        error!("Failed to get defer-rollback-protection property in DT: {e}");
         RebootReason::InvalidFdt
     })?;
-    node.ok_or_else(|| {
-        error!("/avf/untrusted node is missing in DT");
+    Ok(defer_rbp.is_some())
+}
+
+/// Set up PCI bus and VirtIO-blk device containing the instance.img partition.
+fn initialize_instance_img_device(fdt: &Fdt) -> Result<PciRoot, RebootReason> {
+    let pci_info = PciInfo::from_fdt(fdt).map_err(|e| {
+        error!("Failed to detect PCI from DT: {e}");
         RebootReason::InvalidFdt
-    })
+    })?;
+    let swiotlb_range = SwiotlbInfo::new_from_fdt(fdt)
+        .map_err(|e| {
+            error!("Failed to detect swiotlb from DT: {e}");
+            RebootReason::InvalidFdt
+        })?
+        .and_then(|info| info.fixed_range());
+
+    let pci_root = pci::initialize(pci_info).map_err(|e| {
+        error!("Failed to initialize PCI: {e}");
+        RebootReason::InternalError
+    })?;
+    init_shared_pool(swiotlb_range).map_err(|e| {
+        error!("Failed to initialize shared pool: {e}");
+        RebootReason::InternalError
+    })?;
+
+    Ok(pci_root)
 }
diff --git a/guest/rialto/tests/test.rs b/guest/rialto/tests/test.rs
index c94a0e3..d68c568 100644
--- a/guest/rialto/tests/test.rs
+++ b/guest/rialto/tests/test.rs
@@ -54,13 +54,9 @@
 const INSTANCE_IMG_PATH: &str = "/data/local/tmp/rialto_test/arm64/instance.img";
 const TEST_CERT_CHAIN_PATH: &str = "testdata/rkp_cert_chain.der";
 
-#[cfg(dice_changes)]
 #[test]
 fn process_requests_in_protected_vm() -> Result<()> {
     if hypervisor_props::is_protected_vm_supported()? {
-        // The test is skipped if the feature flag |dice_changes| is not enabled, because when
-        // the flag is off, the DICE chain is truncated in the pvmfw, and the service VM cannot
-        // verify the chain due to the missing entries in the chain.
         check_processing_requests(VmType::ProtectedVm, None)
     } else {
         warn!("pVMs are not supported on device, skipping test");
diff --git a/libs/devicemapper/Android.bp b/libs/devicemapper/Android.bp
index 5332469..6b7f680 100644
--- a/libs/devicemapper/Android.bp
+++ b/libs/devicemapper/Android.bp
@@ -8,7 +8,6 @@
     defaults: ["avf_build_flags_rust"],
     srcs: ["src/lib.rs"],
     edition: "2021",
-    prefer_rlib: true,
     rustlibs: [
         "libanyhow",
         "libbitflags",
@@ -18,16 +17,12 @@
         "libuuid",
         "libzerocopy",
     ],
-    multilib: {
-        lib32: {
-            enabled: false,
-        },
-    },
 }
 
 rust_library {
     name: "libdm_rust",
     defaults: ["libdm_rust.defaults"],
+    host_supported: true,
 }
 
 rust_test {
diff --git a/libs/devicemapper/src/lib.rs b/libs/devicemapper/src/lib.rs
index a8f3049..a8c2833 100644
--- a/libs/devicemapper/src/lib.rs
+++ b/libs/devicemapper/src/lib.rs
@@ -235,6 +235,7 @@
 #[cfg(test)]
 mod tests {
     use super::*;
+    use crate::loopdevice::LoopConfigOptions;
     use crypt::{CipherType, DmCryptTargetBuilder};
     use rdroidtest::{ignore_if, rdroidtest};
     use rustutils::system_properties;
@@ -328,10 +329,10 @@
             backing_file,
             0,
             sz,
-            /* direct_io */ true,
-            /* writable */ true,
+            &LoopConfigOptions { direct_io: true, writable: true, ..Default::default() },
         )
-        .unwrap();
+        .unwrap()
+        .path;
         let device_diff = device.to_owned() + "_diff";
 
         scopeguard::defer! {
@@ -372,10 +373,10 @@
             backing_file,
             0,
             sz,
-            /* direct_io */ true,
-            /* writable */ true,
+            &LoopConfigOptions { direct_io: true, writable: true, ..Default::default() },
         )
-        .unwrap();
+        .unwrap()
+        .path;
         let device_diff = device.to_owned() + "_diff";
         scopeguard::defer! {
             loopdevice::detach(&data_device).unwrap();
diff --git a/libs/devicemapper/src/loopdevice.rs b/libs/devicemapper/src/loopdevice.rs
index 130c1c4..b830eda 100644
--- a/libs/devicemapper/src/loopdevice.rs
+++ b/libs/devicemapper/src/loopdevice.rs
@@ -59,14 +59,31 @@
     Ok(unsafe { _loop_clr_fd(device_file.as_raw_fd()) }?)
 }
 
+/// LOOP_CONFIGURE ioctl operation flags.
+#[derive(Default)]
+pub struct LoopConfigOptions {
+    /// Whether to use direct I/O
+    pub direct_io: bool,
+    /// Whether the device is writable
+    pub writable: bool,
+    /// Whether to autodestruct the device on last close
+    pub autoclear: bool,
+}
+
+pub struct LoopDevice {
+    /// The loop device file
+    pub file: File,
+    /// Path to the loop device
+    pub path: PathBuf,
+}
+
 /// Creates a loop device and attach the given file at `path` as the backing store.
 pub fn attach<P: AsRef<Path>>(
     path: P,
     offset: u64,
     size_limit: u64,
-    direct_io: bool,
-    writable: bool,
-) -> Result<PathBuf> {
+    options: &LoopConfigOptions,
+) -> Result<LoopDevice> {
     // Attaching a file to a loop device can make a race condition; a loop device number obtained
     // from LOOP_CTL_GET_FREE might have been used by another thread or process. In that case the
     // subsequent LOOP_CONFIGURE ioctl returns with EBUSY. Try until it succeeds.
@@ -80,8 +97,8 @@
 
     let begin = Instant::now();
     loop {
-        match try_attach(&path, offset, size_limit, direct_io, writable) {
-            Ok(loop_dev) => return Ok(loop_dev),
+        match try_attach(&path, offset, size_limit, options) {
+            Ok(loop_device) => return Ok(loop_device),
             Err(e) => {
                 if begin.elapsed() > TIMEOUT {
                     return Err(e);
@@ -102,9 +119,8 @@
     path: P,
     offset: u64,
     size_limit: u64,
-    direct_io: bool,
-    writable: bool,
-) -> Result<PathBuf> {
+    options: &LoopConfigOptions,
+) -> Result<LoopDevice> {
     // Get a free loop device
     wait_for_path(LOOP_CONTROL)?;
     let ctrl_file = OpenOptions::new()
@@ -117,8 +133,8 @@
     // Construct the loop_info64 struct
     let backing_file = OpenOptions::new()
         .read(true)
-        .write(writable)
-        .custom_flags(if direct_io { O_DIRECT } else { 0 })
+        .write(options.writable)
+        .custom_flags(if options.direct_io { O_DIRECT } else { 0 })
         .open(&path)
         .context(format!("failed to open {:?}", path.as_ref()))?;
     let mut config = loop_config::new_zeroed();
@@ -127,14 +143,18 @@
     config.info.lo_offset = offset;
     config.info.lo_sizelimit = size_limit;
 
-    if !writable {
+    if !options.writable {
         config.info.lo_flags = Flag::LO_FLAGS_READ_ONLY;
     }
 
-    if direct_io {
+    if options.direct_io {
         config.info.lo_flags.insert(Flag::LO_FLAGS_DIRECT_IO);
     }
 
+    if options.autoclear {
+        config.info.lo_flags.insert(Flag::LO_FLAGS_AUTOCLEAR);
+    }
+
     // Configure the loop device to attach the backing file
     let device_path = format!("{}{}", LOOP_DEV_PREFIX, num);
     wait_for_path(&device_path)?;
@@ -146,7 +166,7 @@
     loop_configure(&device_file, &config)
         .context(format!("Failed to configure {:?}", &device_path))?;
 
-    Ok(PathBuf::from(device_path))
+    Ok(LoopDevice { file: device_file, path: PathBuf::from(device_path) })
 }
 
 /// Detaches backing file from the loop device `path`.
@@ -185,7 +205,10 @@
         let a_file = a_dir.path().join("test");
         let a_size = 4096u64;
         create_empty_file(&a_file, a_size);
-        let dev = attach(a_file, 0, a_size, /* direct_io */ true, /* writable */ false).unwrap();
+        let dev =
+            attach(a_file, 0, a_size, &LoopConfigOptions { direct_io: true, ..Default::default() })
+                .unwrap()
+                .path;
         scopeguard::defer! {
             detach(&dev).unwrap();
         }
@@ -198,7 +221,7 @@
         let a_file = a_dir.path().join("test");
         let a_size = 4096u64;
         create_empty_file(&a_file, a_size);
-        let dev = attach(a_file, 0, a_size, /* direct_io */ false, /* writable */ false).unwrap();
+        let dev = attach(a_file, 0, a_size, &LoopConfigOptions::default()).unwrap().path;
         scopeguard::defer! {
             detach(&dev).unwrap();
         }
@@ -211,11 +234,34 @@
         let a_file = a_dir.path().join("test");
         let a_size = 4096u64;
         create_empty_file(&a_file, a_size);
-        let dev = attach(a_file, 0, a_size, /* direct_io */ true, /* writable */ true).unwrap();
+        let dev = attach(
+            a_file,
+            0,
+            a_size,
+            &LoopConfigOptions { direct_io: true, writable: true, ..Default::default() },
+        )
+        .unwrap()
+        .path;
         scopeguard::defer! {
             detach(&dev).unwrap();
         }
         assert!(is_direct_io(&dev));
         assert!(is_direct_io_writable(&dev));
     }
+
+    #[rdroidtest]
+    fn attach_loop_device_autoclear() {
+        let a_dir = tempfile::TempDir::new().unwrap();
+        let a_file = a_dir.path().join("test");
+        let a_size = 4096u64;
+        create_empty_file(&a_file, a_size);
+        let dev =
+            attach(a_file, 0, a_size, &LoopConfigOptions { autoclear: true, ..Default::default() })
+                .unwrap();
+        drop(dev.file);
+
+        let dev_size_path =
+            Path::new("/sys/block").join(dev.path.file_name().unwrap()).join("size");
+        assert_eq!("0", fs::read_to_string(dev_size_path).unwrap().trim());
+    }
 }
diff --git a/libs/libhypervisor_backends/Android.bp b/libs/libhypervisor_backends/Android.bp
index b001b8f..27e3fe5 100644
--- a/libs/libhypervisor_backends/Android.bp
+++ b/libs/libhypervisor_backends/Android.bp
@@ -14,6 +14,7 @@
     rustlibs: [
         "libonce_cell_nostd",
         "libsmccc",
+        "libthiserror_nostd",
         "libuuid_nostd",
     ],
     enabled: false,
diff --git a/libs/libhypervisor_backends/rules.mk b/libs/libhypervisor_backends/rules.mk
index 6fc9dea..1a48773 100644
--- a/libs/libhypervisor_backends/rules.mk
+++ b/libs/libhypervisor_backends/rules.mk
@@ -8,6 +8,7 @@
 	trusty/user/base/lib/liballoc-rust \
 	$(call FIND_CRATE,once_cell) \
 	$(call FIND_CRATE,smccc) \
+	$(call FIND_CRATE,thiserror) \
 	$(call FIND_CRATE,uuid) \
 
 include make/library.mk
\ No newline at end of file
diff --git a/libs/libhypervisor_backends/src/hypervisor/geniezone.rs b/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
index fe56528..76e010b 100644
--- a/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
+++ b/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
@@ -14,8 +14,6 @@
 
 //! Wrappers around calls to the GenieZone hypervisor.
 
-use core::fmt::{self, Display, Formatter};
-
 use super::{Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
 use crate::{mem::page_4kb_of, Error, Result};
 
@@ -23,6 +21,7 @@
     error::{positive_or_error_64, success_or_error_64},
     hvc64,
 };
+use thiserror::Error;
 use uuid::{uuid, Uuid};
 
 pub(super) struct GeniezoneHypervisor;
@@ -44,15 +43,19 @@
 }
 
 /// Error from a GenieZone HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Eq, Error, PartialEq)]
 pub enum GeniezoneError {
     /// The call is not supported by the implementation.
+    #[error("GenieZone call not supported")]
     NotSupported,
     /// The call is not required to implement.
+    #[error("GenieZone call not required")]
     NotRequired,
     /// One of the call parameters has a invalid value.
+    #[error("GenieZone call received invalid value")]
     InvalidParameter,
     /// There was an unexpected return value.
+    #[error("Unknown return value from GenieZone {0} ({0:#x})")]
     Unknown(i64),
 }
 
@@ -73,17 +76,6 @@
     }
 }
 
-impl Display for GeniezoneError {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match self {
-            Self::NotSupported => write!(f, "GenieZone call not supported"),
-            Self::NotRequired => write!(f, "GenieZone call not required"),
-            Self::InvalidParameter => write!(f, "GenieZone call received invalid value"),
-            Self::Unknown(e) => write!(f, "Unknown return value from GenieZone {} ({0:#x})", e),
-        }
-    }
-}
-
 impl Hypervisor for GeniezoneHypervisor {
     fn as_mmio_guard(&self) -> Option<&dyn MmioGuardedHypervisor> {
         Some(self)
diff --git a/libs/libhypervisor_backends/src/hypervisor/kvm.rs b/libs/libhypervisor_backends/src/hypervisor/kvm.rs
index e18c1f4..233097b 100644
--- a/libs/libhypervisor_backends/src/hypervisor/kvm.rs
+++ b/libs/libhypervisor_backends/src/hypervisor/kvm.rs
@@ -14,8 +14,6 @@
 
 //! Wrappers around calls to the KVM hypervisor.
 
-use core::fmt::{self, Display, Formatter};
-
 use super::{DeviceAssigningHypervisor, Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
 use crate::{mem::page_4kb_of, Error, Result};
 
@@ -23,16 +21,20 @@
     error::{positive_or_error_64, success_or_error_32, success_or_error_64},
     hvc64,
 };
+use thiserror::Error;
 use uuid::{uuid, Uuid};
 
 /// Error from a KVM HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Eq, Error, PartialEq)]
 pub enum KvmError {
     /// The call is not supported by the implementation.
+    #[error("KVM call not supported")]
     NotSupported,
     /// One of the call parameters has a non-supported value.
+    #[error("KVM call received non-supported value")]
     InvalidParameter,
     /// There was an unexpected return value.
+    #[error("Unknown return value from KVM {0} ({0:#x})")]
     Unknown(i64),
 }
 
@@ -52,16 +54,6 @@
     }
 }
 
-impl Display for KvmError {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match self {
-            Self::NotSupported => write!(f, "KVM call not supported"),
-            Self::InvalidParameter => write!(f, "KVM call received non-supported value"),
-            Self::Unknown(e) => write!(f, "Unknown return value from KVM {} ({0:#x})", e),
-        }
-    }
-}
-
 const ARM_SMCCC_KVM_FUNC_HYP_MEMINFO: u32 = 0xc6000002;
 const ARM_SMCCC_KVM_FUNC_MEM_SHARE: u32 = 0xc6000003;
 const ARM_SMCCC_KVM_FUNC_MEM_UNSHARE: u32 = 0xc6000004;
diff --git a/libs/libvmbase/Android.bp b/libs/libvmbase/Android.bp
index de347c7..7465508 100644
--- a/libs/libvmbase/Android.bp
+++ b/libs/libvmbase/Android.bp
@@ -87,6 +87,7 @@
         "libsmccc",
         "libspin_nostd",
         "libstatic_assertions",
+        "libthiserror_nostd",
         "libtinyvec_nostd",
         "libuuid_nostd",
         "libvirtio_drivers",
diff --git a/libs/libvmbase/src/bionic.rs b/libs/libvmbase/src/bionic.rs
index ac9f80f..2b59493 100644
--- a/libs/libvmbase/src/bionic.rs
+++ b/libs/libvmbase/src/bionic.rs
@@ -86,15 +86,20 @@
     unsafe { ERRNO }
 }
 
+/// # Safety
+///
+/// `buffer` must point to an allocation of at least `length` bytes which is valid to write to and
+/// has no concurrent access while this function is running.
 #[no_mangle]
-extern "C" fn getentropy(buffer: *mut c_void, length: usize) -> c_int {
+unsafe extern "C" fn getentropy(buffer: *mut c_void, length: usize) -> c_int {
     if length > 256 {
         // The maximum permitted value for the length argument is 256.
         set_errno(EIO);
         return -1;
     }
 
-    // SAFETY: Just like libc, we need to assume that `ptr` is valid.
+    // SAFETY: The caller promised that `buffer` is a valid pointer to at least `length` bytes with
+    // no concurrent access.
     let buffer = unsafe { slice::from_raw_parts_mut(buffer.cast::<u8>(), length) };
     fill_with_entropy(buffer).unwrap();
 
@@ -167,9 +172,13 @@
 #[no_mangle]
 static stderr: CFilePtr = CFilePtr::Stderr;
 
+/// # Safety
+///
+/// `c_str` must be a valid pointer to a NUL-terminated string which is not modified before this
+/// function returns.
 #[no_mangle]
-extern "C" fn fputs(c_str: *const c_char, stream: usize) -> c_int {
-    // SAFETY: Just like libc, we need to assume that `s` is a valid NULL-terminated string.
+unsafe extern "C" fn fputs(c_str: *const c_char, stream: usize) -> c_int {
+    // SAFETY: The caller promised that `c_str` is a valid NUL-terminated string.
     let c_str = unsafe { CStr::from_ptr(c_str) };
 
     if let (Ok(s), Ok(f)) = (c_str.to_str(), CFilePtr::try_from(stream)) {
@@ -181,11 +190,16 @@
     }
 }
 
+/// # Safety
+///
+/// `ptr` must be a valid pointer to an array of at least `size * nmemb` initialised bytes, which
+/// are not modified before this function returns.
 #[no_mangle]
-extern "C" fn fwrite(ptr: *const c_void, size: usize, nmemb: usize, stream: usize) -> usize {
+unsafe extern "C" fn fwrite(ptr: *const c_void, size: usize, nmemb: usize, stream: usize) -> usize {
     let length = size.saturating_mul(nmemb);
 
-    // SAFETY: Just like libc, we need to assume that `ptr` is valid.
+    // SAFETY: The caller promised that `ptr` is a valid pointer to at least `size * nmemb`
+    // initialised bytes, and `length` is no more than that.
     let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, length) };
 
     if let (Ok(s), Ok(f)) = (str::from_utf8(bytes), CFilePtr::try_from(stream)) {
@@ -201,12 +215,16 @@
     cstr_error(n).as_ptr().cast_mut().cast()
 }
 
+/// # Safety
+///
+/// `s` must be a valid pointer to a NUL-terminated string which is not modified before this
+/// function returns.
 #[no_mangle]
-extern "C" fn perror(s: *const c_char) {
+unsafe extern "C" fn perror(s: *const c_char) {
     let prefix = if s.is_null() {
         None
     } else {
-        // SAFETY: Just like libc, we need to assume that `s` is a valid NULL-terminated string.
+        // SAFETY: The caller promised that `s` is a valid NUL-terminated string.
         let c_str = unsafe { CStr::from_ptr(s) };
         if c_str.is_empty() {
             None
diff --git a/libs/libvmbase/src/fdt/pci.rs b/libs/libvmbase/src/fdt/pci.rs
index ebaa671..44ad455 100644
--- a/libs/libvmbase/src/fdt/pci.rs
+++ b/libs/libvmbase/src/fdt/pci.rs
@@ -14,40 +14,47 @@
 
 //! Library for working with (VirtIO) PCI devices discovered from a device tree.
 
-use core::{
-    ffi::CStr,
-    fmt::{self, Display, Formatter},
-    ops::Range,
-};
+use core::{ffi::CStr, ops::Range};
 use libfdt::{AddressRange, Fdt, FdtError, FdtNode};
 use log::debug;
+use thiserror::Error;
 use virtio_drivers::transport::pci::bus::{Cam, PciRoot};
 
 /// PCI MMIO configuration region size.
 const PCI_CFG_SIZE: usize = 0x100_0000;
 
 /// An error parsing a PCI node from an FDT.
-#[derive(Clone, Debug, Eq, PartialEq)]
+#[derive(Clone, Debug, Eq, Error, PartialEq)]
 pub enum PciError {
     /// Error getting PCI node from FDT.
+    #[error("Error getting PCI node from FDT: {0}")]
     FdtErrorPci(FdtError),
     /// Failed to find PCI bus in FDT.
+    #[error("Failed to find PCI bus in FDT.")]
     FdtNoPci,
     /// Error getting `reg` property from PCI node.
+    #[error("Error getting reg property from PCI node: {0}")]
     FdtErrorReg(FdtError),
     /// PCI node missing `reg` property.
+    #[error("PCI node missing reg property.")]
     FdtMissingReg,
     /// Empty `reg property on PCI node.
+    #[error("Empty reg property on PCI node.")]
     FdtRegEmpty,
     /// PCI `reg` property missing size.
+    #[error("PCI reg property missing size.")]
     FdtRegMissingSize,
     /// PCI CAM size reported by FDT is not what we expected.
+    #[error("FDT says PCI CAM is {0} bytes but we expected {PCI_CFG_SIZE}.")]
     CamWrongSize(usize),
     /// Error getting `ranges` property from PCI node.
+    #[error("Error getting ranges property from PCI node: {0}")]
     FdtErrorRanges(FdtError),
     /// PCI node missing `ranges` property.
+    #[error("PCI node missing ranges property.")]
     FdtMissingRanges,
     /// Bus address is not equal to CPU physical address in `ranges` property.
+    #[error("bus address {bus_address:#018x} != CPU physical address {cpu_physical:#018x}")]
     RangeAddressMismatch {
         /// A bus address from the `ranges` property.
         bus_address: u64,
@@ -55,39 +62,10 @@
         cpu_physical: u64,
     },
     /// No suitable PCI memory range found.
+    #[error("No suitable PCI memory range found.")]
     NoSuitableRange,
 }
 
-impl Display for PciError {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match self {
-            Self::FdtErrorPci(e) => write!(f, "Error getting PCI node from FDT: {}", e),
-            Self::FdtNoPci => write!(f, "Failed to find PCI bus in FDT."),
-            Self::FdtErrorReg(e) => write!(f, "Error getting reg property from PCI node: {}", e),
-            Self::FdtMissingReg => write!(f, "PCI node missing reg property."),
-            Self::FdtRegEmpty => write!(f, "Empty reg property on PCI node."),
-            Self::FdtRegMissingSize => write!(f, "PCI reg property missing size."),
-            Self::CamWrongSize(cam_size) => write!(
-                f,
-                "FDT says PCI CAM is {} bytes but we expected {}.",
-                cam_size, PCI_CFG_SIZE
-            ),
-            Self::FdtErrorRanges(e) => {
-                write!(f, "Error getting ranges property from PCI node: {}", e)
-            }
-            Self::FdtMissingRanges => write!(f, "PCI node missing ranges property."),
-            Self::RangeAddressMismatch { bus_address, cpu_physical } => {
-                write!(
-                    f,
-                    "bus address {:#018x} != CPU physical address {:#018x}",
-                    bus_address, cpu_physical
-                )
-            }
-            Self::NoSuitableRange => write!(f, "No suitable PCI memory range found."),
-        }
-    }
-}
-
 /// Information about the PCI bus parsed from the device tree.
 #[derive(Clone, Debug)]
 pub struct PciInfo {
diff --git a/tests/backcompat_test/src/main.rs b/tests/backcompat_test/src/main.rs
index 4113881..bf0afa6 100644
--- a/tests/backcompat_test/src/main.rs
+++ b/tests/backcompat_test/src/main.rs
@@ -152,6 +152,11 @@
         .arg("/chosen/kaslr-seed")
         .arg("--ignore-path-value")
         .arg("/chosen/rng-seed")
+        // TODO: b/391420337 Investigate if bootargs may mutate VM
+        .arg("--ignore-path-value")
+        .arg("/chosen/bootargs")
+        .arg("--ignore-path-value")
+        .arg("/config/kernel-size")
         .arg("--ignore-path-value")
         .arg("/avf/untrusted/instance-id")
         .arg("--ignore-path-value")
diff --git a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
index 109c5e0..1d827b9 100644
--- a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
+++ b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
@@ -27,6 +27,8 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.common.truth.TruthJUnit.assume;
 
+import static org.junit.Assume.assumeTrue;
+
 import android.app.Application;
 import android.app.Instrumentation;
 import android.content.ComponentCallbacks2;
@@ -69,13 +71,16 @@
 import java.io.Writer;
 import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.OptionalLong;
+import java.util.Random;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 
@@ -927,4 +932,169 @@
         }
         reportMetrics(requestAttestationTime, "request_attestation_time", "microsecond");
     }
+
+    List<Double> rpDataAccessWithExistingSession(boolean measureWrite) throws Exception {
+        assumeTrue(
+                "Rollback protected secrets are only available in Updatable VMs",
+                isUpdatableVmSupported());
+        final int NUM_WARMUPS = 10;
+        final int NUM_REQUESTS = 10_000;
+
+        VirtualMachineConfig config =
+                newVmConfigBuilderWithPayloadBinary("MicrodroidTestNativeLib.so")
+                        .setDebugLevel(DEBUG_LEVEL_NONE)
+                        .build();
+
+        byte[] data = new byte[32];
+        Arrays.fill(data, (byte) 0xcc);
+
+        List<Double> requestLatencies = new ArrayList<>(NUM_REQUESTS);
+        VirtualMachine vm = forceCreateNewVirtualMachine("rp_data_access", config);
+        TestResults testResult =
+                runVmTestService(
+                        TAG,
+                        vm,
+                        (ts, tr) -> {
+                            tr.mTimings = new long[NUM_REQUESTS];
+                            for (int i = 0; i < NUM_WARMUPS; i++) {
+                                ts.insecurelyWritePayloadRpData(data);
+                                ts.insecurelyReadPayloadRpData();
+                            }
+                            for (int i = 0; i < NUM_REQUESTS; i++) {
+                                long start = System.nanoTime();
+                                if (measureWrite) {
+                                    ts.insecurelyWritePayloadRpData(data);
+                                    tr.mTimings[i] = System.nanoTime() - start;
+                                } else {
+                                    tr.mPayloadRpData = ts.insecurelyReadPayloadRpData();
+                                    tr.mTimings[i] = System.nanoTime() - start;
+                                    assertThat(tr.mPayloadRpData).isEqualTo(data);
+                                }
+                            }
+                        });
+        // Correctness check.
+        testResult.assertNoException();
+        for (long timings : testResult.mTimings) {
+            requestLatencies.add((double) timings / NANO_TO_MICRO);
+        }
+        return requestLatencies;
+    }
+
+    @Test
+    public void rpDataReadWithExistingSession() throws Exception {
+        reportMetrics(
+                rpDataAccessWithExistingSession(false),
+                "latency/readRollbackProtectedSecretWithExistingSession",
+                "us");
+    }
+
+    @Test
+    public void rpDataWriteWithExistingSession() throws Exception {
+        reportMetrics(
+                rpDataAccessWithExistingSession(true),
+                "latency/writeRollbackProtectedSecretWithExistingSession",
+                "us");
+    }
+
+    List<Double> rpDataAccessWithRefreshingSession(boolean measureWrite) throws Exception {
+        assumeTrue(
+                "Rollback protected secrets are only available in Updatable VMs",
+                isUpdatableVmSupported());
+        final long vmSize = minMemoryRequired();
+        final int numVMs = 8;
+        final int NUM_REQUESTS = 10;
+        final long availableMem = getAvailableMemory();
+
+        // Let's not use more than half of the available memory
+        assume().withMessage("Available memory (" + availableMem + " bytes) too small")
+                .that((numVMs * vmSize) <= (availableMem / 2))
+                .isTrue();
+
+        VirtualMachineConfig config =
+                newVmConfigBuilderWithPayloadBinary("MicrodroidTestNativeLib.so")
+                        .setDebugLevel(DEBUG_LEVEL_FULL)
+                        .setMemoryBytes(vmSize)
+                        .build();
+
+        byte[] data = new byte[32];
+        Arrays.fill(data, (byte) 0xcc);
+
+        List<Double> requestLatencies = new ArrayList<>(numVMs * NUM_REQUESTS);
+        CompletableFuture<TestResults>[] resultFutureList = new CompletableFuture[numVMs];
+        RunTestsAgainstTestService testToRun =
+                (ts, tr) -> {
+                    tr.mTimings = new long[NUM_REQUESTS];
+                    // Warm up request!
+                    ts.insecurelyWritePayloadRpData(data);
+                    for (int j = 0; j < NUM_REQUESTS; j++) {
+                        // Sleep time between 2 requests.
+                        // Randomized
+                        // between 200ms-300ms.
+                        long rnd_sleep_time = (long) (200.0 + new Random().nextDouble() * 100);
+                        Thread.sleep(rnd_sleep_time); // Sleep
+                        long start = System.nanoTime();
+                        if (measureWrite) {
+                            // Write
+                            ts.insecurelyWritePayloadRpData(data);
+                            tr.mTimings[j] = System.nanoTime() - start;
+
+                        } else {
+                            tr.mPayloadRpData = ts.insecurelyReadPayloadRpData();
+                            tr.mTimings[j] = System.nanoTime() - start;
+                            assertThat(tr.mPayloadRpData).isEqualTo(data);
+                        }
+                    }
+                };
+        for (int i = 0; i < numVMs; i++) {
+            final VirtualMachine vm =
+                    forceCreateNewVirtualMachine("rp_data_access_refresh" + i, config);
+            resultFutureList[i] =
+                    CompletableFuture.supplyAsync(
+                            () -> {
+                                try {
+                                    TestResults testResult = runVmTestService(TAG, vm, testToRun);
+                                    // Correctness check.
+                                    testResult.assertNoException();
+                                    return testResult;
+                                } catch (Exception e) {
+                                    throw new CompletionException(e);
+                                }
+                            });
+        }
+
+        for (int i = 0; i < numVMs; i++) {
+            TestResults tr = resultFutureList[i].get();
+            tr.assertNoException();
+            for (long timings : tr.mTimings) {
+                requestLatencies.add((double) timings / NANO_TO_MICRO);
+            }
+        }
+        return requestLatencies;
+    }
+
+    // The following benchmark corresponds to cases when payload access rollback protected secret,
+    // but there is no existing session with Secretkeeper - which could be the case when several VMs
+    // are attempting to establish a connection.
+    //
+    // Implementation detail of the API in such scenario: Microdroid attempts to access the secret
+    // from Secretkeeper -> gets an error ("UnknownKeyId") -> Refreshes the session (this includes
+    // several call to AuthGraphKey Exchange HAL) -> retries access.
+    //
+    // Essentially this latency is (Failed Secretkeeper access from pVM + AuthGraphKeyExchange
+    // protocol between pVM & Secretkeeper + Successful Secretkeeper access from pVM)
+    @Test
+    public void rpDataReadWithRefreshingSession() throws Exception {
+        reportMetrics(
+                rpDataAccessWithRefreshingSession(false),
+                "latency/readRollbackProtectedSecretWithRefreshSession",
+                "us");
+    }
+
+    @Test
+    public void rpDataWriteWithRefreshingSession() throws Exception {
+        reportMetrics(
+                rpDataAccessWithRefreshingSession(true),
+                "latency/writeRollbackProtectedSecretWithRefreshSession",
+                "us");
+    }
 }
diff --git a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
index c05fb0b..94f7ced 100644
--- a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
+++ b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
@@ -27,9 +27,11 @@
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
+import android.app.ActivityManager;
 import android.app.Instrumentation;
 import android.app.UiAutomation;
 import android.content.Context;
+import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.os.SystemProperties;
 import android.system.Os;
@@ -79,6 +81,10 @@
                                     "microdroid_16k",
                                     "microdroid_gki-android15-6.6")));
 
+    private static final long ONE_MEBI = 1024 * 1024;
+    private static final long MIN_MEM_ARM64 = 170 * ONE_MEBI;
+    private static final long MIN_MEM_X86_64 = 196 * ONE_MEBI;
+
     public static boolean isCuttlefish() {
         return getDeviceProperties().isCuttlefish();
     }
@@ -393,6 +399,10 @@
             return mProcessedBootTimeMetrics;
         }
 
+        // Stopping a virtual machine is like pulling the plug on a real computer. VM may be left in
+        // an inconsistent state.
+        // For a graceful shutdown, request the payload to call {@code exit()} and wait for
+        // VirtualMachineCallback#onPayloadFinished} to be called.
         protected void forceStop(VirtualMachine vm) {
             try {
                 vm.stop();
@@ -722,7 +732,6 @@
                     public void onPayloadFinished(VirtualMachine vm, int exitCode) {
                         Log.i(logTag, "onPayloadFinished: " + exitCode);
                         payloadFinished.complete(true);
-                        forceStop(vm);
                     }
                 };
 
@@ -733,6 +742,26 @@
         return testResults;
     }
 
+    protected long getAvailableMemory() {
+        ActivityManager am = getContext().getSystemService(ActivityManager.class);
+        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
+        am.getMemoryInfo(memoryInfo);
+        return memoryInfo.availMem;
+    }
+
+    protected long minMemoryRequired() {
+        assertThat(Build.SUPPORTED_ABIS).isNotEmpty();
+        String primaryAbi = Build.SUPPORTED_ABIS[0];
+        switch (primaryAbi) {
+            case "x86_64":
+                return MIN_MEM_X86_64;
+            case "arm64-v8a":
+            case "arm64-v8a-hwasan":
+                return MIN_MEM_ARM64;
+        }
+        throw new AssertionError("Unsupported ABI: " + primaryAbi);
+    }
+
     @FunctionalInterface
     protected interface RunTestsAgainstTestService {
         void runTests(ITestService testService, TestResults testResults) throws Exception;
diff --git a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
index a2b4747..7431a72 100644
--- a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
+++ b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
@@ -32,14 +32,12 @@
 import static com.google.common.truth.TruthJUnit.assume;
 
 import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static java.util.stream.Collectors.toList;
 
-import android.app.ActivityManager;
 import android.app.Instrumentation;
 import android.app.UiAutomation;
 import android.content.ComponentName;
@@ -47,7 +45,6 @@
 import android.content.ContextWrapper;
 import android.content.Intent;
 import android.content.ServiceConnection;
-import android.os.Build;
 import android.os.IBinder;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
@@ -119,6 +116,7 @@
 import java.util.OptionalLong;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -171,11 +169,6 @@
     public void tearDown() {
         revokePermission(VirtualMachine.USE_CUSTOM_VIRTUAL_MACHINE_PERMISSION);
     }
-
-    private static final long ONE_MEBI = 1024 * 1024;
-
-    private static final long MIN_MEM_ARM64 = 170 * ONE_MEBI;
-    private static final long MIN_MEM_X86_64 = 196 * ONE_MEBI;
     private static final String EXAMPLE_STRING = "Literally any string!! :)";
 
     private static final String VM_SHARE_APP_PACKAGE_NAME = "com.android.microdroid.vmshare_app";
@@ -1875,6 +1868,7 @@
     }
 
     @Test
+    @CddTest
     public void rollbackProtectedDataOfPayload() throws Exception {
         assumeSupportedDevice();
         // Rollback protected data is only possible if Updatable VMs is supported -
@@ -1900,7 +1894,7 @@
                         (ts, tr) -> {
                             tr.mPayloadRpData = ts.insecurelyReadPayloadRpData();
                         });
-        // ainsecurelyReadPayloadRpData()` must've failed since no data was ever written!
+        // `insecurelyReadPayloadRpData()` must've failed since no data was ever written!
         assertWithMessage("The read (unexpectedly) succeeded!")
                 .that(testResults.mException)
                 .isNotNull();
@@ -1931,6 +1925,62 @@
     }
 
     @Test
+    public void rollbackProtectedDataCanBeAccessedPostConnectionExpiration() throws Exception {
+        final long vmSize = minMemoryRequired();
+        // The reference implementation of Secretkeeper maintains 4 live session keys,
+        // dropping the oldest one when new connections are requested. Therefore we spin 8 VMs
+        // asynchronously.
+        // Within a VM, wait for 5 sec (> Microdroid boot time) and trigger rp data access
+        // hoping at least some of the connection between VM <-> Secretkeeper are expired.
+        final int numVMs = 8;
+        final long availableMem = getAvailableMemory();
+
+        // Let's not use more than half of the available memory
+        assume().withMessage("Available memory (" + availableMem + " bytes) too small")
+                .that((numVMs * vmSize) <= (availableMem / 2))
+                .isTrue();
+
+        VirtualMachineConfig config =
+                newVmConfigBuilderWithPayloadBinary("MicrodroidTestNativeLib.so")
+                        .setDebugLevel(DEBUG_LEVEL_FULL)
+                        .setMemoryBytes(vmSize)
+                        .build();
+        byte[] data = new byte[32];
+        Arrays.fill(data, (byte) 0xcc);
+
+        CompletableFuture<TestResults>[] resultFutureList = new CompletableFuture[numVMs];
+        for (int i = 0; i < numVMs; i++) {
+            final VirtualMachine vm =
+                    forceCreateNewVirtualMachine("test_sk_session_expiration_vm_" + i, config);
+            resultFutureList[i] =
+                    CompletableFuture.supplyAsync(
+                            () -> {
+                                try {
+                                    TestResults testResults =
+                                            runVmTestService(
+                                                    TAG,
+                                                    vm,
+                                                    (ts, tr) -> {
+                                                        ts.insecurelyWritePayloadRpData(data);
+                                                        Thread.sleep(5 * 1000); // 5 seconds of wait
+                                                        tr.mPayloadRpData =
+                                                                ts.insecurelyReadPayloadRpData();
+                                                    });
+                                    return testResults;
+                                } catch (Exception e) {
+                                    throw new CompletionException(e);
+                                }
+                            });
+        }
+
+        for (int i = 0; i < numVMs; i++) {
+            TestResults testResult = resultFutureList[i].get();
+            testResult.assertNoException();
+            assertThat(testResult.mPayloadRpData).isEqualTo(data);
+        }
+    }
+
+    @Test
     @CddTest
     public void isNewInstanceTest() throws Exception {
         assumeSupportedDevice();
@@ -2464,25 +2514,7 @@
     }
 
     @Test
-    public void kernelVersionRequirement() throws Exception {
-        assumeVsrCompliant();
-        int firstApiLevel = SystemProperties.getInt("ro.product.first_api_level", 0);
-        assume().withMessage("Skip on devices launched before Android 14 (API level 34)")
-                .that(firstApiLevel)
-                .isAtLeast(34);
-
-        String[] tokens = KERNEL_VERSION.split("\\.");
-        int major = Integer.parseInt(tokens[0]);
-        int minor = Integer.parseInt(tokens[1]);
-
-        // Check kernel version >= 5.15
-        assertTrue(major >= 5);
-        if (major == 5) {
-            assertTrue(minor >= 15);
-        }
-    }
-
-    @Test
+    @CddTest
     public void createAndRunRustVm() throws Exception {
         // This test is here mostly to exercise the Rust wrapper around the VM Payload API.
         // We're testing the same functionality as in other tests, the only difference is
@@ -2686,6 +2718,7 @@
     }
 
     @Test
+    @GmsTest(requirements = {"GMS-3-7.1-001.002"})
     public void pageSize() throws Exception {
         assumeSupportedDevice();
 
@@ -2771,13 +2804,6 @@
         }
     }
 
-    private long getAvailableMemory() {
-        ActivityManager am = getContext().getSystemService(ActivityManager.class);
-        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
-        am.getMemoryInfo(memoryInfo);
-        return memoryInfo.availMem;
-    }
-
     private VirtualMachineDescriptor toParcelFromParcel(VirtualMachineDescriptor descriptor) {
         Parcel parcel = Parcel.obtain();
         descriptor.writeToParcel(parcel, 0);
@@ -2810,17 +2836,4 @@
         Exception e = assertThrows(VirtualMachineException.class, runnable);
         assertThat(e).hasMessageThat().contains(expectedContents);
     }
-
-    private long minMemoryRequired() {
-        assertThat(Build.SUPPORTED_ABIS).isNotEmpty();
-        String primaryAbi = Build.SUPPORTED_ABIS[0];
-        switch (primaryAbi) {
-            case "x86_64":
-                return MIN_MEM_X86_64;
-            case "arm64-v8a":
-            case "arm64-v8a-hwasan":
-                return MIN_MEM_ARM64;
-        }
-        throw new AssertionError("Unsupported ABI: " + primaryAbi);
-    }
 }