diff --git a/src/com/android/tradefed/testtype/DeviceBatteryLevelChecker.java b/src/com/android/tradefed/testtype/DeviceBatteryLevelChecker.java
index 7cf18f5..c5777e0 100644
--- a/src/com/android/tradefed/testtype/DeviceBatteryLevelChecker.java
+++ b/src/com/android/tradefed/testtype/DeviceBatteryLevelChecker.java
@@ -24,13 +24,19 @@
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.result.FailureDescription;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.result.ITestLifeCycleReceiver;
+import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.util.IRunUtil;
 import com.android.tradefed.util.RunUtil;
 import com.android.tradefed.util.TimeUtil;
 
 import org.junit.Assert;
 
+import java.util.HashMap;
+
 /**
  * An {@link IRemoteTest} that checks for a minimum battery charge, and waits for the battery to
  * reach a second charging threshold if the minimum charge isn't present.
@@ -39,6 +45,7 @@
 public class DeviceBatteryLevelChecker implements IRemoteTest {
 
     private ITestDevice mTestDevice = null;
+    private TestDescription mTestDescription = new TestDescription("BatteryCharging", "charge");
 
     /**
      * We use max-battery here to coincide with a {@link DeviceSelectionOptions} option of the same
@@ -103,11 +110,31 @@
         mTestDevice = testInfo.getDevice();
         Assert.assertNotNull(mTestDevice);
 
+        long startTime = System.currentTimeMillis();
+        listener.testRunStarted("BatteryCharging", 1);
+        listener.testStarted(mTestDescription);
+        try {
+            runTest(testInfo, listener);
+        } finally {
+            listener.testEnded(mTestDescription, new HashMap<String, Metric>());
+            listener.testRunEnded(
+                    System.currentTimeMillis() - startTime, new HashMap<String, Metric>());
+        }
+    }
+
+    private void runTest(TestInformation testInfo, ITestInvocationListener listener)
+            throws DeviceNotAvailableException {
+        mTestDevice = testInfo.getDevice();
+        Assert.assertNotNull(mTestDevice);
+
         Integer batteryLevel = checkBatteryLevel(mTestDevice);
 
         if (batteryLevel == null) {
             CLog.w("Failed to determine battery level for device %s.",
                     mTestDevice.getSerialNumber());
+            listener.testFailed(
+                    mTestDescription,
+                    FailureDescription.create("Failed to determine battery level"));
             return;
         } else if (batteryLevel < mMaxBattery) {
             // Time-out.  Send the device to the corner
@@ -130,39 +157,68 @@
         // turn screen off
         turnScreenOff(mTestDevice);
 
-        if (mStopRuntime) {
-            stopDeviceRuntime();
-        }
-        // Stop our logcat receiver
-        if (mStopLogcat) {
-            mTestDevice.stopLogcat();
+        try {
+            if (mStopRuntime) {
+                stopDeviceRuntime();
+            }
+            // Stop our logcat receiver
+            if (mStopLogcat) {
+                mTestDevice.stopLogcat();
+            }
+
+            runBatteryCharging(listener, mTestDescription);
+            // TODO: Check the charging speed
+        } finally {
+            if (mStopRuntime) {
+                // Restart runtime if it was stopped
+                startDeviceRuntime();
+            }
         }
 
+        CLog.i(
+                "Device %s is now charged to battery level %d; releasing.",
+                mTestDevice.getSerialNumber(), batteryLevel);
+    }
+
+    private void turnScreenOff(ITestDevice device) throws DeviceNotAvailableException {
+        // TODO: Handle the case where framework is not working, both command below require it.
+        // disable always on
+        device.executeShellCommand("svc power stayon false");
+        // set screen timeout to 1s
+        device.executeShellCommand("settings put system screen_off_timeout 1000");
+        // pause for 5s to ensure that screen would be off
+        getRunUtil().sleep(5000);
+    }
+
+    private Integer runBatteryCharging(ITestLifeCycleReceiver listener, TestDescription test) {
         // If we're down here, it's time to hold the device until it reaches mResumeLevel
         Long lastReportTime = System.currentTimeMillis();
-        Integer newLevel = checkBatteryLevel(mTestDevice);
+        Integer batteryLevel = checkBatteryLevel(mTestDevice);
 
         long startTime = System.currentTimeMillis();
         while (batteryLevel != null && batteryLevel < mResumeLevel) {
             if (System.currentTimeMillis() - lastReportTime > mLoggingPollTime * 60 * 1000) {
                 // Log the battery level status every mLoggingPollTime minutes
-                CLog.w("Battery level for device %s is currently %d", mTestDevice.getSerialNumber(),
-                        newLevel);
+                CLog.i(
+                        "Battery level for device %s is currently %d",
+                        mTestDevice.getSerialNumber(), batteryLevel);
                 lastReportTime = System.currentTimeMillis();
             }
             if (System.currentTimeMillis() - startTime > mMaxRunTime) {
-                CLog.w(
+                CLog.i(
                         "DeviceBatteryLevelChecker has been running for %s. terminating.",
                         TimeUtil.formatElapsedTime(mMaxRunTime));
                 break;
             }
 
             getRunUtil().sleep((long) (mChargingPollTime * 60 * 1000));
-            newLevel = checkBatteryLevel(mTestDevice);
+            Integer newLevel = checkBatteryLevel(mTestDevice);
             if (newLevel == null) {
                 // weird
                 CLog.w("Breaking out of wait loop because battery level read failed for device %s",
                         mTestDevice.getSerialNumber());
+                listener.testFailed(
+                        test, FailureDescription.create("Failed to read battery level"));
                 break;
             } else if (newLevel < batteryLevel) {
                 // also weird
@@ -175,23 +231,7 @@
             }
             batteryLevel = newLevel;
         }
-
-        if (mStopRuntime) {
-            // Restart runtime if it was stopped
-            startDeviceRuntime();
-        }
-
-        CLog.w("Device %s is now charged to battery level %d; releasing.",
-                mTestDevice.getSerialNumber(), batteryLevel);
-    }
-
-    private void turnScreenOff(ITestDevice device) throws DeviceNotAvailableException {
-        // disable always on
-        device.executeShellCommand("svc power stayon false");
-        // set screen timeout to 1s
-        device.executeShellCommand("settings put system screen_off_timeout 1000");
-        // pause for 5s to ensure that screen would be off
-        getRunUtil().sleep(5000);
+        return batteryLevel;
     }
 
     /**
diff --git a/tests/src/com/android/tradefed/testtype/DeviceBatteryLevelCheckerTest.java b/tests/src/com/android/tradefed/testtype/DeviceBatteryLevelCheckerTest.java
index 01aa9c6..0e99b3e 100644
--- a/tests/src/com/android/tradefed/testtype/DeviceBatteryLevelCheckerTest.java
+++ b/tests/src/com/android/tradefed/testtype/DeviceBatteryLevelCheckerTest.java
@@ -26,6 +26,10 @@
 import com.android.tradefed.invoker.InvocationContext;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.result.FailureDescription;
+import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.util.IRunUtil;
 
 import org.easymock.EasyMock;
@@ -34,6 +38,8 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import java.util.HashMap;
+
 /** Unit tests for {@link DeviceBatteryLevelChecker}. */
 @RunWith(JUnit4.class)
 public class DeviceBatteryLevelCheckerTest {
@@ -42,10 +48,12 @@
     private TestInformation mTestInfo = null;
     private ITestDevice mFakeTestDevice = null;
     public Integer mBatteryLevel = 10;
+    private TestDescription mTestDescription = new TestDescription("BatteryCharging", "charge");
 
     private IDevice mMockIDevice;
     private IDeviceStateMonitor mMockStateMonitor;
     private IDeviceMonitor mMockDvcMonitor;
+    private ITestInvocationListener mMockListener;
 
     /** A {@link TestDevice} that is suitable for running tests against */
     private class TestableTestDevice extends TestDevice {
@@ -80,6 +88,7 @@
         mMockStateMonitor = EasyMock.createMock(IDeviceStateMonitor.class);
         mMockDvcMonitor = EasyMock.createMock(IDeviceMonitor.class);
         mFakeTestDevice = EasyMock.createMock(ITestDevice.class);
+        mMockListener = EasyMock.createMock(ITestInvocationListener.class);
 
         mDevice = new TestableTestDevice();
         mChecker = new DeviceBatteryLevelChecker() {
@@ -97,9 +106,16 @@
     @Test
     public void testNull() throws Exception {
         expectBattLevel(null);
+        mMockListener.testRunStarted("BatteryCharging", 1);
+        mMockListener.testStarted(mTestDescription);
+        mMockListener.testFailed(
+                mTestDescription, FailureDescription.create("Failed to determine battery level"));
+        mMockListener.testEnded(mTestDescription, new HashMap<String, Metric>());
+        mMockListener.testRunEnded(
+                EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
         replayDevices();
 
-        mChecker.run(mTestInfo, null);
+        mChecker.run(mTestInfo, mMockListener);
         // expect this to return immediately without throwing an exception.  Should log a warning.
         verifyDevices();
     }
@@ -107,9 +123,14 @@
     @Test
     public void testNormal() throws Exception {
         expectBattLevel(45);
+        mMockListener.testRunStarted("BatteryCharging", 1);
+        mMockListener.testStarted(mTestDescription);
+        mMockListener.testEnded(mTestDescription, new HashMap<String, Metric>());
+        mMockListener.testRunEnded(
+                EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
         replayDevices();
 
-        mChecker.run(mTestInfo, null);
+        mChecker.run(mTestInfo, mMockListener);
         verifyDevices();
     }
 
@@ -123,9 +144,14 @@
                 .andStubReturn("");
         EasyMock.expect(mFakeTestDevice.executeShellCommand(
                 "settings put system screen_off_timeout 1000")).andStubReturn("");
+        mMockListener.testRunStarted("BatteryCharging", 1);
+        mMockListener.testStarted(mTestDescription);
+        mMockListener.testEnded(mTestDescription, new HashMap<String, Metric>());
+        mMockListener.testRunEnded(
+                EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
         replayDevices();
         mChecker.setResumeLevel(5);
-        mChecker.run(mTestInfo, null);
+        mChecker.run(mTestInfo, mMockListener);
         verifyDevices();
     }
 
@@ -139,6 +165,11 @@
                 .andStubReturn("");
         EasyMock.expect(mFakeTestDevice.executeShellCommand(
                 "settings put system screen_off_timeout 1000")).andStubReturn("");
+        mMockListener.testRunStarted("BatteryCharging", 1);
+        mMockListener.testStarted(mTestDescription);
+        mMockListener.testEnded(mTestDescription, new HashMap<String, Metric>());
+        mMockListener.testRunEnded(
+                EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
         replayDevices();
         Thread raise = new Thread(new Runnable() {
             @Override
@@ -152,7 +183,7 @@
             }
         });
         raise.start();
-        mChecker.run(mTestInfo, null);
+        mChecker.run(mTestInfo, mMockListener);
         verifyDevices();
     }
 
@@ -166,6 +197,13 @@
                 .andStubReturn("");
         EasyMock.expect(mFakeTestDevice.executeShellCommand(
                 "settings put system screen_off_timeout 1000")).andStubReturn("");
+        mMockListener.testRunStarted("BatteryCharging", 1);
+        mMockListener.testStarted(mTestDescription);
+        mMockListener.testFailed(
+                mTestDescription, FailureDescription.create("Failed to read battery level"));
+        mMockListener.testEnded(mTestDescription, new HashMap<String, Metric>());
+        mMockListener.testRunEnded(
+                EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
         replayDevices();
         Thread raise = new Thread(new Runnable() {
             @Override
@@ -179,7 +217,7 @@
             }
         });
         raise.start();
-        mChecker.run(mTestInfo, null);
+        mChecker.run(mTestInfo, mMockListener);
         verifyDevices();
     }
 
@@ -188,11 +226,11 @@
     }
 
     private void replayDevices() {
-        EasyMock.replay(mFakeTestDevice);
+        EasyMock.replay(mFakeTestDevice, mMockListener);
     }
 
     private void verifyDevices() {
-        EasyMock.verify(mFakeTestDevice);
+        EasyMock.verify(mFakeTestDevice, mMockListener);
     }
 }
 
