--- gnome-panel-2.24.0/gnome-panel/applet.c
+++ gnome-panel-2.24.0/gnome-panel/applet.c
@@ -792,6 +792,7 @@ typedef struct {
 } PanelAppletToLoad;
 
 static GSList  *panel_applets_to_load = NULL;
+static GSList  *panel_applets_loading = NULL;
 static gboolean panel_applet_have_load_idle = FALSE;
 
 static void
@@ -818,8 +819,40 @@ panel_applet_on_load_queue (const char *id)
 	return FALSE;
 }
 
+static void
+on_applet_loaded (const char *id,
+                  gpointer    user_data)
+{
+	PanelAppletToLoad *applet;
+	GSList *l, *applet_link;
+
+	GClosure *closure = (GClosure *) user_data;
+
+	applet_link = NULL;
+	for (l = panel_applets_loading; l; l = l->next) {
+		applet = l->data;
+
+		if (strcmp (applet->id, id) == 0) {
+			break;
+		}
+	}
+
+	if (l == NULL)
+		return;
+
+	panel_applets_loading = g_slist_delete_link (panel_applets_loading, l);
+	free_applet_to_load (applet);
+
+	if (panel_applets_loading == NULL && closure != NULL) {
+		GValue param = { 0 };
+		g_value_init (&param, G_TYPE_POINTER);
+		g_value_set_instance (&param, NULL);
+		g_cclosure_marshal_VOID__VOID (closure, NULL, 1, &param, 0, NULL);
+	}
+}
+
 static gboolean
-panel_applet_load_idle_handler (gpointer dummy)
+panel_applet_load_idle_handler (GClosure *closure)
 {
 	PanelAppletToLoad *applet = NULL;
 	PanelToplevel     *toplevel = NULL;
@@ -848,8 +881,8 @@ panel_applet_load_idle_handler (gpointer dummy)
 		panel_applet_have_load_idle = FALSE;
 		return FALSE;
 	}
-
 	panel_applets_to_load = g_slist_delete_link (panel_applets_to_load, l);
+	panel_applets_loading = g_slist_append (panel_applets_loading, applet);
 
 	panel_widget = panel_toplevel_get_panel_widget (toplevel);
 
@@ -866,13 +900,16 @@ panel_applet_load_idle_handler (gpointer dummy)
 					panel_widget,
 					applet->locked,
 					applet->position,
-					applet->id);
+					applet->id,
+					on_applet_loaded,
+					closure);
 		break;
 	case PANEL_OBJECT_DRAWER:
 		drawer_load_from_gconf (panel_widget,
 					applet->locked,
 					applet->position,
 					applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_MENU:
 		panel_menu_button_load_from_gconf (panel_widget,
@@ -880,12 +917,14 @@ panel_applet_load_idle_handler (gpointer dummy)
 						   applet->position,
 						   TRUE,
 						   applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_LAUNCHER:
 		launcher_load_from_gconf (panel_widget,
 					  applet->locked,
 					  applet->position,
 					  applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_LOGOUT:
 	case PANEL_OBJECT_LOCK:
@@ -896,6 +935,7 @@ panel_applet_load_idle_handler (gpointer dummy)
 				applet->position,
 				TRUE,
 				applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_ACTION:
 		panel_action_button_load_from_gconf (
@@ -904,6 +944,7 @@ panel_applet_load_idle_handler (gpointer dummy)
 				applet->position,
 				TRUE,
 				applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_MENU_BAR:
 		panel_menu_bar_load_from_gconf (
@@ -912,18 +953,18 @@ panel_applet_load_idle_handler (gpointer dummy)
 				applet->position,
 				TRUE,
 				applet->id);
+		on_applet_loaded (applet->id, closure);
 		break;
 	case PANEL_OBJECT_SEPARATOR:
 		panel_separator_load_from_gconf (panel_widget,
 						 applet->locked,
 						 applet->position,
 						 applet->id);
+		on_applet_loaded (applet->id, closure);
 	default:
 		break;
 	}
 
-	free_applet_to_load (applet);
-
 	return TRUE;
 }
 
@@ -969,8 +1010,11 @@ panel_applet_compare (const PanelAppletToLoad *a,
 }
 
 void
-panel_applet_load_queued_applets (void)
+panel_applet_load_queued_applets (GFunc    queue_empty_func,
+				  gpointer user_data)
 {
+	GClosure *closure;
+
 	if (!panel_applets_to_load)
 		return;
 
@@ -978,7 +1022,11 @@ panel_applet_load_queued_applets (void)
 					      (GCompareFunc) panel_applet_compare);
 
 	if ( ! panel_applet_have_load_idle) {
-		g_idle_add (panel_applet_load_idle_handler, NULL);
+		if (queue_empty_func != NULL)
+			closure = g_cclosure_new_swap (G_CALLBACK (queue_empty_func), user_data, NULL);
+		else
+			closure = NULL;
+		g_idle_add ((GSourceFunc) panel_applet_load_idle_handler, closure);
 		panel_applet_have_load_idle = TRUE;
 	}
 }
--- gnome-panel-2.24.0/gnome-panel/applet.h
+++ gnome-panel-2.24.0/gnome-panel/applet.h
@@ -28,6 +28,7 @@ typedef struct {
 	char            *id;
 } AppletInfo;
 
+typedef void (* AppletLoadingDoneFunc) (const char *id, gpointer data);
 typedef gboolean (* CallbackEnabledFunc) (void);
 
 typedef struct {
@@ -69,7 +70,8 @@ void panel_applet_queue_applet_to_load (const char      *id,
 					int              position,
 					gboolean         right_stick,
 					gboolean         locked);
-void panel_applet_load_queued_applets  (void);
+void panel_applet_load_queued_applets  (GFunc    queue_empty_func,
+					gpointer user_data);
 gboolean panel_applet_on_load_queue    (const char *id);
 
 
--- gnome-panel-2.24.0/gnome-panel/panel-applet-frame.c
+++ gnome-panel-2.24.0/gnome-panel/panel-applet-frame.c
@@ -80,6 +80,8 @@ typedef struct {
 	int               position;
 	gboolean          exactpos;
 	char             *id;
+	AppletLoadingDoneFunc done_func;
+	gpointer          user_data;
 } PanelAppletFrameActivating;
 
 /* Keep in sync with panel-applet.h. Uggh.
@@ -326,7 +328,9 @@ panel_applet_frame_load (const gchar *iid,
 			 gboolean     locked,
 			 int          position,
 			 gboolean     exactpos,
-			 const char  *id)
+			 const char  *id,
+			 AppletLoadingDoneFunc done_func,
+			 gpointer      user_data)
 {
 	PanelAppletFrame           *frame;
 	CORBA_Environment           ev;
@@ -337,11 +341,17 @@ panel_applet_frame_load (const gchar *iid,
 	g_return_if_fail (id != NULL);
 
 	if (g_slist_find_custom (no_reload_applets, id,
-				 (GCompareFunc) strcmp))
+				 (GCompareFunc) strcmp)) {
+		if (done_func)
+			done_func (id, user_data);
 		return;
+        }
 
-	if (panel_lockdown_is_applet_disabled (iid))
+	if (panel_lockdown_is_applet_disabled (iid)) {
+		if (done_func)
+			done_func (id, user_data);
 		return;
+        }
 
 	frame = g_object_new (PANEL_TYPE_APPLET_FRAME, NULL);
 	frame->priv->panel = panel;
@@ -353,6 +363,8 @@ panel_applet_frame_load (const gchar *iid,
 	frame_act->position = position;
 	frame_act->exactpos = exactpos;
 	frame_act->id       = g_strdup (id);
+	frame_act->done_func = done_func;
+	frame_act->user_data = user_data;
 
 	CORBA_exception_init (&ev);
 
@@ -367,7 +379,9 @@ void
 panel_applet_frame_load_from_gconf (PanelWidget *panel_widget,
 				    gboolean     locked,
 				    int          position,
-				    const char  *id)
+				    const char  *id,
+				    AppletLoadingDoneFunc done_func,
+				    gpointer     user_data)
 {
 	const char  *key;
 	char        *applet_iid;
@@ -379,11 +393,14 @@ panel_applet_frame_load_from_gconf (PanelWidget *panel_widget,
 	applet_iid = gconf_client_get_string (panel_gconf_get_client (),
 					      key, NULL);
 
-	if (!applet_iid || !applet_iid[0])
+	if (!applet_iid || !applet_iid[0]) {
+		done_func (id, user_data);
 		return;
+	}
 
 	panel_applet_frame_load (applet_iid, panel_widget,
-				 locked, position, TRUE, id);
+				 locked, position, TRUE, id,
+				 done_func, user_data);
 
 	g_free (applet_iid);
 }
@@ -890,7 +907,7 @@ panel_applet_frame_reload_response (GtkWidget        *dialog,
 		}
 
 		panel_applet_frame_load (iid, panel, locked,
-					 position, TRUE, id);
+					 position, TRUE, id, NULL, NULL);
 
 		g_free (iid);
 		g_free (id);
@@ -1286,6 +1303,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 		if (!in_default_panel_config (frame_act->id)) {
 			panel_applet_frame_loading_failed (frame, frame_act->id);
 		}
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		return;
@@ -1328,6 +1347,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		CORBA_exception_free (&corba_ev);
 		bonobo_object_release_unref (object, NULL);
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
                 g_free (frame_act->id);
 		g_free (frame_act);
 		g_free (error);
@@ -1344,6 +1365,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 		g_warning (G_STRLOC ": failed to load applet %s",
 			   frame->priv->iid);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		return;
@@ -1355,6 +1378,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 			   "(cannot get control frame)", frame->priv->iid);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		gtk_object_sink (GTK_OBJECT (widget));
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		return;
@@ -1371,6 +1396,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 			   frame->priv->iid, error);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		gtk_object_sink (GTK_OBJECT (widget));
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		g_free (error);
@@ -1394,6 +1421,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 			   frame->priv->iid, error);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		gtk_object_sink (GTK_OBJECT (widget));
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		g_free (error);
@@ -1418,6 +1447,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 			   "(cannot get control)", frame->priv->iid);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		gtk_object_sink (GTK_OBJECT (widget));
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		return;
@@ -1430,6 +1461,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 			   "(cannot get applet shell)", frame->priv->iid);
 		panel_applet_frame_loading_failed (frame, frame_act->id);
 		gtk_object_sink (GTK_OBJECT (widget));
+		if (frame_act->done_func)
+			frame_act->done_func (frame_act->id, frame_act->user_data);
 		g_free (frame_act->id);
 		g_free (frame_act);
 		return;
@@ -1461,6 +1494,8 @@ panel_applet_frame_activated (CORBA_Object  object,
 	panel_lockdown_notify_add (G_CALLBACK (panel_applet_frame_sync_menu_state),
 				   frame);
 
+	if (frame_act->done_func)
+		frame_act->done_func (frame_act->id, frame_act->user_data);
 	g_free (frame_act->id);
 	g_free (frame_act);
 }
--- gnome-panel-2.24.0/gnome-panel/panel-applet-frame.h
+++ gnome-panel-2.24.0/gnome-panel/panel-applet-frame.h
@@ -73,7 +73,9 @@ void       panel_applet_frame_change_background (PanelAppletFrame    *frame,
 void       panel_applet_frame_load_from_gconf   (PanelWidget *panel_widget,
 						 gboolean     locked,
 						 int          position,
-						 const char  *id);
+						 const char  *id,
+						 AppletLoadingDoneFunc done_func,
+						 gpointer user_data);
 
 void            panel_applet_frame_set_panel (PanelAppletFrame *frame,
 					      PanelWidget      *panel);
--- gnome-panel-2.24.0/gnome-panel/panel-profile.c
+++ gnome-panel-2.24.0/gnome-panel/panel-profile.c
@@ -2195,7 +2195,7 @@ panel_profile_object_id_list_notify (GConfClient *client,
 	g_slist_free (sublist);
 	g_slist_free (object_ids);
 
-	panel_applet_load_queued_applets ();
+	panel_applet_load_queued_applets (NULL, NULL);
 }
 
 static void
@@ -2446,6 +2446,22 @@ panel_profile_ensure_toplevel_per_screen (GConfClient *client,
 	g_slist_free (empty_screens);
 }
 
+static void
+panel_profile_on_loaded (void)
+{
+	GSList     *toplevels;
+	GSList     *l;
+
+	toplevels = panel_toplevel_list_toplevels ();
+
+	for (l = toplevels; l; l = l->next) {
+		PanelToplevel *toplevel;
+
+		toplevel = PANEL_TOPLEVEL (l->data);
+		panel_toplevel_queue_initial_unhide (toplevel);
+	}
+}
+
 void
 panel_profile_load (void)
 {
@@ -2477,7 +2493,7 @@ panel_profile_load (void)
 
 	panel_profile_ensure_toplevel_per_screen (client, PANEL_CONFIG_DIR);
 
-	panel_applet_load_queued_applets ();
+	panel_applet_load_queued_applets ((GFunc) panel_profile_on_loaded, NULL);
 }
 
 static gboolean
--- gnome-panel-2.24.0/gnome-panel/panel-toplevel.c
+++ gnome-panel-2.24.0/gnome-panel/panel-toplevel.c
@@ -2898,12 +2899,15 @@ static void
 panel_toplevel_initially_hide (PanelToplevel *toplevel)
 {
 	if (!toplevel->priv->attached) {
+
+		/* We start the panel off hidden until all the
+		 * applets are loaded, and then finally slide it
+		 * down when it's ready to be used
+		 */
 		toplevel->priv->initial_animation_done = FALSE;
 
 		toplevel->priv->state = PANEL_STATE_AUTO_HIDDEN;
 		gtk_widget_queue_resize (GTK_WIDGET (toplevel));
-
-		panel_toplevel_queue_auto_unhide (toplevel);
 	} else
 		toplevel->priv->initial_animation_done = TRUE;
 
@@ -3638,6 +3642,17 @@ panel_toplevel_queue_auto_unhide (PanelToplevel *toplevel)
 				    toplevel);
 }
 
+void
+panel_toplevel_queue_initial_unhide (PanelToplevel *toplevel)
+{
+	if (toplevel->priv->initial_animation_done)
+		return;
+       /* Give the applets a second or so to frob after registering */
+	toplevel->priv->unhide_timeout =
+		g_timeout_add_seconds (1, (GSourceFunc) panel_toplevel_auto_unhide_timeout_handler,
+			toplevel);
+}
+
 static gboolean
 panel_toplevel_enter_notify_event (GtkWidget        *widget,
 				   GdkEventCrossing *event)
--- gnome-panel-2.24.0/gnome-panel/panel-toplevel.h
+++ gnome-panel-2.24.0/gnome-panel/panel-toplevel.h
@@ -136,6 +136,7 @@ void                 panel_toplevel_hide                   (PanelToplevel
 void                 panel_toplevel_unhide                 (PanelToplevel       *toplevel);
 void                 panel_toplevel_queue_auto_hide        (PanelToplevel       *toplevel);
 void                 panel_toplevel_queue_auto_unhide      (PanelToplevel       *toplevel);
+void                 panel_toplevel_queue_initial_unhide   (PanelToplevel       *toplevel);
 void                 panel_toplevel_push_autohide_disabler (PanelToplevel       *toplevel);
 void                 panel_toplevel_pop_autohide_disabler  (PanelToplevel       *toplevel);
 
