diff --git a/sources/rb-browser-source.c b/sources/rb-browser-source.c
index 843d39b..13b0b2e 100644
--- a/sources/rb-browser-source.c
+++ b/sources/rb-browser-source.c
@@ -137,7 +137,7 @@ struct RBBrowserSourcePrivate
 	char *search_text;
 	RhythmDBQueryModel *cached_all_query;
 	RhythmDBPropType search_prop;
-	gboolean initialized;
+	gboolean populate;
 	gboolean query_active;
 	gboolean search_on_completion;
 
@@ -184,7 +184,8 @@ enum
 {
 	PROP_0,
 	PROP_SORTING_KEY,
-	PROP_BASE_QUERY_MODEL
+	PROP_BASE_QUERY_MODEL,
+	PROP_POPULATE
 };
 
 G_DEFINE_ABSTRACT_TYPE (RBBrowserSource, rb_browser_source, RB_TYPE_SOURCE)
@@ -235,6 +236,14 @@ rb_browser_source_class_init (RBBrowserSourceClass *klass)
 	g_object_class_override_property (object_class,
 					  PROP_BASE_QUERY_MODEL,
 					  "base-query-model");
+	
+	g_object_class_install_property (object_class,
+					 PROP_POPULATE,
+					 g_param_spec_boolean ("populate",
+						 	       "populate",
+							       "whether to populate the source",
+							       TRUE,
+							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
 	g_type_class_add_private (klass, sizeof (RBBrowserSourcePrivate));
 }
@@ -510,17 +519,29 @@ rb_browser_source_constructor (GType type,
 	gtk_widget_show_all (GTK_WIDGET (source));
 
 	source->priv->cached_all_query = rhythmdb_query_model_new_empty (source->priv->db);
-	rb_library_browser_set_model (source->priv->browser, source->priv->cached_all_query, TRUE);
-	rhythmdb_do_full_query_async (source->priv->db,
-				      RHYTHMDB_QUERY_RESULTS (source->priv->cached_all_query),
-				      RHYTHMDB_QUERY_PROP_EQUALS, RHYTHMDB_PROP_TYPE, entry_type,
-				      RHYTHMDB_QUERY_END);
+	if (source->priv->populate) {
+		rb_library_browser_set_model (source->priv->browser, source->priv->cached_all_query, TRUE);
+		rhythmdb_do_full_query_async (source->priv->db,
+					      RHYTHMDB_QUERY_RESULTS (source->priv->cached_all_query),
+					      RHYTHMDB_QUERY_PROP_EQUALS, RHYTHMDB_PROP_TYPE, entry_type,
+					      RHYTHMDB_QUERY_END);
+	} else {
+		/* use a throwaway model until we build the real one */
+		rb_library_browser_set_model (source->priv->browser, rhythmdb_query_model_new_empty (source->priv->db), TRUE);
+	}
+
 	g_boxed_free (RHYTHMDB_TYPE_ENTRY_TYPE, entry_type);
 
 	return G_OBJECT (source);
 }
 
 static void
+cached_all_query_complete_cb (RhythmDBQueryModel *model, RBBrowserSource *source)
+{
+	rb_library_browser_set_model (source->priv->browser, source->priv->cached_all_query, TRUE);
+}
+
+static void
 rb_browser_source_set_property (GObject *object,
 				guint prop_id,
 				const GValue *value,
@@ -533,6 +554,21 @@ rb_browser_source_set_property (GObject *object,
 		g_free (source->priv->sorting_key);
 		source->priv->sorting_key = g_strdup (g_value_get_string (value));
 		break;
+	case PROP_POPULATE:
+		source->priv->populate = g_value_get_boolean (value);
+
+		/* if being set after construction, run the query now; otherwise the constructor will do it */
+		if (source->priv->populate && source->priv->songs != NULL) {
+			RhythmDBEntryType *entry_type;
+			g_object_get (source, "entry-type", &entry_type, NULL);
+			g_signal_connect_object (source->priv->cached_all_query, "complete", G_CALLBACK (cached_all_query_complete_cb), source, 0);
+			rhythmdb_do_full_query_async (source->priv->db,
+						      RHYTHMDB_QUERY_RESULTS (source->priv->cached_all_query),
+						      RHYTHMDB_QUERY_PROP_EQUALS, RHYTHMDB_PROP_TYPE, entry_type,
+						      RHYTHMDB_QUERY_END);
+			g_boxed_free (RHYTHMDB_TYPE_ENTRY_TYPE, entry_type);
+		}
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -554,6 +590,9 @@ rb_browser_source_get_property (GObject *object,
 	case PROP_BASE_QUERY_MODEL:
 		g_value_set_object (value, source->priv->cached_all_query);
 		break;
+	case PROP_POPULATE:
+		g_value_set_boolean (value, source->priv->populate);
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -879,8 +918,10 @@ rb_browser_source_browser_changed_cb (RBLibraryBrowser *browser,
 
 static void
 rb_browser_source_query_complete_cb (RhythmDBQueryModel *query_model,
-					    RBBrowserSource *source)
+				     RBBrowserSource *source)
 {
+	rb_library_browser_set_model (source->priv->browser, query_model, TRUE);
+
 	source->priv->query_active = FALSE;
 	if (source->priv->search_on_completion) {
 		rb_debug ("performing deferred search");
@@ -933,9 +974,10 @@ rb_browser_source_do_query (RBBrowserSource *source, gboolean subset)
 		g_object_unref (query_model);
 
 	} else {
-		/* otherwise build a query based on the search text and feed it to the browser */
+		/* otherwise build a query based on the search text, and feed it to the browser
+		 * when the query finishes.
+		 */ 
 		query_model = rhythmdb_query_model_new_empty (source->priv->db);
-		rb_library_browser_set_model (source->priv->browser, query_model, TRUE);
 		source->priv->query_active = TRUE;
 		source->priv->search_on_completion = FALSE;
 		g_signal_connect_object (query_model,
diff --git a/sources/rb-library-source.c b/sources/rb-library-source.c
index e853b99..a6b17a3 100644
--- a/sources/rb-library-source.c
+++ b/sources/rb-library-source.c
@@ -298,6 +298,13 @@ add_child_sources_idle (RBLibrarySource *source)
 	return FALSE;
 }
 
+static void
+db_load_complete_cb (RhythmDB *db, RBLibrarySource *source)
+{
+	/* once the database is loaded, we can run the query to populate the library source */
+	g_object_set (source, "populate", TRUE, NULL);
+}
+
 static GObject *
 rb_library_source_constructor (GType type,
 			       guint n_construct_properties,
@@ -314,6 +321,8 @@ rb_library_source_constructor (GType type,
 	g_object_get (source, "shell", &shell, NULL);
 	g_object_get (shell, "db", &source->priv->db, NULL);
 
+	g_signal_connect_object (source->priv->db, "load-complete", G_CALLBACK (db_load_complete_cb), source, 0);
+
 	rb_library_source_ui_prefs_sync (source);
 
 	/* Set up the default library location if there's no library location set */
@@ -380,6 +389,7 @@ rb_library_source_new (RBShell *shell)
 					  "sorting-key", CONF_STATE_LIBRARY_SORTING,
 					  "shell", shell,
 					  "icon", icon,
+					  "populate", FALSE,		/* wait until the database is loaded */
 					  NULL));
 	if (icon != NULL) {
 		g_object_unref (icon);
