diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index a600fd4..8ecbbbc 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -305,6 +305,22 @@ main_window_row_activated_cb (EmpathyContactListView *view,
 }
 
 static void
+main_window_error_retry_clicked_cb (GtkButton         *button,
+				    EmpathyMainWindow *window)
+{
+	EmpathyAccount *account;
+	GtkWidget *error_widget;
+
+	account = g_object_get_data (G_OBJECT (button), "account");
+	empathy_account_set_enabled (account, FALSE);
+	empathy_account_set_enabled (account, TRUE);
+
+	error_widget = g_hash_table_lookup (window->errors, account);
+	gtk_widget_destroy (error_widget);
+	g_hash_table_remove (window->errors, account);
+}
+
+static void
 main_window_error_edit_clicked_cb (GtkButton         *button,
 				   EmpathyMainWindow *window)
 {
@@ -335,8 +351,10 @@ main_window_error_clear_clicked_cb (GtkButton         *button,
 static void
 main_window_error_display (EmpathyMainWindow *window,
 			   EmpathyAccount    *account,
-			   const gchar       *message)
+			   const gchar       *message,
+			   gboolean           should_retry)
 {
+	GCallback  callback;
 	GtkWidget *child;
 	GtkWidget *table;
 	GtkWidget *image;
@@ -395,11 +413,19 @@ main_window_error_display (EmpathyMainWindow *window,
 	gtk_widget_show (hbox);
 	gtk_container_add (GTK_CONTAINER (alignment), hbox);
 
-	image = gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON);
+	if (should_retry) {
+		image = gtk_image_new_from_stock (GTK_STOCK_REDO, GTK_ICON_SIZE_BUTTON);
+		label = gtk_label_new_with_mnemonic (_("_Retry"));
+		callback = G_CALLBACK (main_window_error_retry_clicked_cb);
+	} else {
+		image = gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON);
+		label = gtk_label_new_with_mnemonic (_("_Edit account"));
+		callback = G_CALLBACK (main_window_error_edit_clicked_cb);
+	}
+
 	gtk_widget_show (image);
 	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
 
-	label = gtk_label_new_with_mnemonic (_("_Edit account"));
 	gtk_widget_show (label);
 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 
@@ -450,7 +476,7 @@ main_window_error_display (EmpathyMainWindow *window,
 				g_object_unref);
 
 	g_signal_connect (button_edit, "clicked",
-			  G_CALLBACK (main_window_error_edit_clicked_cb),
+			  callback,
 			  window);
 
 	g_signal_connect (button_close, "clicked",
@@ -499,13 +525,16 @@ main_window_connection_changed_cb (EmpathyAccountManager *manager,
 	if (current == TP_CONNECTION_STATUS_DISCONNECTED &&
 	    reason != TP_CONNECTION_STATUS_REASON_REQUESTED) {
 		const gchar *message;
+		gboolean     should_retry = FALSE;
 
 		switch (reason) {
 		case TP_CONNECTION_STATUS_REASON_NONE_SPECIFIED:
 			message = _("No error specified");
+			should_retry = TRUE;
 			break;
 		case TP_CONNECTION_STATUS_REASON_NETWORK_ERROR:
 			message = _("Network error");
+			should_retry = TRUE;
 			break;
 		case TP_CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED:
 			message = _("Authentication failed");
@@ -542,10 +571,11 @@ main_window_connection_changed_cb (EmpathyAccountManager *manager,
 			break;
 		default:
 			message = _("Unknown error");
+			should_retry = TRUE;
 			break;
 		}
 
-		main_window_error_display (window, account, message);
+		main_window_error_display (window, account, message, should_retry);
 	}
 
 	if (current == TP_CONNECTION_STATUS_DISCONNECTED) {
