diff --git a/nodejs.js b/nodejs.js
index 715fda9ee5c4b6304d958c89540a9fad775864b3..5b4fdaba565b93bfa43fe92dcba1f74d828b2104 100644
--- a/nodejs.js
+++ b/nodejs.js
@@ -1,7 +1,7 @@
 
 (function ($) {
 
-Drupal.Nodejs = Drupal.Nodejs || {'callbacks': {}, 'socket': false, 'connectionSetupHandlers': {}};
+Drupal.Nodejs = Drupal.Nodejs || {'presenceCallbacks': {}, 'callbacks': {}, 'socket': false, 'connectionSetupHandlers': {}};
 
 Drupal.behaviors.nodejs = {
   attach: function (context, settings) {
@@ -20,6 +20,16 @@ Drupal.Nodejs.runCallbacks = function (message) {
     }
     catch (exception) {}
   }
+  else if (message.presenceNotification != undefined) {
+    $.each(Drupal.Nodejs.presenceCallbacks, function () {
+      if ($.isFunction(this.callback)) {
+        try {
+          this.callback(message);
+        }
+        catch (exception) {}
+      }
+    });
+  }
   else {
     $.each(Drupal.Nodejs.callbacks, function () {
       if ($.isFunction(this.callback)) {
diff --git a/nodejs_buddylist/icons/16/available.png b/nodejs_buddylist/icons/16/available.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e5eda236bee714d5464e6cee913727cab7baba1
Binary files /dev/null and b/nodejs_buddylist/icons/16/available.png differ
diff --git a/nodejs_buddylist/icons/16/away.png b/nodejs_buddylist/icons/16/away.png
new file mode 100644
index 0000000000000000000000000000000000000000..331828ba2fd2f71591d4398655395410e13021ed
Binary files /dev/null and b/nodejs_buddylist/icons/16/away.png differ
diff --git a/nodejs_buddylist/icons/16/busy.png b/nodejs_buddylist/icons/16/busy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0472fbe9cb597b5c0cb38a7e3555679da0cf2ef4
Binary files /dev/null and b/nodejs_buddylist/icons/16/busy.png differ
diff --git a/nodejs_buddylist/icons/16/chat.png b/nodejs_buddylist/icons/16/chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf0811806146cf08721f7d9e1e5265d317e1d6d6
Binary files /dev/null and b/nodejs_buddylist/icons/16/chat.png differ
diff --git a/nodejs_buddylist/icons/16/extended-away.png b/nodejs_buddylist/icons/16/extended-away.png
new file mode 100644
index 0000000000000000000000000000000000000000..018c272eb0eae87af14d6071d8c4d2c25e1825c1
Binary files /dev/null and b/nodejs_buddylist/icons/16/extended-away.png differ
diff --git a/nodejs_buddylist/icons/16/invisible.png b/nodejs_buddylist/icons/16/invisible.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ab7fcd8c1bb57b6a58c936e8d9de5afee0829a4
Binary files /dev/null and b/nodejs_buddylist/icons/16/invisible.png differ
diff --git a/nodejs_buddylist/icons/16/log-in.png b/nodejs_buddylist/icons/16/log-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd61a0317f516777872ed7e91073c6e46a78236e
Binary files /dev/null and b/nodejs_buddylist/icons/16/log-in.png differ
diff --git a/nodejs_buddylist/icons/16/log-out.png b/nodejs_buddylist/icons/16/log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..0418e64c411b503856fe9ef1d22c4069ef1f3806
Binary files /dev/null and b/nodejs_buddylist/icons/16/log-out.png differ
diff --git a/nodejs_buddylist/icons/16/offline.png b/nodejs_buddylist/icons/16/offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..44a0737e8f8b8119d1b0d61d1c565afb9c5af1cd
Binary files /dev/null and b/nodejs_buddylist/icons/16/offline.png differ
diff --git a/nodejs_buddylist/icons/16/person.png b/nodejs_buddylist/icons/16/person.png
new file mode 100644
index 0000000000000000000000000000000000000000..967e2104c17d5bc5e456c710ebe20c1d5e81ebd2
Binary files /dev/null and b/nodejs_buddylist/icons/16/person.png differ
diff --git a/nodejs_buddylist/icons/16/rtl/extended-away.png b/nodejs_buddylist/icons/16/rtl/extended-away.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd2dad501930ad5dde3ec5aa6a386a031913b793
Binary files /dev/null and b/nodejs_buddylist/icons/16/rtl/extended-away.png differ
diff --git a/nodejs_buddylist/icons/16/rtl/log-in.png b/nodejs_buddylist/icons/16/rtl/log-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..b106769a1e13c6b4696594f2616da738bf8394f7
Binary files /dev/null and b/nodejs_buddylist/icons/16/rtl/log-in.png differ
diff --git a/nodejs_buddylist/icons/16/rtl/log-out.png b/nodejs_buddylist/icons/16/rtl/log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd61d6940b376ede43ae03ce75798c92588122a1
Binary files /dev/null and b/nodejs_buddylist/icons/16/rtl/log-out.png differ
diff --git a/nodejs_buddylist/icons/32/available.png b/nodejs_buddylist/icons/32/available.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d8d72cfe02ddd2c399ff7754dac33f053ad912e
Binary files /dev/null and b/nodejs_buddylist/icons/32/available.png differ
diff --git a/nodejs_buddylist/icons/32/away.png b/nodejs_buddylist/icons/32/away.png
new file mode 100644
index 0000000000000000000000000000000000000000..63a388a4a5853530c9949aac4a8765b2089d3077
Binary files /dev/null and b/nodejs_buddylist/icons/32/away.png differ
diff --git a/nodejs_buddylist/icons/32/busy.png b/nodejs_buddylist/icons/32/busy.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dccd177403be9541f5874381b1ffc03be19d527
Binary files /dev/null and b/nodejs_buddylist/icons/32/busy.png differ
diff --git a/nodejs_buddylist/icons/32/chat.png b/nodejs_buddylist/icons/32/chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..537081e05213c231b925c4d989d2feeef19c571b
Binary files /dev/null and b/nodejs_buddylist/icons/32/chat.png differ
diff --git a/nodejs_buddylist/icons/32/extended-away.png b/nodejs_buddylist/icons/32/extended-away.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3cdb827c4894722715768c68bedb3edd4311899
Binary files /dev/null and b/nodejs_buddylist/icons/32/extended-away.png differ
diff --git a/nodejs_buddylist/icons/32/invisible.png b/nodejs_buddylist/icons/32/invisible.png
new file mode 100644
index 0000000000000000000000000000000000000000..f071fbe11607c3c9aa6640b18583a3bc96e9bc70
Binary files /dev/null and b/nodejs_buddylist/icons/32/invisible.png differ
diff --git a/nodejs_buddylist/icons/32/log-in.png b/nodejs_buddylist/icons/32/log-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..56994ba191721314759a69fab0ca26fb7e392a20
Binary files /dev/null and b/nodejs_buddylist/icons/32/log-in.png differ
diff --git a/nodejs_buddylist/icons/32/log-out.png b/nodejs_buddylist/icons/32/log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a9e8aaf1855ee85bcde825444c1b307bc410ce4
Binary files /dev/null and b/nodejs_buddylist/icons/32/log-out.png differ
diff --git a/nodejs_buddylist/icons/32/offline.png b/nodejs_buddylist/icons/32/offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..176f10b01e7a22c38f5f215beaa87b9747fedd78
Binary files /dev/null and b/nodejs_buddylist/icons/32/offline.png differ
diff --git a/nodejs_buddylist/icons/32/person.png b/nodejs_buddylist/icons/32/person.png
new file mode 100644
index 0000000000000000000000000000000000000000..6344d913293fc490acdea6a783f54dcb294ae73e
Binary files /dev/null and b/nodejs_buddylist/icons/32/person.png differ
diff --git a/nodejs_buddylist/icons/32/rtl/extended-away.png b/nodejs_buddylist/icons/32/rtl/extended-away.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3cdb827c4894722715768c68bedb3edd4311899
Binary files /dev/null and b/nodejs_buddylist/icons/32/rtl/extended-away.png differ
diff --git a/nodejs_buddylist/icons/32/rtl/log-in.png b/nodejs_buddylist/icons/32/rtl/log-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2b2d082ad3608aa1fbee945a71ad6e03d573d65
Binary files /dev/null and b/nodejs_buddylist/icons/32/rtl/log-in.png differ
diff --git a/nodejs_buddylist/icons/32/rtl/log-out.png b/nodejs_buddylist/icons/32/rtl/log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..a91bbfa0170690290eaabb9153eb55d5c4bd5989
Binary files /dev/null and b/nodejs_buddylist/icons/32/rtl/log-out.png differ
diff --git a/nodejs_buddylist/icons/48/available.png b/nodejs_buddylist/icons/48/available.png
new file mode 100644
index 0000000000000000000000000000000000000000..a751b1e4aabc8f2ff890938b47590645bc1ee119
Binary files /dev/null and b/nodejs_buddylist/icons/48/available.png differ
diff --git a/nodejs_buddylist/icons/48/away.png b/nodejs_buddylist/icons/48/away.png
new file mode 100644
index 0000000000000000000000000000000000000000..7711762c51762903f2a99f2616c3ed4aac9bcf0d
Binary files /dev/null and b/nodejs_buddylist/icons/48/away.png differ
diff --git a/nodejs_buddylist/icons/48/busy.png b/nodejs_buddylist/icons/48/busy.png
new file mode 100644
index 0000000000000000000000000000000000000000..1aaf614b62b0acbb5cd9c055d010ef4f9bb98a1a
Binary files /dev/null and b/nodejs_buddylist/icons/48/busy.png differ
diff --git a/nodejs_buddylist/icons/48/chat.png b/nodejs_buddylist/icons/48/chat.png
new file mode 100644
index 0000000000000000000000000000000000000000..137429ab8d1366aa8aa9c86d157b12acde259932
Binary files /dev/null and b/nodejs_buddylist/icons/48/chat.png differ
diff --git a/nodejs_buddylist/icons/48/extended-away.png b/nodejs_buddylist/icons/48/extended-away.png
new file mode 100644
index 0000000000000000000000000000000000000000..66864cdff2ade07186973f96f7d3db9f48602846
Binary files /dev/null and b/nodejs_buddylist/icons/48/extended-away.png differ
diff --git a/nodejs_buddylist/icons/48/invisible.png b/nodejs_buddylist/icons/48/invisible.png
new file mode 100644
index 0000000000000000000000000000000000000000..6262681031850f9bea68a2214a9a3399237fac44
Binary files /dev/null and b/nodejs_buddylist/icons/48/invisible.png differ
diff --git a/nodejs_buddylist/icons/48/log-in.png b/nodejs_buddylist/icons/48/log-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..61c103f41df235472199430d972fcb0890bf0ec2
Binary files /dev/null and b/nodejs_buddylist/icons/48/log-in.png differ
diff --git a/nodejs_buddylist/icons/48/log-out.png b/nodejs_buddylist/icons/48/log-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef7947ed17f3b02a2efe318503504b241f771552
Binary files /dev/null and b/nodejs_buddylist/icons/48/log-out.png differ
diff --git a/nodejs_buddylist/icons/48/offline.png b/nodejs_buddylist/icons/48/offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd3083814b15e7b59dc283ef6102baa91abebea4
Binary files /dev/null and b/nodejs_buddylist/icons/48/offline.png differ
diff --git a/nodejs_buddylist/icons/48/person.png b/nodejs_buddylist/icons/48/person.png
new file mode 100644
index 0000000000000000000000000000000000000000..26b924b1c8d2e703bf3c76125ddd709e87d666f7
Binary files /dev/null and b/nodejs_buddylist/icons/48/person.png differ
diff --git a/nodejs_buddylist/nodejs_buddylist.css b/nodejs_buddylist/nodejs_buddylist.css
new file mode 100644
index 0000000000000000000000000000000000000000..d4b64b577a8372ef9db882984869dc162a83707a
--- /dev/null
+++ b/nodejs_buddylist/nodejs_buddylist.css
@@ -0,0 +1,9 @@
+
+.nodejs-buddylist-offline {
+  background: url(icons/16/offline.png) no-repeat top right;
+}
+
+.nodejs-buddylist-online {
+  background: url(icons/16/available.png) no-repeat top right;
+}
+
diff --git a/nodejs_buddylist/nodejs_buddylist.js b/nodejs_buddylist/nodejs_buddylist.js
index 5a09a647f21d4c7baf6cdce0db16bd41c938abfa..1ed9886b9c8ea9a0645c3db4922d6f0ce5a782c6 100644
--- a/nodejs_buddylist/nodejs_buddylist.js
+++ b/nodejs_buddylist/nodejs_buddylist.js
@@ -1,10 +1,19 @@
 (function ($) {
 
-Drupal.Nodejs.callbacks.nodejsBuddylist.refreshList = {
-  callback: function (container_id, data) {
-    //jquery that refreshes the selector for buddy list, or user list
-    //Maybe a simple jquery animation?
+Drupal.Nodejs.presenceCallbacks.buddyList = {
+  callback: function (message) {
+    if (message.presenceNotification.event == 'offline') {
+      $('#nodejs-buddylist-uid-' + message.presenceNotification.uid).removeClass('nodejs-buddylist-online');
+      $('#nodejs-buddylist-uid-' + message.presenceNotification.uid).addClass('nodejs-buddylist-offline');
+    }
+    else {
+      $('#nodejs-buddylist-uid-' + message.presenceNotification.uid).addClass('nodejs-buddylist-online');
+      $('#nodejs-buddylist-uid-' + message.presenceNotification.uid).removeClass('nodejs-buddylist-offline');
+    }
   }
 };
 
-})(jQuery);
\ No newline at end of file
+})(jQuery);
+
+// vi:ai:expandtab:sw=2 ts=2
+
diff --git a/nodejs_buddylist/nodejs_buddylist.module b/nodejs_buddylist/nodejs_buddylist.module
index 55051f3772320dc04f129055c4179b1e652fcbe9..faf93dc27ca29bfad11ee7e360670da59a9b9415 100644
--- a/nodejs_buddylist/nodejs_buddylist.module
+++ b/nodejs_buddylist/nodejs_buddylist.module
@@ -4,7 +4,8 @@
  * Implements hook_init().
  */
 function nodejs_buddylist_init() {
-  global $user;
+  drupal_add_css(drupal_get_path('module', 'nodejs_buddylist') . '/nodejs_buddylist.css');
+  drupal_add_js(drupal_get_path('module', 'nodejs_buddylist') . '/nodejs_buddylist.js');
 }
 
 /**
@@ -76,7 +77,9 @@ function nodejs_buddylist_block_content($account) {
     $online_uids = nodejs_buddylist_get_online_uids(array_keys($buddies));
     $html = '<ul>';
     foreach ($buddies as $buddy) {
-      $html .= '<li>' . theme('username', array('account' => $buddy)) . '</li>';
+      $id = "nodejs-buddylist-uid-$buddy->uid";
+      $class = 'nodejs-buddylist-' . (in_array($buddy->uid, $online_uids) ? 'online' : 'offline');
+      $html .= '<li id="' . $id . '" class="' . $class . '">' . theme('username', array('account' => $buddy)) . '</li>';
     }
     $html .= '</ul>';
     return $html;
@@ -90,7 +93,10 @@ function nodejs_buddylist_block_content($account) {
  * Filter the given list of uids based on who is online.
  */
 function nodejs_buddylist_get_online_uids($uids) {
-  $online_uids = $uids;
-  return $uids;
+  return db_select('nodejs_presence', 'njp')
+    ->condition('njp.uid', $uids, 'IN')
+    ->fields('njp', array('uid'))
+    ->execute()
+    ->fetchCol();
 }