diff --git a/scripts/power.js b/scripts/power.js
--- a/scripts/power.js
+++ b/scripts/power.js
@@ -99,6 +99,11 @@
 
     var percentage = st.Percentage;
 
+    var displayPercentage = percentage;
+    if (st.State == self.DEVICE_STATE.FullyCharged) {
+      displayPercentage = 100;
+    }
+
     var timeToEmpty = st.TimeToEmpty;
     var timeToFull = st.TimeToFull;
 
@@ -107,20 +112,22 @@
 
     // Sanity checks if one or the other time is missing
     if (haveTTE && !haveTTF) {
-      if (percentage > 0) {
-        timeToFull = timeToEmpty * (100 - percentage) / percentage;
+      if (displayPercentage > 0) {
+        timeToFull = timeToEmpty *
+          (100 - displayPercentage) / displayPercentage;
       } else {
         timeToFull = self.DEFAULT_TIME;
       }
     } else if (haveTTF && !haveTTE) {
-      if (percentage < 100) {
-        timeToEmpty = timeToFull * percentage / (100 - percentage);
+      if (displayPercentage < 100) {
+        timeToEmpty = timeToFull *
+          displayPercentage / (100 - displayPercentage);
       } else {
         timeToFull = self.DEFAULT_TIME;
       }
     } else if (!haveTTF && !haveTTE) {
-      timeToEmpty = self.DEFAULT_TIME * percentage;
-      timeToFull = self.DEFAULT_TIME * (100 - percentage);
+      timeToEmpty = self.DEFAULT_TIME * displayPercentage;
+      timeToFull = self.DEFAULT_TIME * (100 - displayPercentage);
     }
 
     var hour_width = self.WIDTH * self.HOUR / (timeToEmpty + timeToFull);
@@ -174,14 +181,21 @@
       'margin-bottom': (self.HEIGHT - self.TERMINAL_HEIGHT) / 2
     }));
 
-    var title = percentage + '%';
-    if (st.TimeToEmpty !== 0) {
-      title += ' (' + moment.duration(st.TimeToEmpty, 's').humanize() + ')';
+    var title;
+    if (st.State === self.DEVICE_STATE.FullyCharged) {
+      title = '';
+    } else {
+      title = percentage + '%';
+      if (st.TimeToEmpty !== 0) {
+        title += ' (' + moment.duration(st.TimeToEmpty, 's').humanize() + ')';
+      }
     }
+
     if (st.Type != self.DEVICE_TYPE.Battery) {
       title += '\n' + st.Vendor + ' ' + st.Model;
     }
 
+    title = title.trim();
     result.attr('title', title);
 
     if (st.State === self.DEVICE_STATE.Charging) {
diff --git a/src/System/Tianbar/Plugin/DBus/JSON.hs b/src/System/Tianbar/Plugin/DBus/JSON.hs
--- a/src/System/Tianbar/Plugin/DBus/JSON.hs
+++ b/src/System/Tianbar/Plugin/DBus/JSON.hs
@@ -27,6 +27,8 @@
         TypeObjectPath -> let Just p = fromVariant v :: Maybe ObjectPath in
             toJSON $ formatObjectPath p
 
+        TypeUnixFd -> let Just fd = fromVariant v :: Maybe Word32 in toJSON fd
+
         TypeVariant -> let Just n = fromVariant v :: Maybe Variant in toJSON n
         TypeArray _ -> let Just a = fromVariant v :: Maybe Array in
             toJSON $ arrayItems a
diff --git a/tianbar.cabal b/tianbar.cabal
--- a/tianbar.cabal
+++ b/tianbar.cabal
@@ -1,5 +1,5 @@
 name:                tianbar
-version:             0.4.6.3
+version:             0.4.7.0
 synopsis:            A desktop bar based on WebKit
 description:
   A desktop bar using WebKit for rendering as much as possible.
@@ -32,7 +32,7 @@
                      , aeson >=0.6
                      , containers >=0.5
                      , directory >=1.2
-                     , dbus >=0.10.7
+                     , dbus >=0.10.10
                      , gtk >=0.12
                      , gtk-traymanager >=0.1
                      , happstack-server >= 7.3
