diff --git a/drupalchat.module b/drupalchat.module
index c4a9806..9eab24c 100644
--- a/drupalchat.module
+++ b/drupalchat.module
@@ -411,6 +411,7 @@ function drupalchat_channel_add() {
       echo nodejs_add_user_to_channel($user->uid, 'drupalchat_' . $user->uid);
       $message['uid'] = $user->uid;
       $message['name'] = $user->name;
+      $message['buddies'] = _drupalchat_buddylist($user->uid);
       $drupalchat_nodejs_message = (object) array(
     'channel' => 'drupalchat_' . $user->uid,
     'broadcast' => FALSE,
@@ -594,7 +595,7 @@ function _drupalchat_buddylist($uid) {
     $result = db_query("SELECT * FROM {flag_friend} WHERE uid = :uid OR friend_uid = :uid", array(':uid' => $uid, ':friend_uid' => $uid));
     
     foreach ($result as $friend) {
-      $uid == $friend->uid ? $users[] = $friend->friend_uid : $users[] = $friend->uid;
+      $users[] = ($uid == $friend->uid) ? $friend->friend_uid : $friend->uid;
     }
   }
   return $users;
diff --git a/drupalchat_nodejs/drupalchat_nodejs.module b/drupalchat_nodejs/drupalchat_nodejs.module
index 466f46b..1ae4bd2 100644
--- a/drupalchat_nodejs/drupalchat_nodejs.module
+++ b/drupalchat_nodejs/drupalchat_nodejs.module
@@ -39,3 +39,22 @@ function drupalchat_nodejs_drupalchat_send($message) {
   nodejs_add_user_to_channel($user->uid, 'drupalchat_' . $user->uid);
 }
 
+
+function drupalchat_nodejs_flag_friend($status, $friend_account, $account, $flag) {
+  if (in_array($status, array('approve', 'remove'))) {
+    Nodejs::initConfig();
+    $options = array(
+      'method' => 'POST',
+      'data' => drupal_json_encode(array(
+        'friend' => $friend_account->uid,
+        'user' => $account->uid,
+        'status' => $status,
+      )),
+      'headers' => Nodejs::$headers,
+      // This is server to server, so start with a low default timeout.
+      'timeout' => !empty(Nodejs::$config['timeout']) ? Nodejs::$config['timeout'] : 5,
+    );
+    Nodejs::httpRequest('nodejs/changeFriend', $options);
+  }
+}
+
diff --git a/drupalchat_nodejs/drupalchat_nodejs.server.extension.js b/drupalchat_nodejs/drupalchat_nodejs.server.extension.js
index 3eb444b..2a75747 100644
--- a/drupalchat_nodejs/drupalchat_nodejs.server.extension.js
+++ b/drupalchat_nodejs/drupalchat_nodejs.server.extension.js
@@ -5,10 +5,21 @@
  */
 
 var publishMessageToClient;
+var friendChange;
 var drupalchat_users = {};
 var drupalchat_names = {};
+var drupalchat_buddies = {};
 var ruser = 0;
 
+exports.routes = [
+  {
+    'auth': true,
+    'path': 'friendChange',
+    'type': 'post',
+    'handler': friendChange
+  }
+];
+
 exports.setup = function (config) {
   publishMessageToClient = config.publishMessageToClient;
 
@@ -16,12 +27,6 @@ exports.setup = function (config) {
     console.log('Auth - ' + authData.uid);
     //get others info
     if(authData.uid != 0) {
-      for (var user in drupalchat_users) {
-        if(authData.uid != drupalchat_users[user] && drupalchat_names[user]) {
-          console.log('Getting - ' + user + ' with name - ' + drupalchat_names[user] + ', for ' + authData.uid);
-          publishMessageToClient(sessionId, {type: 'userOnline', data: {uid: user, name: drupalchat_names[user]}, callback: 'drupalchatNodejsMessageHandler'});
-        }
-      }
       //create own channel
       publishMessageToClient(sessionId, {type: 'createChannel', data: 'create', callback: 'drupalchatNodejsMessageHandler'});
       //add me
@@ -36,10 +41,20 @@ exports.setup = function (config) {
       
       //update name
       console.log('Name ' + data.name);
+      console.log(data);
       drupalchat_names[data.uid] = data.name;
+      drupalchat_buddies[data.uid] = data.buddies;
       //send to others
-      for (var user in drupalchat_users) {
+      var user;
+      for (var key in drupalchat_buddies[data.uid]) {
+        user = drupalchat_buddies[data.uid][key];
+
         if(user != data.uid) {
+          if (drupalchat_names[user]) {
+            console.log('Getting - ' + user + ' with name - ' + drupalchat_names[user] + ', for ' + data.uid);
+            publishMessageToClient(drupalchat_users[data.uid], {type: 'userOnline', data: {uid: user, name: drupalchat_names[user]}, callback: 'drupalchatNodejsMessageHandler'});
+          }
+
           console.log('Sending - ' + data.uid + ' to ' + user);
           publishMessageToClient(drupalchat_users[user], {type: 'userOnline', data: {uid: data.uid, name: data.name}, callback: 'drupalchatNodejsMessageHandler'});
         }
@@ -55,12 +70,73 @@ exports.setup = function (config) {
     }
     console.log('Out - ' + ruser);
     delete drupalchat_users[ruser];
+
     if(ruser!=0) {
-      for (var user in drupalchat_users) {
+      var user;
+      for (var key in drupalchat_buddies[ruser]) {
+        user = drupalchat_buddies[ruser][key];
         if(drupalchat_users[user] != sessionId) 
           publishMessageToClient(drupalchat_users[user], {type: 'userOffline', data: ruser, callback: 'drupalchatNodejsMessageHandler'});
       }
+      delete drupalchat_buddies[ruser];
     }
   });
-};
 
+  friendChange = function(request, response) {
+    var requestBody = '', index = -1;
+    request.setEncoding('utf8');
+    request.on('data', function (chunk) {
+      requestBody += chunk;
+    });
+    request.on('end', function () {
+      try {
+        var message = JSON.parse(requestBody);
+        if (settings.debug) {
+          console.log('friendChange: message', message);
+        }
+      }
+      catch (exception) {
+        console.log('friendChange: Invalid JSON "' + requestBody + '"',  exception);
+        response.send({error: 'Invalid JSON, error: ' + exception.toString()});
+        return;
+      }
+
+      if (message.status == 'approve') {
+        if (drupalchat_users[message.user]) {
+          drupalchat_buddies[message.user].push(message.friend);
+          if (drupalchat_users[message.friend]) {
+            publishMessageToClient(drupalchat_users[message.user], {type: 'userOnline', data: {uid: message.friend, name: drupalchat_names[message.friend]}, callback: 'drupalchatNodejsMessageHandler'});
+          }
+        }
+        if (drupalchat_users[message.friend]) {
+          drupalchat_buddies[message.friend].push(message.user);
+          if (drupalchat_users[message.user]) {
+            publishMessageToClient(drupalchat_users[message.friend], {type: 'userOnline', data: {uid: message.user, name: drupalchat_names[message.user]}, callback: 'drupalchatNodejsMessageHandler'});
+          }
+        }
+      }
+
+      if (messsage.status == 'remove') {
+        if (drupalchat_users[message.user]) {
+          index = drupalchat_buddies[message.user].indexOf(message.friend);
+          if (index > -1) {
+            drupalchat_buddies[message.user].splice(index, 1);
+          }
+          if (drupalchat_users[message.friend]) {
+            publishMessageToClient(drupalchat_users[message.user], {type: 'userOffline', data: message.friend, callback: 'drupalchatNodejsMessageHandler'});
+          }
+        }
+        if (drupalchat_users[message.friend]) {
+          index = drupalchat_buddies[message.friend].indexOf(message.user);
+          if (index > -1) {
+            drupalchat_buddies[message.friend].splice(index, 1);
+          }
+          if (drupalchat_users[message.user]) {
+            publishMessageToClient(drupalchat_users[message.friend], {type: 'userOffline', data: message.user, callback: 'drupalchatNodejsMessageHandler'});
+          }
+        }
+      }
+      response.send({success: true});
+    });    
+  };
+};
