diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 2aae361..4534d19 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -175,6 +175,36 @@ typedef struct {
 	int last_reported_files_left;
 } TransferInfo;
 
+struct _Notifier
+{
+	GObject parent_instance;
+	guint running_jobs_count;
+};
+
+struct _NotifierClass
+{
+	GObjectClass parent_class;
+};
+
+#define NOTIFIER_TYPE (notifier_get_type ())
+#define NOTIFIER(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST ((obj), NOTIFIER_TYPE, Notifier))
+#define NAUTILUS_IS_FILE_OPERATIONS_STATUS(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE ((obj), NOTIFIER_TYPE))
+#define NOTIFIER_CLASS(obj) \
+	(G_TYPE_CHECK_CLASS_CAST ((obj), NOTIFIER_TYPE, NotifierClass))
+#define NAUTILUS_IS_FILE_OPERATIONS_STATUS_CLASS(obj) \
+	(G_TYPE_CHECK_CLASS_TYPE ((obj), NOTIFIER_TYPE))
+#define NOTIFIER_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS ((obj), NOTIFIER_TYPE, NotifierClass))
+
+typedef struct _Notifier Notifier;
+typedef struct _NotifierClass NotifierClass;
+
+GType notifier_get_type (void);
+
+G_DEFINE_TYPE (Notifier, notifier, G_TYPE_OBJECT)
+
 #define SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE 15
 #define NSEC_PER_SEC 1000000000
 #define NSEC_PER_MSEC 1000000
@@ -193,6 +223,25 @@ typedef struct {
 #define MERGE_ALL _("Merge _All")
 #define COPY_FORCE _("Copy _Anyway")
 
+static guint notifier_signal = 0;
+
+static void
+notifier_new_job (Notifier *notifier)
+{
+	notifier->running_jobs_count++;
+}
+
+static void
+notifier_job_done (Notifier *notifier)
+{
+	if (notifier->running_jobs_count != 0) {
+		notifier->running_jobs_count--;
+		if (notifier->running_jobs_count == 0) {
+			g_signal_emit (notifier, notifier_signal, 0);
+		}
+	}
+}
+
 static void
 mark_desktop_file_trusted (CommonJob *common,
 			   GCancellable *cancellable,
@@ -918,6 +967,7 @@ init_common (gsize job_size,
 {
 	CommonJob *common;
 	GdkScreen *screen;
+	GObject *notifier;
 
 	common = g_malloc0 (job_size);
 
@@ -934,6 +984,9 @@ init_common (gsize job_size,
 		screen = gtk_widget_get_screen (GTK_WIDGET (parent_window));
 		common->screen_num = gdk_screen_get_number (screen);
 	}
+
+	notifier = nautilus_file_operations_get_notifier();
+	notifier_new_job(NOTIFIER(notifier));
 	
 	return common;
 }
@@ -941,6 +994,8 @@ init_common (gsize job_size,
 static void
 finalize_common (CommonJob *common)
 {
+	GObject *notifier;
+
 	nautilus_progress_info_finish (common->progress);
 
 	if (common->inhibit_cookie != -1) {
@@ -959,6 +1014,9 @@ finalize_common (CommonJob *common)
 	g_object_unref (common->progress);
 	g_object_unref (common->cancellable);
 	g_free (common);
+
+	notifier = nautilus_file_operations_get_notifier();
+	notifier_job_done(NOTIFIER(notifier));
 }
 
 static void
@@ -6348,6 +6406,42 @@ nautilus_file_mark_desktop_file_trusted (GFile *file,
 				 NULL);
 }
 
+static void
+notifier_class_init (NotifierClass *klass)
+{
+	notifier_signal = g_signal_new ("destroy",
+					NOTIFIER_TYPE,
+					G_SIGNAL_RUN_LAST,
+					0,
+					NULL, NULL,
+					g_cclosure_marshal_VOID__VOID,
+					G_TYPE_NONE, 0);
+}
+
+static void
+notifier_init (Notifier *notifier)
+{
+	notifier->running_jobs_count = 0;
+}
+
+gboolean
+nautilus_file_operations_is_running (void)
+{
+	GObject *notifier;
+	notifier = nautilus_file_operations_get_notifier();
+	return NOTIFIER(notifier)->running_jobs_count > 0;
+}
+
+GObject*
+nautilus_file_operations_get_notifier (void)
+{
+	static GObject *notifier = NULL;
+	if (notifier == NULL) {
+		notifier = g_object_new(NOTIFIER_TYPE, NULL);
+	}
+	return notifier;
+}
+
 #if !defined (NAUTILUS_OMIT_SELF_CHECK)
 
 void
diff --git a/libnautilus-private/nautilus-file-operations.h b/libnautilus-private/nautilus-file-operations.h
index b851bce..bd56371 100644
--- a/libnautilus-private/nautilus-file-operations.h
+++ b/libnautilus-private/nautilus-file-operations.h
@@ -138,5 +138,7 @@ void nautilus_file_mark_desktop_file_trusted (GFile           *file,
 					      NautilusOpCallback done_callback,
 					      gpointer          done_callback_data);
 
+gboolean nautilus_file_operations_is_running (void);
+GObject* nautilus_file_operations_get_notifier (void);
 
 #endif /* NAUTILUS_FILE_OPERATIONS_H */
diff --git a/src/nautilus-main.c b/src/nautilus-main.c
index ce480c7..2820658 100644
--- a/src/nautilus-main.c
+++ b/src/nautilus-main.c
@@ -49,6 +49,7 @@
 #include <libnautilus-private/nautilus-global-preferences.h>
 #include <libnautilus-private/nautilus-lib-self-check-functions.h>
 #include <libnautilus-private/nautilus-icon-names.h>
+#include <libnautilus-private/nautilus-file-operations.h>
 #include <libxml/parser.h>
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
@@ -72,7 +73,9 @@ static gboolean exit_with_last_window = TRUE;
 static gboolean
 is_event_loop_needed (void)
 {
-	return event_loop_registrants != NULL || !exit_with_last_window;
+	return event_loop_registrants != NULL ||
+		!exit_with_last_window || 
+		nautilus_file_operations_is_running();
 }
 
 static int
@@ -106,14 +109,20 @@ eel_gtk_main_quit_all (void)
 }
 
 static void
-event_loop_unregister (GtkObject *object)
+event_loop_quit_if_not_needed (void)
 {
-	event_loop_registrants = g_slist_remove (event_loop_registrants, object);
 	if (!is_event_loop_needed ()) {
 		eel_gtk_main_quit_all ();
 	}
 }
 
+static void
+event_loop_unregister (GtkObject *object)
+{
+	event_loop_registrants = g_slist_remove (event_loop_registrants, object);
+	event_loop_quit_if_not_needed ();
+}
+
 void
 nautilus_main_event_loop_register (GtkObject *object)
 {
@@ -121,6 +130,15 @@ nautilus_main_event_loop_register (GtkObject *object)
 	event_loop_registrants = g_slist_prepend (event_loop_registrants, object);
 }
 
+static void
+nautilus_main_event_loop_register_file_operations (void)
+{
+	GObject *notifier;
+	notifier = nautilus_file_operations_get_notifier ();
+	g_signal_connect (notifier, "destroy", G_CALLBACK (event_loop_quit_if_not_needed), NULL);
+}
+
+
 gboolean
 nautilus_main_is_event_loop_mainstay (GtkObject *object)
 {
@@ -541,6 +559,7 @@ main (int argc, char *argv[])
 		}
 
 		if (is_event_loop_needed ()) {
+			nautilus_main_event_loop_register_file_operations ();
 			gtk_main ();
 		}
 	}
