diff --git a/power-660.c b/power-660.c
index 23a91b6..e246f3b 100644
--- a/power-660.c
+++ b/power-660.c
@@ -49,8 +49,6 @@
 #include "power-common.h"
 #include "utils.h"
 
-#define MIN_VAL(X, Y) ((X > Y) ? (Y) : (X))
-
 static int video_encode_hint_sent;
 
 /**
@@ -153,52 +151,46 @@
 
 int set_interactive_override(int on) {
     char governor[80];
-    int resource_values[20];
-    int num_resources;
-
-    ALOGI("Got set_interactive hint");
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-        return HINT_HANDLED;
+        return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         if (is_interactive_governor(governor)) {
-            /*
-                1. CPUfreq params
-                       - hispeed freq for big - 1113Mhz
-                       - go hispeed load for big - 95
-                       - above_hispeed_delay for big - 40ms
-               2. BusDCVS V2 params
-                       - Sample_ms of 10ms
-           */
             if (is_target_SDM630()) {
-                int res[] = {0x41414000, 0x459, 0x41410000, 0x5F, 0x41400000, 0x4, 0x41820000, 0xA};
-                memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res)));
-                num_resources = ARRAY_SIZE(res);
-            }
-            /*
-                1. CPUfreq params
-                       - hispeed freq for little - 902Mhz
-                       - go hispeed load for little - 95
-                       - above_hispeed_delay for little - 40ms
-                2. BusDCVS V2 params
+                /*
+                    1. CPUfreq params
+                        - hispeed freq for big - 1113Mhz
+                        - go hispeed load for big - 95
+                        - above_hispeed_delay for big - 40ms
+                    2. BusDCVS V2 params
                        - Sample_ms of 10ms
-                3. Sched group upmigrate - 500
-           */
-            else {
-                int res[] = {0x41414100, 0x386,      0x41410100, 0x5F,       0x41400100,
-                             0x4,        0x41820000, 0xA,        0x40C54000, 0x1F4};
-                memcpy(resource_values, res, MIN_VAL(sizeof(resource_values), sizeof(res)));
-                num_resources = ARRAY_SIZE(res);
+                 */
+                int resource_values[] = {0x41414000, 0x459, 0x41410000, 0x5F,
+                                         0x41400000, 0x4,   0x41820000, 0xA};
+                perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                    ARRAY_SIZE(resource_values));
+            } else {
+                /*
+                    1. CPUfreq params
+                        - hispeed freq for little - 902Mhz
+                        - go hispeed load for little - 95
+                        - above_hispeed_delay for little - 40ms
+                    2. BusDCVS V2 params
+                        - Sample_ms of 10ms
+                    3. Sched group upmigrate - 500
+                 */
+                int resource_values[] = {0x41414100, 0x386,      0x41410100, 0x5F,       0x41400100,
+                                         0x4,        0x41820000, 0xA,        0x40C54000, 0x1F4};
+                perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                    ARRAY_SIZE(resource_values));
             }
-            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values, num_resources);
         }
-
     } else {
-        /* Display on. */
+        /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
         }
diff --git a/power-710.c b/power-710.c
index 75094a0..d5c8b52 100644
--- a/power-710.c
+++ b/power-710.c
@@ -54,12 +54,8 @@
     static const char* display_off = "0";
     char err_buf[80];
     static int init_interactive_hint = 0;
-    static int set_i_count = 0;
     int rc = 0;
 
-    set_i_count++;
-    ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count);
-
     if (init_interactive_hint == 0) {
         // First time the display is turned off
         display_fd = TEMP_FAILURE_RETRY(open(SYS_DISPLAY_PWR, O_RDWR));
@@ -69,7 +65,7 @@
         } else
             init_interactive_hint = 1;
     } else if (!on) {
-        /* Display off. */
+        /* Display off */
         rc = TEMP_FAILURE_RETRY(write(display_fd, display_off, strlen(display_off)));
         if (rc < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
@@ -83,6 +79,5 @@
             ALOGE("Error writing %s to  %s: %s\n", display_on, SYS_DISPLAY_PWR, err_buf);
         }
     }
-
-    return HINT_HANDLED; /* Don't excecute this code path, not in use */
+    return HINT_HANDLED;
 }
diff --git a/power-8084.c b/power-8084.c
index 73176c1..8612769 100644
--- a/power-8084.c
+++ b/power-8084.c
@@ -145,12 +145,11 @@
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-
         return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         /*
          * We need to be able to identify the first display off hint
          * and release the current lock holder
@@ -161,12 +160,19 @@
         }
         /* Used for all subsequent toggles to the display */
         undo_hint_action(DISPLAY_STATE_HINT_ID_2);
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
     } else {
         /* Display on */
         int resource_values2[] = {CPUS_ONLINE_MIN_2};
         perform_hint_action(DISPLAY_STATE_HINT_ID_2, resource_values2,
                             ARRAY_SIZE(resource_values2));
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
     }
-
-    return HINT_NONE;
+    return HINT_HANDLED;
 }
diff --git a/power-8226.c b/power-8226.c
index 01c481d..f797574 100644
--- a/power-8226.c
+++ b/power-8226.c
@@ -144,3 +144,27 @@
     }
     return ret_val;
 }
+
+int set_interactive_override(int on) {
+    char governor[80];
+
+    if (get_scaling_governor(governor, sizeof(governor)) == -1) {
+        ALOGE("Can't obtain scaling governor.");
+        return HINT_NONE;
+    }
+
+    if (!on) {
+        /* Display off */
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
+    } else {
+        /* Display on */
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
+    }
+    return HINT_HANDLED;
+}
diff --git a/power-845.c b/power-845.c
index aaf355b..d952111 100644
--- a/power-845.c
+++ b/power-845.c
@@ -209,12 +209,8 @@
     static const char* display_off = "0";
     char err_buf[80];
     static int init_interactive_hint = 0;
-    static int set_i_count = 0;
     int rc = 0;
 
-    set_i_count++;
-    ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count);
-
     if (init_interactive_hint == 0) {
         // First time the display is turned off
         display_fd = TEMP_FAILURE_RETRY(open(SYS_DISPLAY_PWR, O_RDWR));
@@ -224,7 +220,7 @@
         } else
             init_interactive_hint = 1;
     } else if (!on) {
-        /* Display off. */
+        /* Display off */
         rc = TEMP_FAILURE_RETRY(write(display_fd, display_off, strlen(display_off)));
         if (rc < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
@@ -238,6 +234,5 @@
             ALOGE("Error writing %s to  %s: %s\n", display_on, SYS_DISPLAY_PWR, err_buf);
         }
     }
-
-    return HINT_HANDLED; /* Don't excecute this code path, not in use */
+    return HINT_HANDLED;
 }
diff --git a/power-8610.c b/power-8610.c
index 01c481d..f797574 100644
--- a/power-8610.c
+++ b/power-8610.c
@@ -144,3 +144,27 @@
     }
     return ret_val;
 }
+
+int set_interactive_override(int on) {
+    char governor[80];
+
+    if (get_scaling_governor(governor, sizeof(governor)) == -1) {
+        ALOGE("Can't obtain scaling governor.");
+        return HINT_NONE;
+    }
+
+    if (!on) {
+        /* Display off */
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
+    } else {
+        /* Display on */
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
+    }
+    return HINT_HANDLED;
+}
diff --git a/power-8909.c b/power-8909.c
index 38d0e1c..c4854d8 100644
--- a/power-8909.c
+++ b/power-8909.c
@@ -136,3 +136,27 @@
     }
     return ret_val;
 }
+
+int set_interactive_override(int on) {
+    char governor[80];
+
+    if (get_scaling_governor(governor, sizeof(governor)) == -1) {
+        ALOGE("Can't obtain scaling governor.");
+        return HINT_NONE;
+    }
+
+    if (!on) {
+        /* Display off */
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
+    } else {
+        /* Display on */
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
+    }
+    return HINT_HANDLED;
+}
diff --git a/power-8916.c b/power-8916.c
index 422cb75..5625620 100644
--- a/power-8916.c
+++ b/power-8916.c
@@ -96,23 +96,20 @@
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-        return HINT_HANDLED;
+        return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         if (is_target_8916()) {
             if (is_interactive_governor(governor)) {
                 int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
-
                 perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                     ARRAY_SIZE(resource_values));
-            } /* Perf time rate set for 8916 target*/
-            /* End of display hint for 8916 */
+            }
         } else {
             if (is_interactive_governor(governor)) {
                 int resource_values[] = {TR_MS_CPU0_50, TR_MS_CPU4_50, THREAD_MIGRATION_SYNC_OFF};
-
                 /* Set CPU0 MIN FREQ to 400Mhz avoid extra peak power
                    impact in volume key press  */
                 snprintf(tmp_str, NODE_MAX, "%d", MIN_FREQ_CPU0_DISP_OFF);
@@ -125,14 +122,12 @@
                         }
                     }
                 }
-
                 perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                     ARRAY_SIZE(resource_values));
-            } /* Perf time rate set for CORE0,CORE4 8939 target*/
-            /* End of display hint for 8939 */
+            }
         }
     } else {
-        /* Display on. */
+        /* Display on */
         if (is_target_8916()) {
             if (is_interactive_governor(governor)) {
                 undo_hint_action(DISPLAY_STATE_HINT_ID);
@@ -152,7 +147,7 @@
                 }
                 undo_hint_action(DISPLAY_STATE_HINT_ID);
             }
-        } /* End of check condition during the DISPLAY ON case */
+        }
     }
     return HINT_HANDLED;
 }
diff --git a/power-8937.c b/power-8937.c
index 98431d3..9963eb4 100644
--- a/power-8937.c
+++ b/power-8937.c
@@ -170,47 +170,38 @@
     static const char* display_off = "0";
     char err_buf[80];
     static int init_interactive_hint = 0;
-    static int set_i_count = 0;
-
-    ALOGI("Got set_interactive hint");
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-        return HINT_HANDLED;
+        return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         if (is_interactive_governor(governor)) {
             int resource_values[] = {INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_50,
                                      INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_50,
                                      INT_OP_NOTIFY_ON_MIGRATE,   0x00};
-
             perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                 ARRAY_SIZE(resource_values));
-        } /* Perf time rate set for CORE0,CORE4 8952 target*/
-
+        }
     } else {
-        /* Display on. */
+        /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
         }
     }
 
-    set_i_count++;
-    ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count);
-
     if (init_interactive_hint == 0) {
         // First time the display is turned off
         display_fd = TEMP_FAILURE_RETRY(open(SYS_DISPLAY_PWR, O_RDWR));
         if (display_fd < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
             ALOGE("Error opening %s: %s\n", SYS_DISPLAY_PWR, err_buf);
-            return HINT_HANDLED;
         } else
             init_interactive_hint = 1;
     } else if (!on) {
-        /* Display off. */
+        /* Display off */
         rc = TEMP_FAILURE_RETRY(write(display_fd, display_off, strlen(display_off)));
         if (rc < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
@@ -224,6 +215,5 @@
             ALOGE("Error writing %s to  %s: %s\n", display_on, SYS_DISPLAY_PWR, err_buf);
         }
     }
-
     return HINT_HANDLED;
 }
diff --git a/power-8952.c b/power-8952.c
index 2b320d0..3e7941b 100644
--- a/power-8952.c
+++ b/power-8952.c
@@ -147,26 +147,22 @@
 int set_interactive_override(int on) {
     char governor[80];
 
-    ALOGI("Got set_interactive hint");
-
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-        return HINT_HANDLED;
+        return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         if (is_interactive_governor(governor)) {
             int resource_values[] = {INT_OP_CLUSTER0_TIMER_RATE, BIG_LITTLE_TR_MS_50,
                                      INT_OP_CLUSTER1_TIMER_RATE, BIG_LITTLE_TR_MS_50,
                                      INT_OP_NOTIFY_ON_MIGRATE,   0x00};
-
             perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                 ARRAY_SIZE(resource_values));
-        } /* Perf time rate set for CORE0,CORE4 8952 target*/
-
+        }
     } else {
-        /* Display on. */
+        /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
         }
diff --git a/power-8953.c b/power-8953.c
index a151180..2fe14a9 100644
--- a/power-8953.c
+++ b/power-8953.c
@@ -167,17 +167,14 @@
     static const char* display_off = "0";
     char err_buf[80];
     static int init_interactive_hint = 0;
-    static int set_i_count = 0;
-
-    ALOGI("Got set_interactive hint");
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-        return HINT_HANDLED;
+        return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         if (is_interactive_governor(governor)) {
             /* timer rate - 40mS*/
             int resource_values[] = {
@@ -186,29 +183,24 @@
             };
             perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                 ARRAY_SIZE(resource_values));
-        } /* Perf time rate set for CORE0,CORE4 8952 target*/
-
+        }
     } else {
-        /* Display on. */
+        /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
         }
     }
 
-    set_i_count++;
-    ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count);
-
     if (init_interactive_hint == 0) {
         // First time the display is turned off
         display_fd = TEMP_FAILURE_RETRY(open(SYS_DISPLAY_PWR, O_RDWR));
         if (display_fd < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
             ALOGE("Error opening %s: %s\n", SYS_DISPLAY_PWR, err_buf);
-            return HINT_HANDLED;
         } else
             init_interactive_hint = 1;
     } else if (!on) {
-        /* Display off. */
+        /* Display off */
         rc = TEMP_FAILURE_RETRY(write(display_fd, display_off, strlen(display_off)));
         if (rc < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
@@ -222,6 +214,5 @@
             ALOGE("Error writing %s to  %s: %s\n", display_on, SYS_DISPLAY_PWR, err_buf);
         }
     }
-
     return HINT_HANDLED;
 }
diff --git a/power-8960.c b/power-8960.c
index 0c5809b..6c29b06 100644
--- a/power-8960.c
+++ b/power-8960.c
@@ -138,3 +138,27 @@
     }
     return ret_val;
 }
+
+int set_interactive_override(int on) {
+    char governor[80];
+
+    if (get_scaling_governor(governor, sizeof(governor)) == -1) {
+        ALOGE("Can't obtain scaling governor.");
+        return HINT_NONE;
+    }
+
+    if (!on) {
+        /* Display off */
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
+    } else {
+        /* Display on */
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
+    }
+    return HINT_HANDLED;
+}
diff --git a/power-8974.c b/power-8974.c
index 029c933..e5ddf0f 100644
--- a/power-8974.c
+++ b/power-8974.c
@@ -160,12 +160,11 @@
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-
         return HINT_NONE;
     }
 
     if (!on) {
-        /* Display off. */
+        /* Display off */
         /*
          * We need to be able to identify the first display off hint
          * and release the current lock holder
@@ -178,6 +177,11 @@
             /* used for all subsequent toggles to the display */
             undo_hint_action(DISPLAY_STATE_HINT_ID_2);
         }
+        if (is_interactive_governor(governor)) {
+            int resource_values[] = {TR_MS_50, THREAD_MIGRATION_SYNC_OFF};
+            perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
+                                ARRAY_SIZE(resource_values));
+        }
     } else {
         /* Display on */
         if (is_target_8974pro()) {
@@ -185,7 +189,9 @@
             perform_hint_action(DISPLAY_STATE_HINT_ID_2, resource_values2,
                                 ARRAY_SIZE(resource_values2));
         }
+        if (is_interactive_governor(governor)) {
+            undo_hint_action(DISPLAY_STATE_HINT_ID);
+        }
     }
-
-    return HINT_NONE;
+    return HINT_HANDLED;
 }
diff --git a/power-8992.c b/power-8992.c
index 541cc0b..5a8181b 100644
--- a/power-8992.c
+++ b/power-8992.c
@@ -148,7 +148,6 @@
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-
         return HINT_NONE;
     }
 
@@ -158,14 +157,12 @@
             int resource_values[] = {0x777}; /* 4+0 core config in display off */
             perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                 ARRAY_SIZE(resource_values));
-            return HINT_HANDLED;
         }
     } else {
         /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
-            return HINT_HANDLED;
         }
     }
-    return HINT_NONE;
+    return HINT_HANDLED;
 }
diff --git a/power-8994.c b/power-8994.c
index 561809e..0682b17 100644
--- a/power-8994.c
+++ b/power-8994.c
@@ -148,7 +148,6 @@
 
     if (get_scaling_governor(governor, sizeof(governor)) == -1) {
         ALOGE("Can't obtain scaling governor.");
-
         return HINT_NONE;
     }
 
@@ -158,14 +157,12 @@
             int resource_values[] = {0x777}; /* 4+0 core config in display off */
             perform_hint_action(DISPLAY_STATE_HINT_ID, resource_values,
                                 ARRAY_SIZE(resource_values));
-            return HINT_HANDLED;
         }
     } else {
         /* Display on */
         if (is_interactive_governor(governor)) {
             undo_hint_action(DISPLAY_STATE_HINT_ID);
-            return HINT_HANDLED;
         }
     }
-    return HINT_NONE;
+    return HINT_HANDLED;
 }
diff --git a/power-common.c b/power-common.c
index 23fd823..cdac1e6 100644
--- a/power-common.c
+++ b/power-common.c
@@ -131,9 +131,9 @@
 
     if (set_interactive_override(on) == HINT_HANDLED) {
         return;
+    } else {
+        ALOGI("Hint not handled in set_interactive_override");
     }
-
-    ALOGI("Got set_interactive hint");
 }
 
 void __attribute__((weak))
diff --git a/power-msmnile.c b/power-msmnile.c
index 965eb9d..d6fcb80 100644
--- a/power-msmnile.c
+++ b/power-msmnile.c
@@ -53,12 +53,8 @@
     static const char* display_off = "0";
     char err_buf[80];
     static int init_interactive_hint = 0;
-    static int set_i_count = 0;
     int rc = 0;
 
-    set_i_count++;
-    ALOGI("Got set_interactive hint on= %d, count= %d\n", on, set_i_count);
-
     if (init_interactive_hint == 0) {
         // First time the display is turned off
         display_fd = TEMP_FAILURE_RETRY(open(SYS_DISPLAY_PWR, O_RDWR));
@@ -68,7 +64,7 @@
         } else
             init_interactive_hint = 1;
     } else if (!on) {
-        /* Display off. */
+        /* Display off */
         rc = TEMP_FAILURE_RETRY(write(display_fd, display_off, strlen(display_off)));
         if (rc < 0) {
             strerror_r(errno, err_buf, sizeof(err_buf));
@@ -82,7 +78,6 @@
             ALOGE("Error writing %s to  %s: %s\n", display_on, SYS_DISPLAY_PWR, err_buf);
         }
     }
-
     return HINT_HANDLED;
 }
 
