diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ff80d5bd3f64ef993183bfe7aee146b1654b9fc2..068173acbc37499b645d800a91d80f600af47056 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -10364,6 +10364,12 @@ public final class Settings {
          */
         public static final String DOUBLE_TAP_SLEEP_GESTURE = "double_tap_sleep_gesture";
 
+        /**
+         * Whether key swap is enabled on supported hardware
+         * @hide
+         */
+        public static final String SWAP_CAPACITIVE_KEYS = "swap_capacitive_keys";
+
         /**
          * These entries are considered common between the personal and the managed profile,
          * since the managed profile doesn't get to change them.
diff --git a/core/java/com/android/internal/libremobileos/hardware/LineageHardwareManager.java b/core/java/com/android/internal/libremobileos/hardware/LineageHardwareManager.java
index f0e54639f223a46ef795472df5212aeeddfe5f17..190c5cd29ecdd9b40480eb0c41329d7d12d87c82 100644
--- a/core/java/com/android/internal/libremobileos/hardware/LineageHardwareManager.java
+++ b/core/java/com/android/internal/libremobileos/hardware/LineageHardwareManager.java
@@ -30,6 +30,7 @@ import com.android.internal.libremobileos.hardware.HIDLHelper;
 
 import vendor.lineage.touch.V1_0.IGloveMode;
 import vendor.lineage.touch.V1_0.IKeyDisabler;
+import vendor.lineage.touch.V1_0.IKeySwapper;
 import vendor.lineage.touch.V1_0.IStylusMode;
 import vendor.lineage.touch.V1_0.ITouchscreenGesture;
 
@@ -68,6 +69,12 @@ public final class LineageHardwareManager {
     @VisibleForTesting
     public static final int FEATURE_KEY_DISABLE = 0x20;
 
+    /**
+     * Hardware navigation key swapping
+     */
+    @VisibleForTesting
+    public static final int FEATURE_KEY_SWAP = 0x40;
+
     /**
      * Touchscreen hovering
      */
@@ -83,6 +90,7 @@ public final class LineageHardwareManager {
     private static final List<Integer> BOOLEAN_FEATURES = Arrays.asList(
         FEATURE_HIGH_TOUCH_SENSITIVITY,
         FEATURE_KEY_DISABLE,
+        FEATURE_KEY_SWAP,
         FEATURE_TOUCH_HOVERING
     );
 
@@ -173,6 +181,8 @@ public final class LineageHardwareManager {
                     return IGloveMode.getService(true);
                 case FEATURE_KEY_DISABLE:
                     return IKeyDisabler.getService(true);
+                case FEATURE_KEY_SWAP:
+                    return IKeySwapper.getService(true);
                 case FEATURE_TOUCH_HOVERING:
                     return IStylusMode.getService(true);
                 case FEATURE_TOUCHSCREEN_GESTURES:
@@ -227,6 +237,9 @@ public final class LineageHardwareManager {
                     case FEATURE_KEY_DISABLE:
                         IKeyDisabler keyDisabler = (IKeyDisabler) obj;
                         return keyDisabler.isEnabled();
+                    case FEATURE_KEY_SWAP:
+                        IKeySwapper keySwapper = (IKeySwapper) obj;
+                        return keySwapper.isEnabled();
                     case FEATURE_TOUCH_HOVERING:
                         IStylusMode stylusMode = (IStylusMode) obj;
                         return stylusMode.isEnabled();
@@ -264,6 +277,9 @@ public final class LineageHardwareManager {
                     case FEATURE_KEY_DISABLE:
                         IKeyDisabler keyDisabler = (IKeyDisabler) obj;
                         return keyDisabler.setEnabled(enable);
+                    case FEATURE_KEY_SWAP:
+                        IKeySwapper keySwapper = (IKeySwapper) obj;
+                        return keySwapper.setEnabled(enable);
                     case FEATURE_TOUCH_HOVERING:
                         IStylusMode stylusMode = (IStylusMode) obj;
                         return stylusMode.setEnabled(enable);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index e5eb369c752a1eac217709a3fe31eee5beba4056..df96b4eedade2711e97d87da12678ab682c2fcb5 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -755,6 +755,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             resolver.registerContentObserver(Settings.Global.getUriFor(
                     Settings.Global.POWER_BUTTON_SUPPRESSION_DELAY_AFTER_GESTURE_WAKE), false, this,
                     UserHandle.USER_ALL);
+            if (mLineageHardware.isSupported(LineageHardwareManager.FEATURE_KEY_SWAP)) {
+                resolver.registerContentObserver(Settings.Secure.getUriFor(
+                        Settings.Secure.SWAP_CAPACITIVE_KEYS), false, this,
+                        UserHandle.USER_ALL);
+            }
             updateSettings();
         }
 
@@ -2195,6 +2200,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         if (updateRotation) {
             updateRotation(true);
         }
+        updateKeySwapper();
+    }
+
+    private void updateKeySwapper(){
+        if (!mLineageHardware.isSupported(LineageHardwareManager.FEATURE_KEY_SWAP)) {
+            return;
+        }
+        final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.SWAP_CAPACITIVE_KEYS, 0) == 1;
+        mLineageHardware.set(LineageHardwareManager.FEATURE_KEY_SWAP, enabled);
     }
 
     private void updateWakeGestureListenerLp() {