diff --git a/service/java/com/android/server/wifi/WifiLockManager.java b/service/java/com/android/server/wifi/WifiLockManager.java
index fe193f0..df9586f 100644
--- a/service/java/com/android/server/wifi/WifiLockManager.java
+++ b/service/java/com/android/server/wifi/WifiLockManager.java
@@ -71,7 +71,7 @@
         if (!isValidLockMode(lockMode)) {
             throw new IllegalArgumentException("lockMode =" + lockMode);
         }
-        if (ws == null || ws.size() == 0) {
+        if (ws == null || ws.isEmpty()) {
             ws = new WorkSource(Binder.getCallingUid());
         } else {
             mContext.enforceCallingOrSelfPermission(
@@ -144,15 +144,23 @@
         }
 
         WorkSource newWorkSource;
-        if (ws == null || ws.size() == 0) {
+        if (ws == null || ws.isEmpty()) {
             newWorkSource = new WorkSource(Binder.getCallingUid());
         } else {
             // Make a copy of the WorkSource before adding it to the WakeLock
             newWorkSource = new WorkSource(ws);
         }
 
+        if (mVerboseLoggingEnabled) {
+            Slog.d(TAG, "updateWifiLockWakeSource: " + wl + ", newWorkSource=" + newWorkSource);
+        }
+
         long ident = Binder.clearCallingIdentity();
         try {
+            // TODO: Introduce a noteFullWifiLockChangedFromSource() so that this logic can be
+            // handled properly in BatteryStats rather than here. This would ensure there are no
+            // "holes" in the reported data due to a "release" event occurring before an
+            // "acquire" event.
             mBatteryStats.noteFullWifiLockReleasedFromSource(wl.mWorkSource);
             wl.mWorkSource = newWorkSource;
             mBatteryStats.noteFullWifiLockAcquiredFromSource(wl.mWorkSource);
@@ -323,7 +331,8 @@
         }
 
         public String toString() {
-            return "WifiLock{" + this.mTag + " type=" + this.mMode + " uid=" + mUid + "}";
+            return "WifiLock{" + this.mTag + " type=" + this.mMode + " uid=" + mUid
+                    + " workSource=" + mWorkSource + "}";
         }
     }
 }
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java
index d5d79b8..1cc9479 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java
@@ -31,7 +31,6 @@
 
 import org.junit.Before;
 import org.junit.Test;
-
 import org.mockito.ArgumentCaptor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
@@ -52,7 +51,9 @@
     WifiLockManager mWifiLockManager;
     @Mock IBatteryStats mBatteryStats;
     @Mock IBinder mBinder;
+    @Mock IBinder mBinder2;
     WorkSource mWorkSource;
+    WorkSource mChainedWorkSource;
     @Mock Context mContext;
 
     /**
@@ -62,6 +63,11 @@
     @Before
     public void setUp() {
         mWorkSource = new WorkSource(DEFAULT_TEST_UID_1);
+        mChainedWorkSource = new WorkSource();
+        mChainedWorkSource.createWorkChain()
+                .addNode(DEFAULT_TEST_UID_1, "tag1")
+                .addNode(DEFAULT_TEST_UID_2, "tag2");
+
         MockitoAnnotations.initMocks(this);
         mWifiLockManager = new WifiLockManager(mContext, mBatteryStats);
     }
@@ -225,6 +231,41 @@
     }
 
     /**
+     * Checks that WorkChains are preserved when merged WorkSources are created.
+     */
+    @Test
+    public void createMergedworkSourceWithChainsShouldSucceed() throws Exception {
+        acquireWifiLockSuccessful(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "", mBinder, mWorkSource);
+        acquireWifiLockSuccessful(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "", mBinder2,
+                mChainedWorkSource);
+
+        WorkSource merged = mWifiLockManager.createMergedWorkSource();
+        assertEquals(1, merged.size());
+        assertEquals(1, merged.getWorkChains().size());
+    }
+
+    /**
+     * A smoke test for acquiring, updating and releasing WifiLocks with chained WorkSources.
+     */
+    @Test
+    public void smokeTestLockLifecycleWithChainedWorkSource() throws Exception {
+        acquireWifiLockSuccessful(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "", mBinder,
+                mChainedWorkSource);
+
+        WorkSource updated = new WorkSource();
+        updated.set(mChainedWorkSource);
+        updated.createWorkChain().addNode(
+                DEFAULT_TEST_UID_1, "chain2");
+
+        mWifiLockManager.updateWifiLockWorkSource(mBinder, updated);
+        InOrder inOrder = inOrder(mBatteryStats);
+        inOrder.verify(mBatteryStats).noteFullWifiLockReleasedFromSource(mChainedWorkSource);
+        inOrder.verify(mBatteryStats).noteFullWifiLockAcquiredFromSource(eq(updated));
+
+        releaseWifiLockSuccessful(mBinder);
+    }
+
+    /**
      * Test the ability to update a WifiLock WorkSource with a new WorkSource.
      *
      * Steps: acquire a WifiLock with the default test worksource, then attempt to update it.
@@ -314,6 +355,7 @@
         assertTrue(wifiLockManagerDumpString.contains("Locks held:"));
         assertTrue(wifiLockManagerDumpString.contains(
                 "WifiLock{" + TEST_WIFI_LOCK_TAG + " type=" + WifiManager.WIFI_MODE_FULL
-                + " uid=" + Binder.getCallingUid() + "}"));
+                + " uid=" + Binder.getCallingUid() + " workSource=WorkSource{"
+                        + DEFAULT_TEST_UID_1 + "}"));
     }
 }
