diff --git a/libempathy/empathy-call-handler.c b/libempathy/empathy-call-handler.c
index 3be5eda..b0a90cd 100644
--- a/libempathy/empathy-call-handler.c
+++ b/libempathy/empathy-call-handler.c
@@ -533,7 +533,7 @@ empathy_call_handler_stop_call (EmpathyCallHandler *handler)
 
   if (priv->call != NULL)
     {
-      empathy_tp_call_close (priv->call);
+      empathy_tp_call_leave (priv->call);
       g_object_unref (priv->call);
     }
 
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index 31b4fe9..eafeead 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -816,3 +816,49 @@ empathy_tp_call_has_initial_video (EmpathyTpCall *self)
   g_hash_table_unref (props);
   return initial_video;
 }
+
+static void
+leave_remove_members_cb (TpChannel *proxy,
+    const GError *error,
+    gpointer user_data,
+    GObject *weak_object)
+{
+  EmpathyTpCall *self = user_data;
+
+  if (error == NULL)
+    return;
+
+  DEBUG ("RemoveMembers failed (%s); closing the channel", error->message);
+  empathy_tp_call_close (self);
+}
+
+void
+empathy_tp_call_leave (EmpathyTpCall *self)
+{
+  EmpathyTpCallPriv *priv = GET_PRIV (self);
+  TpHandle self_handle;
+  GArray *array;
+
+  if (!tp_proxy_has_interface_by_id (priv->channel,
+        TP_IFACE_QUARK_CHANNEL_INTERFACE_GROUP))
+    {
+      empathy_tp_call_close (self);
+      return;
+    }
+
+  self_handle = tp_channel_group_get_self_handle (priv->channel);
+  if (self_handle == 0)
+    {
+      /* we are not member of the channel */
+      empathy_tp_call_close (self);
+      return;
+    }
+
+  array = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1);
+  g_array_insert_val (array, 0, self_handle);
+
+  tp_cli_channel_interface_group_call_remove_members (priv->channel, -1, array,
+      "", leave_remove_members_cb, self, NULL, G_OBJECT (self));
+
+  g_array_free (array, TRUE);
+}
diff --git a/libempathy/empathy-tp-call.h b/libempathy/empathy-tp-call.h
index c5607d8..ed3ae0d 100644
--- a/libempathy/empathy-tp-call.h
+++ b/libempathy/empathy-tp-call.h
@@ -92,6 +92,8 @@ const gchar * empathy_tp_call_get_connection_manager (EmpathyTpCall *self);
 
 gboolean empathy_tp_call_has_initial_video (EmpathyTpCall *self);
 
+void empathy_tp_call_leave (EmpathyTpCall *self);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_TP_CALL_H__ */
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index 8b7af2d..938fd61 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -1330,7 +1330,10 @@ empathy_call_window_dispose (GObject *object)
     }
 
   if (priv->handler != NULL)
-    g_object_unref (priv->handler);
+    {
+      empathy_call_handler_stop_call (priv->handler);
+      g_object_unref (priv->handler);
+    }
   priv->handler = NULL;
 
   if (priv->pipeline != NULL)
@@ -1508,7 +1511,9 @@ empathy_call_window_disconnected (EmpathyCallWindow *self)
 {
   gboolean could_disconnect = FALSE;
   EmpathyCallWindowPriv *priv = GET_PRIV (self);
-  gboolean could_reset_pipeline = empathy_call_window_reset_pipeline (self);
+  gboolean could_reset_pipeline;
+
+  could_reset_pipeline = empathy_call_window_reset_pipeline (self);
 
   if (priv->call_state == CONNECTING)
       empathy_sound_stop (EMPATHY_SOUND_PHONE_OUTGOING);
@@ -2448,6 +2453,10 @@ static void
 empathy_call_window_hangup_cb (gpointer object,
                                EmpathyCallWindow *window)
 {
+  EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+  empathy_call_handler_stop_call (priv->handler);
+
   if (empathy_call_window_disconnected (window))
     gtk_widget_destroy (GTK_WIDGET (window));
 }
