diff --git a/libempathy/empathy-chatroom-manager.c b/libempathy/empathy-chatroom-manager.c
index b9eef3c..fb2571f 100644
--- a/libempathy/empathy-chatroom-manager.c
+++ b/libempathy/empathy-chatroom-manager.c
@@ -433,6 +433,7 @@ chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
 	}
 
 	chatroom = empathy_chatroom_new_full (account, room, name, auto_connect);
+  g_object_set (chatroom, "favorite", TRUE, NULL);
 	priv->chatrooms = g_list_prepend (priv->chatrooms, chatroom);
 	g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom);
 
@@ -470,8 +471,14 @@ chatroom_manager_file_save (EmpathyChatroomManager *manager)
 		EmpathyChatroom *chatroom;
 		xmlNodePtr      node;
 		const gchar    *account_id;
+    gboolean favorite;
 
 		chatroom = l->data;
+
+    g_object_get (chatroom, "favorite", &favorite, NULL);
+    if (!favorite)
+      continue;
+
 		account_id = mc_account_get_unique_name (empathy_chatroom_get_account (chatroom));
 
 		node = xmlNewChild (root, NULL, "chatroom", NULL);
diff --git a/libempathy/empathy-chatroom.c b/libempathy/empathy-chatroom.c
index 17be191..00371cb 100644
--- a/libempathy/empathy-chatroom.c
+++ b/libempathy/empathy-chatroom.c
@@ -34,6 +34,11 @@ typedef struct {
 	gchar     *room;
 	gchar     *name;
 	gboolean   auto_connect;
+  gboolean favorite;
+  /* FIXME: This is crack. We should store EmapthyTpChat but can't
+   * as it's not created in the dispatcher. At some point it should be
+   * automatically created by tp-glib */
+  TpChannel *tp_channel;
 } EmpathyChatroomPriv;
 
 
@@ -53,6 +58,8 @@ enum {
 	PROP_ROOM,
 	PROP_NAME,
 	PROP_AUTO_CONNECT,
+  PROP_FAVORITE,
+  PROP_TP_CHANNEL
 };
 
 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
@@ -98,6 +105,30 @@ empathy_chatroom_class_init (EmpathyChatroomClass *klass)
 							       FALSE,
 							       G_PARAM_READWRITE));
 
+  g_object_class_install_property (object_class,
+      PROP_FAVORITE,
+      g_param_spec_boolean ("favorite",
+        "Favorite",
+        "TRUE if the chatroom is in user's favorite list",
+        FALSE,
+        G_PARAM_READWRITE |
+        G_PARAM_CONSTRUCT |
+        G_PARAM_STATIC_NAME |
+        G_PARAM_STATIC_NICK |
+        G_PARAM_STATIC_BLURB));
+
+  g_object_class_install_property (object_class,
+      PROP_TP_CHANNEL,
+      g_param_spec_object ("tp-channel",
+        "TpChannel object",
+        "The TpChannel associated with this chatroom if we are in the"
+        " room. NULL otherwise.",
+        TP_TYPE_CHANNEL,
+        G_PARAM_READWRITE |
+        G_PARAM_CONSTRUCT |
+        G_PARAM_STATIC_NAME |
+        G_PARAM_STATIC_NICK |
+        G_PARAM_STATIC_BLURB));
 
 	g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
 }
@@ -118,6 +149,12 @@ chatroom_finalize (GObject *object)
 
 	priv = GET_PRIV (object);
 
+  if (priv->tp_channel != NULL)
+    {
+      g_object_unref (priv->tp_channel);
+      priv->tp_channel = NULL;
+    }
+
 	g_object_unref (priv->account);
 	g_free (priv->room);
 	g_free (priv->name);
@@ -148,6 +185,12 @@ chatroom_get_property (GObject    *object,
 	case PROP_AUTO_CONNECT:
 		g_value_set_boolean (value, priv->auto_connect);
 		break;
+  case PROP_FAVORITE:
+    g_value_set_boolean (value, priv->favorite);
+    break;
+  case PROP_TP_CHANNEL:
+    g_value_set_object (value, priv->tp_channel);
+    break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
@@ -181,6 +224,17 @@ chatroom_set_property (GObject      *object,
 		empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
 						  g_value_get_boolean (value));
 		break;
+  case PROP_FAVORITE:
+    priv->favorite = g_value_get_boolean (value);
+    break;
+  case PROP_TP_CHANNEL:
+    if (priv->tp_channel != NULL)
+      {
+        g_object_unref (priv->tp_channel);
+      }
+
+    priv->tp_channel = g_value_dup_object (value);
+    break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c
index 1d2b989..6d1f2a4 100644
--- a/libempathy/empathy-dispatcher.c
+++ b/libempathy/empathy-dispatcher.c
@@ -41,6 +41,8 @@
 #include "empathy-tube-handler.h"
 #include "empathy-contact-factory.h"
 #include "empathy-tp-group.h"
+#include "empathy-chatroom-manager.h"
+#include "empathy-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_DISPATCHER
 #include <libempathy/empathy-debug.h>
@@ -389,6 +391,31 @@ dispatcher_connection_invalidated_cb (TpConnection  *connection,
 	}
 }
 
+static void chatroom_invalidated_cb (TpProxy *channel,
+                                     guint domain,
+						                         gint code,
+                                     gchar *message,
+						                         EmpathyChatroom *chatroom)
+{
+  EmpathyChatroomManager *mgr;
+  mgr = empathy_chatroom_manager_new ();
+  gboolean favorite;
+
+  g_object_get (chatroom, "favorite", &favorite, NULL);
+
+  if (favorite)
+    {
+      /* Chatroom is in favorites so don't remove it from the manager */
+      g_object_set (chatroom, "tp-channel", NULL, NULL);
+    }
+  else
+    {
+      empathy_chatroom_manager_remove (mgr, chatroom);
+    }
+
+  g_object_unref (mgr);
+}
+
 static void
 dispatcher_connection_new_channel_cb (TpConnection *connection,
 				      const gchar  *object_path,
@@ -418,6 +445,54 @@ dispatcher_connection_new_channel_cb (TpConnection *connection,
 		dispatcher_tubes_handle_channel (dispatcher, channel);
 	}
 
+  if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_TEXT) &&
+      handle_type == TP_HANDLE_TYPE_ROOM)
+    {
+      /* Add the chatroom to the chatroom manager */
+      EmpathyChatroomManager *mgr;
+      EmpathyChatroom *chatroom;
+      GArray *handles;
+      gchar **room_ids;
+  	  MissionControl *mc;
+      McAccount *account;
+
+      mgr = empathy_chatroom_manager_new ();
+
+      handles = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1);
+      g_array_append_val (handles, handle);
+
+      tp_cli_connection_run_inspect_handles (connection, -1,
+          TP_HANDLE_TYPE_ROOM, handles, &room_ids, NULL, NULL);
+
+      mc = empathy_mission_control_new ();
+      account = mission_control_get_account_for_tpconnection (mc, connection,
+          NULL);
+
+      chatroom = empathy_chatroom_manager_find (mgr, account, room_ids[0]);
+      if (chatroom == NULL)
+        {
+          chatroom = empathy_chatroom_new (account, room_ids[0]);
+          empathy_chatroom_manager_add (mgr, chatroom);
+        }
+      else
+        {
+          g_object_ref (chatroom);
+        }
+
+      g_object_set (chatroom, "tp-channel", channel, NULL);
+
+      g_signal_connect (channel, "invalidated",
+          G_CALLBACK (chatroom_invalidated_cb), chatroom);
+
+      g_free (room_ids[0]);
+      g_free (room_ids);
+      g_array_free (handles, TRUE);
+      g_object_unref (mc);
+      g_object_unref (account);
+      g_object_unref (chatroom);
+      g_object_unref (mgr);
+    }
+
 	if (suppress_handler) {
 		g_signal_emit (dispatcher, signals[DISPATCH_CHANNEL], 0, channel);
 	} else {
