[gnome-photos/wip/search: 5/18] Add PhotosSearchContext and make PhotosApplication implement it



commit 8561371031d4c331fb9c474988e0a52ede4d42df
Author: Debarshi Ray <debarshir gnome org>
Date:   Sun Dec 1 01:14:52 2013 +0100

    Add PhotosSearchContext and make PhotosApplication implement it
    
    The future PhotosShellSearchProvider will be another implementation.

 src/Makefile.am                             |    2 +
 src/photos-application.c                    |   47 +++++++++++--
 src/photos-base-item.c                      |   12 +++-
 src/photos-base-manager.c                   |   38 ++++++++++-
 src/photos-camera-cache.c                   |   10 ++-
 src/photos-collection-icon-watcher.c        |   14 ++++-
 src/photos-collection-manager.c             |   24 +-------
 src/photos-collection-manager.h             |    4 +-
 src/photos-create-collection-job.c          |   11 +++-
 src/photos-delete-item-job.c                |   11 +++-
 src/photos-dropdown.c                       |   17 +++--
 src/photos-embed.c                          |   13 +++-
 src/photos-empty-results-box.c              |    9 ++-
 src/photos-facebook-item.c                  |   11 +++-
 src/photos-fetch-collection-state-job.c     |    9 ++-
 src/photos-fetch-collections-job.c          |   11 +++-
 src/photos-flickr-item.c                    |   12 +++-
 src/photos-item-manager.c                   |   15 ++++-
 src/photos-main-toolbar.c                   |   11 ++-
 src/photos-main-window.c                    |    9 ++-
 src/photos-offset-collections-controller.c  |   21 +++++-
 src/photos-offset-favorites-controller.c    |   21 +++++-
 src/photos-offset-overview-controller.c     |   13 +++-
 src/photos-offset-search-controller.c       |   11 +++-
 src/photos-organize-collection-model.c      |   12 +++-
 src/photos-organize-collection-view.c       |   16 +++--
 src/photos-overview-searchbar.c             |   19 +++---
 src/photos-query-builder.c                  |   95 ++++++++++++---------------
 src/photos-query-builder.h                  |   26 +++++---
 src/photos-query.c                          |   11 +--
 src/photos-query.h                          |    3 +-
 src/photos-search-context.c                 |   80 ++++++++++++++++++++++
 src/photos-search-context.h                 |   79 ++++++++++++++++++++++
 src/photos-search-controller.c              |   21 +------
 src/photos-search-controller.h              |    2 +-
 src/photos-search-match-manager.c           |   34 ++++------
 src/photos-search-match-manager.h           |    3 +-
 src/photos-search-type-manager.c            |   24 +-------
 src/photos-search-type-manager.h            |    4 +-
 src/photos-set-collection-job.c             |   11 +++-
 src/photos-single-item-job.c                |    5 +-
 src/photos-single-item-job.h                |    5 +-
 src/photos-source-manager.c                 |   23 +------
 src/photos-source-manager.h                 |    4 +-
 src/photos-tracker-collections-controller.c |   19 +++++-
 src/photos-tracker-controller.c             |   12 +++-
 src/photos-tracker-favorites-controller.c   |   19 +++++-
 src/photos-tracker-overview-controller.c    |   11 +++-
 src/photos-tracker-search-controller.c      |   31 ++++++---
 src/photos-update-mtime-job.c               |   11 +++-
 src/photos-view-model.c                     |   12 +++-
 51 files changed, 658 insertions(+), 290 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 438e0f9..bea51e0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -163,6 +163,8 @@ gnome_photos_SOURCES = \
        photos-query-builder.c \
        photos-remote-display-manager.c \
        photos-remote-display-manager.h \
+       photos-search-context.c \
+       photos-search-context.h \
        photos-search-controller.c \
        photos-search-controller.h \
        photos-search-match.c \
diff --git a/src/photos-application.c b/src/photos-application.c
index c3fecc9..1356862 100644
--- a/src/photos-application.c
+++ b/src/photos-application.c
@@ -44,6 +44,7 @@
 #include "photos-mode-controller.h"
 #include "photos-properties-dialog.h"
 #include "photos-resources.h"
+#include "photos-search-context.h"
 #include "photos-source-manager.h"
 
 
@@ -66,13 +67,18 @@ struct _PhotosApplicationPrivate
   GomMiner *flickr_miner;
   GtkWidget *main_window;
   PhotosBaseManager *item_mngr;
-  PhotosBaseManager *src_mngr;
   PhotosCameraCache *camera_cache;
   PhotosModeController *mode_cntrlr;
+  PhotosSearchContextState *state;
 };
 
+static void photos_application_search_context_iface_init (PhotosSearchContextInterface *iface);
 
-G_DEFINE_TYPE_WITH_PRIVATE (PhotosApplication, photos_application, GTK_TYPE_APPLICATION)
+
+G_DEFINE_TYPE_WITH_CODE (PhotosApplication, photos_application, GTK_TYPE_APPLICATION,
+                         G_ADD_PRIVATE (PhotosApplication)
+                         G_IMPLEMENT_INTERFACE (PHOTOS_TYPE_SEARCH_CONTEXT,
+                                                photos_application_search_context_iface_init));
 
 
 enum
@@ -155,6 +161,14 @@ photos_application_fullscreen (PhotosApplication *self, GVariant *parameter)
 }
 
 
+static PhotosSearchContextState *
+photos_application_get_state (PhotosSearchContext *context)
+{
+  PhotosApplication *self = PHOTOS_APPLICATION (context);
+  return self->priv->state;
+}
+
+
 static void
 photos_application_open_current (PhotosApplication *self)
 {
@@ -272,10 +286,10 @@ photos_application_refresh_miners (PhotosApplication *self)
 {
   PhotosApplicationPrivate *priv = self->priv;
 
-  if (photos_source_manager_has_provider_type (PHOTOS_SOURCE_MANAGER (priv->src_mngr), "facebook"))
+  if (photos_source_manager_has_provider_type (PHOTOS_SOURCE_MANAGER (priv->state->src_mngr), "facebook"))
     photos_application_refresh_miner_now (self, priv->facebook_miner);
 
-  if (photos_source_manager_has_provider_type (PHOTOS_SOURCE_MANAGER (priv->src_mngr), "flickr"))
+  if (photos_source_manager_has_provider_type (PHOTOS_SOURCE_MANAGER (priv->state->src_mngr), "flickr"))
     photos_application_refresh_miner_now (self, priv->flickr_miner);
 }
 
@@ -359,12 +373,12 @@ photos_application_start_miners (PhotosApplication *self)
 
   photos_application_refresh_miners (self);
 
-  g_signal_connect_object (priv->src_mngr,
+  g_signal_connect_object (priv->state->src_mngr,
                            "object-added",
                            G_CALLBACK (photos_application_refresh_miners),
                            self,
                            G_CONNECT_SWAPPED);
-  g_signal_connect_object (priv->src_mngr,
+  g_signal_connect_object (priv->state->src_mngr,
                            "object-removed",
                            G_CALLBACK (photos_application_refresh_miners),
                            self,
@@ -470,7 +484,6 @@ photos_application_startup (GApplication *application)
                                                          NULL);
 
   priv->item_mngr = photos_item_manager_dup_singleton ();
-  priv->src_mngr = photos_source_manager_dup_singleton ();
 
   /* A dummy reference to keep it alive during the lifetime of the
    * application.
@@ -611,10 +624,15 @@ photos_application_dispose (GObject *object)
   g_clear_object (&priv->facebook_miner);
   g_clear_object (&priv->flickr_miner);
   g_clear_object (&priv->item_mngr);
-  g_clear_object (&priv->src_mngr);
   g_clear_object (&priv->camera_cache);
   g_clear_object (&priv->mode_cntrlr);
 
+  if (priv->state != NULL)
+    {
+      photos_search_context_state_free (priv->state);
+      priv->state = NULL;
+    }
+
   G_OBJECT_CLASS (photos_application_parent_class)->dispose (object);
 }
 
@@ -622,8 +640,14 @@ photos_application_dispose (GObject *object)
 static void
 photos_application_init (PhotosApplication *self)
 {
+  PhotosApplicationPrivate *priv;
+
   self->priv = photos_application_get_instance_private (self);
+  priv = self->priv;
+
   eog_debug_init ();
+
+  priv->state = photos_search_context_state_new (PHOTOS_SEARCH_CONTEXT (self));
 }
 
 
@@ -642,6 +666,13 @@ photos_application_class_init (PhotosApplicationClass *class)
 }
 
 
+static void
+photos_application_search_context_iface_init (PhotosSearchContextInterface *iface)
+{
+  iface->get_state = photos_application_get_state;
+}
+
+
 GtkApplication *
 photos_application_new (void)
 {
diff --git a/src/photos-base-item.c b/src/photos-base-item.c
index 8eb6f67..d7ebf4c 100644
--- a/src/photos-base-item.c
+++ b/src/photos-base-item.c
@@ -40,6 +40,7 @@
 #include "photos-icons.h"
 #include "photos-print-operation.h"
 #include "photos-query.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 #include "photos-single-item-job.h"
 #include "photos-utils.h"
@@ -1288,10 +1289,19 @@ photos_base_item_print (PhotosBaseItem *self, GtkWidget *toplevel)
 void
 photos_base_item_refresh (PhotosBaseItem *self)
 {
+  GApplication *app;
+  PhotosSearchContextState *state;
   PhotosSingleItemJob *job;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   job = photos_single_item_job_new (self->priv->id);
-  photos_single_item_job_run (job, PHOTOS_QUERY_FLAGS_NONE, photos_base_item_refresh_executed, g_object_ref 
(self));
+  photos_single_item_job_run (job,
+                              state,
+                              PHOTOS_QUERY_FLAGS_NONE,
+                              photos_base_item_refresh_executed,
+                              g_object_ref (self));
   g_object_unref (job);
 }
 
diff --git a/src/photos-base-manager.c b/src/photos-base-manager.c
index 0911205..b57886e 100644
--- a/src/photos-base-manager.c
+++ b/src/photos-base-manager.c
@@ -29,18 +29,21 @@
 
 #include "photos-base-manager.h"
 #include "photos-filterable.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosBaseManagerPrivate
 {
   GHashTable *objects;
   GObject *active_object;
+  PhotosSearchContext *context;
   gchar *title;
 };
 
 enum
 {
   PROP_0,
+  PROP_CONTEXT,
   PROP_TITLE
 };
 
@@ -122,14 +125,38 @@ photos_base_manager_finalize (GObject *object)
 
 
 static void
+photos_base_manager_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+  PhotosBaseManager *self = PHOTOS_BASE_MANAGER (object);
+
+  switch (prop_id)
+    {
+    case PROP_CONTEXT:
+      g_value_set_object (value, self->priv->context);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+
+static void
 photos_base_manager_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 {
   PhotosBaseManager *self = PHOTOS_BASE_MANAGER (object);
+  PhotosBaseManagerPrivate *priv = self->priv;
 
   switch (prop_id)
     {
+    case PROP_CONTEXT:
+      priv->context = PHOTOS_SEARCH_CONTEXT (g_value_get_object (value)); /* self is owned by context */
+      g_object_add_weak_pointer (G_OBJECT (priv->context), (gpointer *) &priv->context);
+      break;
+
     case PROP_TITLE:
-      self->priv->title = g_value_dup_string (value);
+      priv->title = g_value_dup_string (value);
       break;
 
     default:
@@ -158,12 +185,21 @@ photos_base_manager_class_init (PhotosBaseManagerClass *class)
 
   object_class->dispose = photos_base_manager_dispose;
   object_class->finalize = photos_base_manager_finalize;
+  object_class->get_property = photos_base_manager_get_property;
   object_class->set_property = photos_base_manager_set_property;
   class->get_filter = photos_base_manager_default_get_filter;
   class->get_where = photos_base_manager_default_get_where;
   class->set_active_object = photos_base_manager_default_set_active_object;
 
   g_object_class_install_property (object_class,
+                                   PROP_CONTEXT,
+                                   g_param_spec_object ("context",
+                                                        "A PhotosSearchContext",
+                                                        "The search context in which this manager will be 
used",
+                                                        PHOTOS_TYPE_SEARCH_CONTEXT,
+                                                        G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
+
+  g_object_class_install_property (object_class,
                                    PROP_TITLE,
                                    g_param_spec_string ("title",
                                                         "Title",
diff --git a/src/photos-camera-cache.c b/src/photos-camera-cache.c
index 5c1e1aa..1144bfe 100644
--- a/src/photos-camera-cache.c
+++ b/src/photos-camera-cache.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,6 +25,7 @@
 
 #include "photos-camera-cache.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-queue.h"
 
 
@@ -188,8 +189,10 @@ photos_camera_cache_get_camera_async (PhotosCameraCache *self,
                                       gpointer user_data)
 {
   PhotosCameraCachePrivate *priv = self->priv;
+  GApplication *app;
   GTask *task;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
   const gchar *camera;
 
   task = g_task_new (self, cancellable, callback, user_data);
@@ -210,7 +213,10 @@ photos_camera_cache_get_camera_async (PhotosCameraCache *self,
       goto out;
     }
 
-  query = photos_query_builder_equipment_query (id);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_equipment_query (state, id);
   photos_tracker_queue_select (priv->queue,
                                query->sparql,
                                cancellable,
diff --git a/src/photos-collection-icon-watcher.c b/src/photos-collection-icon-watcher.c
index fa3b7db..334c5b6 100644
--- a/src/photos-collection-icon-watcher.c
+++ b/src/photos-collection-icon-watcher.c
@@ -34,6 +34,7 @@
 #include "photos-item-manager.h"
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-single-item-job.h"
 #include "photos-tracker-queue.h"
 #include "photos-utils.h"
@@ -186,12 +187,17 @@ static void
 photos_collection_icon_watcher_finished (PhotosCollectionIconWatcher *self)
 {
   PhotosCollectionIconWatcherPrivate *priv = self->priv;
+  GApplication *app;
   GList *l;
   GList *to_query = NULL;
+  PhotosSearchContextState *state;
 
   if (priv->urns == NULL)
     return;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->to_query_remaining = 0;
 
   for (l = priv->urns; l != NULL; l = l->next)
@@ -222,6 +228,7 @@ photos_collection_icon_watcher_finished (PhotosCollectionIconWatcher *self)
 
       job = photos_single_item_job_new (urn);
       photos_single_item_job_run (job,
+                                  state,
                                   PHOTOS_QUERY_FLAGS_UNFILTERED,
                                   photos_collection_icon_watcher_to_query_executed,
                                   g_object_ref (self));
@@ -299,7 +306,9 @@ static void
 photos_collection_icon_watcher_start (PhotosCollectionIconWatcher *self)
 {
   PhotosCollectionIconWatcherPrivate *priv = self->priv;
+  GApplication *app;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
   const gchar *id;
 
   photos_collection_icon_watcher_clear (self);
@@ -310,8 +319,11 @@ photos_collection_icon_watcher_start (PhotosCollectionIconWatcher *self)
   if (priv->collection == NULL)
     return;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   id = photos_filterable_get_id (PHOTOS_FILTERABLE (priv->collection));
-  query = photos_query_builder_collection_icon_query (id);
+  query = photos_query_builder_collection_icon_query (state, id);
   photos_tracker_queue_select (priv->queue,
                                query->sparql,
                                NULL,
diff --git a/src/photos-collection-manager.c b/src/photos-collection-manager.c
index bece01f..33276e7 100644
--- a/src/photos-collection-manager.c
+++ b/src/photos-collection-manager.c
@@ -47,26 +47,6 @@ photos_collection_manager_get_where (PhotosBaseManager *mngr, gint flags)
 }
 
 
-static GObject *
-photos_collection_manager_constructor (GType                  type,
-                                       guint                  n_construct_params,
-                                       GObjectConstructParam *construct_params)
-{
-  static GObject *self = NULL;
-
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_collection_manager_parent_class)->constructor (type,
-                                                                                   n_construct_params,
-                                                                                   construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
-
-  return g_object_ref (self);
-}
-
-
 static void
 photos_collection_manager_init (PhotosCollectionManager *self)
 {
@@ -76,16 +56,14 @@ photos_collection_manager_init (PhotosCollectionManager *self)
 static void
 photos_collection_manager_class_init (PhotosCollectionManagerClass *class)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (class);
   PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
-  object_class->constructor = photos_collection_manager_constructor;
   base_manager_class->get_where = photos_collection_manager_get_where;
 }
 
 
 PhotosBaseManager *
-photos_collection_manager_dup_singleton (void)
+photos_collection_manager_new (void)
 {
   return g_object_new (PHOTOS_TYPE_COLLECTION_MANAGER, NULL);
 }
diff --git a/src/photos-collection-manager.h b/src/photos-collection-manager.h
index e8e5045..1336b5e 100644
--- a/src/photos-collection-manager.h
+++ b/src/photos-collection-manager.h
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -68,7 +68,7 @@ struct _PhotosCollectionManagerClass
 
 GType                     photos_collection_manager_get_type           (void) G_GNUC_CONST;
 
-PhotosBaseManager        *photos_collection_manager_dup_singleton      (void);
+PhotosBaseManager        *photos_collection_manager_new                (void);
 
 G_END_DECLS
 
diff --git a/src/photos-create-collection-job.c b/src/photos-create-collection-job.c
index d7f2eda..330fd57 100644
--- a/src/photos-create-collection-job.c
+++ b/src/photos-create-collection-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,12 +25,14 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <tracker-sparql.h>
 
 #include "photos-create-collection-job.h"
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-queue.h"
 
 
@@ -193,7 +195,9 @@ photos_create_collection_job_run (PhotosCreateCollectionJob *self,
                                   gpointer user_data)
 {
   PhotosCreateCollectionJobPrivate *priv = self->priv;
+  GApplication *app;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
 
   if (G_UNLIKELY (priv->queue == NULL))
     {
@@ -205,7 +209,10 @@ photos_create_collection_job_run (PhotosCreateCollectionJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
-  query = photos_query_builder_create_collection_query (priv->name);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_create_collection_query (state, priv->name);
   photos_tracker_queue_update_blank (priv->queue,
                                      query->sparql,
                                      NULL,
diff --git a/src/photos-delete-item-job.c b/src/photos-delete-item-job.c
index 92fa442..9268a90 100644
--- a/src/photos-delete-item-job.c
+++ b/src/photos-delete-item-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,12 +25,14 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <tracker-sparql.h>
 
 #include "photos-delete-item-job.h"
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-queue.h"
 
 
@@ -159,7 +161,9 @@ photos_delete_item_job_run (PhotosDeleteItemJob *self,
                             gpointer user_data)
 {
   PhotosDeleteItemJobPrivate *priv = self->priv;
+  GApplication *app;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
 
   if (G_UNLIKELY (priv->queue == NULL))
     {
@@ -171,7 +175,10 @@ photos_delete_item_job_run (PhotosDeleteItemJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
-  query = photos_query_builder_delete_resource_query (priv->urn);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_delete_resource_query (state, priv->urn);
   photos_tracker_queue_update (priv->queue,
                                query->sparql,
                                NULL,
diff --git a/src/photos-dropdown.c b/src/photos-dropdown.c
index fcf171a..3cf1fde 100644
--- a/src/photos-dropdown.c
+++ b/src/photos-dropdown.c
@@ -25,13 +25,11 @@
 
 #include "config.h"
 
-#include <glib.h>
+#include <gio/gio.h>
 
 #include "photos-base-view.h"
 #include "photos-dropdown.h"
-#include "photos-source-manager.h"
-#include "photos-search-match-manager.h"
-#include "photos-search-type-manager.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosDropdownPrivate
@@ -82,15 +80,20 @@ static void
 photos_dropdown_init (PhotosDropdown *self)
 {
   PhotosDropdownPrivate *priv;
+  GApplication *app;
   GtkStyleContext *context;
   GtkWidget *frame;
+  PhotosSearchContextState *state;
 
   self->priv = photos_dropdown_get_instance_private (self);
   priv = self->priv;
 
-  priv->srch_mtch_mngr = photos_search_match_manager_dup_singleton ();
-  priv->srch_typ_mngr = photos_search_type_manager_dup_singleton ();
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->srch_mtch_mngr = g_object_ref (state->srch_mtch_mngr);
+  priv->srch_typ_mngr = g_object_ref (state->srch_typ_mngr);
+  priv->src_mngr = g_object_ref (state->src_mngr);
 
   priv->match_view = photos_base_view_new (priv->srch_mtch_mngr);
   priv->source_view = photos_base_view_new (priv->src_mngr);
diff --git a/src/photos-embed.c b/src/photos-embed.c
index 281f68f..44c33f0 100644
--- a/src/photos-embed.c
+++ b/src/photos-embed.c
@@ -27,6 +27,7 @@
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gegl.h>
+#include <gio/gio.h>
 #include <glib/gi18n.h>
 
 #include "photos-collection-manager.h"
@@ -40,6 +41,7 @@
 #include "photos-search-controller.h"
 #include "photos-selection-toolbar.h"
 #include "photos-spinner-box.h"
+#include "photos-search-context.h"
 #include "photos-search-type.h"
 #include "photos-search-type-manager.h"
 #include "photos-source.h"
@@ -610,12 +612,15 @@ photos_embed_init (PhotosEmbed *self)
 {
   PhotosEmbedPrivate *priv;
   GApplication *app;
+  PhotosSearchContextState *state;
   gboolean querying;
 
   self->priv = photos_embed_get_instance_private (self);
   priv = self->priv;
 
   app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->search_action = g_action_map_lookup_action (G_ACTION_MAP (app), "search");
   g_signal_connect_swapped (app, "window-added", G_CALLBACK (photos_embed_window_added), self);
 
@@ -685,22 +690,22 @@ photos_embed_init (PhotosEmbed *self)
                             G_CALLBACK (photos_embed_query_status_changed),
                             self);
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   g_signal_connect (priv->col_mngr, "active-changed", G_CALLBACK (photos_embed_active_changed), self);
 
   priv->item_mngr = photos_item_manager_dup_singleton ();
   g_signal_connect (priv->item_mngr, "active-changed", G_CALLBACK (photos_embed_active_changed), self);
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_swapped (priv->src_mngr, "active-changed", G_CALLBACK (photos_embed_search_changed), 
self);
 
-  priv->srch_mngr = photos_search_type_manager_dup_singleton ();
+  priv->srch_mngr = g_object_ref (state->srch_typ_mngr);
   g_signal_connect_swapped (priv->srch_mngr, "active-changed", G_CALLBACK (photos_embed_search_changed), 
self);
 
   querying = photos_tracker_controller_get_query_status (priv->trk_ovrvw_cntrlr);
   photos_embed_query_status_changed (self, querying);
 
-  priv->srch_cntrlr = photos_search_controller_dup_singleton ();
+  priv->srch_cntrlr = g_object_ref (state->srch_cntrlr);
   g_signal_connect_swapped (priv->srch_cntrlr,
                             "search-string-changed",
                             G_CALLBACK (photos_embed_search_changed),
diff --git a/src/photos-empty-results-box.c b/src/photos-empty-results-box.c
index 768391c..8c0afc7 100644
--- a/src/photos-empty-results-box.c
+++ b/src/photos-empty-results-box.c
@@ -25,11 +25,13 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib/gi18n.h>
 
 #include "photos-empty-results-box.h"
 #include "photos-enums.h"
 #include "photos-icons.h"
+#include "photos-search-context.h"
 #include "photos-source-manager.h"
 
 
@@ -272,11 +274,16 @@ static void
 photos_empty_results_box_init (PhotosEmptyResultsBox *self)
 {
   PhotosEmptyResultsBoxPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_empty_results_box_get_instance_private (self);
   priv = self->priv;
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->src_mngr = g_object_ref (state->src_mngr);
 }
 
 
diff --git a/src/photos-facebook-item.c b/src/photos-facebook-item.c
index d62ae5c..12c081b 100644
--- a/src/photos-facebook-item.c
+++ b/src/photos-facebook-item.c
@@ -1,6 +1,7 @@
 /*
  * Photos - access, organize and share your photos on GNOME
  * Copyright © 2013 Álvaro Peña
+ * Copyright © 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -33,9 +34,10 @@
 #include <goa/goa.h>
 #include <libgnome-desktop/gnome-desktop-thumbnail.h>
 
+#include "photos-base-manager.h"
 #include "photos-facebook-item.h"
+#include "photos-search-context.h"
 #include "photos-source.h"
-#include "photos-source-manager.h"
 #include "photos-utils.h"
 
 
@@ -234,11 +236,16 @@ static void
 photos_facebook_item_init (PhotosFacebookItem *self)
 {
   PhotosFacebookItemPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_facebook_item_get_instance_private (self);
   priv = self->priv;
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->src_mngr = g_object_ref (state->src_mngr);
 }
 
 
diff --git a/src/photos-fetch-collection-state-job.c b/src/photos-fetch-collection-state-job.c
index 811bcdc..dc347bf 100644
--- a/src/photos-fetch-collection-state-job.c
+++ b/src/photos-fetch-collection-state-job.c
@@ -28,13 +28,13 @@
 #include <glib.h>
 #include <tracker-sparql.h>
 
-#include "photos-collection-manager.h"
 #include "photos-fetch-collection-state-job.h"
 #include "photos-fetch-collections-job.h"
 #include "photos-filterable.h"
 #include "photos-item-manager.h"
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 
 
@@ -219,16 +219,21 @@ static void
 photos_fetch_collection_state_job_init (PhotosFetchCollectionStateJob *self)
 {
   PhotosFetchCollectionStateJobPrivate *priv = self->priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_fetch_collection_state_job_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->collections_for_items = g_hash_table_new_full (g_str_hash,
                                                        g_str_equal,
                                                        g_free,
                                                        photos_fetch_collection_state_job_value_destroy_func);
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   priv->item_mngr = photos_item_manager_dup_singleton ();
   priv->sel_cntrlr = photos_selection_controller_dup_singleton ();
 }
diff --git a/src/photos-fetch-collections-job.c b/src/photos-fetch-collections-job.c
index 46b5d3e..cd4ed32 100644
--- a/src/photos-fetch-collections-job.c
+++ b/src/photos-fetch-collections-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,12 +25,14 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <tracker-sparql.h>
 
 #include "photos-fetch-collections-job.h"
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-queue.h"
 
 
@@ -215,7 +217,9 @@ photos_fetch_collections_job_run (PhotosFetchCollectionsJob *self,
                                   gpointer user_data)
 {
   PhotosFetchCollectionsJobPrivate *priv = self->priv;
+  GApplication *app;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
 
   if (G_UNLIKELY (priv->queue == NULL))
     {
@@ -227,7 +231,10 @@ photos_fetch_collections_job_run (PhotosFetchCollectionsJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
-  query = photos_query_builder_fetch_collections_query (priv->urn);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_fetch_collections_query (state, priv->urn);
   photos_tracker_queue_select (priv->queue,
                                query->sparql,
                                NULL,
diff --git a/src/photos-flickr-item.c b/src/photos-flickr-item.c
index 7bcff94..36bbc0c 100644
--- a/src/photos-flickr-item.c
+++ b/src/photos-flickr-item.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,9 +34,10 @@
 #include <grilo.h>
 #include <libgnome-desktop/gnome-desktop-thumbnail.h>
 
+#include "photos-base-manager.h"
 #include "photos-flickr-item.h"
+#include "photos-search-context.h"
 #include "photos-source.h"
-#include "photos-source-manager.h"
 #include "photos-utils.h"
 
 
@@ -338,11 +339,16 @@ static void
 photos_flickr_item_init (PhotosFlickrItem *self)
 {
   PhotosFlickrItemPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_flickr_item_get_instance_private (self);
   priv = self->priv;
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->src_mngr = g_object_ref (state->src_mngr);
 }
 
 
diff --git a/src/photos-item-manager.c b/src/photos-item-manager.c
index 07e441e..a2c9ef8 100644
--- a/src/photos-item-manager.c
+++ b/src/photos-item-manager.c
@@ -28,12 +28,12 @@
 #include <glib.h>
 #include <tracker-sparql.h>
 
-#include "photos-collection-manager.h"
 #include "photos-item-manager.h"
 #include "photos-local-item.h"
 #include "photos-facebook-item.h"
 #include "photos-flickr-item.h"
 #include "photos-query.h"
+#include "photos-search-context.h"
 #include "photos-single-item-job.h"
 #include "photos-tracker-change-event.h"
 #include "photos-tracker-change-monitor.h"
@@ -68,10 +68,16 @@ photos_item_manager_item_created_executed (TrackerSparqlCursor *cursor, gpointer
 static void
 photos_item_manager_item_created (PhotosItemManager *self, const gchar *urn)
 {
+  GApplication *app;
+  PhotosSearchContextState *state;
   PhotosSingleItemJob *job;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   job = photos_single_item_job_new (urn);
   photos_single_item_job_run (job,
+                              state,
                               PHOTOS_QUERY_FLAGS_NONE,
                               photos_item_manager_item_created_executed,
                               g_object_ref (self));
@@ -215,12 +221,17 @@ static void
 photos_item_manager_init (PhotosItemManager *self)
 {
   PhotosItemManagerPrivate *priv = self->priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_item_manager_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->collection_path = g_queue_new ();
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
 
   priv->monitor = photos_tracker_change_monitor_dup_singleton (NULL, NULL);
   if (G_LIKELY (priv->monitor != NULL))
diff --git a/src/photos-main-toolbar.c b/src/photos-main-toolbar.c
index f657c7a..35dd13b 100644
--- a/src/photos-main-toolbar.c
+++ b/src/photos-main-toolbar.c
@@ -40,8 +40,8 @@
 #include "photos-mode-controller.h"
 #include "photos-overview-searchbar.h"
 #include "photos-remote-display-manager.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
-#include "photos-source-manager.h"
 
 
 struct _PhotosMainToolbarPrivate
@@ -704,10 +704,14 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
   GMenu *selection_menu;
   GApplication *app;
   GtkBuilder *builder;
+  PhotosSearchContextState *state;
 
   self->priv = photos_main_toolbar_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
   gtk_widget_show (GTK_WIDGET (self));
 
@@ -715,7 +719,6 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
   gtk_container_add (GTK_CONTAINER (self), priv->toolbar);
   gtk_widget_show (priv->toolbar);
 
-  app = g_application_get_default ();
   priv->gear_menu = G_SIMPLE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (app), "gear-menu"));
   priv->search = g_action_map_lookup_action (G_ACTION_MAP (app), "search");
 
@@ -731,10 +734,10 @@ photos_main_toolbar_init (PhotosMainToolbar *self)
   photos_header_bar_set_selection_menu (PHOTOS_HEADER_BAR (priv->toolbar),
                                         GD_HEADER_BUTTON (priv->selection_menu));
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   priv->item_mngr = photos_item_manager_dup_singleton ();
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_object (priv->src_mngr,
                            "active-changed",
                            G_CALLBACK (photos_main_toolbar_set_toolbar_title),
diff --git a/src/photos-main-window.c b/src/photos-main-window.c
index b3c92a4..26ab833 100644
--- a/src/photos-main-window.c
+++ b/src/photos-main-window.c
@@ -29,11 +29,11 @@
 #include <glib/gi18n.h>
 
 #include "photos-about-data.h"
-#include "photos-collection-manager.h"
 #include "photos-embed.h"
 #include "photos-item-manager.h"
 #include "photos-main-window.h"
 #include "photos-mode-controller.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 #include "photos-settings.h"
 
@@ -348,7 +348,9 @@ static void
 photos_main_window_init (PhotosMainWindow *self)
 {
   PhotosMainWindowPrivate *priv;
+  GApplication *app;
   GVariant *variant;
+  PhotosSearchContextState *state;
   gboolean maximized;
   const gint32 *position;
   const gint32 *size;
@@ -357,6 +359,9 @@ photos_main_window_init (PhotosMainWindow *self)
   self->priv = photos_main_window_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->settings = photos_settings_new ();
 
   variant = g_settings_get_value (priv->settings, "window-size");
@@ -375,7 +380,7 @@ photos_main_window_init (PhotosMainWindow *self)
   if (maximized)
     gtk_window_maximize (GTK_WINDOW (self));
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   priv->item_mngr = photos_item_manager_dup_singleton ();
 
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
diff --git a/src/photos-offset-collections-controller.c b/src/photos-offset-collections-controller.c
index 3b57a32..cc2af7a 100644
--- a/src/photos-offset-collections-controller.c
+++ b/src/photos-offset-collections-controller.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,9 +25,12 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-query-builder.h"
 #include "photos-offset-collections-controller.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosOffsetCollectionsControllerPrivate
@@ -45,7 +48,9 @@ static PhotosQuery *
 photos_offset_collections_controller_get_query (PhotosOffsetController *offset_cntrlr)
 {
   PhotosOffsetCollectionsController *self = PHOTOS_OFFSET_COLLECTIONS_CONTROLLER (offset_cntrlr);
+  GApplication *app;
   GObject *collection;
+  PhotosSearchContextState *state;
   gint flags;
 
   collection = photos_base_manager_get_active_object (self->priv->col_mngr);
@@ -54,7 +59,10 @@ photos_offset_collections_controller_get_query (PhotosOffsetController *offset_c
   else
     flags = PHOTOS_QUERY_FLAGS_COLLECTIONS;
 
-  return photos_query_builder_count_query (flags);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_count_query (state, flags);
 }
 
 
@@ -93,11 +101,16 @@ static void
 photos_offset_collections_controller_init (PhotosOffsetCollectionsController *self)
 {
   PhotosOffsetCollectionsControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_offset_collections_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->col_mngr = g_object_ref (state->col_mngr);
 }
 
 
diff --git a/src/photos-offset-favorites-controller.c b/src/photos-offset-favorites-controller.c
index f4cd085..d1a097e 100644
--- a/src/photos-offset-favorites-controller.c
+++ b/src/photos-offset-favorites-controller.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,9 +25,12 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-query-builder.h"
 #include "photos-offset-favorites-controller.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosOffsetFavoritesControllerPrivate
@@ -45,7 +48,9 @@ static PhotosQuery *
 photos_offset_favorites_controller_get_query (PhotosOffsetController *offset_cntrlr)
 {
   PhotosOffsetFavoritesController *self = PHOTOS_OFFSET_FAVORITES_CONTROLLER (offset_cntrlr);
+  GApplication *app;
   GObject *collection;
+  PhotosSearchContextState *state;
   gint flags;
 
   collection = photos_base_manager_get_active_object (self->priv->col_mngr);
@@ -54,7 +59,10 @@ photos_offset_favorites_controller_get_query (PhotosOffsetController *offset_cnt
   else
     flags = PHOTOS_QUERY_FLAGS_FAVORITES;
 
-  return photos_query_builder_count_query (flags);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_count_query (state, flags);
 }
 
 
@@ -93,11 +101,16 @@ static void
 photos_offset_favorites_controller_init (PhotosOffsetFavoritesController *self)
 {
   PhotosOffsetFavoritesControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_offset_favorites_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->col_mngr = g_object_ref (state->col_mngr);
 }
 
 
diff --git a/src/photos-offset-overview-controller.c b/src/photos-offset-overview-controller.c
index d953dfe..4551fd9 100644
--- a/src/photos-offset-overview-controller.c
+++ b/src/photos-offset-overview-controller.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,8 +25,11 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
+
 #include "photos-query-builder.h"
 #include "photos-offset-overview-controller.h"
+#include "photos-search-context.h"
 
 
 G_DEFINE_TYPE (PhotosOffsetOverviewController, photos_offset_overview_controller, 
PHOTOS_TYPE_OFFSET_CONTROLLER);
@@ -35,7 +38,13 @@ G_DEFINE_TYPE (PhotosOffsetOverviewController, photos_offset_overview_controller
 static PhotosQuery *
 photos_offset_overview_controller_get_query (PhotosOffsetController *offset_cntrlr)
 {
-  return photos_query_builder_count_query (PHOTOS_QUERY_FLAGS_OVERVIEW);
+  GApplication *app;
+  PhotosSearchContextState *state;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_count_query (state, PHOTOS_QUERY_FLAGS_OVERVIEW);
 }
 
 
diff --git a/src/photos-offset-search-controller.c b/src/photos-offset-search-controller.c
index e4c9e56..e1b4d7d 100644
--- a/src/photos-offset-search-controller.c
+++ b/src/photos-offset-search-controller.c
@@ -25,8 +25,11 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
+
 #include "photos-query-builder.h"
 #include "photos-offset-search-controller.h"
+#include "photos-search-context.h"
 
 
 G_DEFINE_TYPE (PhotosOffsetSearchController, photos_offset_search_controller, PHOTOS_TYPE_OFFSET_CONTROLLER);
@@ -35,7 +38,13 @@ G_DEFINE_TYPE (PhotosOffsetSearchController, photos_offset_search_controller, PH
 static PhotosQuery *
 photos_offset_search_controller_get_query (PhotosOffsetController *offset_cntrlr)
 {
-  return photos_query_builder_count_query (PHOTOS_QUERY_FLAGS_SEARCH);
+  GApplication *app;
+  PhotosSearchContextState *state;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_count_query (state, PHOTOS_QUERY_FLAGS_SEARCH);
 }
 
 
diff --git a/src/photos-organize-collection-model.c b/src/photos-organize-collection-model.c
index ec7433a..dcb9533 100644
--- a/src/photos-organize-collection-model.c
+++ b/src/photos-organize-collection-model.c
@@ -25,11 +25,14 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
+
 #include "photos-base-item.h"
-#include "photos-collection-manager.h"
+#include "photos-base-manager.h"
 #include "photos-fetch-collection-state-job.h"
 #include "photos-filterable.h"
 #include "photos-organize-collection-model.h"
+#include "photos-search-context.h"
 
 
 struct _PhotosOrganizeCollectionModelPrivate
@@ -195,16 +198,21 @@ static void
 photos_organize_collection_model_init (PhotosOrganizeCollectionModel *self)
 {
   PhotosOrganizeCollectionModelPrivate *priv;
+  GApplication *app;
   GType columns[] = {G_TYPE_STRING,  /* ID */
                      G_TYPE_STRING,  /* NAME */
                      G_TYPE_INT};    /* STATE */
+  PhotosSearchContextState *state;
 
   self->priv = photos_organize_collection_model_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   gtk_list_store_set_column_types (GTK_LIST_STORE (self), sizeof (columns) / sizeof (columns[0]), columns);
 
-  priv->manager = photos_collection_manager_dup_singleton ();
+  priv->manager = g_object_ref (state->col_mngr);
 
   g_signal_connect_object (priv->manager,
                            "object-added",
diff --git a/src/photos-organize-collection-view.c b/src/photos-organize-collection-view.c
index bd29048..076bfd4 100644
--- a/src/photos-organize-collection-view.c
+++ b/src/photos-organize-collection-view.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,17 +25,18 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <libgd/gd.h>
 
 #include "photos-base-item.h"
-#include "photos-collection-manager.h"
+#include "photos-base-manager.h"
 #include "photos-create-collection-job.h"
 #include "photos-fetch-collection-state-job.h"
 #include "photos-organize-collection-model.h"
 #include "photos-organize-collection-view.h"
 #include "photos-query.h"
-#include "photos-source-manager.h"
+#include "photos-search-context.h"
 #include "photos-set-collection-job.h"
 #include "photos-utils.h"
 
@@ -285,10 +286,15 @@ static void
 photos_organize_collection_view_init (PhotosOrganizeCollectionView *self)
 {
   PhotosOrganizeCollectionViewPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_organize_collection_view_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->model = photos_organize_collection_model_new ();
   gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (priv->model));
 
@@ -329,8 +335,8 @@ photos_organize_collection_view_init (PhotosOrganizeCollectionView *self)
                                            self,
                                            NULL);
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->src_mngr);
+  priv->src_mngr = g_object_ref (state->src_mngr);
 
   gtk_widget_show (GTK_WIDGET (self));
 }
diff --git a/src/photos-overview-searchbar.c b/src/photos-overview-searchbar.c
index ec5f592..8233527 100644
--- a/src/photos-overview-searchbar.c
+++ b/src/photos-overview-searchbar.c
@@ -28,14 +28,12 @@
 #include <gio/gio.h>
 #include <libgd/gd.h>
 
-#include "photos-collection-manager.h"
+#include "photos-base-manager.h"
 #include "photos-filterable.h"
 #include "photos-overview-searchbar.h"
+#include "photos-search-context.h"
 #include "photos-search-controller.h"
-#include "photos-search-match-manager.h"
 #include "photos-search-type.h"
-#include "photos-search-type-manager.h"
-#include "photos-source-manager.h"
 
 
 struct _PhotosOverviewSearchbarPrivate
@@ -345,42 +343,45 @@ photos_overview_searchbar_init (PhotosOverviewSearchbar *self)
 {
   PhotosOverviewSearchbarPrivate *priv;
   GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_overview_searchbar_get_instance_private (self);
   priv = self->priv;
 
   app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->select_all = g_action_map_lookup_action (G_ACTION_MAP (app), "select-all");
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_object (priv->src_mngr,
                            "active-changed",
                            G_CALLBACK (photos_overview_searchbar_source_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
 
-  priv->srch_mtch_mngr = photos_search_match_manager_dup_singleton ();
+  priv->srch_mtch_mngr = g_object_ref (state->srch_mtch_mngr);
   g_signal_connect_object (priv->srch_mtch_mngr,
                            "active-changed",
                            G_CALLBACK (photos_overview_searchbar_search_match_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
 
-  priv->srch_typ_mngr = photos_search_type_manager_dup_singleton ();
+  priv->srch_typ_mngr = g_object_ref (state->srch_typ_mngr);
   g_signal_connect_object (priv->srch_typ_mngr,
                            "active-changed",
                            G_CALLBACK (photos_overview_searchbar_search_type_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   g_signal_connect_object (priv->col_mngr,
                            "active-changed",
                            G_CALLBACK (photos_overview_searchbar_collection_active_changed),
                            self,
                            G_CONNECT_SWAPPED);
 
-  priv->srch_cntrlr = photos_search_controller_dup_singleton ();
+  priv->srch_cntrlr = g_object_ref (state->srch_cntrlr);
 }
 
 
diff --git a/src/photos-query-builder.c b/src/photos-query-builder.c
index e617bfd..1daf62d 100644
--- a/src/photos-query-builder.c
+++ b/src/photos-query-builder.c
@@ -53,24 +53,16 @@ photos_query_builder_convert_path_to_uri (const gchar *path)
 
 
 static gchar *
-photos_query_builder_filter (gint flags)
+photos_query_builder_filter (PhotosSearchContextState *state, gint flags)
 {
-  PhotosBaseManager *src_mngr;
-  PhotosBaseManager *srch_mtch_mngr;
-  PhotosBaseManager *srch_typ_mngr;
   gchar *sparql;
   gchar *src_mngr_filter;
   gchar *srch_mtch_mngr_filter;
   gchar *srch_typ_mngr_filter;
 
-  src_mngr = photos_source_manager_dup_singleton ();
-  src_mngr_filter = photos_base_manager_get_filter (src_mngr, flags);
-
-  srch_mtch_mngr = photos_search_match_manager_dup_singleton ();
-  srch_mtch_mngr_filter = photos_base_manager_get_filter (srch_mtch_mngr, flags);
-
-  srch_typ_mngr = photos_search_type_manager_dup_singleton ();
-  srch_typ_mngr_filter = photos_base_manager_get_filter (srch_typ_mngr, flags);
+  src_mngr_filter = photos_base_manager_get_filter (state->src_mngr, flags);
+  srch_mtch_mngr_filter = photos_base_manager_get_filter (state->srch_mtch_mngr, flags);
+  srch_typ_mngr_filter = photos_base_manager_get_filter (state->srch_typ_mngr, flags);
 
   sparql = g_strdup_printf ("FILTER (%s && %s && %s)",
                             src_mngr_filter,
@@ -78,13 +70,8 @@ photos_query_builder_filter (gint flags)
                             srch_typ_mngr_filter);
 
   g_free (srch_typ_mngr_filter);
-  g_object_unref (srch_typ_mngr);
-
   g_free (srch_mtch_mngr_filter);
-  g_object_unref (srch_mtch_mngr);
-
   g_free (src_mngr_filter);
-  g_object_unref (src_mngr);
 
   return sparql;
 }
@@ -99,21 +86,15 @@ photos_query_builder_optional (void)
 
 
 static gchar *
-photos_query_builder_where (gboolean global, gint flags)
+photos_query_builder_where (PhotosSearchContextState *state, gboolean global, gint flags)
 {
-  PhotosBaseManager *col_mngr;
-  PhotosBaseManager *srch_typ_mngr;
   gchar *col_mngr_where = NULL;
   gchar *filter = NULL;
   gchar *optional = NULL;
   gchar *sparql;
   gchar *srch_typ_mngr_where = NULL;
 
-  col_mngr = photos_collection_manager_dup_singleton ();
-
-  srch_typ_mngr = photos_search_type_manager_dup_singleton ();
-  srch_typ_mngr_where = photos_base_manager_get_where (srch_typ_mngr, flags);
-
+  srch_typ_mngr_where = photos_base_manager_get_where (state->srch_typ_mngr, flags);
   optional = photos_query_builder_optional ();
 
   if (!(flags & PHOTOS_QUERY_FLAGS_UNFILTERED))
@@ -122,10 +103,10 @@ photos_query_builder_where (gboolean global, gint flags)
         {
           /* TODO: SearchCategoryManager */
 
-          col_mngr_where = photos_base_manager_get_where (col_mngr, flags);
+          col_mngr_where = photos_base_manager_get_where (state->col_mngr, flags);
         }
 
-      filter = photos_query_builder_filter (flags);
+      filter = photos_query_builder_filter (state, flags);
     }
 
   sparql = g_strdup_printf ("WHERE { %s %s %s %s }",
@@ -137,21 +118,22 @@ photos_query_builder_where (gboolean global, gint flags)
   g_free (col_mngr_where);
   g_free (filter);
   g_free (srch_typ_mngr_where);
-  g_object_unref (col_mngr);
-  g_object_unref (srch_typ_mngr);
 
   return sparql;
 }
 
 
 static gchar *
-photos_query_builder_query (gboolean global, gint flags, PhotosOffsetController *offset_cntrlr)
+photos_query_builder_query (PhotosSearchContextState *state,
+                            gboolean global,
+                            gint flags,
+                            PhotosOffsetController *offset_cntrlr)
 {
   gchar *sparql;
   gchar *tail_sparql = NULL;
   gchar *where_sparql;
 
-  where_sparql = photos_query_builder_where (global, flags);
+  where_sparql = photos_query_builder_where (state, global, flags);
 
   if (global)
     {
@@ -199,7 +181,7 @@ photos_query_builder_query (gboolean global, gint flags, PhotosOffsetController
 
 
 PhotosQuery *
-photos_query_builder_create_collection_query (const gchar *name)
+photos_query_builder_create_collection_query (PhotosSearchContextState *state, const gchar *name)
 {
   GTimeVal tv;
   gchar *sparql;
@@ -221,12 +203,12 @@ photos_query_builder_create_collection_query (const gchar *name)
                             name);
   g_free (time);
 
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_collection_icon_query (const gchar *resource)
+photos_query_builder_collection_icon_query (PhotosSearchContextState *state, const gchar *resource)
 {
   gchar *sparql;
 
@@ -235,68 +217,73 @@ photos_query_builder_collection_icon_query (const gchar *resource)
                             "WHERE { ?urn nie:isPartOf <%s> } "
                             "ORDER BY DESC (?mtime) LIMIT 4",
                             resource);
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_count_query (gint flags)
+photos_query_builder_count_query (PhotosSearchContextState *state, gint flags)
 {
   gchar *sparql;
   gchar *where_sparql;
 
-  where_sparql = photos_query_builder_where (TRUE, flags);
+  where_sparql = photos_query_builder_where (state, TRUE, flags);
   sparql = g_strconcat ("SELECT DISTINCT COUNT(?urn) ", where_sparql, NULL);
   g_free (where_sparql);
 
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_delete_resource_query (const gchar *resource)
+photos_query_builder_delete_resource_query (PhotosSearchContextState *state, const gchar *resource)
 {
   gchar *sparql;
 
   sparql = g_strdup_printf ("DELETE { <%s> a rdfs:Resource }", resource);
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_equipment_query (GQuark equipment)
+photos_query_builder_equipment_query (PhotosSearchContextState *state, GQuark equipment)
 {
   const gchar *resource;
   gchar *sparql;
 
   resource = g_quark_to_string (equipment);
   sparql = g_strdup_printf ("SELECT nfo:manufacturer (<%s>) nfo:model (<%s>) WHERE {}", resource, resource);
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_fetch_collections_query (const gchar *resource)
+photos_query_builder_fetch_collections_query (PhotosSearchContextState *state, const gchar *resource)
 {
   gchar *sparql;
 
   sparql = g_strdup_printf ("SELECT ?urn WHERE { ?urn a nfo:DataContainer . <%s> nie:isPartOf ?urn }", 
resource);
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_global_query (gint flags, PhotosOffsetController *offset_cntrlr)
+photos_query_builder_global_query (PhotosSearchContextState *state,
+                                   gint flags,
+                                   PhotosOffsetController *offset_cntrlr)
 {
   gchar *sparql;
 
-  sparql = photos_query_builder_query (TRUE, flags, offset_cntrlr);
-  return photos_query_new (sparql);
+  sparql = photos_query_builder_query (state, TRUE, flags, offset_cntrlr);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_set_collection_query (const gchar *item_urn, const gchar *collection_urn, gboolean 
setting)
+photos_query_builder_set_collection_query (PhotosSearchContextState *state,
+                                           const gchar *item_urn,
+                                           const gchar *collection_urn,
+                                           gboolean setting)
 {
   gchar *sparql;
 
@@ -304,19 +291,19 @@ photos_query_builder_set_collection_query (const gchar *item_urn, const gchar *c
                             setting ? "INSERT" : "DELETE",
                             item_urn,
                             collection_urn);
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_single_query (gint flags, const gchar *resource)
+photos_query_builder_single_query (PhotosSearchContextState *state, gint flags, const gchar *resource)
 {
   GRegex *regex;
   gchar *replacement;
   gchar *sparql;
   gchar *tmp;
 
-  tmp = photos_query_builder_query (FALSE, flags, NULL);
+  tmp = photos_query_builder_query (state, FALSE, flags, NULL);
 
   regex = g_regex_new ("\\?urn", 0, 0, NULL);
   replacement = g_strconcat ("<", resource, ">", NULL);
@@ -325,12 +312,12 @@ photos_query_builder_single_query (gint flags, const gchar *resource)
   g_free (tmp);
   g_regex_unref (regex);
 
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
 PhotosQuery *
-photos_query_builder_update_mtime_query (const gchar *resource)
+photos_query_builder_update_mtime_query (PhotosSearchContextState *state, const gchar *resource)
 {
   GTimeVal tv;
   gchar *sparql;
@@ -345,7 +332,7 @@ photos_query_builder_update_mtime_query (const gchar *resource)
   sparql = g_strdup_printf ("INSERT OR REPLACE { <%s> nie:contentLastModified \"%s\" }", resource, time);
   g_free (time);
 
-  return photos_query_new (sparql);
+  return photos_query_new (state, sparql);
 }
 
 
diff --git a/src/photos-query-builder.h b/src/photos-query-builder.h
index 0a451aa..f7a9e23 100644
--- a/src/photos-query-builder.h
+++ b/src/photos-query-builder.h
@@ -29,30 +29,36 @@
 
 #include "photos-offset-controller.h"
 #include "photos-query.h"
+#include "photos-search-context.h"
 
 G_BEGIN_DECLS
 
-PhotosQuery  *photos_query_builder_create_collection_query (const gchar *name);
+PhotosQuery  *photos_query_builder_create_collection_query (PhotosSearchContextState *state, const gchar 
*name);
 
-PhotosQuery  *photos_query_builder_collection_icon_query (const gchar *resource);
+PhotosQuery  *photos_query_builder_collection_icon_query (PhotosSearchContextState *state, const gchar 
*resource);
 
-PhotosQuery  *photos_query_builder_count_query (gint flags);
+PhotosQuery  *photos_query_builder_count_query (PhotosSearchContextState *state, gint flags);
 
-PhotosQuery  *photos_query_builder_delete_resource_query (const gchar *resource);
+PhotosQuery  *photos_query_builder_delete_resource_query (PhotosSearchContextState *state, const gchar 
*resource);
 
-PhotosQuery  *photos_query_builder_equipment_query (GQuark equipment);
+PhotosQuery  *photos_query_builder_equipment_query (PhotosSearchContextState *state, GQuark equipment);
 
-PhotosQuery  *photos_query_builder_fetch_collections_query (const gchar *resource);
+PhotosQuery  *photos_query_builder_fetch_collections_query (PhotosSearchContextState *state, const gchar 
*resource);
 
-PhotosQuery  *photos_query_builder_global_query        (gint flags, PhotosOffsetController *offset_cntrlr);
+PhotosQuery  *photos_query_builder_global_query        (PhotosSearchContextState *state,
+                                                        gint flags,
+                                                        PhotosOffsetController *offset_cntrlr);
 
-PhotosQuery  *photos_query_builder_set_collection_query (const gchar *item_urn,
+PhotosQuery  *photos_query_builder_set_collection_query (PhotosSearchContextState *state,
+                                                         const gchar *item_urn,
                                                          const gchar *collection_urn,
                                                          gboolean setting);
 
-PhotosQuery  *photos_query_builder_single_query        (gint flags, const gchar *resource);
+PhotosQuery  *photos_query_builder_single_query        (PhotosSearchContextState *state,
+                                                        gint flags,
+                                                        const gchar *resource);
 
-PhotosQuery  *photos_query_builder_update_mtime_query (const gchar *resource);
+PhotosQuery  *photos_query_builder_update_mtime_query (PhotosSearchContextState *state, const gchar 
*resource);
 
 gchar        *photos_query_builder_filter_local        (void);
 
diff --git a/src/photos-query.c b/src/photos-query.c
index 7571360..dfc93e4 100644
--- a/src/photos-query.c
+++ b/src/photos-query.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,8 +25,8 @@
 
 #include "config.h"
 
+#include "photos-base-manager.h"
 #include "photos-query.h"
-#include "photos-source-manager.h"
 
 
 const gchar *PHOTOS_QUERY_COLLECTIONS_IDENTIFIER = "photos:collection:";
@@ -34,19 +34,16 @@ const gchar *PHOTOS_QUERY_LOCAL_COLLECTIONS_IDENTIFIER = "photos:collection:loca
 
 
 PhotosQuery *
-photos_query_new (gchar *sparql)
+photos_query_new (PhotosSearchContextState *state, gchar *sparql)
 {
-  PhotosBaseManager *src_mngr;
   GObject *active_object;
   PhotosQuery *query;
 
   query = g_slice_new0 (PhotosQuery);
 
-  src_mngr = photos_source_manager_dup_singleton ();
-  active_object = photos_base_manager_get_active_object (src_mngr);
+  active_object = photos_base_manager_get_active_object (state->src_mngr);
   if (active_object != NULL)
     query->source = PHOTOS_SOURCE (g_object_ref (active_object));
-  g_object_unref (src_mngr);
 
   query->sparql = sparql;
 
diff --git a/src/photos-query.h b/src/photos-query.h
index 78a59b0..36ebd35 100644
--- a/src/photos-query.h
+++ b/src/photos-query.h
@@ -28,6 +28,7 @@
 #include <glib.h>
 
 #include "photos-query.h"
+#include "photos-search-context.h"
 #include "photos-source.h"
 
 G_BEGIN_DECLS
@@ -78,7 +79,7 @@ struct _PhotosQuery
   gchar *sparql;
 };
 
-PhotosQuery    *photos_query_new     (gchar *sparql);
+PhotosQuery    *photos_query_new     (PhotosSearchContextState *state, gchar *sparql);
 
 void            photos_query_free    (PhotosQuery *query);
 
diff --git a/src/photos-search-context.c b/src/photos-search-context.c
new file mode 100644
index 0000000..cf31977
--- /dev/null
+++ b/src/photos-search-context.c
@@ -0,0 +1,80 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright © 2013 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* Based on code from:
+ *   + Documents
+ */
+
+
+#include "config.h"
+
+#include <glib.h>
+
+#include "photos-collection-manager.h"
+#include "photos-search-context.h"
+#include "photos-search-controller.h"
+#include "photos-search-match-manager.h"
+#include "photos-search-type-manager.h"
+#include "photos-source-manager.h"
+
+
+G_DEFINE_INTERFACE (PhotosSearchContext, photos_search_context, G_TYPE_INVALID);
+
+
+static void
+photos_search_context_default_init (PhotosSearchContextInterface *iface)
+{
+}
+
+
+PhotosSearchContextState *
+photos_search_context_state_new (PhotosSearchContext *self)
+{
+  PhotosSearchContextState *state;
+
+  state = g_slice_new0 (PhotosSearchContextState);
+  state->col_mngr = photos_collection_manager_new ();
+  state->src_mngr = photos_source_manager_new ();
+  state->srch_mtch_mngr = photos_search_match_manager_new (self);
+  state->srch_typ_mngr = photos_search_type_manager_new ();
+  state->srch_cntrlr = photos_search_controller_new ();
+
+  return state;
+}
+
+
+void
+photos_search_context_state_free (PhotosSearchContextState *state)
+{
+  g_object_unref (state->col_mngr);
+  g_object_unref (state->src_mngr);
+  g_object_unref (state->srch_mtch_mngr);
+  g_object_unref (state->srch_typ_mngr);
+  g_object_unref (state->srch_cntrlr);
+  g_slice_free (PhotosSearchContextState, state);
+}
+
+
+PhotosSearchContextState *
+photos_search_context_get_state (PhotosSearchContext *self)
+{
+  g_return_val_if_fail (PHOTOS_IS_SEARCH_CONTEXT (self), NULL);
+  return PHOTOS_SEARCH_CONTEXT_GET_INTERFACE (self)->get_state (self);
+}
diff --git a/src/photos-search-context.h b/src/photos-search-context.h
new file mode 100644
index 0000000..95303c1
--- /dev/null
+++ b/src/photos-search-context.h
@@ -0,0 +1,79 @@
+/*
+ * Photos - access, organize and share your photos on GNOME
+ * Copyright © 2013 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* Based on code from:
+ *   + Documents
+ */
+
+#ifndef PHOTOS_SEARCH_CONTEXT_H
+#define PHOTOS_SEARCH_CONTEXT_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define PHOTOS_TYPE_SEARCH_CONTEXT (photos_search_context_get_type ())
+
+#define PHOTOS_SEARCH_CONTEXT(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+   PHOTOS_TYPE_SEARCH_CONTEXT, PhotosSearchContext))
+
+#define PHOTOS_IS_SEARCH_CONTEXT(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+   PHOTOS_TYPE_SEARCH_CONTEXT))
+
+#define PHOTOS_SEARCH_CONTEXT_GET_INTERFACE(inst) \
+  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \
+   PHOTOS_TYPE_SEARCH_CONTEXT, PhotosSearchContextInterface))
+
+typedef struct _PhotosSearchContextState PhotosSearchContextState;
+
+typedef struct _PhotosSearchContext          PhotosSearchContext;
+typedef struct _PhotosSearchContextInterface PhotosSearchContextInterface;
+
+struct _PhotosSearchContextState
+{
+  gpointer col_mngr;
+  gpointer src_mngr;
+  gpointer srch_mtch_mngr;
+  gpointer srch_typ_mngr;
+  gpointer offset_cntrlr;
+  gpointer srch_cntrlr;
+};
+
+PhotosSearchContextState      *photos_search_context_state_new      (PhotosSearchContext *self);
+
+void                           photos_search_context_state_free     (PhotosSearchContextState *state);
+
+struct _PhotosSearchContextInterface
+{
+  GTypeInterface parent_iface;
+
+  /* virtual methods */
+  PhotosSearchContextState *(*get_state) (PhotosSearchContext *self);
+};
+
+GType                        photos_search_context_get_type           (void) G_GNUC_CONST;
+
+PhotosSearchContextState    *photos_search_context_get_state          (PhotosSearchContext *self);
+
+G_END_DECLS
+
+#endif /* PHOTOS_SEARCH_CONTEXT_H */
diff --git a/src/photos-search-controller.c b/src/photos-search-controller.c
index 18fa666..a1a9681 100644
--- a/src/photos-search-controller.c
+++ b/src/photos-search-controller.c
@@ -48,24 +48,6 @@ static guint signals[LAST_SIGNAL] = { 0 };
 G_DEFINE_TYPE_WITH_PRIVATE (PhotosSearchController, photos_search_controller, G_TYPE_OBJECT);
 
 
-static GObject *
-photos_search_controller_constructor (GType type, guint n_construct_params, GObjectConstructParam 
*construct_params)
-{
-  static GObject *self = NULL;
-
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_search_controller_parent_class)->constructor (type,
-                                                                                  n_construct_params,
-                                                                                  construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
-
-  return g_object_ref (self);
-}
-
-
 static void
 photos_search_controller_finalize (GObject *object)
 {
@@ -94,7 +76,6 @@ photos_search_controller_class_init (PhotosSearchControllerClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
 
-  object_class->constructor = photos_search_controller_constructor;
   object_class->finalize = photos_search_controller_finalize;
 
   signals[SEARCH_STRING_CHANGED] = g_signal_new ("search-string-changed",
@@ -112,7 +93,7 @@ photos_search_controller_class_init (PhotosSearchControllerClass *class)
 
 
 PhotosSearchController *
-photos_search_controller_dup_singleton (void)
+photos_search_controller_new (void)
 {
   return g_object_new (PHOTOS_TYPE_SEARCH_CONTROLLER, NULL);
 }
diff --git a/src/photos-search-controller.h b/src/photos-search-controller.h
index e2337a2..d3d89f2 100644
--- a/src/photos-search-controller.h
+++ b/src/photos-search-controller.h
@@ -71,7 +71,7 @@ struct _PhotosSearchControllerClass
 
 GType                      photos_search_controller_get_type       (void) G_GNUC_CONST;
 
-PhotosSearchController    *photos_search_controller_dup_singleton  (void);
+PhotosSearchController    *photos_search_controller_new            (void);
 
 const gchar               *photos_search_controller_get_string     (PhotosSearchController *self);
 
diff --git a/src/photos-search-match-manager.c b/src/photos-search-match-manager.c
index 1f0c9f1..9f33e6a 100644
--- a/src/photos-search-match-manager.c
+++ b/src/photos-search-match-manager.c
@@ -100,23 +100,19 @@ photos_search_match_manager_get_filter (PhotosBaseManager *mngr, gint flags)
 }
 
 
-static GObject *
-photos_search_match_manager_constructor (GType                  type,
-                                         guint                  n_construct_params,
-                                         GObjectConstructParam *construct_params)
+static void
+photos_search_match_manager_constructed (GObject *object)
 {
-  static GObject *self = NULL;
+  PhotosSearchMatchManager *self = PHOTOS_SEARCH_MATCH_MANAGER (object);
+  PhotosSearchContext *context;
+  PhotosSearchContextState *state;
 
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_search_match_manager_parent_class)->constructor (type,
-                                                                                     n_construct_params,
-                                                                                     construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
+  G_OBJECT_CLASS (photos_search_match_manager_parent_class)->constructed (object);
 
-  return g_object_ref (self);
+  g_object_get (self, "context", &context, NULL);
+  state = photos_search_context_get_state (context);
+  self->priv->srch_cntrlr = g_object_ref (state->srch_cntrlr);
+  g_object_unref (context);
 }
 
 
@@ -134,15 +130,11 @@ photos_search_match_manager_dispose (GObject *object)
 static void
 photos_search_match_manager_init (PhotosSearchMatchManager *self)
 {
-  PhotosSearchMatchManagerPrivate *priv;
   PhotosSearchMatch *search_match;
   const gchar *author_filter;
   const gchar *title_filter;
 
   self->priv = photos_search_match_manager_get_instance_private (self);
-  priv = self->priv;
-
-  priv->srch_cntrlr = photos_search_controller_dup_singleton ();
 
   author_filter = "fn:contains ("
                   "  tracker:case-fold (tracker:coalesce (nco:fullname (?creator), 
nco:fullname(?publisher))),"
@@ -181,17 +173,17 @@ photos_search_match_manager_class_init (PhotosSearchMatchManagerClass *class)
   GObjectClass *object_class = G_OBJECT_CLASS (class);
   PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
-  object_class->constructor = photos_search_match_manager_constructor;
+  object_class->constructed = photos_search_match_manager_constructed;
   object_class->dispose = photos_search_match_manager_dispose;
   base_manager_class->get_filter = photos_search_match_manager_get_filter;
 }
 
 
 PhotosBaseManager *
-photos_search_match_manager_dup_singleton (void)
+photos_search_match_manager_new (PhotosSearchContext *context)
 {
   /* Translators: this is a verb that refers to "All", "Title" and
    * "Author", as in "Match All", "Match Title" and "Match Author".
    */
-  return g_object_new (PHOTOS_TYPE_SEARCH_MATCH_MANAGER, "title", _("Match"), NULL);
+  return g_object_new (PHOTOS_TYPE_SEARCH_MATCH_MANAGER, "context", context, "title", _("Match"), NULL);
 }
diff --git a/src/photos-search-match-manager.h b/src/photos-search-match-manager.h
index 04df7f0..bccec62 100644
--- a/src/photos-search-match-manager.h
+++ b/src/photos-search-match-manager.h
@@ -26,6 +26,7 @@
 #define PHOTOS_SEARCH_MATCH_MANAGER_H
 
 #include "photos-base-manager.h"
+#include "photos-search-context.h"
 
 G_BEGIN_DECLS
 
@@ -68,7 +69,7 @@ struct _PhotosSearchMatchManagerClass
 
 GType                     photos_search_match_manager_get_type           (void) G_GNUC_CONST;
 
-PhotosBaseManager        *photos_search_match_manager_dup_singleton      (void);
+PhotosBaseManager        *photos_search_match_manager_new                (PhotosSearchContext *context);
 
 G_END_DECLS
 
diff --git a/src/photos-search-type-manager.c b/src/photos-search-type-manager.c
index 440ea14..28c7734 100644
--- a/src/photos-search-type-manager.c
+++ b/src/photos-search-type-manager.c
@@ -85,26 +85,6 @@ photos_search_type_manager_get_where (PhotosBaseManager *mngr, gint flags)
 }
 
 
-static GObject *
-photos_search_type_manager_constructor (GType                  type,
-                                        guint                  n_construct_params,
-                                        GObjectConstructParam *construct_params)
-{
-  static GObject *self = NULL;
-
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_search_type_manager_parent_class)->constructor (type,
-                                                                                    n_construct_params,
-                                                                                    construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
-
-  return g_object_ref (self);
-}
-
-
 static void
 photos_search_type_manager_init (PhotosSearchTypeManager *self)
 {
@@ -157,17 +137,15 @@ photos_search_type_manager_init (PhotosSearchTypeManager *self)
 static void
 photos_search_type_manager_class_init (PhotosSearchTypeManagerClass *class)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (class);
   PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
-  object_class->constructor = photos_search_type_manager_constructor;
   base_manager_class->get_filter = photos_search_type_manager_get_filter;
   base_manager_class->get_where = photos_search_type_manager_get_where;
 }
 
 
 PhotosBaseManager *
-photos_search_type_manager_dup_singleton (void)
+photos_search_type_manager_new (void)
 {
   /* Translators: "Type" refers to a search filter. eg., All, Albums,
    * Favorites and Photos.
diff --git a/src/photos-search-type-manager.h b/src/photos-search-type-manager.h
index 0b0dc41..5c2a88a 100644
--- a/src/photos-search-type-manager.h
+++ b/src/photos-search-type-manager.h
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -68,7 +68,7 @@ struct _PhotosSearchTypeManagerClass
 
 GType                     photos_search_type_manager_get_type           (void) G_GNUC_CONST;
 
-PhotosBaseManager        *photos_search_type_manager_dup_singleton      (void);
+PhotosBaseManager        *photos_search_type_manager_new                (void);
 
 G_END_DECLS
 
diff --git a/src/photos-set-collection-job.c b/src/photos-set-collection-job.c
index 3c5f222..ec698d2 100644
--- a/src/photos-set-collection-job.c
+++ b/src/photos-set-collection-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,11 +25,13 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <tracker-sparql.h>
 
 #include "photos-query.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-selection-controller.h"
 #include "photos-set-collection-job.h"
 #include "photos-tracker-queue.h"
@@ -212,8 +214,10 @@ photos_set_collection_job_run (PhotosSetCollectionJob *self,
                                gpointer user_data)
 {
   PhotosSetCollectionJobPrivate *priv = self->priv;
+  GApplication *app;
   GList *l;
   GList *urns;
+  PhotosSearchContextState *state;
 
   if (G_UNLIKELY (priv->queue == NULL))
     {
@@ -225,6 +229,9 @@ photos_set_collection_job_run (PhotosSetCollectionJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   urns = photos_selection_controller_get_selection (priv->sel_cntrlr);
   for (l = urns; l != NULL; l = l->next)
     {
@@ -235,7 +242,7 @@ photos_set_collection_job_run (PhotosSetCollectionJob *self,
         continue;
 
       priv->running_jobs++;
-      query = photos_query_builder_set_collection_query (urn, priv->collection_urn, priv->setting);
+      query = photos_query_builder_set_collection_query (state, urn, priv->collection_urn, priv->setting);
       photos_tracker_queue_update (priv->queue,
                                    query->sparql,
                                    NULL,
diff --git a/src/photos-single-item-job.c b/src/photos-single-item-job.c
index b74339b..7434c71 100644
--- a/src/photos-single-item-job.c
+++ b/src/photos-single-item-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012 Red Hat, Inc.
+ * Copyright © 2012, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -201,6 +201,7 @@ photos_single_item_job_new (const gchar *urn)
 
 void
 photos_single_item_job_run (PhotosSingleItemJob *self,
+                            PhotosSearchContextState *state,
                             gint flags,
                             PhotosSingleItemJobCallback callback,
                             gpointer user_data)
@@ -218,7 +219,7 @@ photos_single_item_job_run (PhotosSingleItemJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
-  query = photos_query_builder_single_query (flags, priv->urn);
+  query = photos_query_builder_single_query (state, flags, priv->urn);
   photos_tracker_queue_select (priv->queue,
                                query->sparql,
                                NULL,
diff --git a/src/photos-single-item-job.h b/src/photos-single-item-job.h
index 24e5c6b..fdad9d0 100644
--- a/src/photos-single-item-job.h
+++ b/src/photos-single-item-job.h
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012 Red Hat, Inc.
+ * Copyright © 2012, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -28,6 +28,8 @@
 #include <gio/gio.h>
 #include <tracker-sparql.h>
 
+#include "photos-search-context.h"
+
 G_BEGIN_DECLS
 
 #define PHOTOS_TYPE_SINGLE_ITEM_JOB (photos_single_item_job_get_type ())
@@ -74,6 +76,7 @@ GType                  photos_single_item_job_get_type             (void) G_GNUC
 PhotosSingleItemJob   *photos_single_item_job_new                  (const gchar *urn);
 
 void                   photos_single_item_job_run                  (PhotosSingleItemJob *self,
+                                                                    PhotosSearchContextState *state,
                                                                     gint flags,
                                                                     PhotosSingleItemJobCallback callback,
                                                                     gpointer user_data);
diff --git a/src/photos-source-manager.c b/src/photos-source-manager.c
index 6ca8d7b..54bbc66 100644
--- a/src/photos-source-manager.c
+++ b/src/photos-source-manager.c
@@ -107,26 +107,6 @@ photos_source_manager_refresh_accounts (PhotosSourceManager *self)
 }
 
 
-static GObject *
-photos_source_manager_constructor (GType                  type,
-                                   guint                  n_construct_params,
-                                   GObjectConstructParam *construct_params)
-{
-  static GObject *self = NULL;
-
-  if (self == NULL)
-    {
-      self = G_OBJECT_CLASS (photos_source_manager_parent_class)->constructor (type,
-                                                                               n_construct_params,
-                                                                               construct_params);
-      g_object_add_weak_pointer (self, (gpointer) &self);
-      return self;
-    }
-
-  return g_object_ref (self);
-}
-
-
 static void
 photos_source_manager_dispose (GObject *object)
 {
@@ -183,14 +163,13 @@ photos_source_manager_class_init (PhotosSourceManagerClass *class)
   GObjectClass *object_class = G_OBJECT_CLASS (class);
   PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
-  object_class->constructor = photos_source_manager_constructor;
   object_class->dispose = photos_source_manager_dispose;
   base_manager_class->get_filter = photos_source_manager_get_filter;
 }
 
 
 PhotosBaseManager *
-photos_source_manager_dup_singleton (void)
+photos_source_manager_new (void)
 {
   return g_object_new (PHOTOS_TYPE_SOURCE_MANAGER, "title", _("Sources"), NULL);
 }
diff --git a/src/photos-source-manager.h b/src/photos-source-manager.h
index 4dff9ac..e764ee8 100644
--- a/src/photos-source-manager.h
+++ b/src/photos-source-manager.h
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2012, 2013 Red Hat, Inc.
+ * Copyright © 2012, 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -68,7 +68,7 @@ struct _PhotosSourceManagerClass
 
 GType                     photos_source_manager_get_type           (void) G_GNUC_CONST;
 
-PhotosBaseManager        *photos_source_manager_dup_singleton      (void);
+PhotosBaseManager        *photos_source_manager_new                (void);
 
 GList                    *photos_source_manager_get_for_provider_type (PhotosSourceManager *self,
                                                                        const gchar *provider_type);
diff --git a/src/photos-tracker-collections-controller.c b/src/photos-tracker-collections-controller.c
index 120f45f..2776501 100644
--- a/src/photos-tracker-collections-controller.c
+++ b/src/photos-tracker-collections-controller.c
@@ -21,10 +21,13 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-collections-controller.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-collections-controller.h"
 
 
@@ -67,7 +70,9 @@ photos_tracker_collections_controller_get_query (PhotosTrackerController *trk_cn
 {
   PhotosTrackerCollectionsController *self = PHOTOS_TRACKER_COLLECTIONS_CONTROLLER (trk_cntrlr);
   PhotosTrackerCollectionsControllerPrivate *priv = self->priv;
+  GApplication *app;
   GObject *collection;
+  PhotosSearchContextState *state;
   gint flags;
 
   collection = photos_base_manager_get_active_object (priv->col_mngr);
@@ -76,7 +81,10 @@ photos_tracker_collections_controller_get_query (PhotosTrackerController *trk_cn
   else
     flags = PHOTOS_QUERY_FLAGS_COLLECTIONS;
 
-  return photos_query_builder_global_query (flags, priv->offset_cntrlr);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_global_query (state, flags, priv->offset_cntrlr);
 }
 
 
@@ -118,11 +126,16 @@ static void
 photos_tracker_collections_controller_init (PhotosTrackerCollectionsController *self)
 {
   PhotosTrackerCollectionsControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_tracker_collections_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->col_mngr = g_object_ref (state->col_mngr);
   g_signal_connect_swapped (priv->col_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_collections_controller_col_active_changed),
diff --git a/src/photos-tracker-controller.c b/src/photos-tracker-controller.c
index f13a713..ced4a70 100644
--- a/src/photos-tracker-controller.c
+++ b/src/photos-tracker-controller.c
@@ -28,13 +28,16 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-enums.h"
 #include "photos-filterable.h"
 #include "photos-item-manager.h"
 #include "photos-marshalers.h"
 #include "photos-mode-controller.h"
 #include "photos-query-builder.h"
-#include "photos-source-manager.h"
+#include "photos-search-context.h"
 #include "photos-tracker-controller.h"
 #include "photos-tracker-queue.h"
 
@@ -371,14 +374,19 @@ static void
 photos_tracker_controller_init (PhotosTrackerController *self)
 {
   PhotosTrackerControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_tracker_controller_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   priv->cancellable = g_cancellable_new ();
   priv->item_mngr = photos_item_manager_dup_singleton ();
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_swapped (priv->src_mngr,
                             "object-added",
                             G_CALLBACK (photos_tracker_controller_source_object_added_removed),
diff --git a/src/photos-tracker-favorites-controller.c b/src/photos-tracker-favorites-controller.c
index 24795c1..a3a86cc 100644
--- a/src/photos-tracker-favorites-controller.c
+++ b/src/photos-tracker-favorites-controller.c
@@ -21,10 +21,13 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-favorites-controller.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-favorites-controller.h"
 
 
@@ -67,7 +70,9 @@ photos_tracker_favorites_controller_get_query (PhotosTrackerController *trk_cntr
 {
   PhotosTrackerFavoritesController *self = PHOTOS_TRACKER_FAVORITES_CONTROLLER (trk_cntrlr);
   PhotosTrackerFavoritesControllerPrivate *priv = self->priv;
+  GApplication *app;
   GObject *collection;
+  PhotosSearchContextState *state;
   gint flags;
 
   collection = photos_base_manager_get_active_object (priv->col_mngr);
@@ -76,7 +81,10 @@ photos_tracker_favorites_controller_get_query (PhotosTrackerController *trk_cntr
   else
     flags = PHOTOS_QUERY_FLAGS_FAVORITES;
 
-  return photos_query_builder_global_query (flags, priv->offset_cntrlr);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_global_query (state, flags, priv->offset_cntrlr);
 }
 
 
@@ -118,11 +126,16 @@ static void
 photos_tracker_favorites_controller_init (PhotosTrackerFavoritesController *self)
 {
   PhotosTrackerFavoritesControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_tracker_favorites_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->col_mngr = g_object_ref (state->col_mngr);
   g_signal_connect_swapped (priv->col_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_favorites_controller_col_active_changed),
diff --git a/src/photos-tracker-overview-controller.c b/src/photos-tracker-overview-controller.c
index 3cb7dfe..4a01c5e 100644
--- a/src/photos-tracker-overview-controller.c
+++ b/src/photos-tracker-overview-controller.c
@@ -25,9 +25,12 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
+
 #include "photos-mode-controller.h"
 #include "photos-offset-overview-controller.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-tracker-overview-controller.h"
 
 
@@ -54,7 +57,13 @@ static PhotosQuery *
 photos_tracker_overview_controller_get_query (PhotosTrackerController *trk_cntrlr)
 {
   PhotosTrackerOverviewController *self = PHOTOS_TRACKER_OVERVIEW_CONTROLLER (trk_cntrlr);
-  return photos_query_builder_global_query (PHOTOS_QUERY_FLAGS_OVERVIEW, self->priv->offset_cntrlr);
+  GApplication *app;
+  PhotosSearchContextState *state;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_global_query (state, PHOTOS_QUERY_FLAGS_OVERVIEW, self->priv->offset_cntrlr);
 }
 
 
diff --git a/src/photos-tracker-search-controller.c b/src/photos-tracker-search-controller.c
index c764502..eaa4498 100644
--- a/src/photos-tracker-search-controller.c
+++ b/src/photos-tracker-search-controller.c
@@ -25,14 +25,14 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-mode-controller.h"
 #include "photos-offset-search-controller.h"
 #include "photos-query-builder.h"
+#include "photos-search-context.h"
 #include "photos-search-controller.h"
-#include "photos-search-match-manager.h"
-#include "photos-search-type-manager.h"
-#include "photos-source-manager.h"
 #include "photos-tracker-search-controller.h"
 
 
@@ -78,7 +78,13 @@ static PhotosQuery *
 photos_tracker_search_controller_get_query (PhotosTrackerController *trk_cntrlr)
 {
   PhotosTrackerSearchController *self = PHOTOS_TRACKER_SEARCH_CONTROLLER (trk_cntrlr);
-  return photos_query_builder_global_query (PHOTOS_QUERY_FLAGS_SEARCH, self->priv->offset_cntrlr);
+  GApplication *app;
+  PhotosSearchContextState *state;
+
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  return photos_query_builder_global_query (state, PHOTOS_QUERY_FLAGS_SEARCH, self->priv->offset_cntrlr);
 }
 
 
@@ -137,29 +143,34 @@ static void
 photos_tracker_search_controller_init (PhotosTrackerSearchController *self)
 {
   PhotosTrackerSearchControllerPrivate *priv;
+  GApplication *app;
+  PhotosSearchContextState *state;
 
   self->priv = photos_tracker_search_controller_get_instance_private (self);
   priv = self->priv;
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  priv->col_mngr = g_object_ref (state->col_mngr);
   g_signal_connect_swapped (priv->col_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_search_controller_col_active_changed),
                             self);
 
-  priv->src_mngr = photos_source_manager_dup_singleton ();
+  priv->src_mngr = g_object_ref (state->src_mngr);
   g_signal_connect_swapped (priv->src_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_controller_refresh_for_object),
                             self);
 
-  priv->srch_mtch_mngr = photos_search_match_manager_dup_singleton ();
+  priv->srch_mtch_mngr = g_object_ref (state->srch_mtch_mngr);
   g_signal_connect_swapped (priv->srch_mtch_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_search_controller_search_match_active_changed),
                             self);
 
-  priv->srch_typ_mngr = photos_search_type_manager_dup_singleton ();
+  priv->srch_typ_mngr = g_object_ref (state->srch_typ_mngr);
   g_signal_connect_swapped (priv->srch_typ_mngr,
                             "active-changed",
                             G_CALLBACK (photos_tracker_controller_refresh_for_object),
@@ -168,7 +179,7 @@ photos_tracker_search_controller_init (PhotosTrackerSearchController *self)
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
   priv->offset_cntrlr = photos_offset_search_controller_dup_singleton ();
 
-  priv->srch_cntrlr = photos_search_controller_dup_singleton ();
+  priv->srch_cntrlr = g_object_ref (state->srch_cntrlr);
   g_signal_connect_swapped (priv->srch_cntrlr,
                             "search-string-changed",
                             G_CALLBACK (photos_tracker_controller_refresh_for_object),
diff --git a/src/photos-update-mtime-job.c b/src/photos-update-mtime-job.c
index 7234362..fd9b10f 100644
--- a/src/photos-update-mtime-job.c
+++ b/src/photos-update-mtime-job.c
@@ -1,6 +1,6 @@
 /*
  * Photos - access, organize and share your photos on GNOME
- * Copyright © 2013 Red Hat, Inc.
+ * Copyright © 2013, 2014 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,12 +25,14 @@
 
 #include "config.h"
 
+#include <gio/gio.h>
 #include <glib.h>
 #include <tracker-sparql.h>
 
 #include "photos-query.h"
 #include "photos-query-builder.h"
 #include "photos-update-mtime-job.h"
+#include "photos-search-context.h"
 #include "photos-tracker-queue.h"
 
 
@@ -160,7 +162,9 @@ photos_update_mtime_job_run (PhotosUpdateMtimeJob *self,
                              gpointer user_data)
 {
   PhotosUpdateMtimeJobPrivate *priv = self->priv;
+  GApplication *app;
   PhotosQuery *query;
+  PhotosSearchContextState *state;
 
   if (G_UNLIKELY (priv->queue == NULL))
     {
@@ -172,7 +176,10 @@ photos_update_mtime_job_run (PhotosUpdateMtimeJob *self,
   priv->callback = callback;
   priv->user_data = user_data;
 
-  query = photos_query_builder_update_mtime_query (priv->urn);
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
+  query = photos_query_builder_update_mtime_query (state, priv->urn);
   photos_tracker_queue_update (priv->queue,
                                query->sparql,
                                NULL,
diff --git a/src/photos-view-model.c b/src/photos-view-model.c
index d9ea4cc..3a9575e 100644
--- a/src/photos-view-model.c
+++ b/src/photos-view-model.c
@@ -25,7 +25,9 @@
 
 #include "config.h"
 
-#include "photos-collection-manager.h"
+#include <gio/gio.h>
+
+#include "photos-base-manager.h"
 #include "photos-enums.h"
 #include "photos-filterable.h"
 #include "photos-item-manager.h"
@@ -34,6 +36,7 @@
 #include "photos-offset-favorites-controller.h"
 #include "photos-offset-overview-controller.h"
 #include "photos-offset-search-controller.h"
+#include "photos-search-context.h"
 #include "photos-tracker-collections-controller.h"
 #include "photos-tracker-favorites-controller.h"
 #include "photos-tracker-overview-controller.h"
@@ -417,6 +420,7 @@ static void
 photos_view_model_init (PhotosViewModel *self)
 {
   PhotosViewModelPrivate *priv;
+  GApplication *app;
   GType columns[] = {G_TYPE_STRING,    /* URN */
                      G_TYPE_STRING,    /* URI */
                      G_TYPE_STRING,    /* NAME */
@@ -425,14 +429,18 @@ photos_view_model_init (PhotosViewModel *self)
                      G_TYPE_INT64,     /* MTIME */
                      G_TYPE_BOOLEAN,   /* STATE */
                      G_TYPE_UINT};     /* PULSE (unused) */
+  PhotosSearchContextState *state;
 
   self->priv = photos_view_model_get_instance_private (self);
   priv = self->priv;
 
+  app = g_application_get_default ();
+  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));
+
   gtk_list_store_set_column_types (GTK_LIST_STORE (self), sizeof (columns) / sizeof (columns[0]), columns);
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self), PHOTOS_VIEW_MODEL_MTIME, 
GTK_SORT_DESCENDING);
 
-  priv->col_mngr = photos_collection_manager_dup_singleton ();
+  priv->col_mngr = g_object_ref (state->col_mngr);
   priv->item_mngr = photos_item_manager_dup_singleton ();
   priv->mode_cntrlr = photos_mode_controller_dup_singleton ();
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]