diff --git a/libempathy/empathy-call-factory.c b/libempathy/empathy-call-factory.c
index d02b583..0cff336 100644
--- a/libempathy/empathy-call-factory.c
+++ b/libempathy/empathy-call-factory.c
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <telepathy-glib/util.h>
+
 #include "empathy-marshal.h"
 #include "empathy-call-factory.h"
 #include "empathy-utils.h"
@@ -176,16 +178,13 @@ empathy_call_factory_new_call (EmpathyCallFactory *factory,
   empathy_call_factory_new_call_with_streams (factory, contact, TRUE, FALSE);
 }
 
-void
-empathy_call_factory_claim_channel (EmpathyCallFactory *factory,
-  EmpathyDispatchOperation *operation)
+static void
+create_call_handler (EmpathyCallFactory *factory,
+    EmpathyDispatchOperation *operation)
 {
   EmpathyCallHandler *handler;
   EmpathyTpCall *call;
 
-  g_return_if_fail (factory != NULL);
-  g_return_if_fail (operation != NULL);
-
   call = EMPATHY_TP_CALL (
     empathy_dispatch_operation_get_channel_wrapper (operation));
 
@@ -199,3 +198,40 @@ empathy_call_factory_claim_channel (EmpathyCallFactory *factory,
   g_object_unref (handler);
 }
 
+static void
+call_status_changed_cb (EmpathyTpCall *call,
+    GParamSpec *spec,
+    EmpathyDispatchOperation *operation)
+{
+  if (call_factory != NULL)
+    create_call_handler (EMPATHY_CALL_FACTORY (call_factory), operation);
+
+  g_signal_handlers_disconnect_by_func (call, call_status_changed_cb,
+      operation);
+}
+
+void
+empathy_call_factory_claim_channel (EmpathyCallFactory *factory,
+  EmpathyDispatchOperation *operation)
+{
+  EmpathyTpCall *call;
+  EmpathyTpCallStatus status;
+
+  g_return_if_fail (factory != NULL);
+  g_return_if_fail (operation != NULL);
+
+  call = EMPATHY_TP_CALL (
+    empathy_dispatch_operation_get_channel_wrapper (operation));
+
+  /* Create the call handler once the EmpathyTpCall is ready */
+  status = empathy_tp_call_get_status (call);
+  if (status > EMPATHY_TP_CALL_STATUS_READYING)
+    {
+      create_call_handler (factory, operation);
+    }
+  else
+    {
+      tp_g_signal_connect_object (call, "notify::status",
+        G_CALLBACK (call_status_changed_cb), operation, 0);
+    }
+}
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index 32a0925..bfda27d 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -857,3 +857,11 @@ empathy_tp_call_leave (EmpathyTpCall *self)
   tp_cli_channel_interface_group_call_remove_members (priv->channel, -1, &array,
       "", leave_remove_members_cb, self, NULL, G_OBJECT (self));
 }
+
+EmpathyTpCallStatus
+empathy_tp_call_get_status (EmpathyTpCall *self)
+{
+  EmpathyTpCallPriv *priv = GET_PRIV (self);
+
+  return priv->status;
+}
diff --git a/libempathy/empathy-tp-call.h b/libempathy/empathy-tp-call.h
index ed3ae0d..ff51055 100644
--- a/libempathy/empathy-tp-call.h
+++ b/libempathy/empathy-tp-call.h
@@ -94,6 +94,8 @@ gboolean empathy_tp_call_has_initial_video (EmpathyTpCall *self);
 
 void empathy_tp_call_leave (EmpathyTpCall *self);
 
+EmpathyTpCallStatus empathy_tp_call_get_status (EmpathyTpCall *self);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_TP_CALL_H__ */
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index cad014d..36c9622 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -1862,3 +1862,52 @@ empathy_tp_chat_leave (EmpathyTpChat *self)
 
 	g_array_free (array, TRUE);
 }
+
+static void
+add_members_cb (TpChannel *proxy,
+		const GError *error,
+		gpointer user_data,
+		GObject *weak_object)
+{
+	EmpathyTpChatPriv *priv = GET_PRIV (weak_object);
+
+	if (error != NULL) {
+		DEBUG ("Failed to join chat (%s): %s",
+			tp_channel_get_identifier (priv->channel), error->message);
+	}
+}
+
+void
+empathy_tp_chat_join (EmpathyTpChat *self)
+{
+	EmpathyTpChatPriv *priv = GET_PRIV (self);
+	TpHandle self_handle;
+	GArray *members;
+
+	self_handle = tp_channel_group_get_self_handle (priv->channel);
+
+	members = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1);
+	g_array_append_val (members, self_handle);
+
+	tp_cli_channel_interface_group_call_add_members (priv->channel, -1, members,
+		"", add_members_cb, NULL, NULL, G_OBJECT (self));
+
+	g_array_free (members, TRUE);
+}
+
+gboolean
+empathy_tp_chat_is_invited (EmpathyTpChat *self)
+{
+	EmpathyTpChatPriv *priv = GET_PRIV (self);
+	TpHandle self_handle;
+
+	if (!tp_proxy_has_interface (priv->channel, TP_IFACE_CHANNEL_INTERFACE_GROUP))
+		return FALSE;
+
+	self_handle = tp_channel_group_get_self_handle (priv->channel);
+	if (self_handle == 0)
+		return FALSE;
+
+	return tp_channel_group_get_local_pending_info (priv->channel, self_handle,
+		NULL, NULL, NULL);
+}
diff --git a/libempathy/empathy-tp-chat.h b/libempathy/empathy-tp-chat.h
index fd97240..e5abe93 100644
--- a/libempathy/empathy-tp-chat.h
+++ b/libempathy/empathy-tp-chat.h
@@ -99,6 +99,9 @@ gboolean       empathy_tp_chat_provide_password_finish (EmpathyTpChat *chat,
 gboolean       empathy_tp_chat_can_add_contact (EmpathyTpChat *self);
 
 void           empathy_tp_chat_leave                (EmpathyTpChat      *chat);
+void           empathy_tp_chat_join                 (EmpathyTpChat      *chat);
+
+gboolean       empathy_tp_chat_is_invited           (EmpathyTpChat      *chat);
 
 G_END_DECLS
 
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c
index 841883d..67f910e 100644
--- a/src/empathy-event-manager.c
+++ b/src/empathy-event-manager.c
@@ -536,9 +536,6 @@ invite_dialog_response_cb (GtkDialog *dialog,
                            EventManagerApproval *approval)
 {
   EmpathyTpChat *tp_chat;
-  TpChannel *channel;
-  TpHandle self_handle;
-  GArray *members;
   gint64 timestamp;
 
   gtk_widget_destroy (GTK_WIDGET (approval->dialog));
@@ -559,15 +556,7 @@ invite_dialog_response_cb (GtkDialog *dialog,
 
   DEBUG ("Muc invitation accepted");
 
-  /* join the room */
-  channel = empathy_tp_chat_get_channel (tp_chat);
-
-  self_handle = tp_channel_group_get_self_handle (channel);
-  members = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1);
-  g_array_append_val (members, self_handle);
-
-  tp_cli_channel_interface_group_call_add_members (channel, -1, members,
-      "", NULL, NULL, NULL, NULL);
+  /* We'll join the room when handling the channel */
 
   timestamp = gtk_get_current_event_time ();
   if (timestamp == GDK_CURRENT_TIME)
@@ -576,8 +565,6 @@ invite_dialog_response_cb (GtkDialog *dialog,
   empathy_dispatch_operation_set_user_action_time (approval->operation,
     timestamp);
   empathy_dispatch_operation_approve (approval->operation);
-
-  g_array_free (members, TRUE);
 }
 
 static void
diff --git a/src/empathy.c b/src/empathy.c
index 5dcf035..9d59bba 100644
--- a/src/empathy.c
+++ b/src/empathy.c
@@ -136,6 +136,13 @@ dispatch_cb (EmpathyDispatcher *dispatcher,
       empathy_chat_window_present_chat (chat,
           empathy_dispatch_operation_get_user_action_time (operation));
 
+      if (empathy_tp_chat_is_invited (tp_chat))
+        {
+          /* We have been invited to the room. Add ourself as member as this
+           * channel has been approved. */
+          empathy_tp_chat_join (tp_chat);
+        }
+
       empathy_dispatch_operation_claim (operation);
     }
   else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA)
