diff --git a/cmhw/org/cyanogenmod/hardware/SunlightEnhancement.java b/cmhw/org/cyanogenmod/hardware/SunlightEnhancement.java
new file mode 100644
index 0000000..afcf33c
--- /dev/null
+++ b/cmhw/org/cyanogenmod/hardware/SunlightEnhancement.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016 The CyanogenMod 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 org.cyanogenmod.hardware;
+
+import org.cyanogenmod.hardware.util.FileUtils;
+
+import android.os.SystemProperties;
+
+import java.io.File;
+
+/**
+ * Sunlight Readability Enhancement support, aka Facemelt Mode.
+ *
+ * Brightens up the screen via image processing or other tricks when
+ * under aggressive lighting conditions. Usually depends on CABC
+ * support.
+ */
+public class SunlightEnhancement {
+    private static final String sOutdoorModePath = "/sys/class/mdnie/mdnie/outdoor";
+
+    /**
+     * Whether device supports SRE
+     *
+     * @return boolean Supported devices must return always true
+     */
+    public static boolean isSupported() {
+        return new File(sOutdoorModePath).exists();
+    }
+
+    /**
+     * This method return the current activation status of SRE
+     *
+     * @return boolean Must be false when SRE is not supported or not activated, or
+     * the operation failed while reading the status; true in any other case.
+     */
+    public static boolean isEnabled() {
+        String line = FileUtils.readOneLine(sOutdoorModePath);
+        if (line == null)
+            return false;
+        return line.equals("1");
+    }
+
+    /**
+     * This method allows to setup SRE.
+     *
+     * @param status The new SRE status
+     * @return boolean Must be false if SRE is not supported or the operation
+     * failed; true in any other case.
+     */
+    public static boolean setEnabled(boolean status) {
+        return FileUtils.writeLine(sOutdoorModePath, status ? "1" : "0");
+    }
+
+    /**
+     * Whether adaptive backlight (CABL / CABC) is required to be enabled
+     *
+     * @return boolean False if adaptive backlight is not a dependency
+     */
+    public static boolean isAdaptiveBacklightRequired() {
+        return false;
+    }
+
+    /**
+     * Set this to true if the implementation is self-managed and does
+     * it's own ambient sensing. In this case, setEnabled is assumed
+     * to toggle the feature on or off, but not activate it. If set
+     * to false, LiveDisplay will call setEnabled when the ambient lux
+     * threshold is crossed.
+     *
+     * @return true if this enhancement is self-managed
+     */
+    public static boolean isSelfManaged() {
+        return false;
+    }
+}
