diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 71fb2e8..45faea4 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -710,8 +710,7 @@ chat_command_join (EmpathyChat *chat,
 			TpConnection *connection;
 
 			connection = empathy_tp_chat_get_connection (priv->tp_chat);
-			empathy_dispatcher_join_muc (
-				empathy_get_account_for_connection (connection), rooms[i],
+			empathy_dispatcher_join_muc (priv->account, rooms[i],
 				gtk_get_current_event_time ());
 		}
 		i++;
@@ -3013,7 +3012,7 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
 
 	priv->tp_chat = g_object_ref (tp_chat);
 	connection = empathy_tp_chat_get_connection (priv->tp_chat);
-	priv->account = g_object_ref (empathy_get_account_for_connection (connection));
+	priv->account = g_object_ref (empathy_tp_chat_get_account (priv->tp_chat));
 
 	g_signal_connect (tp_chat, "destroy",
 			  G_CALLBACK (chat_destroy_cb),
diff --git a/libempathy/empathy-call-factory.c b/libempathy/empathy-call-factory.c
index 9ac4af2..49bc60d 100644
--- a/libempathy/empathy-call-factory.c
+++ b/libempathy/empathy-call-factory.c
@@ -314,7 +314,7 @@ handle_channels_cb (TpSimpleHandler *handler,
           TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA)
         continue;
 
-      call = empathy_tp_call_new (channel);
+      call = empathy_tp_call_new (account, channel);
 
       if (empathy_tp_call_get_status (call) <= EMPATHY_TP_CALL_STATUS_READYING)
         {
diff --git a/libempathy/empathy-call-handler.c b/libempathy/empathy-call-handler.c
index a895f53..dc734b2 100644
--- a/libempathy/empathy-call-handler.c
+++ b/libempathy/empathy-call-handler.c
@@ -762,9 +762,11 @@ empathy_call_handler_request_cb (GObject *source,
   EmpathyCallHandlerPriv *priv = GET_PRIV (self);
   TpChannel *channel;
   GError *error = NULL;
+  TpAccountChannelRequest *req = TP_ACCOUNT_CHANNEL_REQUEST (source);
+  TpAccount *account;
 
-  channel = tp_account_channel_request_create_and_handle_channel_finish (
-      TP_ACCOUNT_CHANNEL_REQUEST (source), result, NULL, &error);
+  channel = tp_account_channel_request_create_and_handle_channel_finish (req,
+      result, NULL, &error);
   if (channel == NULL)
     {
       DEBUG ("Failed to create the channel: %s", error->message);
@@ -772,7 +774,9 @@ empathy_call_handler_request_cb (GObject *source,
       return;
     }
 
-  priv->call = empathy_tp_call_new (channel);
+  account = tp_account_channel_request_get_account (req);
+
+  priv->call = empathy_tp_call_new (account, channel);
 
   g_object_notify (G_OBJECT (self), "tp-call");
 
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index 16689e6..66fd3f8 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -39,6 +39,7 @@
 typedef struct
 {
   gboolean dispose_has_run;
+  TpAccount *account;
   TpChannel *channel;
   EmpathyContact *contact;
   gboolean is_incoming;
@@ -60,6 +61,7 @@ static guint signals[LAST_SIGNAL] = {0};
 enum
 {
   PROP_0,
+  PROP_ACCOUNT,
   PROP_CHANNEL,
   PROP_CONTACT,
   PROP_STATUS,
@@ -444,6 +446,8 @@ tp_call_dispose (GObject *object)
   if (priv->contact != NULL)
       g_object_unref (priv->contact);
 
+  tp_clear_object (&priv->account);
+
   if (G_OBJECT_CLASS (empathy_tp_call_parent_class)->dispose)
     G_OBJECT_CLASS (empathy_tp_call_parent_class)->dispose (object);
 }
@@ -471,6 +475,9 @@ tp_call_set_property (GObject *object,
 
   switch (prop_id)
     {
+    case PROP_ACCOUNT:
+      priv->account = g_value_dup_object (value);
+      break;
     case PROP_CHANNEL:
       priv->channel = g_value_dup_object (value);
       break;
@@ -490,6 +497,9 @@ tp_call_get_property (GObject *object,
 
   switch (prop_id)
     {
+    case PROP_ACCOUNT:
+      g_value_set_object (value, priv->channel);
+      break;
     case PROP_CHANNEL:
       g_value_set_object (value, priv->channel);
       break;
@@ -524,23 +534,33 @@ empathy_tp_call_class_init (EmpathyTpCallClass *klass)
 
   g_type_class_add_private (klass, sizeof (EmpathyTpCallPriv));
 
+  g_object_class_install_property (object_class, PROP_ACCOUNT,
+      g_param_spec_object ("account", "TpAccount", "TpAccount",
+      TP_TYPE_ACCOUNT,
+      G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
+      G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_property (object_class, PROP_CHANNEL,
       g_param_spec_object ("channel", "channel", "channel",
       TP_TYPE_CHANNEL,
       G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
       G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
   g_object_class_install_property (object_class, PROP_CONTACT,
       g_param_spec_object ("contact", "Call contact", "Call contact",
       EMPATHY_TYPE_CONTACT,
       G_PARAM_READABLE | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
   g_object_class_install_property (object_class, PROP_STATUS,
       g_param_spec_uint ("status", "Call status",
       "Call status", 0, 255, 0, G_PARAM_READABLE | G_PARAM_STATIC_NICK |
       G_PARAM_STATIC_BLURB));
+
   g_object_class_install_property (object_class, PROP_AUDIO_STREAM,
       g_param_spec_pointer ("audio-stream", "Audio stream data",
       "Audio stream data",
       G_PARAM_READABLE | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
   g_object_class_install_property (object_class, PROP_VIDEO_STREAM,
       g_param_spec_pointer ("video-stream", "Video stream data",
       "Video stream data",
@@ -581,11 +601,13 @@ empathy_tp_call_init (EmpathyTpCall *call)
 }
 
 EmpathyTpCall *
-empathy_tp_call_new (TpChannel *channel)
+empathy_tp_call_new (TpAccount *account,
+    TpChannel *channel)
 {
   g_return_val_if_fail (TP_IS_CHANNEL (channel), NULL);
 
   return g_object_new (EMPATHY_TYPE_TP_CALL,
+      "account", account,
       "channel", channel,
       NULL);
 }
@@ -753,21 +775,8 @@ const gchar *
 empathy_tp_call_get_connection_manager (EmpathyTpCall *self)
 {
   EmpathyTpCallPriv *priv = GET_PRIV (self);
-  TpConnection *conn;
-  TpAccount *account;
-
-  if (priv->channel == NULL)
-    return NULL;
-
-  conn = tp_channel_borrow_connection (priv->channel);
-  if (conn == NULL)
-    return NULL;
-
-  account = empathy_get_account_for_connection (conn);
-  if (account == NULL)
-    return NULL;
 
-  return tp_account_get_connection_manager (account);
+  return tp_account_get_connection_manager (priv->account);
 }
 
 gboolean
@@ -840,3 +849,11 @@ empathy_tp_call_get_status (EmpathyTpCall *self)
 
   return priv->status;
 }
+
+TpAccount *
+empathy_tp_call_get_account (EmpathyTpCall *self)
+{
+  EmpathyTpCallPriv *priv = GET_PRIV (self);
+
+  return priv->account;
+}
diff --git a/libempathy/empathy-tp-call.h b/libempathy/empathy-tp-call.h
index d866a2e..c633da3 100644
--- a/libempathy/empathy-tp-call.h
+++ b/libempathy/empathy-tp-call.h
@@ -73,7 +73,8 @@ typedef struct
 } EmpathyTpCallStream;
 
 GType empathy_tp_call_get_type (void) G_GNUC_CONST;
-EmpathyTpCall *empathy_tp_call_new (TpChannel *channel);
+EmpathyTpCall *empathy_tp_call_new (TpAccount *account,
+    TpChannel *channel);
 void empathy_tp_call_close (EmpathyTpCall *call);
 
 void empathy_tp_call_accept_incoming_call (EmpathyTpCall *call);
@@ -93,6 +94,8 @@ void empathy_tp_call_leave (EmpathyTpCall *self);
 
 EmpathyTpCallStatus empathy_tp_call_get_status (EmpathyTpCall *self);
 
+TpAccount * empathy_tp_call_get_account (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 9a4e56a..7bc9a9c 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -41,6 +41,7 @@
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyTpChat)
 typedef struct {
 	gboolean               dispose_has_run;
+	TpAccount             *account;
 	TpConnection          *connection;
 	EmpathyContact        *user;
 	EmpathyContact        *remote_contact;
@@ -65,6 +66,7 @@ static void tp_chat_iface_init         (EmpathyContactListIface *iface);
 
 enum {
 	PROP_0,
+	PROP_ACCOUNT,
 	PROP_CHANNEL,
 	PROP_REMOTE_CONTACT,
 	PROP_PASSWORD_NEEDED,
@@ -164,8 +166,7 @@ tp_chat_add (EmpathyContactList *list,
 		    /* FIXME: InvitationMessage ? */
 		    NULL);
 
-		req = tp_account_channel_request_new (
-			empathy_get_account_for_connection (priv->connection), props,
+		req = tp_account_channel_request_new (priv->account, props,
 			EMPATHY_DISPATCHER_NON_USER_ACTION);
 
 		/* Although this is a MUC, it's anonymous, so CreateChannel is
@@ -778,6 +779,8 @@ tp_chat_dispose (GObject *object)
 
 	priv->dispose_has_run = TRUE;
 
+	tp_clear_object (&priv->account);
+
 	if (priv->connection != NULL)
 		g_object_unref (priv->connection);
 	priv->connection = NULL;
@@ -1261,7 +1264,7 @@ tp_chat_constructor (GType                  type,
 
 	priv = GET_PRIV (chat);
 
-	priv->connection = g_object_ref (tp_channel_borrow_connection (priv->channel));
+	priv->connection = g_object_ref (tp_account_get_connection (priv->account));
 	tp_g_signal_connect_object (priv->channel, "invalidated",
 			  G_CALLBACK (tp_chat_invalidated_cb),
 			  chat, 0);
@@ -1369,6 +1372,9 @@ tp_chat_get_property (GObject    *object,
 	EmpathyTpChatPriv *priv = GET_PRIV (object);
 
 	switch (param_id) {
+	case PROP_ACCOUNT:
+		g_value_set_object (value, priv->account);
+		break;
 	case PROP_CHANNEL:
 		g_value_set_object (value, priv->channel);
 		break;
@@ -1396,6 +1402,9 @@ tp_chat_set_property (GObject      *object,
 	EmpathyTpChatPriv *priv = GET_PRIV (object);
 
 	switch (param_id) {
+	case PROP_ACCOUNT:
+		priv->account = g_value_dup_object (value);
+		break;
 	case PROP_CHANNEL:
 		priv->channel = g_value_dup_object (value);
 		break;
@@ -1417,6 +1426,16 @@ empathy_tp_chat_class_init (EmpathyTpChatClass *klass)
 	object_class->set_property = tp_chat_set_property;
 
 	g_object_class_install_property (object_class,
+					 PROP_ACCOUNT,
+					 g_param_spec_object ("account",
+							      "TpAccount",
+							      "the account associated with the chat",
+							      TP_TYPE_ACCOUNT,
+							      G_PARAM_READWRITE |
+							      G_PARAM_CONSTRUCT_ONLY |
+							      G_PARAM_STATIC_STRINGS));
+
+	g_object_class_install_property (object_class,
 					 PROP_CHANNEL,
 					 g_param_spec_object ("channel",
 							      "telepathy channel",
@@ -1523,9 +1542,11 @@ tp_chat_iface_init (EmpathyContactListIface *iface)
 }
 
 EmpathyTpChat *
-empathy_tp_chat_new (TpChannel *channel)
+empathy_tp_chat_new (TpAccount *account,
+		     TpChannel *channel)
 {
 	return g_object_new (EMPATHY_TYPE_TP_CHAT,
+			     "account", account,
 			     "channel", channel,
 			     NULL);
 }
@@ -1580,6 +1601,16 @@ empathy_tp_chat_get_channel (EmpathyTpChat *chat)
 	return priv->channel;
 }
 
+TpAccount *
+empathy_tp_chat_get_account (EmpathyTpChat *chat)
+{
+	EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+	g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL);
+
+	return priv->account;
+}
+
 TpConnection *
 empathy_tp_chat_get_connection (EmpathyTpChat *chat)
 {
@@ -1589,7 +1620,6 @@ empathy_tp_chat_get_connection (EmpathyTpChat *chat)
 
 	return tp_channel_borrow_connection (priv->channel);
 }
-
 gboolean
 empathy_tp_chat_is_ready (EmpathyTpChat *chat)
 {
diff --git a/libempathy/empathy-tp-chat.h b/libempathy/empathy-tp-chat.h
index 3ac5eaf..8858f49 100644
--- a/libempathy/empathy-tp-chat.h
+++ b/libempathy/empathy-tp-chat.h
@@ -60,10 +60,12 @@ typedef struct {
 } EmpathyTpChatProperty;
 
 GType          empathy_tp_chat_get_type             (void) G_GNUC_CONST;
-EmpathyTpChat *empathy_tp_chat_new                  (TpChannel          *channel);
+EmpathyTpChat *empathy_tp_chat_new                  (TpAccount *account,
+						     TpChannel *channel);
 const gchar *  empathy_tp_chat_get_id               (EmpathyTpChat      *chat);
 EmpathyContact *empathy_tp_chat_get_remote_contact   (EmpathyTpChat      *chat);
 TpChannel *    empathy_tp_chat_get_channel          (EmpathyTpChat      *chat);
+TpAccount    * empathy_tp_chat_get_account          (EmpathyTpChat      *chat);
 TpConnection * empathy_tp_chat_get_connection       (EmpathyTpChat      *chat);
 gboolean       empathy_tp_chat_is_ready             (EmpathyTpChat      *chat);
 void           empathy_tp_chat_send                 (EmpathyTpChat      *chat,
diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c
index 8b9a73b..fdc4451 100644
--- a/src/empathy-chat-manager.c
+++ b/src/empathy-chat-manager.c
@@ -218,7 +218,7 @@ handle_channels (TpSimpleHandler *handler,
       TpChannel *channel = l->data;
       EmpathyTpChat *tp_chat;
 
-      tp_chat = empathy_tp_chat_new (channel);
+      tp_chat = empathy_tp_chat_new (account, channel);
 
       if (empathy_tp_chat_is_ready (tp_chat))
         {
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c
index e60a9b1..5916ddd 100644
--- a/src/empathy-event-manager.c
+++ b/src/empathy-event-manager.c
@@ -866,7 +866,7 @@ approve_channels (TpSimpleApprover *approver,
     {
       EmpathyTpChat *tp_chat;
 
-      tp_chat = empathy_tp_chat_new (channel);
+      tp_chat = empathy_tp_chat_new (account, channel);
       approval->handler_instance = G_OBJECT (tp_chat);
 
       if (tp_proxy_has_interface (channel, TP_IFACE_CHANNEL_INTERFACE_GROUP))
@@ -902,7 +902,7 @@ approve_channels (TpSimpleApprover *approver,
   else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA)
     {
       EmpathyContact *contact;
-      EmpathyTpCall *call = empathy_tp_call_new (channel);
+      EmpathyTpCall *call = empathy_tp_call_new (account, channel);
 
       approval->handler_instance = G_OBJECT (call);
 
