diff --git a/suspend/1.0/default/SystemSuspend.cpp b/suspend/1.0/default/SystemSuspend.cpp
index 5e5a745..5374ea9 100644
--- a/suspend/1.0/default/SystemSuspend.cpp
+++ b/suspend/1.0/default/SystemSuspend.cpp
@@ -56,6 +56,12 @@
 static constexpr char kSysPowerWakeLock[] = "/sys/power/wake_lock";
 static constexpr char kSysPowerWakeUnlock[] = "/sys/power/wake_unlock";
 static constexpr char kUnknownWakeup[] = "unknown";
+// This is used to disable autosuspend when zygote is restarted
+// it allows the system to make progress before autosuspend is kicked
+// NOTE: If the name of this wakelock is changed then also update the name
+// in rootdir/init.zygote32.rc, rootdir/init.zygote64.rc, and
+// rootdir/init.zygote64_32.rc
+static constexpr char kZygoteKernelWakelock[] = "zygote_kwl";
 
 // This function assumes that data in fd is small enough that it can be read in one go.
 // We use this function instead of the ones available in libbase because it doesn't block
@@ -150,10 +156,11 @@
         if (mWakeLockFd < 0) {
             PLOG(ERROR) << "error opening " << kSysPowerWakeLock;
         }
-        mWakeUnlockFd.reset(TEMP_FAILURE_RETRY(open(kSysPowerWakeUnlock, O_CLOEXEC | O_RDWR)));
-        if (mWakeUnlockFd < 0) {
-            PLOG(ERROR) << "error opening " << kSysPowerWakeUnlock;
-        }
+    }
+
+    mWakeUnlockFd.reset(TEMP_FAILURE_RETRY(open(kSysPowerWakeUnlock, O_CLOEXEC | O_RDWR)));
+    if (mWakeUnlockFd < 0) {
+        PLOG(ERROR) << "error opening " << kSysPowerWakeUnlock;
     }
 }
 
@@ -161,6 +168,14 @@
     auto tokensLock = std::lock_guard(mAutosuspendClientTokensLock);
     auto autosuspendLock = std::lock_guard(mAutosuspendLock);
 
+    // Disable zygote kernel wakelock, since explicitly attempting to
+    // enable autosuspend. This should be done even if autosuspend is
+    // already enabled, since it could be the case that the framework
+    // is restarting and connecting to the existing suspend service.
+    if (!WriteStringToFd(kZygoteKernelWakelock, mWakeUnlockFd)) {
+        PLOG(ERROR) << "error writing " << kZygoteKernelWakelock << " to " << kSysPowerWakeUnlock;
+    }
+
     bool hasToken = std::find(mAutosuspendClientTokens.begin(), mAutosuspendClientTokens.end(),
                               token) != mAutosuspendClientTokens.end();
 
@@ -327,7 +342,8 @@
             bool success;
             {
                 auto tokensLock = std::lock_guard(mAutosuspendClientTokensLock);
-                checkAutosuspendClientsLivenessLocked();
+                // TODO: Clean up client tokens after soaking the new approach
+                // checkAutosuspendClientsLivenessLocked();
 
                 autosuspendLock.lock();
                 base::ScopedLockAssertion autosuspendLocked(mAutosuspendLock);
diff --git a/suspend/1.0/default/SystemSuspendUnitTest.cpp b/suspend/1.0/default/SystemSuspendUnitTest.cpp
index f6e216b..a4d58b5 100644
--- a/suspend/1.0/default/SystemSuspendUnitTest.cpp
+++ b/suspend/1.0/default/SystemSuspendUnitTest.cpp
@@ -198,8 +198,12 @@
     }
 
     virtual void TearDown() override {
+        // Allow some time for the autosuspend loop to happen, if unblocked
+        std::this_thread::sleep_for(100ms);
+
         if (!isReadBlocked(wakeupCountFd)) readFd(wakeupCountFd);
-        if (!isReadBlocked(stateFd)) readFd(stateFd).empty();
+        if (!isReadBlocked(stateFd)) readFd(stateFd);
+
         ASSERT_TRUE(isReadBlocked(wakeupCountFd));
         ASSERT_TRUE(isReadBlocked(stateFd));
     }
@@ -209,7 +213,12 @@
         ASSERT_TRUE(WriteStringToFd(wakeupCount, wakeupCountFd));
     }
 
-    bool isSystemSuspendBlocked(int timeout_ms = 20) { return isReadBlocked(stateFd, timeout_ms); }
+    bool isSystemSuspendBlocked(int timeout_ms = 20) {
+        // Allow some time for the autosuspend loop to happen, if unblocked
+        std::this_thread::sleep_for(100ms);
+
+        return isReadBlocked(stateFd, timeout_ms);
+    }
 
     std::shared_ptr<IWakeLock> acquireWakeLock(const std::string& name = "TestLock") {
         std::shared_ptr<IWakeLock> wl = nullptr;
@@ -305,18 +314,32 @@
 // Tests that autosuspend thread can only enabled again after its been disabled.
 TEST_F(SystemSuspendTest, EnableAutosuspendAfterDisableAutosuspend) {
     bool enabled = false;
-    unblockSystemSuspendFromWakeupCount();
-    systemSuspend->disableAutosuspend();
+
+    checkLoop(1);
     controlServiceInternal->enableAutosuspend(new BBinder(), &enabled);
-    ASSERT_EQ(enabled, true);
+    ASSERT_FALSE(enabled);
+
+    systemSuspend->disableAutosuspend();
+    unblockSystemSuspendFromWakeupCount();
+
+    controlServiceInternal->enableAutosuspend(new BBinder(), &enabled);
+    ASSERT_TRUE(enabled);
 }
 
 TEST_F(SystemSuspendTest, DisableAutosuspendBlocksSuspend) {
     checkLoop(1);
     systemSuspend->disableAutosuspend();
+    unblockSystemSuspendFromWakeupCount();
     ASSERT_TRUE(isSystemSuspendBlocked());
+
+    // Re-enable autosuspend
+    bool enabled = false;
+    controlServiceInternal->enableAutosuspend(new BBinder(), &enabled);
+    ASSERT_TRUE(enabled);
 }
 
+// TODO: Clean up binder tokens after soaking new implementation
+/*
 TEST_F(SystemSuspendTest, BlockAutosuspendIfBinderIsDead) {
     class DeadBinder : public BBinder {
         android::status_t pingBinder() override { return android::UNKNOWN_ERROR; }
@@ -385,6 +408,7 @@
 
     ASSERT_FALSE(timedOut);
 }
+*/
 
 TEST_F(SystemSuspendTest, AutosuspendLoop) {
     checkLoop(5);
@@ -417,10 +441,10 @@
         std::shared_ptr<IWakeLock> wl1 = acquireWakeLock();
         ASSERT_NE(wl1, nullptr);
         ASSERT_TRUE(isSystemSuspendBlocked());
-        unblockSystemSuspendFromWakeupCount();
         {
             std::shared_ptr<IWakeLock> wl2 = acquireWakeLock();
             ASSERT_NE(wl2, nullptr);
+            unblockSystemSuspendFromWakeupCount();
             ASSERT_TRUE(isSystemSuspendBlocked());
         }
         ASSERT_TRUE(isSystemSuspendBlocked());
