diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fbfcd77e0d9a81981188a5ccbddbe47432abc4d0..8e2f31462cc1846f193f597d55388d36cf1a2ec9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -73,4 +73,5 @@ update-default-branch:
     UPSTREAM_BRANCH: upstream/master
     UPSTREAM_DEFAULT_BRANCH: master
     UPSTREAM_URL: https://git.code.sf.net/p/opencamera/code
-    TEMP_LATEST_TAG_BRANCH: latest_upstream_tag_branch
\ No newline at end of file
+    TEMP_LATEST_TAG_BRANCH: latest_upstream_tag_branch
+  allow_failure: true
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 57b47934bf0eedd6633548c22f1c78f2070516fb..6adbfcf4052af026e899e2dbc0d22b84401bc427 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,6 +47,7 @@
             android:name="net.sourceforge.opencamera.MainActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:theme="@style/AppTheme"
+            android:launchMode="singleInstance"
             android:clearTaskOnLaunch="true"
             android:exported="true"
             >
diff --git a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java
index ed6011b1cd7ed2992bc01a722a2b4eb42fa1e5a7..b76e9fcb3174c548151be18c11c90c79409ef041 100644
--- a/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java
+++ b/app/src/main/java/net/sourceforge/opencamera/DeviceSettings.java
@@ -38,4 +38,8 @@ public class DeviceSettings {
         final boolean isOne = Build.DEVICE.equals("one") || Build.DEVICE.equals("X2");
         return isMurena && isOne;
     }
+
+    public static boolean isMurenaTwo() {
+        return Build.DEVICE.toLowerCase(Locale.US).contains("two");
+    }
 }
diff --git a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java
index 692599deee5ceb397a2946aa4e29d7c248857c50..19ced8e307d279f6a0eef8cf4f97ec5d16908f5c 100644
--- a/app/src/main/java/net/sourceforge/opencamera/MainActivity.java
+++ b/app/src/main/java/net/sourceforge/opencamera/MainActivity.java
@@ -105,6 +105,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -185,6 +186,11 @@ public class MainActivity extends AppCompatActivity {
     public static volatile boolean test_preview_want_no_limits; // test flag, if set to true then instead use test_preview_want_no_limits_value; needs to be static, as it needs to be set before activity is created to take effect
     public static volatile boolean test_preview_want_no_limits_value;
 
+    private boolean murenaTwoHwKill = false;
+
+    private Handler handler;
+    private Runnable retryRunnable = null;
+
     // whether this is a multi-camera device (note, this isn't simply having more than 1 camera, but also having more than one with the same facing)
     // note that in most cases, code should check the MultiCamButtonPreferenceKey preference as well as the is_multi_cam flag,
     // this can be done via isMultiCamEnabled().
@@ -358,6 +364,8 @@ public class MainActivity extends AppCompatActivity {
         magneticSensor = new MagneticSensor(this);
         //speechControl = new SpeechControl(this);
 
+        handler = new Handler();
+
         // determine whether we support Camera2 API
         // must be done before setDeviceDefaults()
         initCamera2Support();
@@ -1594,6 +1602,26 @@ public class MainActivity extends AppCompatActivity {
         else {
             mainUI.onKeyUp(keyCode, event);
         }
+
+        if (!camera_in_background && keyCode == 131 && DeviceSettings.isMurenaTwo()) {
+            String cameraState = Utils.getProperty("persist.sys.hwswitch.state", null);
+            if (cameraState == null) return super.onKeyUp(keyCode, event);
+
+            if (retryRunnable != null) {
+                handler.removeCallbacks(retryRunnable);
+            }
+
+            murenaTwoHwKill = Objects.equals(cameraState, "1");
+            retryRunnable = () -> {
+                if (!murenaTwoHwKill) {
+                    preview.retryOpenCamera();
+                } else {
+                    restartOpenCamera();
+                }
+            };
+            handler.postDelayed(retryRunnable, murenaTwoHwKill ? 200 : 5000);
+        }
+
         return super.onKeyUp(keyCode, event);
     }
 
diff --git a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java
index 8c3aa4c1a2c8927223fa0046612137d219c56db5..372803e9509ff746b90fba31e087ec21887cd6d2 100644
--- a/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java
+++ b/app/src/main/java/net/sourceforge/opencamera/MyApplicationInterface.java
@@ -2633,6 +2633,7 @@ public class MyApplicationInterface extends BasicApplicationInterface {
 
     @Override
     public void onCameraError() {
+        if (DeviceSettings.isMurenaTwo()) return;
         main_activity.getPreview().showToast(null, R.string.camera_error);
     }
 
diff --git a/app/src/main/java/net/sourceforge/opencamera/Utils.java b/app/src/main/java/net/sourceforge/opencamera/Utils.java
new file mode 100644
index 0000000000000000000000000000000000000000..761e8e0d81e994b1a03692ff03f100b1a6631077
--- /dev/null
+++ b/app/src/main/java/net/sourceforge/opencamera/Utils.java
@@ -0,0 +1,19 @@
+package net.sourceforge.opencamera;
+
+import android.os.Build;
+
+import java.lang.reflect.Method;
+import java.util.Locale;
+
+public class Utils {
+    public static String getProperty(String key, String defaultValue) {
+        try {
+            Class> systemProperties = Class.forName("android.os.SystemProperties");
+            Method get = systemProperties.getMethod("get", String.class, String.class);
+            return (String) get.invoke(null, key, defaultValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return defaultValue;
+        }
+    }
+}
diff --git a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java
index 8c0cda5a2c71f23c9a2b904510e95a72aacf07b7..fd696a7b1d3715880221de62626d21c6be736282 100644
--- a/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java
+++ b/app/src/main/java/net/sourceforge/opencamera/ui/DrawPreview.java
@@ -31,6 +31,7 @@ import android.view.View;
 
 import androidx.annotation.NonNull;
 
+import net.sourceforge.opencamera.DeviceSettings;
 import net.sourceforge.opencamera.GyroSensor;
 import net.sourceforge.opencamera.ImageSaver;
 import net.sourceforge.opencamera.LocationSupplier;
@@ -38,6 +39,7 @@ import net.sourceforge.opencamera.MainActivity;
 import net.sourceforge.opencamera.MyApplicationInterface;
 import net.sourceforge.opencamera.MyDebug;
 import net.sourceforge.opencamera.PreferenceKeys;
+import net.sourceforge.opencamera.Utils;
 import net.sourceforge.opencamera.cameracontroller.CameraController;
 import net.sourceforge.opencamera.preview.ApplicationInterface;
 import net.sourceforge.opencamera.preview.Preview;
@@ -50,6 +52,7 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 
 import foundation.e.camera.R;
 
@@ -2052,7 +2055,16 @@ public class DrawPreview {
             p.setTextAlign(Paint.Align.CENTER);
             int pixels_offset = (int) (20 * scale + 0.5f); // convert dps to pixels
             if( preview.hasPermissions() ) {
-                if( preview.openCameraFailed() ) {
+                String cameraState = Utils.getProperty("persist.sys.hwswitch.state", null);
+                if (cameraState != null && DeviceSettings.isMurenaTwo() && preview.openCameraFailed()) {
+                    boolean enabled = Objects.equals(cameraState, "1");
+                    int text1 = enabled ? R.string.failed_to_open_camera_two_1_disabled : R.string.failed_to_open_camera_two_1_enabled;
+                    int text2 = enabled ? R.string.failed_to_open_camera_two_2_disabled : R.string.failed_to_open_camera_two_2_enabled;
+                    canvas.drawText(getContext().getResources().getString(text1), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f, p);
+                    canvas.drawText(getContext().getResources().getString(text2), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + pixels_offset, p);
+                }
+
+                if ( !DeviceSettings.isMurenaTwo() && preview.openCameraFailed() ) {
                     canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_1), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f, p);
                     canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_2), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + pixels_offset, p);
                     canvas.drawText(getContext().getResources().getString(R.string.failed_to_open_camera_3), canvas.getWidth() / 2.0f, canvas.getHeight() / 2.0f + 2 * pixels_offset, p);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a9737d854dc47fec6f95a067294e45ed47623354..bb18ff383dbf521c6506996c2ee7f85645d43a2c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1132,4 +1132,10 @@
     Handle this FIDO QR code
     Use passkey
     Share with
+
+    "YOUR PRIVACY SWITCH MUST BE ACTIVATED"
+    "AS THE CAMERA IS NOT AVAILABLE ;-)"
+
+    "PLEASE WAIT 5 SECONDS FOR YOUR CAMERA"
+    "TO LOAD AS IT'S JUST BEEN ENABLED"