diff --git a/sdk/src/omnirom/app/OmniRomContextConstants.java b/sdk/src/omnirom/app/OmniRomContextConstants.java
new file mode 100644
index 0000000..33a3694
--- /dev/null
+++ b/sdk/src/omnirom/app/OmniRomContextConstants.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (C) 2015, The CyanogenMod Project
+ *               2017-2023 The LineageOS 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 omnirom.app;
+
+import android.annotation.SdkConstant;
+
+/**
+ * @hide
+ * TODO: We need to somehow make these managers accessible via getSystemService
+ */
+public final class OmniRomContextConstants {
+
+    /**
+     * @hide
+     */
+    private OmniRomContextConstants() {
+        // Empty constructor
+    }
+
+    /**
+     * Use with {@link android.content.Context#getSystemService} to retrieve a
+     * {@link lineageos.health.HealthInterface} to access the Health interface.
+     *
+     * @see android.content.Context#getSystemService
+     * @see lineageos.health.HealthInterface
+     *
+     * @hide
+     */
+    public static final String LINEAGE_HEALTH_INTERFACE = "lineagehealth";
+
+    /**
+     * Features supported by the Lineage SDK.
+     */
+    public static class Features {
+        /**
+         * Feature for {@link PackageManager#getSystemAvailableFeatures} and
+         * {@link PackageManager#hasSystemFeature}: The device includes the lineage health
+         * service utilized by the omnirom sdk and Omnirom Control.
+         */
+        @SdkConstant(SdkConstant.SdkConstantType.FEATURE)
+        public static final String HEALTH = "org.lineageos.health";
+    }
+}
diff --git a/sdk/src/omnirom/health/HealthInterface.java b/sdk/src/omnirom/health/HealthInterface.java
new file mode 100644
index 0000000..3a8e787
--- /dev/null
+++ b/sdk/src/omnirom/health/HealthInterface.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2023 The LineageOS 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 omnirom.health;
+
+import android.content.Context;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+
+import omnirom.app.OmniRomContextConstants;
+
+public class HealthInterface {
+    /**
+     * No config set. This value is invalid and does not have any effects
+     */
+    public static final int MODE_NONE = 0;
+
+    /**
+     * Automatic config
+     */
+    public static final int MODE_AUTO = 1;
+
+    /**
+     * Manual config mode
+     */
+    public static final int MODE_MANUAL = 2;
+
+    /**
+     * Limit config mode
+     */
+    public static final int MODE_LIMIT = 3;
+
+    private static final String TAG = "HealthInterface";
+    private static IHealthInterface sService;
+    private static HealthInterface sInstance;
+    private Context mContext;
+
+    private HealthInterface(Context context) {
+        Context appContext = context.getApplicationContext();
+        mContext = appContext == null ? context : appContext;
+        sService = getService();
+
+        if (context.getPackageManager().hasSystemFeature(
+                OmniRomContextConstants.Features.HEALTH) && sService == null) {
+            throw new RuntimeException("Unable to get HealthInterfaceService. The service" +
+                    " either crashed, was not started, or the interface has been called too early" +
+                    " in SystemServer init");
+        }
+    }
+
+    /**
+     * Get or create an instance of the {@link omnirom.health.HealthInterface}
+     *
+     * @param context Used to get the service
+     * @return {@link HealthInterface}
+     */
+    public static synchronized HealthInterface getInstance(Context context) {
+        if (sInstance == null) {
+            sInstance = new HealthInterface(context);
+        }
+
+        return sInstance;
+    }
+
+    /** @hide **/
+    public static IHealthInterface getService() {
+        if (sService != null) {
+            return sService;
+        }
+        IBinder b = ServiceManager.getService(OmniRomContextConstants.LINEAGE_HEALTH_INTERFACE);
+        sService = IHealthInterface.Stub.asInterface(b);
+
+        if (sService == null) {
+            Log.e(TAG, "null health service, SAD!");
+            return null;
+        }
+
+        return sService;
+    }
+
+    /**
+     * @return true if service is valid
+     */
+    private boolean checkService() {
+        if (sService == null) {
+            Log.w(TAG, "not connected to OmniRomHardwareManagerService");
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Returns whether charging control is supported
+     *
+     * @return true if charging control is supported
+     */
+    public boolean isChargingControlSupported() {
+        try {
+            return checkService() && sService.isChargingControlSupported();
+        } catch (RemoteException e) {
+            Log.e(TAG, e.getLocalizedMessage(), e);
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns the charging control enabled status
+     *
+     * @return whether charging control has been enabled
+     */
+    public boolean getEnabled() {
+        try {
+            return checkService() && sService.getChargingControlEnabled();
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Set charging control enable status
+     *
+     * @param enabled whether charging control should be enabled
+     * @return true if the enabled status was successfully set
+     */
+    public boolean setEnabled(boolean enabled) {
+        try {
+            return checkService() && sService.setChargingControlEnabled(enabled);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the current charging control mode
+     *
+     * @return id of the charging control mode
+     */
+    public int getMode() {
+        try {
+            return checkService() ? sService.getChargingControlMode() : MODE_NONE;
+        } catch (RemoteException e) {
+            return MODE_NONE;
+        }
+    }
+
+    /**
+     * Selects the new charging control mode
+     *
+     * @param mode the new charging control mode
+     * @return true if the mode was successfully set
+     */
+    public boolean setMode(int mode) {
+        try {
+            return checkService() && sService.setChargingControlMode(mode);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Gets the charging control start time
+     *
+     * @return the seconds of the day of the start time
+     */
+    public int getStartTime() {
+        try {
+            return checkService() ? sService.getChargingControlStartTime() : 0;
+        } catch (RemoteException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Sets the charging control start time
+     *
+     * @param time the seconds of the day of the start time
+     * @return true if the start time was successfully set
+     */
+    public boolean setStartTime(int time) {
+        try {
+            return checkService() && sService.setChargingControlStartTime(time);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Gets the charging control target time
+     *
+     * @return the seconds of the day of the target time
+     */
+    public int getTargetTime() {
+        try {
+            return checkService() ? sService.getChargingControlTargetTime() : 0;
+        } catch (RemoteException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Sets the charging control target time
+     *
+     * @param time the seconds of the day of the target time
+     * @return true if the target time was successfully set
+     */
+    public boolean setTargetTime(int time) {
+        try {
+            return checkService() && sService.setChargingControlTargetTime(time);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Gets the charging control limit
+     *
+     * @return the charging control limit
+     */
+    public int getLimit() {
+        try {
+            return checkService() ? sService.getChargingControlLimit() : 100;
+        } catch (RemoteException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Sets the charging control limit
+     *
+     * @param limit the charging control limit
+     * @return true if the limit was successfully set
+     */
+    public boolean setLimit(int limit) {
+        try {
+            return checkService() && sService.setChargingControlLimit(limit);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Resets the charging control setting to default
+     *
+     * @return true if the setting was successfully reset
+     */
+    public boolean reset() {
+        try {
+            return checkService() && sService.resetChargingControl();
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns whether the device's battery control bypasses battery
+     *
+     * @return true if the charging control bypasses battery
+     */
+    public boolean allowFineGrainedSettings() {
+        try {
+            return checkService() && sService.allowFineGrainedSettings();
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+}
diff --git a/sdk/src/omnirom/health/IHealthInterface.aidl b/sdk/src/omnirom/health/IHealthInterface.aidl
new file mode 100644
index 0000000..30928c5
--- /dev/null
+++ b/sdk/src/omnirom/health/IHealthInterface.aidl
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2023 The LineageOS 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 omnirom.health;
+
+/** @hide */
+interface IHealthInterface {
+    boolean isChargingControlSupported();
+
+    boolean getChargingControlEnabled();
+    boolean setChargingControlEnabled(boolean enabled);
+
+    int getChargingControlMode();
+    boolean setChargingControlMode(int mode);
+
+    int getChargingControlStartTime();
+    boolean setChargingControlStartTime(int time);
+
+    int getChargingControlTargetTime();
+    boolean setChargingControlTargetTime(int time);
+
+    int getChargingControlLimit();
+    boolean setChargingControlLimit(int limit);
+
+    boolean resetChargingControl();
+    boolean allowFineGrainedSettings();
+}
