[PackageKit-commit] packagekit: Branch 'master' - 35 commits

Richard Hughes hughsient at kemper.freedesktop.org
Mon Apr 12 11:40:55 PDT 2010


 RELEASE                                      |    6 
 backends/box/pk-backend-box.c                |  228 ++--
 backends/opkg/pk-backend-opkg.c              |  130 +-
 backends/yum/Makefile.am                     |   32 
 backends/yum/libzif/zif-md-comps.c           |  960 ++++++++++++++++++++
 backends/yum/libzif/zif-md-comps.h           |   78 +
 backends/yum/libzif/zif-md-filelists.c       |  450 +++++++++
 backends/yum/libzif/zif-md-filelists.h       |   68 +
 backends/yum/libzif/zif-md-metalink.c        |  504 ++++++++++
 backends/yum/libzif/zif-md-metalink.h        |   68 +
 backends/yum/libzif/zif-md-mirrorlist.c      |  347 +++++++
 backends/yum/libzif/zif-md-mirrorlist.h      |   67 +
 backends/yum/libzif/zif-md-primary-sql.c     |  668 ++++++++++++++
 backends/yum/libzif/zif-md-primary-sql.h     |   64 +
 backends/yum/libzif/zif-md-primary-xml.c     |  890 +++++++++++++++++++
 backends/yum/libzif/zif-md-primary-xml.h     |   64 +
 backends/yum/libzif/zif-md-updateinfo.c      |  763 ++++++++++++++++
 backends/yum/libzif/zif-md-updateinfo.h      |   73 +
 backends/yum/libzif/zif-md.c                 | 1242 +++++++++++++++++++++++++++
 backends/yum/libzif/zif-md.h                 |  237 +++++
 backends/yum/libzif/zif-package.c            |  154 +++
 backends/yum/libzif/zif-package.h            |    7 
 backends/yum/libzif/zif-repo-md-comps.c      |  977 ---------------------
 backends/yum/libzif/zif-repo-md-comps.h      |   78 -
 backends/yum/libzif/zif-repo-md-filelists.c  |  449 ---------
 backends/yum/libzif/zif-repo-md-filelists.h  |   68 -
 backends/yum/libzif/zif-repo-md-metalink.c   |  503 ----------
 backends/yum/libzif/zif-repo-md-metalink.h   |   68 -
 backends/yum/libzif/zif-repo-md-mirrorlist.c |  347 -------
 backends/yum/libzif/zif-repo-md-mirrorlist.h |   67 -
 backends/yum/libzif/zif-repo-md-primary.c    |  749 ----------------
 backends/yum/libzif/zif-repo-md-primary.h    |  113 --
 backends/yum/libzif/zif-repo-md.c            |  931 --------------------
 backends/yum/libzif/zif-repo-md.h            |  149 ---
 backends/yum/libzif/zif-self-test.c          |   23 
 backends/yum/libzif/zif-store-array.c        |    6 
 backends/yum/libzif/zif-store-array.h        |    1 
 backends/yum/libzif/zif-store-remote.c       |  462 +++++-----
 backends/yum/libzif/zif-store-remote.h       |    6 
 backends/yum/libzif/zif-store.c              |    7 
 backends/yum/libzif/zif-store.h              |    2 
 backends/yum/libzif/zif-update-info.c        |  345 +++++++
 backends/yum/libzif/zif-update-info.h        |   86 +
 backends/yum/libzif/zif-update.c             |  539 +++++++++++
 backends/yum/libzif/zif-update.h             |   96 ++
 backends/yum/pk-backend-yum.c                |  218 ++++
 backends/yum/yumBackend.py                   |  184 +++-
 client/pk-console.c                          |   21 
 client/pk-generate-pack.c                    |    6 
 client/pkcon.xml                             |    8 
 configure.ac                                 |    8 
 contrib/PackageKit.spec.in                   |   13 
 lib/packagekit-glib2/pk-control-sync.c       |   55 +
 lib/packagekit-glib2/pk-control-sync.h       |    6 
 lib/packagekit-glib2/pk-enum.c               |    1 
 lib/packagekit-glib2/pk-enum.h               |    1 
 lib/packagekit-glib2/pk-package-sack.h       |    2 
 lib/packagekit-glib2/pk-package.c            |   86 +
 lib/packagekit-glib2/pk-package.h            |   14 
 lib/packagekit-glib2/pk-progress.h           |    2 
 lib/packagekit-glib2/pk-results.h            |    2 
 lib/packagekit-glib2/pk-task.c               |    1 
 lib/packagekit-glib2/pk-task.h               |    2 
 po/es.po                                     |  763 +++++++++-------
 po/nl.po                                     |  471 +++++-----
 po/pl.po                                     |  466 +++++-----
 po/sr.po                                     |  277 +++---
 po/sr at latin.po                               |  277 +++---
 po/uk.po                                     |  463 +++++-----
 src/pk-backend-spawn.c                       |    2 
 src/pk-backend.c                             |  129 +-
 src/pk-backend.h                             |    3 
 src/pk-engine.c                              |   93 +-
 src/pk-spawn.c                               |   16 
 src/pk-transaction-extra.c                   |    2 
 src/pk-transaction.c                         |   50 +
 76 files changed, 10479 insertions(+), 6335 deletions(-)

New commits:
commit dcabf9a81c15fc7d590567f8aec1645f0f537620
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Apr 11 08:36:15 2010 +0100

    Send a message when other updates are held back so we can add a note to the GUI tool

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 9ccbeff..c85b915 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -2555,6 +2555,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             infra_packages = ['PackageKit', 'yum', 'rpm']
             if pkg.name in infra_packages or pkg.name.partition('-')[0] in infra_packages:
                 infra_pkgs.append(pkg)
+        if len(infra_pkgs) > len(pkgs):
+            self.message(MESSAGE_OTHER_UPDATES_HELD_BACK, "Infrastructure packages take priority")
         if len(infra_pkgs) > 0:
             msg = []
             for pkg in infra_pkgs:
diff --git a/lib/packagekit-glib2/pk-enum.c b/lib/packagekit-glib2/pk-enum.c
index 9d0e678..488eb65 100644
--- a/lib/packagekit-glib2/pk-enum.c
+++ b/lib/packagekit-glib2/pk-enum.c
@@ -225,6 +225,7 @@ static const PkEnumMatch enum_message[] = {
 	{PK_MESSAGE_ENUM_AUTOREMOVE_IGNORED, "autoremove-ignored"},
 	{PK_MESSAGE_ENUM_REPO_METADATA_DOWNLOAD_FAILED, "repo-metadata-download-failed"},
 	{PK_MESSAGE_ENUM_REPO_FOR_DEVELOPERS_ONLY, "repo-for-developers-only"},
+	{PK_MESSAGE_ENUM_OTHER_UPDATES_HELD_BACK, "other-updates-held-back"},
 	{0, NULL}
 };
 
diff --git a/lib/packagekit-glib2/pk-enum.h b/lib/packagekit-glib2/pk-enum.h
index 72fbea9..96e9974 100644
--- a/lib/packagekit-glib2/pk-enum.h
+++ b/lib/packagekit-glib2/pk-enum.h
@@ -288,6 +288,7 @@ typedef enum {
 	PK_MESSAGE_ENUM_AUTOREMOVE_IGNORED,
 	PK_MESSAGE_ENUM_REPO_METADATA_DOWNLOAD_FAILED,
 	PK_MESSAGE_ENUM_REPO_FOR_DEVELOPERS_ONLY,
+	PK_MESSAGE_ENUM_OTHER_UPDATES_HELD_BACK,
 	PK_MESSAGE_ENUM_LAST
 } PkMessageEnum;
 
commit a08f9b9a999a7339e8a9ddad1385ed794e606b9d
Author: Grzegorz Dabrowski <grzegorz.dabrowski at gmail.com>
Date:   Sun Apr 11 08:55:07 2010 +0200

    ported PackageKit to Haiku - http://www.haiku-os.org/
    - daemon() exists in libbsd.so library
    - there is no setpriority() function
    - pid_t is defined as signed long int
    
    Please review pid_t change. I hope that it compiles on FreeBSD.

diff --git a/configure.ac b/configure.ac
index c681855..1a05a94 100644
--- a/configure.ac
+++ b/configure.ac
@@ -254,6 +254,12 @@ AC_PATH_PROG(GMSGFMT, msgfmt, msgfmt)
 networking_apis="unix"
 
 dnl ---------------------------------------------------------------------------
+dnl - Haiku compatibility
+dnl ---------------------------------------------------------------------------
+AC_SEARCH_LIBS([daemon], [bsd])
+AC_CHECK_FUNCS(setpriority)
+
+dnl ---------------------------------------------------------------------------
 dnl - NetworkManager (default enabled)
 dnl ---------------------------------------------------------------------------
 AC_ARG_ENABLE(networkmanager, AS_HELP_STRING([--disable-networkmanager],[Disable NetworkManager support]),
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 568377a..8a11eec 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -59,7 +59,7 @@ static void     pk_spawn_finalize	(GObject       *object);
 
 struct PkSpawnPrivate
 {
-	gint			 child_pid;
+	pid_t			 child_pid;
 	gint			 stdin_fd;
 	gint			 stdout_fd;
 	gint			 stderr_fd;
@@ -205,12 +205,12 @@ pk_spawn_check_child (PkSpawn *spawn)
 
 	/* Only print one in twenty times to avoid filling the screen */
 	if (limit_printing++ % 20 == 0)
-		egg_debug ("polling child_pid=%i (1/20)", spawn->priv->child_pid);
+		egg_debug ("polling child_pid=%ld (1/20)", (long)spawn->priv->child_pid);
 
 	/* check if the child exited */
 	pid = waitpid (spawn->priv->child_pid, &status, WNOHANG);
 	if (pid == -1) {
-		egg_warning ("failed to get the child PID data for %i", spawn->priv->child_pid);
+		egg_warning ("failed to get the child PID data for %ld", (long)spawn->priv->child_pid);
 		return TRUE;
 	}
 	if (pid == 0) {
@@ -218,8 +218,8 @@ pk_spawn_check_child (PkSpawn *spawn)
 		return TRUE;
 	}
 	if (pid != spawn->priv->child_pid) {
-		egg_warning ("some other process id was returned: got %i and wanted %i",
-			     pid, spawn->priv->child_pid);
+		egg_warning ("some other process id was returned: got %ld and wanted %ld",
+			     (long)pid, (long)spawn->priv->child_pid);
 		return TRUE;
 	}
 
@@ -310,7 +310,7 @@ pk_spawn_sigkill_cb (PkSpawn *spawn)
 	/* set this in case the script catches the signal and exits properly */
 	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_SIGKILL;
 
-	egg_debug ("sending SIGKILL %i", spawn->priv->child_pid);
+	egg_debug ("sending SIGKILL %ld", (long)spawn->priv->child_pid);
 	retval = kill (spawn->priv->child_pid, SIGKILL);
 	if (retval == EINVAL) {
 		egg_warning ("The signum argument is an invalid or unsupported number");
@@ -367,7 +367,7 @@ pk_spawn_kill (PkSpawn *spawn)
 	/* set this in case the script catches the signal and exits properly */
 	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_SIGQUIT;
 
-	egg_debug ("sending SIGQUIT %i", spawn->priv->child_pid);
+	egg_debug ("sending SIGQUIT %ld", (long)spawn->priv->child_pid);
 	retval = kill (spawn->priv->child_pid, SIGQUIT);
 	if (retval == EINVAL) {
 		egg_warning ("The signum argument is an invalid or unsupported number");
@@ -566,11 +566,13 @@ pk_spawn_argv (PkSpawn *spawn, gchar **argv, gchar **envp)
 	nice_value = pk_conf_get_int (spawn->priv->conf, key);
 	nice_value = CLAMP(nice_value, -20, 19);
 
+#if HAVE_SETPRIORITY
 	/* don't completely bog the system down */
 	if (nice_value != 0) {
 		egg_debug ("renice to %i", nice_value);
 		setpriority (PRIO_PROCESS, spawn->priv->child_pid, nice_value);
 	}
+#endif
 
 	/* perhaps set idle IO priority */
 	key = "BackendSpawnIdleIO";
commit 448d8868aeaa08b33e0ab0180a1971893d5f3a3c
Author: Koen Kooi <koen at openembedded.org>
Date:   Sat Apr 10 22:17:22 2010 +0200

    opkg: include stdio.h before opkg.h to make newer gcc happy

diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
index d06eab2..be30ad1 100644
--- a/backends/opkg/pk-backend-opkg.c
+++ b/backends/opkg/pk-backend-opkg.c
@@ -27,6 +27,7 @@
 #include <pk-backend.h>
 #include <egg-debug.h>
 
+#include <stdio.h>
 #include <libopkg/opkg.h>
 
 enum {
commit 1d18e85e5302c92ceae56c58dc4a3b81dc56eb30
Author: Koen Kooi <koen at openembedded.org>
Date:   Sat Apr 10 22:16:00 2010 +0200

    Fix opkg backend

diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
index 46e366d..d06eab2 100644
--- a/backends/opkg/pk-backend-opkg.c
+++ b/backends/opkg/pk-backend-opkg.c
@@ -29,8 +29,6 @@
 
 #include <libopkg/opkg.h>
 
-static opkg_t *opkg;
-
 enum {
 	SEARCH_NAME,
 	SEARCH_DESCRIPTION,
@@ -62,7 +60,7 @@ opkg_unknown_error (PkBackend *backend, gint error_code, const gchar *failed_cmd
  * check an opkg package for known GUI dependancies
  */
 static gboolean
-opkg_is_gui_pkg (opkg_package_t *pkg)
+opkg_is_gui_pkg (pkg_t *pkg)
 {
 
   /* TODO: check appropriate tag */
@@ -84,7 +82,7 @@ opkg_is_gui_pkg (opkg_package_t *pkg)
  * check an opkg package to determine if it is a development package
  */
 static gboolean
-opkg_is_devel_pkg (opkg_package_t *pkg)
+opkg_is_devel_pkg (pkg_t *pkg)
 {
   if (g_strrstr (pkg->name, "-dev"))
       return TRUE;
@@ -105,7 +103,7 @@ opkg_is_devel_pkg (opkg_package_t *pkg)
  * returns true if the tag is present
  */
 static gboolean 
-opkg_check_tag (opkg_package_t *pkg, const gchar *tag)
+opkg_check_tag (pkg_t *pkg, const gchar *tag)
 {
 	if (pkg->tags && tag)
 		return (g_strrstr (pkg->tags, tag) != NULL);
@@ -118,7 +116,7 @@ handle_install_error (PkBackend *backend, int err)
 {
 	switch (err)
 	{
-	case OPKG_NO_ERROR:
+/*	case OPKG_NO_ERROR:
 		break;
 	case OPKG_PACKAGE_NOT_INSTALLED:
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
@@ -140,7 +138,7 @@ handle_install_error (PkBackend *backend, int err)
 		break;
 	case OPKG_PACKAGE_NOT_AVAILABLE:
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL);
-		break;
+		break;*/
 	default:
 		opkg_unknown_error (backend, err, "Update package");
 	}
@@ -152,7 +150,7 @@ handle_install_error (PkBackend *backend, int err)
 static void
 backend_initialize (PkBackend *backend)
 {
-	opkg = opkg_new ();
+	int opkg = opkg_new ();
 
 	if (!opkg) {
 		pk_backend_error_code (backend,
@@ -162,8 +160,8 @@ backend_initialize (PkBackend *backend)
 	}
 
 #ifdef OPKG_OFFLINE_ROOT
-	opkg_set_option (opkg, (char *) "offline_root", OPKG_OFFLINE_ROOT);
-	opkg_re_read_config_files (opkg);
+	opkg_set_option ((char *) "offline_root", OPKG_OFFLINE_ROOT);
+	opkg_re_read_config_files ();
 #endif
 
 }
@@ -174,22 +172,22 @@ backend_initialize (PkBackend *backend)
 static void
 backend_destroy (PkBackend *backend)
 {
-	opkg_free (opkg);
+	opkg_free ();
 }
 
 
 static void
-pk_opkg_progress_cb (opkg_t *_opkg, const opkg_progress_data_t *pdata, void *data)
+pk_opkg_progress_cb (const opkg_progress_data_t *pdata, void *data)
 {
-	PkBackend *backend = PK_BACKEND (data);
+	PkBackend *backend = (PkBackend*) data;
 	if (!backend)
 		return;
 
 	pk_backend_set_percentage (backend, pdata->percentage);
-	if (pdata->package)
+	if (pdata->pkg)
 	{
 		gchar *uid;
-		opkg_package_t *pkg = pdata->package;
+		pkg_t *pkg = pdata->pkg;
 		gint status = PK_INFO_ENUM_UNKNOWN;
 
 		uid = g_strdup_printf ("%s;%s;%s;",
@@ -225,12 +223,12 @@ backend_refresh_cache_thread (PkBackend *backend)
 {
 	int ret;
 
-	ret = opkg_update_package_lists (opkg, pk_opkg_progress_cb, backend);
+	ret = opkg_update_package_lists (pk_opkg_progress_cb, backend);
 
 	if (ret) {
-		if (ret == OPKG_DOWNLOAD_FAILED)
-			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_AVAILABLE, NULL);
-		else
+//		if (ret == OPKG_DOWNLOAD_FAILED)
+//			pk_backend_error_code (backend, PK_ERROR_ENUM_REPO_NOT_AVAILABLE, NULL);
+//		else
 			opkg_unknown_error (backend, ret, "Refreshing cache");
 	}
 	pk_backend_finished (backend);
@@ -256,7 +254,7 @@ backend_refresh_cache (PkBackend *backend, gboolean force)
  */
 
 static void
-pk_opkg_package_list_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
+pk_opkg_package_list_cb (pkg_t *pkg, void *data)
 {
 	SearchParams *params = (SearchParams*) data;
 	gchar *uid;
@@ -298,7 +296,7 @@ pk_opkg_package_list_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
 	uid = g_strdup_printf ("%s;%s;%s;",
 		pkg->name, pkg->version, pkg->architecture);
 
-	if (pkg->installed)
+	if (pkg->state_status == SS_INSTALLED)
 		status = PK_INFO_ENUM_INSTALLED;
 	else
 		status = PK_INFO_ENUM_AVAILABLE;
@@ -318,10 +316,10 @@ pk_opkg_package_list_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
                 opkg_is_gui_pkg (pkg))
 		goto end_handle;
 	if (pk_bitfield_contain(filters, PK_FILTER_ENUM_INSTALLED) && 
-                (!pkg->installed))
+                (pkg->state_status != SS_INSTALLED))
 		goto end_handle;
 	if (pk_bitfield_contain(filters, PK_FILTER_ENUM_NOT_INSTALLED) && 
-                (pkg->installed))
+                (pkg->state_status == SS_INSTALLED))
 		goto end_handle;
 
 	pk_backend_package (params->backend, status, uid, pkg->description);
@@ -338,7 +336,7 @@ backend_search_thread (PkBackend *backend)
 
 	params = pk_backend_get_pointer (backend, "search-params");
 
-	opkg_list_packages (opkg, pk_opkg_package_list_cb, params);
+	opkg_list_packages (pk_opkg_package_list_cb, params);
 
 	pk_backend_finished (params->backend);
 
@@ -349,7 +347,7 @@ backend_search_thread (PkBackend *backend)
 }
 
 static void
-backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_name (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -360,7 +358,7 @@ backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_NAME;
-	params->needle = g_utf8_strdown (search, -1);
+	params->needle = g_utf8_strdown (search[0], -1);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -371,7 +369,7 @@ backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search
  * backend_search_description:
  */
 static void
-backend_search_description (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_description (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -382,7 +380,7 @@ backend_search_description (PkBackend *backend, PkBitfield filters, const gchar
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_DESCRIPTION;
-	params->needle = g_utf8_strdown (search, -1);
+	params->needle = g_utf8_strdown (search[0], -1);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -390,7 +388,7 @@ backend_search_description (PkBackend *backend, PkBitfield filters, const gchar
 }
 
 static void
-backend_search_group (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_group (PkBackend *backend, PkBitfield filters, gchar **search)
 {
 	SearchParams *params;
 
@@ -401,7 +399,7 @@ backend_search_group (PkBackend *backend, PkBitfield filters, const gchar *searc
 	params = g_new0 (SearchParams, 1);
 	params->filters = filters;
 	params->search_type = SEARCH_TAG;
-	params->needle = g_strdup_printf ("group::%s", search);
+	params->needle = g_strdup_printf ("group::%s", search[0]);
 	params->backend = backend;
 
 	pk_backend_set_pointer (backend, "search-params", params);
@@ -412,9 +410,9 @@ backend_search_group (PkBackend *backend, PkBitfield filters, const gchar *searc
 static gboolean
 backend_install_packages_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gint err, i;
 	gchar **package_ids;
+	gchar **parts;
 
 	package_ids = pk_backend_get_strv (backend, "pkids");
 
@@ -424,13 +422,13 @@ backend_install_packages_thread (PkBackend *backend)
 	{
 		pk_backend_package (backend, PK_INFO_ENUM_INSTALLING, package_ids[i], NULL);
 
-		pi = pk_package_id_new_from_string (package_ids[i]);
+		parts = pk_package_id_split (package_ids[i]);
 
-		err = opkg_install_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+		err = opkg_install_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 		if (err)
 			handle_install_error (backend, err);
 
-		pk_package_id_free (pi);
+		g_strfreev (parts);
 		if (err != 0)
 			break;
 	}
@@ -453,9 +451,9 @@ backend_install_packages (PkBackend *backend, gboolean only_trusted, gchar **pac
 static gboolean
 backend_remove_packages_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gint err, i;
 	gchar **package_ids;
+	gchar **parts;
 	gboolean allow_deps;
 	gboolean autoremove;
 	gpointer *data;
@@ -467,29 +465,30 @@ backend_remove_packages_thread (PkBackend *backend)
 	autoremove = GPOINTER_TO_INT (data[2]);
 	g_free (data);
 
-	opkg_set_option (opkg, (char *)"autoremove", &autoremove);
-	opkg_set_option (opkg, (char *)"force_removal_of_dependent_packages", &allow_deps);
+	opkg_set_option ((char *)"autoremove", &autoremove);
+	opkg_set_option ((char *)"force_removal_of_dependent_packages", &allow_deps);
 
 	err = 0;
 
 	for (i = 0; package_ids[i]; i++)
 	{
-		pi = pk_package_id_new_from_string (package_ids[i]);
 		pk_backend_package (backend, PK_INFO_ENUM_REMOVING, package_ids[i], NULL);
 
-		err = opkg_remove_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+		parts = pk_package_id_split (package_ids[i]);
+
+		err = opkg_remove_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 
 		switch (err)
 		{
-		case OPKG_NO_ERROR:
-			break;
-		case OPKG_PACKAGE_NOT_INSTALLED:
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
-			break;
+		//case OPKG_NO_ERROR:
+		//	break;
+		//case OPKG_PACKAGE_NOT_INSTALLED:
+		//	pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, NULL);
+		//	break;
 		default:
 			opkg_unknown_error (backend, err, "Remove");
 		}
-		pk_package_id_free (pi);
+		g_strfreev (parts);
 
 		if (err != 0)
 			break;
@@ -540,7 +539,7 @@ backend_update_system_thread (PkBackend *backend)
 	gint err;
 
 	/* FIXME: support only_trusted */
-	err = opkg_upgrade_all (opkg, pk_opkg_progress_cb, backend);
+	err = opkg_upgrade_all (pk_opkg_progress_cb, backend);
 
 	if (err)
 		opkg_unknown_error (backend, err, "Upgrading system");
@@ -564,29 +563,28 @@ backend_update_system (PkBackend *backend, gboolean only_trusted)
 static gboolean
 backend_update_package_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
+        gchar **parts;
 	gint err = 0;
 	const gchar *package_id;
 
 	/* FIXME: support only_trusted */
 	package_id = pk_backend_get_string (backend, "pkgid");
-	pi = pk_package_id_new_from_string (package_id);
+	parts = pk_package_id_split (package_id);
 
-	if (!pi->name || !pi->version)
+	if (!parts)
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND,
 				"Package not found");
-		pk_package_id_free (pi);
 		pk_backend_finished (backend);
 		return FALSE;
 	}
 
-	err = opkg_upgrade_package (opkg, pi->name, pk_opkg_progress_cb, backend);
+	err = opkg_upgrade_package (parts[PK_PACKAGE_ID_NAME], pk_opkg_progress_cb, backend);
 	if (err)
 		handle_install_error (backend, err);
 
 
-	pk_package_id_free (pi);
+	g_strfreev (parts);
 	pk_backend_finished (backend);
 	return (err != 0);
 }
@@ -610,13 +608,13 @@ backend_update_packages (PkBackend *backend, gboolean only_trusted, gchar **pack
  */
 
 static void
-pk_opkg_list_upgradable_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
+pk_opkg_list_upgradable_cb (pkg_t *pkg, void *data)
 {
-	PkBackend *backend = PK_BACKEND (data);
+	PkBackend *backend = (PkBackend*) data;
 	gchar *uid;
 	gint status;
 
-	if (pkg->installed)
+	if (pkg->state_status == SS_INSTALLED)
 		status = PK_INFO_ENUM_INSTALLED;
 	else
 		status = PK_INFO_ENUM_AVAILABLE;
@@ -631,7 +629,7 @@ pk_opkg_list_upgradable_cb (opkg_t *_opkg, opkg_package_t *pkg, void *data)
 static gboolean
 backend_get_updates_thread (PkBackend *backend)
 {
-	opkg_list_upgradable_packages (opkg, pk_opkg_list_upgradable_cb, backend);
+	opkg_list_upgradable_packages (pk_opkg_list_upgradable_cb, backend);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -668,16 +666,18 @@ backend_get_groups (PkBackend *backend)
 static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gchar **package_ids;
+        gchar **parts;
 	int group_index;
 	PkGroupEnum group = 0;
-	opkg_package_t *pkg;
+	pkg_t *pkg;
 	gchar *newid;
 
         package_ids = pk_backend_get_strv(backend, "package_ids");
-	pi = pk_package_id_new_from_string (package_ids[0]);
-	if (pi == NULL)
+	parts = pk_package_id_split (package_ids[0]);
+
+
+	if (!parts)
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_backend_finished (backend);
@@ -685,8 +685,8 @@ backend_get_details_thread (PkBackend *backend)
 	}
 
 
-	pkg = opkg_find_package (opkg, pi->name, pi->version, pi->arch, pi->data);
-	pk_package_id_free (pi);
+	pkg = opkg_find_package (parts[PK_PACKAGE_ID_NAME], parts[PK_PACKAGE_ID_VERSION], parts[PK_PACKAGE_ID_ARCH], parts[PK_PACKAGE_ID_DATA]);
+	g_strfreev (parts);
 
 	if (!pkg)
 	{
@@ -695,7 +695,7 @@ backend_get_details_thread (PkBackend *backend)
 		return FALSE;
 	}
 
-	newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->repository);
+	newid = g_strdup_printf ("%s;%s;%s;%s", pkg->name, pkg->version, pkg->architecture, pkg->src->name);
 
 	if (pkg->tags) {
 		for (group_index = 0; group < PK_GROUP_ENUM_LAST; group_index++) {
@@ -706,9 +706,8 @@ backend_get_details_thread (PkBackend *backend)
 		}
 	}
 
-	pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size);
+	pk_backend_details (backend, newid, NULL, group, pkg->description, NULL, pkg->size);
 	g_free (newid);
-	opkg_package_free(pkg);
 	pk_backend_finished (backend);
 	return TRUE;
 }
commit 29dc9f3cf4342f4f8ae8f5c362da61f753fedbe4
Author: Grzegorz Dabrowski <grzegorz.dabrowski at gmail.com>
Date:   Sat Apr 10 15:29:34 2010 +0200

    updated box backend, now it compiles and works again

diff --git a/backends/box/pk-backend-box.c b/backends/box/pk-backend-box.c
index 9759e69..5d2f507 100644
--- a/backends/box/pk-backend-box.c
+++ b/backends/box/pk-backend-box.c
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  *
- * Copyright (C) 2007 Grzegorz DÄ…browski <gdx at o2.pl>
+ * Copyright (C) 2007 Grzegorz DÄ…browski grzegorz.dabrowski at gmail.com>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -21,8 +21,6 @@
 
 #include <gmodule.h>
 #include <glib.h>
-#include <string.h>
-#include <unistd.h>
 #include <pk-backend.h>
 #include <egg-debug.h>
 
@@ -88,7 +86,7 @@ add_packages_from_list (PkBackend *backend, GList *list, gboolean updates)
 
 	for (li = list; li != NULL; li = li->next) {
 		package = (PackageSearch*)li->data;
-		pkg_string = pk_package_id_build(package->package, package->version, package->arch, package->reponame);
+		pkg_string = pk_package_id_build (package->package, package->version, package->arch, package->reponame);
 		if (updates == TRUE)
 			info = PK_INFO_ENUM_NORMAL;
 		else if (package->installed)
@@ -96,7 +94,7 @@ add_packages_from_list (PkBackend *backend, GList *list, gboolean updates)
 		else
 			info = PK_INFO_ENUM_AVAILABLE;
 		pk_backend_package (backend, info, pkg_string, package->description);
-		g_free(pkg_string);
+		g_free (pkg_string);
 	}
 }
 
@@ -105,14 +103,18 @@ backend_find_packages_thread (PkBackend *backend)
 {
 	PkBitfield filters;
 	const gchar *search;
+	gchar **values;
 	guint mode;
 	GList *list = NULL;
 	sqlite3 *db = NULL;
 	gint filter_box = 0;
 
+
 	filters = pk_backend_get_uint (backend, "filters");
 	mode = pk_backend_get_uint (backend, "mode");
-	search = pk_backend_get_string (backend, "search");
+	values = pk_backend_get_strv (backend, "search");
+	/* FIXME: support multiple packages */
+	search = values[0];
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -140,7 +142,7 @@ backend_find_packages_thread (PkBackend *backend)
 
 	pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
 
-	db = db_open();
+	db = db_open ();
 
 	if (mode == SEARCH_TYPE_FILE) {
 		list = box_db_repos_search_file_with_filter (db, search, filter_box);
@@ -155,21 +157,57 @@ backend_find_packages_thread (PkBackend *backend)
 		     pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) ||
 		    (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED) &&
 		     !pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED))) {
-			list = box_db_repos_packages_search_all(db, (gchar *)search, filter_box);
+			list = box_db_repos_packages_search_all (db, (gchar *)search, filter_box);
 		} else if (pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
-			list = box_db_repos_packages_search_installed(db, (gchar *)search, filter_box);
+			list = box_db_repos_packages_search_installed (db, (gchar *)search, filter_box);
 		} else if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) {
-			list = box_db_repos_packages_search_available(db, (gchar *)search, filter_box);
+			list = box_db_repos_packages_search_available (db, (gchar *)search, filter_box);
 		}
 		add_packages_from_list (backend, list, FALSE);
 		box_db_repos_package_list_free (list);
 	}
 
+	db_close (db);
+	pk_backend_finished (backend);
+	return TRUE;
+}
+
+
+static gboolean
+backend_get_packages_thread (PkBackend *backend)
+{
+	PkBitfield filters;
+	GList *list = NULL;
+	sqlite3 *db = NULL;
+
+	filters = pk_backend_get_uint (backend, "filters");
+
+	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
+
+	pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID);
+
+	db = db_open();
+
+	if ((pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED) &&
+	     pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) ||
+	    (!pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED) &&
+	     !pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED))) {
+		list = box_db_repos_packages_search_all (db, NULL, 0);
+	} else if (pk_bitfield_contain (filters, PK_FILTER_ENUM_INSTALLED)) {
+		list = box_db_repos_packages_search_installed (db, NULL, 0);
+	} else if (pk_bitfield_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED)) {
+		list = box_db_repos_packages_search_available (db, NULL, 0);
+	}
+
+	add_packages_from_list (backend, list, FALSE);
+	box_db_repos_package_list_free (list);
+
 	db_close(db);
 	pk_backend_finished (backend);
 	return TRUE;
 }
 
+
 static gboolean
 backend_get_updates_thread (PkBackend *backend)
 {
@@ -204,22 +242,19 @@ backend_update_system_thread (PkBackend *backend)
 static gboolean
 backend_install_packages_thread (PkBackend *backend)
 {
-	gboolean result;
-	PkPackageId *pi;
+	gboolean result = TRUE;
 	gchar **package_ids;
+	size_t i;
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
 	/* FIXME: support only_trusted */
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
-	if (pi == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_package_id_free (pi);
-		return FALSE;
-	}
-	result = box_package_install(pi->name, ROOT_DIRECTORY, common_progress, backend, FALSE);
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+        for (i = 0; i < g_strv_length (package_ids); i++) {
+		gchar **package_id_data = pk_package_id_split (package_ids[i]);
+		result = box_package_install (package_id_data[PK_PACKAGE_ID_NAME], ROOT_DIRECTORY, common_progress, backend, FALSE);
+        }
 
 	pk_backend_finished (backend);
 
@@ -231,8 +266,7 @@ backend_update_packages_thread (PkBackend *backend)
 {
 	gboolean result = TRUE;
 	gchar **package_ids;
-	PkPackageId *pi;
-	gint i;
+	size_t i;
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	/* FIXME: support only_trusted */
@@ -240,15 +274,7 @@ backend_update_packages_thread (PkBackend *backend)
 
 	for (i = 0; i < g_strv_length (package_ids); i++)
 	{
-		pi = pk_package_id_new_from_string (package_ids[i]);
-		if (pi == NULL) {
-			pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-			pk_package_id_free (pi);
-			g_strfreev (package_ids);
-
-			return FALSE;
-		}
-		result |= box_package_install(pi->name, ROOT_DIRECTORY, common_progress, backend, FALSE);
+		result |= box_package_install (package_ids[i], ROOT_DIRECTORY, common_progress, backend, FALSE);
 	}
 
 	pk_backend_finished (backend);
@@ -264,7 +290,7 @@ backend_install_files_thread (PkBackend *backend)
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
 	full_paths = pk_backend_get_strv (backend, "full_paths");
-	result = box_package_install(full_paths[0], ROOT_DIRECTORY, common_progress, backend, FALSE);
+	result = box_package_install (full_paths[0], ROOT_DIRECTORY, common_progress, backend, FALSE);
 
 	pk_backend_finished (backend);
 
@@ -274,43 +300,35 @@ backend_install_files_thread (PkBackend *backend)
 static gboolean
 backend_get_details_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	PackageSearch *ps;
 	GList *list;
 	sqlite3 *db;
 	gchar **package_ids;
+	gchar **package_id_data;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	db = db_open();
-
-	pi = pk_package_id_new_from_string (package_id);
-	if (pi == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_package_id_free (pi);
-		db_close (db);
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+	/* FIXME: support multiple packages */
+	package_id_data = pk_package_id_split (package_ids[0]);
 
-		return FALSE;
-	}
+	db = db_open ();
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
 	/* only one element is returned */
-	list = box_db_repos_packages_search_by_data(db, pi->name, pi->version);
+	list = box_db_repos_packages_search_by_data (db, package_id_data[PK_PACKAGE_ID_NAME], package_id_data[PK_PACKAGE_ID_VERSION]);
 
 	if (list == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "cannot find package by id");
-		pk_package_id_free (pi);
 		db_close (db);
 		return FALSE;
 	}
 	ps = (PackageSearch*) list->data;
 
-	pk_backend_details (backend, package_id, "unknown", PK_GROUP_ENUM_OTHER, ps->description, "", 0);
+	pk_backend_details (backend, package_ids[0], "unknown", PK_GROUP_ENUM_OTHER, ps->description, "", 0);
 
-	pk_package_id_free (pi);
 	box_db_repos_package_list_free (list);
 
-	db_close(db);
+	db_close (db);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -318,30 +336,22 @@ backend_get_details_thread (PkBackend *backend)
 static gboolean
 backend_get_files_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gchar *files;
 	sqlite3 *db;
 	gchar **package_ids;
+	gchar **package_id_data;
 
 	db = db_open();
-	package_id = pk_backend_get_string (backend, "package_id");
-
-	pi = pk_package_id_new_from_string (package_id);
-	if (pi == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		pk_package_id_free (pi);
-		db_close (db);
-
-		return FALSE;
-	}
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+	/* FIXME: support multiple packages */
+	package_id_data = pk_package_id_split (package_ids[0]);
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
-	files = box_db_repos_get_files_string (db, pi->name, pi->version);
-	pk_backend_files (backend, package_id, files);
+	files = box_db_repos_get_files_string (db, package_id_data[PK_PACKAGE_ID_NAME], package_id_data[PK_PACKAGE_ID_VERSION]);
+	pk_backend_files (backend, package_ids[0], files);
 
-	pk_package_id_free (pi);
-	db_close(db);
+	db_close (db);
 	g_free (files);
 
 	pk_backend_finished (backend);
@@ -351,34 +361,27 @@ backend_get_files_thread (PkBackend *backend)
 static gboolean
 backend_get_depends_requires_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	GList *list = NULL;
 	sqlite3 *db;
 	gchar **package_ids;
 	int deps_type;
+        gchar **package_id_data;
 
 	db = db_open ();
-	package_id = pk_backend_get_string (backend, "package_id");
+	package_ids = pk_backend_get_strv (backend, "package_ids");
 	deps_type = pk_backend_get_uint (backend, "type");
-
-	pi = pk_package_id_new_from_string (package_id);
-	if (pi == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-		db_close (db);
-
-		return FALSE;
-	}
+	/* FIXME: support multiple packages */
+	package_id_data = pk_package_id_split (package_ids[0]);
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
 	if (deps_type == DEPS_TYPE_DEPENDS)
-		list = box_db_repos_get_depends(db, pi->name);
+		list = box_db_repos_get_depends (db, package_id_data[PK_PACKAGE_ID_NAME]);
 	else if (deps_type == DEPS_TYPE_REQUIRES)
-		list = box_db_repos_get_requires(db, pi->name);
+		list = box_db_repos_get_requires (db, package_id_data[PK_PACKAGE_ID_NAME]);
 
 	add_packages_from_list (backend, list, FALSE);
 	box_db_repos_package_list_free (list);
-	pk_package_id_free (pi);
 
 	db_close (db);
 
@@ -389,25 +392,20 @@ backend_get_depends_requires_thread (PkBackend *backend)
 static gboolean
 backend_remove_packages_thread (PkBackend *backend)
 {
-	PkPackageId *pi;
 	gchar **package_ids;
+	gchar **package_id_data;
 
 	package_ids = pk_backend_get_strv (backend, "package_ids");
-	pi = pk_package_id_new_from_string (package_ids[0]);
-	if (pi == NULL) {
-		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
-
-		return FALSE;
-	}
+	/* FIXME: support multiple packages */
+	package_id_data = pk_package_id_split (package_ids[0]);
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE);
 
-	if (!box_package_uninstall (pi->name, ROOT_DIRECTORY, common_progress, backend, FALSE))
+	if (!box_package_uninstall (package_id_data[PK_PACKAGE_ID_NAME], ROOT_DIRECTORY, common_progress, backend, FALSE))
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_DEP_RESOLUTION_FAILED, "Cannot uninstall");
 	}
 
-	pk_package_id_free (pi);
 	pk_backend_finished (backend);
 	return TRUE;
 }
@@ -454,12 +452,24 @@ backend_get_filters (PkBackend *backend)
 }
 
 /**
+ * backend_get_mime_types:
+ */
+static gchar *
+backend_get_mime_types (PkBackend *backend)
+{
+        return g_strdup ("application/x-box-package");
+}
+
+
+/**
  * backend_get_depends:
  */
 static void
 backend_get_depends (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_uint (backend, "type", DEPS_TYPE_DEPENDS);
+	pk_backend_set_strv (backend, "package_ids", package_ids);
+	/* TODO: param recursive */
 	pk_backend_thread_create (backend, backend_get_depends_requires_thread);
 }
 
@@ -469,6 +479,7 @@ backend_get_depends (PkBackend *backend, PkBitfield filters, gchar **package_ids
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
+	pk_backend_set_strv (backend, "package_ids", package_ids);
 	pk_backend_thread_create (backend, backend_get_details_thread);
 }
 
@@ -478,16 +489,29 @@ backend_get_details (PkBackend *backend, gchar **package_ids)
 static void
 backend_get_files (PkBackend *backend, gchar **package_ids)
 {
+	pk_backend_set_strv (backend, "package_ids", package_ids);
 	pk_backend_thread_create (backend, backend_get_files_thread);
 }
 
 /**
+ * backend_get_packages:
+ */
+static void
+backend_get_packages (PkBackend *backend, PkBitfield filters)
+{
+	pk_backend_set_uint (backend, "filters", filters);
+	pk_backend_thread_create (backend, backend_get_packages_thread);
+}
+
+/**
  * backend_get_requires:
  */
 static void
 backend_get_requires (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
 	pk_backend_set_uint (backend, "type", DEPS_TYPE_REQUIRES);
+	pk_backend_set_strv (backend, "package_ids", package_ids);
+	/* TODO: param recursive */
 	pk_backend_thread_create (backend, backend_get_depends_requires_thread);
 }
 
@@ -497,6 +521,7 @@ backend_get_requires (PkBackend *backend, PkBitfield filters, gchar **package_id
 static void
 backend_get_updates (PkBackend *backend, PkBitfield filters)
 {
+	/* TODO: filters */
 	pk_backend_thread_create (backend, backend_get_updates_thread);
 }
 
@@ -512,6 +537,7 @@ backend_install_packages (PkBackend *backend, gboolean only_trusted, gchar **pac
 		pk_backend_finished (backend);
 		return;
 	}
+	pk_backend_set_strv (backend, "package_ids", package_ids);
 
 	pk_backend_thread_create (backend, backend_install_packages_thread);
 }
@@ -520,8 +546,9 @@ backend_install_packages (PkBackend *backend, gboolean only_trusted, gchar **pac
  * backend_install_files:
  */
 static void
-backend_install_files (PkBackend *backend, gboolean only_trusted, gchar **files)
+backend_install_files (PkBackend *backend, gboolean only_trusted, gchar **full_paths)
 {
+	pk_backend_set_strv (backend, "full_paths", full_paths);
 	pk_backend_thread_create (backend, backend_install_files_thread);
 }
 
@@ -537,6 +564,7 @@ backend_refresh_cache (PkBackend *backend, gboolean force)
 		pk_backend_finished (backend);
 		return;
 	}
+	/* FIXME: support force */
 	pk_backend_thread_create (backend, backend_refresh_cache_thread);
 }
 
@@ -544,9 +572,10 @@ backend_refresh_cache (PkBackend *backend, gboolean force)
  * backend_remove_packages:
  */
 static void
-backend_remove_packages (PkBackend *backend, gchar **package_id, gboolean allow_deps, gboolean autoremove)
+backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
 {
 	pk_backend_set_uint (backend, "type", DEPS_ALLOW);
+	pk_backend_set_strv (backend, "package_ids", package_ids);
 	pk_backend_thread_create (backend, backend_remove_packages_thread);
 }
 
@@ -554,9 +583,10 @@ backend_remove_packages (PkBackend *backend, gchar **package_id, gboolean allow_
  * backend_resolve:
  */
 static void
-backend_resolve (PkBackend *backend, PkBitfield filters, const gchar *package)
+backend_resolve (PkBackend *backend, PkBitfield filters, gchar **packages)
 {
 	pk_backend_set_uint (backend, "mode", SEARCH_TYPE_RESOLVE);
+	pk_backend_set_strv (backend, "search", packages);
 	pk_backend_thread_create (backend, backend_find_packages_thread);
 }
 
@@ -564,19 +594,21 @@ backend_resolve (PkBackend *backend, PkBitfield filters, const gchar *package)
  * backend_search_details:
  */
 static void
-backend_search_details (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_details (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	pk_backend_set_uint (backend, "mode", SEARCH_TYPE_DETAILS);
+	pk_backend_set_strv (backend, "search", values);
 	pk_backend_thread_create (backend, backend_find_packages_thread);
 }
 
 /**
- * backend_search_file:
+ * backend_search_files:
  */
 static void
-backend_search_file (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_files (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	pk_backend_set_uint (backend, "mode", SEARCH_TYPE_FILE);
+	pk_backend_set_strv (backend, "search", values);
 	pk_backend_thread_create (backend, backend_find_packages_thread);
 }
 
@@ -584,9 +616,10 @@ backend_search_file (PkBackend *backend, PkBitfield filters, const gchar *search
  * backend_search_name:
  */
 static void
-backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search)
+backend_search_names (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	pk_backend_set_uint (backend, "mode", SEARCH_TYPE_NAME);
+	pk_backend_set_strv (backend, "search", values);
 	pk_backend_thread_create (backend, backend_find_packages_thread);
 }
 
@@ -673,7 +706,7 @@ PK_BACKEND_OPTIONS (
 	NULL,					/* get_groups */
 	backend_get_filters,			/* get_filters */
 	NULL,					/* get_roles */
-	NULL,					/* get_mime_types */
+	backend_get_mime_types,			/* get_mime_types */
 	NULL,					/* cancel */
 	NULL,					/* download_packages */
 	NULL,					/* get_categories */
@@ -681,7 +714,7 @@ PK_BACKEND_OPTIONS (
 	backend_get_details,			/* get_details */
 	NULL,					/* get_distro_upgrades */
 	backend_get_files,			/* get_files */
-	NULL,					/* get_packages */
+	backend_get_packages,			/* get_packages */
 	backend_get_repo_list,			/* get_repo_list */
 	backend_get_requires,			/* get_requires */
 	NULL,					/* get_update_detail */
@@ -696,9 +729,9 @@ PK_BACKEND_OPTIONS (
 	backend_resolve,			/* resolve */
 	NULL,					/* rollback */
 	backend_search_details,			/* search_details */
-	backend_search_file,			/* search_file */
-	NULL,					/* search_group */
-	backend_search_name,			/* search_name */
+	backend_search_files,			/* search_files */
+	NULL,					/* search_groups */
+	backend_search_names,			/* search_names */
 	backend_update_packages,		/* update_packages */
 	backend_update_system,			/* update_system */
 	NULL,					/* what_provides */
@@ -707,4 +740,3 @@ PK_BACKEND_OPTIONS (
 	NULL,					/* simulate_remove_packages */
 	NULL					/* simulate_update_packages */
 );
-
commit 5fb1ec9abea73ec261b978cc72222306bb5d2532
Author: kmilos <kmilos at fedoraproject.org>
Date:   Fri Apr 9 20:45:22 2010 +0000

    l10n: Updates to Serbian (Latin) (sr at latin) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/sr at latin.po b/po/sr at latin.po
index bb9bd90..49b7a5d 100644
--- a/po/sr at latin.po
+++ b/po/sr at latin.po
@@ -11,8 +11,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-16 19:09+0000\n"
-"PO-Revision-Date: 2010-03-16 20:40+0100\n"
+"POT-Creation-Date: 2010-04-07 19:20+0000\n"
+"PO-Revision-Date: 2010-04-07 23:02-0000\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian <trans-sr at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -23,115 +23,115 @@ msgstr ""
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175 ../client/pk-console.c:597
+#: ../client/pk-console.c:176 ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Transakcija"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Sistemsko vreme"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Uspela"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Tačno"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Netačno"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Radnja"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Trajanje"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(sekundi)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Komandna linija"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "Korisnički IB"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Korisničko ime"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "Stvarno ime"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Obuhvaćeni paketi:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Obuhvaćeni paketi: ni jedan"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Distribucija"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Vrsta"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252 ../client/pk-console.c:291
+#: ../client/pk-console.c:253 ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Sažetak"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Kategorija"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "Identifikator"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Roditelj"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Naziv"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Ikona"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Više o nadgradnji:"
 
@@ -140,7 +140,7 @@ msgstr "Više o nadgradnji:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346 ../client/pk-console.c:616
+#: ../client/pk-console.c:347 ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -151,166 +151,166 @@ msgstr[1] "Paketa"
 msgstr[2] "Paketa"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Ažurira"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Prevazilazi"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357 ../lib/packagekit-glib2/pk-task-text.c:211
+#: ../client/pk-console.c:358 ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Izdavač"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Ponovno pokretanje"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Opis ažuriranja"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Promene"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Stanje"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Izdato"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389 ../lib/packagekit-glib2/pk-console-shared.c:511
+#: ../client/pk-console.c:390 ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Datum ažuriranja"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Uključena"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Isključena"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Ponovno pokretanje sistema zahteva paket:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Neophodno je ponovno pokretanje sesije:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Ponovno pokretanje sistema (bezbednosno) zahteva:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Neophodno je ponovno pokretanje sesije (bezbednosno):"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Ponovno pokretanje programa zahteva paket:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Opis paketa"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Poruka:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Nema datoteka"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Spisak datoteka"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Procenat"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Status"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Rezultati:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Kobna greška"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "Transakcija nije uspela"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "Trenutno nema dostupnih ažuriranja."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Trenutno nema dostupnih nadgradnji."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Neophodno je ponovno pokretanje sistema radi završetka ažuriranja."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr ""
 "Neophodno je odjavljivanje i ponovna prijava radi završetka ažuriranja."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
@@ -319,7 +319,7 @@ msgstr ""
 "instalirana važna bezbednosna ažuriranja."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
@@ -328,29 +328,29 @@ msgstr ""
 "su instalirana važna bezbednosna ažuriranja."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid ""
-"Extected package name, actually got file. Try using 'pkcon install-local %s' "
+"Expected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
 "Očekivano je ime paketa, ustvari je dobijena datoteka. Pokušajte da "
 "upotrebite „pkcon install-local %s“ namesto."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Ova alatka nije mogla pronaći nikakve dostupne pakete: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Ova alatka nije mogla pronaći instalirani paket: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915 ../client/pk-console.c:943
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Ova alatka nije mogla pronaći paket: %s"
@@ -359,180 +359,185 @@ msgstr "Ova alatka nije mogla pronaći paket: %s"
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971 ../client/pk-console.c:999
-#: ../client/pk-console.c:1027 ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972 ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028 ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Ova alatka nije pronašla sve pakete: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "Uslužni program se iznenada prekinuo!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Tekstualno sučelje programa PaketKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Naredbe:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr "Datum poslednjeg izvršavanja ove radnje nije pronađen"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263 ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Prikaži verziju programa i završi rad"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Namesti filter, npr. instalirani"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Završi rad bez čekanja da se poslovi završe"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Instaliraj pakete bez pitanja za potvrdu"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Izvrši naredbu koristeći neiskorišćeni mrežni opseg i takođe trošeći manje "
 "energije"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
 "Štampaj izlaz čitljiv mašini na ekranu, umesto upotrebe animiranih vidžeta"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Neuspešno kontaktiranje PaketKita."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "Proksi nije mogao da bude postavljen"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "Navedeni filter nije ispravan"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Morate navesti vrstu pretrage, npr. po imenu"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384 ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408 ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Morate navesti termin za pretragu"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Neispravna vrsta pretrage"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Neophodno je ime paketa za instalaciju"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Neophodno je ime datoteke za instalaciju"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Morate navesti vrstu, IB ključa i IB paketa (key_id i package_id)"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Morate navesti naziv paketa za uklanjanje"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr "Neophodni su odredišni direktorijum i imena paketa za preuzimanje"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Direktorijum nije nađen"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Morete navesti identifikator licence (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Morate navesti identifikator transakcije (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Morate navesti ime paketa za razrešavanje"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536 ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Morate navesti ime riznice"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Morate navesti ime, parametar i vrednost riznice"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Morate navesti radnju, npr. „update-system“ (ažuriranje sistema)"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Morate navesti važeću radnju"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592 ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616 ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645 ../client/pk-generate-pack.c:316
+#: ../client/pk-console.c:1611 ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635 ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Morate navesti ime paketa"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Morate navesti „provide“ niz (šta paket pruža)"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Opcija „%s“ nije podržana"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Naredba nije uspela"
 
@@ -543,11 +548,10 @@ msgstr "Postavite ime datoteke za međuzavisnosti koje će biti izostavljene"
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
+msgid "The output file or directory (the current directory is used if omitted)"
 msgstr ""
-"Direktorijum za izlaznu datoteku (tekući direktorijum se koristiti ako nije "
-"naveden)"
+"Izlazna datoteka ili direktorijum (koristi se tekući direktorijum ako je "
+"izostavljeno)"
 
 #. TRANSLATORS: put a list of packages in the pack
 #: ../client/pk-generate-pack.c:261
@@ -574,9 +578,9 @@ msgstr "Obe opcije izabrane."
 msgid "A output directory or file name is required"
 msgstr "Morate navesti ime izlazne datoteke ili direktorijuma"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
+msgid "The daemon failed to startup"
 msgstr "Demon nije uspeo da se pokrene"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
@@ -647,12 +651,12 @@ msgstr "Servisna grupa je napravljena „%s“"
 msgid "Failed to create '%s': %s"
 msgstr "Neuspelo pravljenje „%s“: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Neuspeo pokušaj dobavljanja stanja demona"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "PaketKit redar"
 
@@ -711,42 +715,42 @@ msgid "Installing..."
 msgstr "Instaliram..."
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Preuzimam detalje o izvorima softvera."
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr "Preuzimam spiskove datoteka (ovo može da potraje dok se ne završi)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Čekanje na zaključavanje upravnika paketa."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Učitavam spisak paketa."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Datoteka nije pronađena"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Neuspešno pokretanje:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "Neuspešna instalacija paketa"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "PaketKit naredba nije nađena"
 
@@ -756,51 +760,51 @@ msgid "Command not found."
 msgstr "Naredba nije nađena."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Slična naredba je:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Pokreni sličnu naredbu:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Slične naredbe su:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Izaberite naredbu za pokretanje"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "Paket koji pruža ovu datoteku je:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Da instaliram paket „%s“ koji pruža naredbu „%s“?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Paketi koji pružaju ovu datoteku su:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Prikladni paketi su:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Izaberite paket za instalaciju"
 
@@ -1994,25 +1998,25 @@ msgid "Show debugging information for all files"
 msgstr "Prikaži informacije o otklonu grešaka za sve datoteke"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Otklon grešaka ovih izričitih modula"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Otklon grešaka ovih izričitih funkcija"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Zapiši podatke o otklonu grešaka u datoteku"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Opcije za otklon grešaka"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Prikaži opcije za otklon grešaka"
 
@@ -2119,9 +2123,6 @@ msgstr "Prikaži opcije za otklon grešaka"
 #~ msgid "Incorrect privileges for this operation"
 #~ msgstr "Neispravna ovlašćenja za ovu operaciju"
 
-#~ msgid "The package could not be found"
-#~ msgstr "Paket nije nađen"
-
 #~ msgid "You need to specify a search type, e.g. name"
 #~ msgstr "Morate navesti vrstu pretrage, npr. ime"
 
commit d0c0f27a68e67ab2d4b64348cf48e8ea65cd23d4
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 8 19:17:22 2010 +0100

    Correctly fallback by checking the transaction role, not the backend role. Fixes fd#27527

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 25a5534..3b2b670 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -121,6 +121,7 @@ struct _PkBackendPrivate
 	PkNetwork		*network;
 	PkResults		*results;
 	PkRoleEnum		 role; /* this never changes for the lifetime of a transaction */
+	PkRoleEnum		 transaction_role;
 	PkStatusEnum		 status; /* this changes */
 	PkStore			*store;
 	PkTime			*time;
@@ -982,10 +983,10 @@ pk_backend_package (PkBackend *backend, PkInfoEnum info, const gchar *package_id
 	summary_safe = pk_backend_strsafe (summary);
 
 	/* fix up available and installed when doing simulate roles */
-	if (backend->priv->role == PK_ROLE_ENUM_SIMULATE_INSTALL_FILES ||
-	    backend->priv->role == PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES ||
-	    backend->priv->role == PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES ||
-	    backend->priv->role == PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES) {
+	if (backend->priv->transaction_role == PK_ROLE_ENUM_SIMULATE_INSTALL_FILES ||
+	    backend->priv->transaction_role == PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES ||
+	    backend->priv->transaction_role == PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES ||
+	    backend->priv->transaction_role == PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES) {
 		if (info == PK_INFO_ENUM_AVAILABLE)
 			info = PK_INFO_ENUM_INSTALLING;
 		else if (info == PK_INFO_ENUM_INSTALLED)
@@ -1927,14 +1928,11 @@ pk_backend_get_allow_cancel (PkBackend *backend)
 }
 
 /**
- * pk_backend_set_role:
+ * pk_backend_set_role_internal:
  **/
-gboolean
-pk_backend_set_role (PkBackend *backend, PkRoleEnum role)
+static gboolean
+pk_backend_set_role_internal (PkBackend *backend, PkRoleEnum role)
 {
-	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
-	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
-
 	/* Should only be called once... */
 	if (backend->priv->role != PK_ROLE_ENUM_UNKNOWN) {
 		egg_warning ("cannot set role more than once, already %s",
@@ -1952,6 +1950,23 @@ pk_backend_set_role (PkBackend *backend, PkRoleEnum role)
 }
 
 /**
+ * pk_backend_set_role:
+ **/
+gboolean
+pk_backend_set_role (PkBackend *backend, PkRoleEnum role)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
+	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
+
+	/* the role of the transaction can be different to the role of the backend if:
+	 * - we reuse the backend for instance searching for files before UpdatePackages
+	 * - we are simulating the SimulateInstallPackages with a GetDepends call */
+	egg_debug ("setting transaction role to %s", pk_role_enum_to_string (role));
+	backend->priv->transaction_role = role;
+	return pk_backend_set_role_internal (backend, role);
+}
+
+/**
  * pk_backend_set_exit_code:
  *
  * Should only be used internally, or from PkRunner when setting CANCELLED.
@@ -2639,6 +2654,7 @@ pk_backend_reset (PkBackend *backend)
 	backend->priv->status = PK_STATUS_ENUM_UNKNOWN;
 	backend->priv->exit = PK_EXIT_ENUM_UNKNOWN;
 	backend->priv->role = PK_ROLE_ENUM_UNKNOWN;
+	backend->priv->transaction_role = PK_ROLE_ENUM_UNKNOWN;
 	backend->priv->last_remaining = 0;
 	backend->priv->last_percentage = PK_BACKEND_PERCENTAGE_DEFAULT;
 	backend->priv->last_subpercentage = PK_BACKEND_PERCENTAGE_INVALID;
@@ -2676,7 +2692,7 @@ void
 pk_backend_download_packages (PkBackend *backend, gchar **package_ids, const gchar *directory)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_DOWNLOAD_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_DOWNLOAD_PACKAGES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	pk_store_set_string (backend->priv->store, "directory", directory);
 	backend->priv->desc->download_packages (backend, package_ids, directory);
@@ -2689,7 +2705,7 @@ void
 pk_backend_get_categories (PkBackend *backend)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_CATEGORIES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_CATEGORIES);
 	backend->priv->desc->get_categories (backend);
 }
 
@@ -2700,7 +2716,7 @@ void
 pk_backend_get_depends (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_DEPENDS);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_DEPENDS);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	pk_store_set_bool (backend->priv->store, "recursive", recursive);
@@ -2714,7 +2730,7 @@ void
 pk_backend_get_details (PkBackend *backend, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_DETAILS);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_DETAILS);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->get_details (backend, package_ids);
 }
@@ -2726,7 +2742,7 @@ void
 pk_backend_get_distro_upgrades (PkBackend *backend)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_DISTRO_UPGRADES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_DISTRO_UPGRADES);
 	backend->priv->desc->get_distro_upgrades (backend);
 }
 
@@ -2737,7 +2753,7 @@ void
 pk_backend_get_files (PkBackend *backend, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_FILES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_FILES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->get_files (backend, package_ids);
 }
@@ -2749,7 +2765,7 @@ void
 pk_backend_get_requires (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_REQUIRES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_REQUIRES);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	pk_store_set_bool (backend->priv->store, "recursive", recursive);
@@ -2763,7 +2779,7 @@ void
 pk_backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_UPDATE_DETAIL);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_UPDATE_DETAIL);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->get_update_detail (backend, package_ids);
 }
@@ -2775,7 +2791,7 @@ void
 pk_backend_get_updates (PkBackend *backend, PkBitfield filters)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_UPDATES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_UPDATES);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	backend->priv->desc->get_updates (backend, filters);
 }
@@ -2787,7 +2803,7 @@ void
 pk_backend_install_packages (PkBackend *backend, gboolean only_trusted, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_INSTALL_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_INSTALL_PACKAGES);
 	pk_store_set_bool (backend->priv->store, "only_trusted", only_trusted);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->install_packages (backend, only_trusted, package_ids);
@@ -2800,7 +2816,7 @@ void
 pk_backend_install_signature (PkBackend *backend, PkSigTypeEnum type, const gchar *key_id, const gchar *package_id)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_INSTALL_SIGNATURE);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_INSTALL_SIGNATURE);
 	pk_store_set_string (backend->priv->store, "key_id", key_id);
 	pk_store_set_string (backend->priv->store, "package_id", package_id);
 	backend->priv->desc->install_signature (backend, type, key_id, package_id);
@@ -2813,7 +2829,7 @@ void
 pk_backend_install_files (PkBackend *backend, gboolean only_trusted, gchar **full_paths)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_INSTALL_FILES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_INSTALL_FILES);
 	pk_store_set_bool (backend->priv->store, "only_trusted", only_trusted);
 	pk_store_set_strv (backend->priv->store, "full_paths", full_paths);
 	backend->priv->desc->install_files (backend, only_trusted, full_paths);
@@ -2826,7 +2842,7 @@ void
 pk_backend_refresh_cache (PkBackend *backend, gboolean force)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_REFRESH_CACHE);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_REFRESH_CACHE);
 	pk_store_set_bool (backend->priv->store, "force", force);
 	backend->priv->desc->refresh_cache (backend, force);
 }
@@ -2838,7 +2854,7 @@ void
 pk_backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_REMOVE_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_REMOVE_PACKAGES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	pk_store_set_bool (backend->priv->store, "allow_deps", allow_deps);
 	pk_store_set_bool (backend->priv->store, "autoremove", autoremove);
@@ -2852,7 +2868,7 @@ void
 pk_backend_resolve (PkBackend *backend, PkBitfield filters, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_RESOLVE);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_RESOLVE);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->resolve (backend, filters, package_ids);
@@ -2865,7 +2881,7 @@ void
 pk_backend_rollback (PkBackend *backend, const gchar *transaction_id)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_ROLLBACK);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_ROLLBACK);
 	pk_store_set_string (backend->priv->store, "transaction_id", transaction_id);
 	backend->priv->desc->rollback (backend, transaction_id);
 }
@@ -2877,7 +2893,7 @@ void
 pk_backend_search_details (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SEARCH_DETAILS);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SEARCH_DETAILS);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "search", values);
 	backend->priv->desc->search_details (backend, filters, values);
@@ -2890,7 +2906,7 @@ void
 pk_backend_search_files (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SEARCH_FILE);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SEARCH_FILE);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "search", values);
 	backend->priv->desc->search_files (backend, filters, values);
@@ -2903,7 +2919,7 @@ void
 pk_backend_search_groups (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SEARCH_GROUP);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SEARCH_GROUP);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "search", values);
 	backend->priv->desc->search_groups (backend, filters, values);
@@ -2916,7 +2932,7 @@ void
 pk_backend_search_names (PkBackend *backend, PkBitfield filters, gchar **values)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SEARCH_NAME);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SEARCH_NAME);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_strv (backend->priv->store, "search", values);
 	backend->priv->desc->search_names (backend, filters, values);
@@ -2929,7 +2945,7 @@ void
 pk_backend_update_packages (PkBackend *backend, gboolean only_trusted, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_UPDATE_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_UPDATE_PACKAGES);
 	pk_store_set_bool (backend->priv->store, "only_trusted", only_trusted);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->update_packages (backend, only_trusted, package_ids);
@@ -2942,7 +2958,7 @@ void
 pk_backend_update_system (PkBackend *backend, gboolean only_trusted)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_UPDATE_SYSTEM);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_UPDATE_SYSTEM);
 	pk_store_set_bool (backend->priv->store, "only_trusted", only_trusted);
 	backend->priv->desc->update_system (backend, only_trusted);
 }
@@ -2954,7 +2970,7 @@ void
 pk_backend_get_repo_list (PkBackend *backend, PkBitfield filters)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_REPO_LIST);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_REPO_LIST);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	backend->priv->desc->get_repo_list (backend, filters);
 }
@@ -2966,7 +2982,7 @@ void
 pk_backend_repo_enable (PkBackend *backend, const gchar *repo_id, gboolean enabled)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_REPO_ENABLE);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_REPO_ENABLE);
 	pk_store_set_string (backend->priv->store, "repo_id", repo_id);
 	pk_store_set_bool (backend->priv->store, "enabled", enabled);
 	backend->priv->desc->repo_enable (backend, repo_id, enabled);
@@ -2979,7 +2995,7 @@ void
 pk_backend_repo_set_data (PkBackend *backend, const gchar *repo_id, const gchar *parameter, const gchar *value)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_REPO_SET_DATA);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_REPO_SET_DATA);
 	pk_store_set_string (backend->priv->store, "repo_id", repo_id);
 	pk_store_set_string (backend->priv->store, "parameter", parameter);
 	pk_store_set_string (backend->priv->store, "value", value);
@@ -2993,7 +3009,7 @@ void
 pk_backend_what_provides (PkBackend *backend, PkBitfield filters, PkProvidesEnum provides, gchar **values)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_WHAT_PROVIDES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_WHAT_PROVIDES);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	pk_store_set_uint (backend->priv->store, "provides", provides);
 	pk_store_set_strv (backend->priv->store, "search", values);
@@ -3007,7 +3023,7 @@ void
 pk_backend_get_packages (PkBackend *backend, PkBitfield filters)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_GET_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_GET_PACKAGES);
 	pk_store_set_uint (backend->priv->store, "filters", filters);
 	backend->priv->desc->get_packages (backend, filters);
 }
@@ -3019,7 +3035,7 @@ void
 pk_backend_simulate_install_files (PkBackend *backend, gchar **full_paths)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SIMULATE_INSTALL_FILES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SIMULATE_INSTALL_FILES);
 	pk_store_set_strv (backend->priv->store, "full_paths", full_paths);
 	backend->priv->desc->simulate_install_files (backend, full_paths);
 }
@@ -3031,7 +3047,7 @@ void
 pk_backend_simulate_install_packages (PkBackend *backend, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SIMULATE_INSTALL_PACKAGES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->simulate_install_packages (backend, package_ids);
 }
@@ -3043,7 +3059,7 @@ void
 pk_backend_simulate_remove_packages (PkBackend *backend, gchar **package_ids, gboolean	 autoremove)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SIMULATE_REMOVE_PACKAGES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	pk_store_set_bool (backend->priv->store, "autoremove", autoremove);
 	backend->priv->desc->simulate_remove_packages (backend, package_ids, autoremove);
@@ -3056,7 +3072,7 @@ void
 pk_backend_simulate_update_packages (PkBackend *backend, gchar **package_ids)
 {
 	g_return_if_fail (PK_IS_BACKEND (backend));
-	pk_backend_set_role (backend, PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES);
+	pk_backend_set_role_internal (backend, PK_ROLE_ENUM_SIMULATE_UPDATE_PACKAGES);
 	pk_store_set_strv (backend->priv->store, "package_ids", package_ids);
 	backend->priv->desc->simulate_update_packages (backend, package_ids);
 }
commit 49c62bc75647ca28ce50b92f56e58e12335df115
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 16:20:56 2010 +0100

    yum: do not crash when using the newest filter with libzif

diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 423b629..32b1846 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -277,7 +277,6 @@ backend_filter_package_array_newest (GPtrArray *array)
 		/* the package is older than the one we have stored */
 		if (retval <= 0) {
 			g_free (key);
-			g_object_unref (package);
 			g_ptr_array_remove (array, package);
 			continue;
 		}
commit d1b892ce76a3170389c9a1b85491bcc7aa594308
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 14:36:15 2010 +0100

    yum: Add some test code to get the update info using zif

diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index 58b6bd9..423b629 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -1619,15 +1619,125 @@ backend_get_packages (PkBackend *backend, PkBitfield filters)
 }
 
 /**
+ * backend_get_update_detail_thread:
+ */
+static gboolean
+backend_get_update_detail_thread (PkBackend *backend)
+{
+	gchar **package_ids;
+	guint i;
+	guint j;
+	gboolean ret;
+	ZifUpdate *update;
+	ZifCompletion *completion_local;
+	ZifPackage *package;
+	GError *error = NULL;
+
+	/* reset */
+	backend_profile (NULL);
+
+	/* get lock */
+	ret = backend_get_lock (backend);
+	if (!ret) {
+		egg_warning ("failed to get lock");
+		goto out;
+	}
+
+	/* get the data */
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+
+	/* profile */
+	backend_profile ("get lock");
+
+	/* set the network state */
+	backend_setup_network (backend);
+
+	/* setup completion */
+	zif_completion_reset (priv->completion);
+	zif_completion_set_number_steps (priv->completion, g_strv_length (package_ids));
+
+	/* get the update info */
+	for (i=0; package_ids[i] != NULL; i++) {
+
+		package = zif_package_new ();
+		ret = zif_package_set_id (package, package_ids[i]);
+		if (!ret) {
+			g_error ("moo");
+		}
+
+		completion_local = zif_completion_get_child (priv->completion);
+		update = zif_package_get_update_detail (package, priv->cancellable, completion_local, &error);
+		if (update == NULL) {
+			egg_debug ("failed to get updateinfo for %s", zif_package_get_id (package));
+			g_clear_error (&error);
+		} else {
+			GPtrArray *array;
+			GString *string_cve;
+			GString *string_bugzilla;
+			ZifUpdateInfo *info;
+			array = zif_update_get_update_infos (update);
+			string_cve = g_string_new (NULL);
+			string_bugzilla = g_string_new (NULL);
+			for (j=0; j<array->len; j++) {
+				info = g_ptr_array_index (array, j);
+				switch (zif_update_info_get_kind (info)) {
+				case ZIF_UPDATE_INFO_KIND_CVE:
+					g_string_append_printf (string_cve, "%s\t%s\t",
+								zif_update_info_get_title (info),
+								zif_update_info_get_url (info));
+					break;
+				case ZIF_UPDATE_INFO_KIND_BUGZILLA:
+					g_string_append_printf (string_bugzilla, "%s\t%s\t",
+								zif_update_info_get_title (info),
+								zif_update_info_get_url (info));
+					break;
+				default:
+					break;
+				}
+			}
+			pk_backend_update_detail (backend, package_ids[i],
+						  NULL, //updates,
+						  NULL, //obsoletes,
+						  NULL, //vendor_url,
+						  string_bugzilla->str,
+						  string_cve->str,
+						  PK_RESTART_ENUM_NONE,
+						  zif_update_get_description (update),
+						  NULL, //changelog,
+						  zif_update_get_state (update),
+						  zif_update_get_issued (update),
+						  NULL);
+			g_ptr_array_unref (array);
+			g_string_free (string_cve, TRUE);
+			g_string_free (string_bugzilla, TRUE);
+		}
+
+		g_object_unref (package);
+
+		/* this section done */
+		zif_completion_done (priv->completion);
+	}
+out:
+	backend_unlock (backend);
+	pk_backend_finished (backend);
+	return TRUE;
+}
+
+/**
  * backend_get_update_detail:
  */
 static void
 backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	gchar *package_ids_temp;
-	package_ids_temp = pk_package_ids_to_string (package_ids);
-	pk_backend_spawn_helper (priv->spawn, "yumBackend.py", "get-update-detail", package_ids_temp, NULL);
-	g_free (package_ids_temp);
+	/* it seems some people are not ready for the awesomeness */
+	if (TRUE || !priv->use_zif) {
+		gchar *package_ids_temp;
+		package_ids_temp = pk_package_ids_to_string (package_ids);
+		pk_backend_spawn_helper (priv->spawn, "yumBackend.py", "get-update-detail", package_ids_temp, NULL);
+		g_free (package_ids_temp);
+		return;
+	}
+	pk_backend_thread_create (backend, backend_get_update_detail_thread);
 }
 
 /**
commit d2d66dcc4ceab765908c8aec7145319ca5797b7f
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 14:16:39 2010 +0100

    yum: use zif to get the update lists

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index 9f46ca7..9565231 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -64,6 +64,8 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-md-metalink.h				\
 	libzif/zif-md-mirrorlist.c				\
 	libzif/zif-md-mirrorlist.h				\
+	libzif/zif-md-updateinfo.c				\
+	libzif/zif-md-updateinfo.h				\
 	libzif/zif-md-comps.c					\
 	libzif/zif-md-comps.h					\
 	libzif/zif-store-array.c				\
diff --git a/backends/yum/libzif/zif-store-remote.c b/backends/yum/libzif/zif-store-remote.c
index 483c776..4ebc3f2 100644
--- a/backends/yum/libzif/zif-store-remote.c
+++ b/backends/yum/libzif/zif-store-remote.c
@@ -1486,6 +1486,7 @@ zif_store_remote_resolve (ZifStore *store, const gchar *search, GCancellable *ca
 	GPtrArray *array = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *primary;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -1520,7 +1521,8 @@ zif_store_remote_resolve (ZifStore *store, const gchar *search, GCancellable *ca
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_md_resolve (remote->priv->md_primary_db, search, cancellable, completion_local, error);
+	primary = zif_store_remote_get_primary (remote);
+	array = zif_md_resolve (primary, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1844,6 +1846,7 @@ zif_store_remote_search_group (ZifStore *store, const gchar *search, GCancellabl
 	GPtrArray *array = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *primary;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -1878,7 +1881,8 @@ zif_store_remote_search_group (ZifStore *store, const gchar *search, GCancellabl
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_md_search_group (remote->priv->md_primary_db, search, cancellable, completion_local, error);
+	primary = zif_store_remote_get_primary (remote);
+	array = zif_md_search_group (primary, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1898,6 +1902,7 @@ zif_store_remote_find_package (ZifStore *store, const gchar *package_id, GCancel
 	GError *error_local = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *primary;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -1933,7 +1938,8 @@ zif_store_remote_find_package (ZifStore *store, const gchar *package_id, GCancel
 
 	/* search with predicate, TODO: search version (epoch+release) */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_md_find_package (remote->priv->md_primary_db, package_id, cancellable, completion_local, &error_local);
+	primary = zif_store_remote_get_primary (remote);
+	array = zif_md_find_package (primary, package_id, cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to search: %s", error_local->message);
@@ -1976,6 +1982,7 @@ zif_store_remote_get_packages (ZifStore *store, GCancellable *cancellable, ZifCo
 	GPtrArray *array = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *primary;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -2009,8 +2016,9 @@ zif_store_remote_get_packages (ZifStore *store, GCancellable *cancellable, ZifCo
 		zif_completion_done (completion);
 	}
 
+	primary = zif_store_remote_get_primary (remote);
 	completion_local = zif_completion_get_child (completion);
-	array = zif_md_get_packages (remote->priv->md_primary_db, cancellable, completion_local, error);
+	array = zif_md_get_packages (primary, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -2169,6 +2177,7 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 	ZifCompletion *completion_local;
 	gchar **split;
 	gchar **split_update;
+	ZifMd *primary;
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -2202,6 +2211,9 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 	/* create array for packages to update */
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 
+	/* get primary */
+	primary = zif_store_remote_get_primary (remote);
+
 	/* find each one in a remote repo */
 	egg_debug ("searching with %i packages", packages->len);
 	for (i=0; i<packages->len; i++) {
@@ -2211,11 +2223,11 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 		/* find package name in repo */
 		completion_local = zif_completion_get_child (completion);
 		split = pk_package_id_split (package_id);
-		updates = zif_md_resolve (remote->priv->md_primary_db, split[PK_PACKAGE_ID_NAME],
-						  cancellable, completion_local, NULL);
+		updates = zif_md_resolve (primary, split[PK_PACKAGE_ID_NAME],
+					  cancellable, completion_local, NULL);
 		g_strfreev (split);
 		if (updates == NULL) {
-			egg_debug ("not found %s", split[PK_PACKAGE_ID_NAME]);
+			egg_debug ("not found %s", package_id);
 			continue;
 		}
 
@@ -2232,7 +2244,10 @@ zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
 				package_id_update = zif_package_get_id (update);
 				split = pk_package_id_split (package_id);
 				split_update = pk_package_id_split (package_id_update);
-				egg_debug ("*** update %s from %s to %s", split[PK_PACKAGE_ID_NAME], split[PK_PACKAGE_ID_VERSION], split_update[PK_PACKAGE_ID_VERSION]);
+				egg_debug ("*** update %s from %s to %s",
+					   split[PK_PACKAGE_ID_NAME],
+					   split[PK_PACKAGE_ID_VERSION],
+					   split_update[PK_PACKAGE_ID_VERSION]);
 				g_strfreev (split);
 				g_strfreev (split_update);
 				g_ptr_array_add (array, g_object_ref (update));
@@ -2259,6 +2274,7 @@ zif_store_remote_what_provides (ZifStore *store, const gchar *search,
 	GPtrArray *array = NULL;
 	ZifCompletion *completion_local;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
+	ZifMd *primary;
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -2291,8 +2307,9 @@ zif_store_remote_what_provides (ZifStore *store, const gchar *search,
 
 	/* get details */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_md_what_provides (remote->priv->md_primary_db, search,
-						   cancellable, completion_local, error);
+	primary = zif_store_remote_get_primary (remote);
+	array = zif_md_what_provides (primary, search,
+				      cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -2316,6 +2333,7 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 	const gchar *pkgid;
 	guint i, j;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
+	ZifMd *primary;
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -2359,6 +2377,9 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 	/* this section done */
 	zif_completion_done (completion);
 
+	/* get primary */
+	primary = zif_store_remote_get_primary (remote);
+
 	/* resolve the pkgId to a set of packages */
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 	for (i=0; i<pkgids->len; i++) {
@@ -2366,7 +2387,7 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 
 		/* get the results (should just be one) */
 		completion_local = zif_completion_get_child (completion);
-		tmp = zif_md_search_pkgid (remote->priv->md_primary_db, pkgid, cancellable, completion_local, &error_local);
+		tmp = zif_md_search_pkgid (primary, pkgid, cancellable, completion_local, &error_local);
 		if (tmp == NULL) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED_TO_FIND,
 				     "failed to resolve pkgId to package: %s", error_local->message);
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index bcbd6f3..58b6bd9 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -372,6 +372,7 @@ backend_emit_package_array (PkBackend *backend, GPtrArray *array)
 	guint i;
 	gboolean installed;
 	PkInfoEnum info;
+	const gchar *info_hint;
 	const gchar *package_id;
 	ZifString *summary;
 	ZifPackage *package;
@@ -383,10 +384,15 @@ backend_emit_package_array (PkBackend *backend, GPtrArray *array)
 		installed = zif_package_is_installed (package);
 		package_id = zif_package_get_package_id (package);
 		summary = zif_package_get_summary (package, NULL);
-		info = installed ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
-//		/* hack until we have update details */
-//		if (strstr (package_id, "update") != NULL)
-//			info = PK_INFO_ENUM_NORMAL;
+
+		/* if we set a hint, use that, otherwise just get the installed status correct */
+		info_hint = (const gchar *)g_object_get_data (G_OBJECT(package), "kind");
+		if (info_hint == NULL) {
+			info = installed ? PK_INFO_ENUM_INSTALLED : PK_INFO_ENUM_AVAILABLE;
+		} else {
+			info = pk_info_enum_from_string (info_hint);
+		}
+
 		pk_backend_package (backend, info, package_id, zif_string_get_value (summary));
 		zif_string_unref (summary);
 	}
@@ -1431,13 +1437,21 @@ backend_get_updates_thread (PkBackend *backend)
 	PkBitfield filters = (PkBitfield) pk_backend_get_uint (backend, "filters");
 	GPtrArray *store_array = NULL;
 	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
 	GPtrArray *array = NULL;
 	GPtrArray *result = NULL;
 	GPtrArray *packages = NULL;
 	gboolean ret;
 	GError *error = NULL;
+	ZifUpdate *update;
+	ZifPackage *package;
+	PkInfoEnum info;
+	guint i;
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
+	/* reset */
+	backend_profile (NULL);
+
 	/* get lock */
 	ret = backend_get_lock (backend);
 	if (!ret) {
@@ -1445,12 +1459,15 @@ backend_get_updates_thread (PkBackend *backend)
 		goto out;
 	}
 
+	/* profile */
+	backend_profile ("get lock");
+
 	/* set the network state */
 	backend_setup_network (backend);
 
 	/* setup completion */
 	zif_completion_reset (priv->completion);
-	zif_completion_set_number_steps (priv->completion, 4);
+	zif_completion_set_number_steps (priv->completion, 5);
 
 	/* get a store_array of remote stores */
 	store_array = zif_store_array_new ();
@@ -1465,6 +1482,9 @@ backend_get_updates_thread (PkBackend *backend)
 	/* this section done */
 	zif_completion_done (priv->completion);
 
+	/* profile */
+	backend_profile ("get remote stores");
+
 	/* get all the installed packages */
 	completion_local = zif_completion_get_child (priv->completion);
 	packages = zif_store_get_packages (ZIF_STORE (priv->store_local), NULL, completion_local, &error);
@@ -1478,12 +1498,18 @@ backend_get_updates_thread (PkBackend *backend)
 	/* this section done */
 	zif_completion_done (priv->completion);
 
+	/* profile */
+	backend_profile ("get installed packages");
+
 	/* remove any packages that are not newest (think kernel) */
 	zif_package_array_filter_newest (packages);
 
 	/* this section done */
 	zif_completion_done (priv->completion);
 
+	/* profile */
+	backend_profile ("filter installed newest");
+
 	/* get updates */
 	completion_local = zif_completion_get_child (priv->completion);
 	array = zif_store_array_get_updates (store_array, packages, (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
@@ -1497,6 +1523,40 @@ backend_get_updates_thread (PkBackend *backend)
 	/* this section done */
 	zif_completion_done (priv->completion);
 
+	/* profile */
+	backend_profile ("get updates of packages");
+
+	/* setup steps on updatinfo completion */
+	completion_local = zif_completion_get_child (priv->completion);
+	zif_completion_set_number_steps (completion_local, array->len);
+
+	/* get update info */
+	for (i=0; i<array->len; i++) {
+		package = g_ptr_array_index (array, i);
+		completion_loop = zif_completion_get_child (completion_local);
+		update = zif_package_get_update_detail (package, priv->cancellable, completion_loop, &error);
+		if (update == NULL) {
+			egg_debug ("failed to get updateinfo for %s", zif_package_get_id (package));
+			g_clear_error (&error);
+			info = PK_INFO_ENUM_NORMAL;
+		} else {
+			info = zif_update_get_kind (update);
+			g_object_unref (update);
+		}
+
+		/* set new severity */
+		g_object_set_data (G_OBJECT(package), "kind", (gpointer)pk_info_enum_to_string (info));
+
+		/* this section done */
+		zif_completion_done (completion_local);
+	}
+
+	/* this section done */
+	zif_completion_done (priv->completion);
+
+	/* profile */
+	backend_profile ("get updateinfo");
+
 	/* filter */
 	result = backend_filter_package_array (array, filters);
 
@@ -1506,6 +1566,9 @@ backend_get_updates_thread (PkBackend *backend)
 	/* emit */
 	backend_emit_package_array (backend, result);
 
+	/* profile */
+	backend_profile ("filter and emit");
+
 out:
 	backend_unlock (backend);
 	pk_backend_finished (backend);
@@ -1528,7 +1591,7 @@ static void
 backend_get_updates (PkBackend *backend, PkBitfield filters)
 {
 	/* it seems some people are not ready for the awesomeness */
-	if (TRUE || !priv->use_zif) {
+	if (!priv->use_zif) {
 		gchar *filters_text;
 		filters_text = pk_filter_bitfield_to_string (filters);
 		pk_backend_spawn_helper (priv->spawn,  "yumBackend.py", "get-updates", filters_text, NULL);
commit 48ecaebae6a5368e05d1000852ff32b9c928b1c0
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 13:28:28 2010 +0100

    Fix build when not using PolicyKit

diff --git a/src/pk-engine.c b/src/pk-engine.c
index 022c82e..912e6aa 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -923,7 +923,7 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	egg_warning ("*** THERE IS NO SECURITY MODEL BEING USED!!! ***");
 
 	/* try to set the new proxy and save to database */
-	ret = pk_engine_set_proxy_internal (engine);
+	ret = pk_engine_set_proxy_internal (engine, sender);
 	if (!ret) {
 		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "setting the proxy failed");
 		dbus_g_method_return_error (context, error);
commit a6bb5de5a32d5140d8097d66dd6a8b4856547e2f
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 13:25:03 2010 +0100

    trivial: update to the latest snapshot of libzif to support legacy primary metadata

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index a645404..9f46ca7 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -52,18 +52,20 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-store-local.h				\
 	libzif/zif-store-remote.c				\
 	libzif/zif-store-remote.h				\
-	libzif/zif-repo-md.c					\
-	libzif/zif-repo-md.h					\
-	libzif/zif-repo-md-filelists.c				\
-	libzif/zif-repo-md-filelists.h				\
-	libzif/zif-repo-md-primary.c				\
-	libzif/zif-repo-md-primary.h				\
-	libzif/zif-repo-md-metalink.c				\
-	libzif/zif-repo-md-metalink.h				\
-	libzif/zif-repo-md-mirrorlist.c				\
-	libzif/zif-repo-md-mirrorlist.h				\
-	libzif/zif-repo-md-comps.c				\
-	libzif/zif-repo-md-comps.h				\
+	libzif/zif-md.c						\
+	libzif/zif-md.h						\
+	libzif/zif-md-filelists.c				\
+	libzif/zif-md-filelists.h				\
+	libzif/zif-md-primary-sql.c				\
+	libzif/zif-md-primary-sql.h				\
+	libzif/zif-md-primary-xml.c				\
+	libzif/zif-md-primary-xml.h				\
+	libzif/zif-md-metalink.c				\
+	libzif/zif-md-metalink.h				\
+	libzif/zif-md-mirrorlist.c				\
+	libzif/zif-md-mirrorlist.h				\
+	libzif/zif-md-comps.c					\
+	libzif/zif-md-comps.h					\
 	libzif/zif-store-array.c				\
 	libzif/zif-store-array.h				\
 	libzif/zif-repos.c					\
@@ -76,6 +78,10 @@ libpk_backend_yum_la_SOURCES += 				\
 	libzif/zif-config.h					\
 	libzif/zif-monitor.c					\
 	libzif/zif-monitor.h					\
+	libzif/zif-update.c					\
+	libzif/zif-update.h					\
+	libzif/zif-update-info.c				\
+	libzif/zif-update-info.h				\
 	libzif/zif-download.c					\
 	libzif/zif-download.h
 
diff --git a/backends/yum/libzif/zif-package.c b/backends/yum/libzif/zif-package.c
index d0e9b3f..4d6890a 100644
--- a/backends/yum/libzif/zif-package.c
+++ b/backends/yum/libzif/zif-package.c
@@ -123,6 +123,10 @@ zif_package_compare (ZifPackage *a, ZifPackage *b)
 
 	/* do a version compare */
 	val = zif_compare_evr (splita[PK_PACKAGE_ID_VERSION], splitb[PK_PACKAGE_ID_VERSION]);
+
+	/* if the packages are equal, prefer the same architecture */
+	if (val == 0)
+		val = g_strcmp0 (splitb[PK_PACKAGE_ID_ARCH], splita[PK_PACKAGE_ID_ARCH]);
 out:
 	g_strfreev (splita);
 	g_strfreev (splitb);
@@ -173,6 +177,73 @@ out:
 }
 
 /**
+ * zif_package_array_filter_newest:
+ * @packages: array of %ZifPackage's
+ *
+ * Filters the list so that only the newest version of a package remains.
+ *
+ * Return value: %TRUE if the array was modified
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_package_array_filter_newest (GPtrArray *packages)
+{
+	guint i;
+	GHashTable *hash;
+	ZifPackage *package;
+	ZifPackage *package_tmp;
+	const gchar *name;
+	gboolean ret = FALSE;
+
+	/* use a hash so it's O(n) not O(n^2) */
+	hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+	for (i=0; i<packages->len; i++) {
+		package = ZIF_PACKAGE (g_ptr_array_index (packages, i));
+		name = zif_package_get_name (package);
+		package_tmp = g_hash_table_lookup (hash, name);
+
+		/* does not already exist */
+		if (package_tmp == NULL) {
+			g_hash_table_insert (hash, g_strdup (name), g_object_ref (package));
+			continue;
+		}
+
+		/* the new package is older */
+		if (zif_package_compare (package, package_tmp) < 0) {
+			egg_debug ("%s is older than %s, so ignoring it",
+				   zif_package_get_id (package), zif_package_get_id (package_tmp));
+			g_ptr_array_remove_index_fast (packages, i);
+			ret = TRUE;
+			continue;
+		}
+
+		ret = TRUE;
+		egg_debug ("removing %s", zif_package_get_id (package_tmp));
+		egg_debug ("adding %s", zif_package_get_id (package));
+
+		/* remove the old one */
+		g_hash_table_remove (hash, zif_package_get_name (package_tmp));
+		g_hash_table_insert (hash, g_strdup (name), g_object_ref (package));
+		g_ptr_array_remove_fast (packages, package_tmp);
+	}
+	g_hash_table_unref (hash);
+	return  ret;
+}
+
+/**
+ * zif_package_get_store_for_package:
+ **/
+static ZifStoreRemote *
+zif_package_get_store_for_package (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifStoreRemote *store_remote;
+	store_remote = zif_repos_get_store (package->priv->repos, package->priv->package_id_split[PK_PACKAGE_ID_DATA],
+					    cancellable, completion, error);
+	return store_remote;
+}
+
+/**
  * zif_package_download:
  * @package: the #ZifPackage object
  * @directory: the local directory to save to
@@ -190,7 +261,7 @@ gboolean
 zif_package_download (ZifPackage *package, const gchar *directory, GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret = FALSE;
-	ZifStoreRemote *repo = NULL;
+	ZifStoreRemote *store_remote = NULL;
 	GError *error_local = NULL;
 	ZifCompletion *completion_local = NULL;
 
@@ -210,10 +281,10 @@ zif_package_download (ZifPackage *package, const gchar *directory, GCancellable
 
 	/* find correct repo */
 	completion_local = zif_completion_get_child (completion);
-	repo = zif_repos_get_store (package->priv->repos, package->priv->package_id_split[PK_PACKAGE_ID_DATA], cancellable, completion_local, &error_local);
-	if (repo == NULL) {
+	store_remote = zif_package_get_store_for_package (package, cancellable, completion_local, &error_local);
+	if (store_remote == NULL) {
 		g_set_error (error, ZIF_PACKAGE_ERROR, ZIF_PACKAGE_ERROR_FAILED,
-			     "cannot find remote repo: %s", error_local->message);
+			     "cannot find remote store: %s", error_local->message);
 		g_error_free (error_local);
 		goto out;
 	}
@@ -224,11 +295,11 @@ zif_package_download (ZifPackage *package, const gchar *directory, GCancellable
 	/* create a chain of completions */
 	completion_local = zif_completion_get_child (completion);
 
-	/* download from the repo */
-	ret = zif_store_remote_download (repo, zif_string_get_value (package->priv->location_href), directory, cancellable, completion_local, &error_local);
+	/* download from the store */
+	ret = zif_store_remote_download (store_remote, zif_string_get_value (package->priv->location_href), directory, cancellable, completion_local, &error_local);
 	if (!ret) {
 		g_set_error (error, ZIF_PACKAGE_ERROR, ZIF_PACKAGE_ERROR_FAILED,
-			     "cannot download from repo: %s", error_local->message);
+			     "cannot download from store: %s", error_local->message);
 		g_error_free (error_local);
 		goto out;
 	}
@@ -236,12 +307,77 @@ zif_package_download (ZifPackage *package, const gchar *directory, GCancellable
 	/* this section done */
 	zif_completion_done (completion);
 out:
-	if (repo != NULL)
-		g_object_unref (repo);
+	if (store_remote != NULL)
+		g_object_unref (store_remote);
 	return ret;
 }
 
 /**
+ * zif_package_get_update_detail:
+ * @package: the #ZifPackage object
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the update detail for a package.
+ *
+ * Return value: a %ZifUpdate, or %NULL for failure
+ *
+ * Since: 0.0.1
+ **/
+ZifUpdate *
+zif_package_get_update_detail (ZifPackage *package, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifUpdate *update = NULL;
+	ZifStoreRemote *store_remote = NULL;
+	GError *error_local = NULL;
+	ZifCompletion *completion_local = NULL;
+
+	g_return_val_if_fail (ZIF_IS_PACKAGE (package), NULL);
+	g_return_val_if_fail (package->priv->package_id_split != NULL, NULL);
+
+	/* check we are not installed */
+	if (package->priv->installed) {
+		g_set_error_literal (error, ZIF_PACKAGE_ERROR, ZIF_PACKAGE_ERROR_FAILED,
+				     "cannot get details for installed packages");
+		goto out;
+	}
+
+	/* two steps */
+	zif_completion_set_number_steps (completion, 2);
+
+	/* find correct repo */
+	completion_local = zif_completion_get_child (completion);
+	store_remote = zif_package_get_store_for_package (package, cancellable, completion_local, &error_local);
+	if (store_remote == NULL) {
+		g_set_error (error, ZIF_PACKAGE_ERROR, ZIF_PACKAGE_ERROR_FAILED,
+			     "cannot find remote store: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* download from the store */
+	completion_local = zif_completion_get_child (completion);
+	update = zif_store_remote_get_update_detail (store_remote, package->priv->package_id, cancellable, completion_local, &error_local);
+	if (update == NULL) {
+		g_set_error (error, ZIF_PACKAGE_ERROR, ZIF_PACKAGE_ERROR_FAILED,
+			     "cannot get update detail from store: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	if (store_remote != NULL)
+		g_object_unref (store_remote);
+	return update;
+}
+
+/**
  * zif_package_print:
  * @package: the #ZifPackage object
  *
diff --git a/backends/yum/libzif/zif-package.h b/backends/yum/libzif/zif-package.h
index 69a6319..c958365 100644
--- a/backends/yum/libzif/zif-package.h
+++ b/backends/yum/libzif/zif-package.h
@@ -47,6 +47,8 @@ typedef struct _ZifPackage		ZifPackage;
 typedef struct _ZifPackagePrivate	ZifPackagePrivate;
 typedef struct _ZifPackageClass		ZifPackageClass;
 
+#include "zif-update.h"
+
 typedef enum {
 	ZIF_PACKAGE_ENSURE_TYPE_FILES,
 	ZIF_PACKAGE_ENSURE_TYPE_SUMMARY,
@@ -147,6 +149,10 @@ gboolean		 zif_package_download		(ZifPackage	*package,
 							 GCancellable	*cancellable,
 							 ZifCompletion	*completion,
 							 GError		**error);
+ZifUpdate		*zif_package_get_update_detail	(ZifPackage	*package,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
 const gchar		*zif_package_get_package_id	(ZifPackage	*package);
 void			 zif_package_print		(ZifPackage	*package);
 gboolean		 zif_package_is_devel		(ZifPackage	*package);
@@ -158,6 +164,7 @@ gint			 zif_package_compare		(ZifPackage	*a,
 							 ZifPackage	*b);
 ZifPackage		*zif_package_array_get_newest	(GPtrArray	*array,
 							 GError		**error);
+gboolean		 zif_package_array_filter_newest (GPtrArray	*packages);
 
 G_END_DECLS
 
diff --git a/backends/yum/libzif/zif-repo-md-comps.c b/backends/yum/libzif/zif-repo-md-comps.c
deleted file mode 100644
index 096176f..0000000
--- a/backends/yum/libzif/zif-repo-md-comps.c
+++ /dev/null
@@ -1,977 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md-comps
- * @short_description: Comps metadata functionality
- *
- * Provide access to the comps repo metadata.
- * This object is a subclass of #ZifRepoMd
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <glib.h>
-
-#include "zif-repo-md.h"
-#include "zif-repo-md-comps.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_COMPS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD_COMPS, ZifRepoMdCompsPrivate))
-
-typedef enum {
-	ZIF_REPO_MD_COMPS_SECTION_GROUP,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY,
-	ZIF_REPO_MD_COMPS_SECTION_UNKNOWN
-} ZifRepoMdCompsSection;
-
-typedef enum {
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_ID,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_NAME,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_DESCRIPTION,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_VISIBLE,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_PACKAGELIST,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_PACKAGE,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN
-} ZifRepoMdCompsSectionGroup;
-
-typedef enum {
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_DEFAULT,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_OPTIONAL,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_CONDITIONAL,
-	ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN
-} ZifRepoMdCompsSectionGroupType;
-
-typedef enum {
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_ID,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_NAME,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_DESCRIPTION,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_GROUPLIST,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_GROUP,
-	ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN
-} ZifRepoMdCompsSectionCategory;
-
-typedef struct {
-	gchar				*id;
-	gchar				*name;
-	gchar				*description;
-	gboolean			 visible;
-	GPtrArray			*packagelist;		/* stored as gchar */
-} ZifRepoMdCompsGroupData;
-
-typedef struct {
-	gchar				*id;
-	gchar				*name;
-	gchar				*description;
-	GPtrArray			*grouplist;		/* stored as gchar */
-} ZifRepoMdCompsCategoryData;
-
-/**
- * ZifRepoMdCompsPrivate:
- *
- * Private #ZifRepoMdComps data
- **/
-struct _ZifRepoMdCompsPrivate
-{
-	gboolean			 loaded;
-	GPtrArray			*array_groups;		/* stored as ZifRepoMdCompsGroupData */
-	GPtrArray			*array_categories;	/* stored as ZifRepoMdCompsCategoryData */
-	/* for parser */
-	ZifRepoMdCompsSection		 section;
-	ZifRepoMdCompsSectionGroup	 section_group;
-	ZifRepoMdCompsSectionGroupType	 section_group_type;
-	ZifRepoMdCompsSectionCategory	 section_category;
-	ZifRepoMdCompsGroupData		*group_data_temp;
-	ZifRepoMdCompsCategoryData	*category_data_temp;
-};
-
-G_DEFINE_TYPE (ZifRepoMdComps, zif_repo_md_comps, ZIF_TYPE_REPO_MD)
-
-/**
- * zif_repo_md_comps_group_data_new:
- **/
-static ZifRepoMdCompsGroupData *
-zif_repo_md_comps_group_data_new (void)
-{
-	ZifRepoMdCompsGroupData *data;
-	data = g_new0 (ZifRepoMdCompsGroupData, 1);
-	data->packagelist = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-	return data;
-}
-
-/**
- * zif_repo_md_comps_category_data_new:
- **/
-static ZifRepoMdCompsCategoryData *
-zif_repo_md_comps_category_data_new (void)
-{
-	ZifRepoMdCompsCategoryData *data;
-	data = g_new0 (ZifRepoMdCompsCategoryData, 1);
-	data->grouplist = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-	return data;
-}
-
-/**
- * zif_repo_md_comps_group_data_free:
- **/
-static void
-zif_repo_md_comps_group_data_free (ZifRepoMdCompsGroupData *data)
-{
-	g_free (data->id);
-	g_free (data->name);
-	g_free (data->description);
-	g_ptr_array_unref (data->packagelist);
-	g_free (data);
-}
-
-/**
- * zif_repo_md_comps_category_data_free:
- **/
-static void
-zif_repo_md_comps_category_data_free (ZifRepoMdCompsCategoryData *data)
-{
-	g_free (data->id);
-	g_free (data->name);
-	g_free (data->description);
-	g_ptr_array_unref (data->grouplist);
-	g_free (data);
-}
-
-#if 0
-/**
- * zif_repo_md_comps_protocol_type_from_text:
- **/
-static ZifRepoMdCompsProtocolType
-zif_repo_md_comps_protocol_type_from_text (const gchar *type_text)
-{
-	if (g_strcmp0 (type_text, "ftp") == 0)
-		return ZIF_REPO_MD_COMPS_PROTOCOL_TYPE_FTP;
-	if (g_strcmp0 (type_text, "http") == 0)
-		return ZIF_REPO_MD_COMPS_PROTOCOL_TYPE_HTTP;
-	if (g_strcmp0 (type_text, "rsync") == 0)
-		return ZIF_REPO_MD_COMPS_PROTOCOL_TYPE_RSYNC;
-	return ZIF_REPO_MD_COMPS_PROTOCOL_TYPE_UNKNOWN;
-}
-#endif
-
-/**
- * zif_repo_md_comps_parser_start_element:
- **/
-static void
-zif_repo_md_comps_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
-					const gchar **attribute_names, const gchar **attribute_values,
-					gpointer user_data, GError **error)
-{
-	guint i;
-	ZifRepoMdComps *comps = user_data;
-
-	g_return_if_fail (ZIF_IS_REPO_MD_COMPS (comps));
-
-	/* group element */
-	if (comps->priv->section == ZIF_REPO_MD_COMPS_SECTION_UNKNOWN) {
-
-		/* start of group */
-		if (g_strcmp0 (element_name, "group") == 0) {
-			comps->priv->section = ZIF_REPO_MD_COMPS_SECTION_GROUP;
-			comps->priv->group_data_temp = zif_repo_md_comps_group_data_new ();
-			goto out;
-		}
-
-		/* start of category */
-		if (g_strcmp0 (element_name, "category") == 0) {
-			comps->priv->section = ZIF_REPO_MD_COMPS_SECTION_CATEGORY;
-			comps->priv->category_data_temp = zif_repo_md_comps_category_data_new ();
-			goto out;
-		}
-
-		goto out;
-	}
-
-	/* group element */
-	if (comps->priv->section == ZIF_REPO_MD_COMPS_SECTION_GROUP) {
-		/* id */
-		if (g_strcmp0 (element_name, "id") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_ID;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "name") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_NAME;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "description") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_DESCRIPTION;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "uservisible") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_VISIBLE;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "packagelist") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_PACKAGELIST;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "packagereq") == 0) {
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_PACKAGE;
-
-			/* find the package type as a bonus */
-			comps->priv->section_group_type = ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN;
-			for (i=0; attribute_names[i] != NULL; i++) {
-				if (g_strcmp0 (element_name, "type") == 0) {
-					if (g_strcmp0 (attribute_values[i], "default"))
-						comps->priv->section_group_type = ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_DEFAULT;
-					break;
-				}
-			}
-			goto out;
-		}
-	}
-
-	/* category element */
-	if (comps->priv->section == ZIF_REPO_MD_COMPS_SECTION_CATEGORY) {
-		/* id */
-		if (g_strcmp0 (element_name, "id") == 0) {
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_ID;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "name") == 0) {
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_NAME;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "description") == 0) {
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_DESCRIPTION;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "grouplist") == 0) {
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_GROUPLIST;
-			goto out;
-		}
-		if (g_strcmp0 (element_name, "groupid") == 0) {
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_GROUP;
-			goto out;
-		}
-	}
-out:
-	return;
-}
-
-/**
- * zif_repo_md_comps_parser_end_element:
- **/
-static void
-zif_repo_md_comps_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
-				      gpointer user_data, GError **error)
-{
-	ZifRepoMdComps *comps = user_data;
-
-	/* end of group */
-	if (g_strcmp0 (element_name, "group") == 0) {
-		comps->priv->section = ZIF_REPO_MD_COMPS_SECTION_UNKNOWN;
-
-		/* add to array */
-		g_ptr_array_add (comps->priv->array_groups, comps->priv->group_data_temp);
-
-		if (FALSE)
-		egg_debug ("added GROUP '%s' name:%s, desc:%s, visible:%i, list=%p",
-			   comps->priv->group_data_temp->id,
-			   comps->priv->group_data_temp->name,
-			   comps->priv->group_data_temp->description,
-			   comps->priv->group_data_temp->visible,
-			   comps->priv->group_data_temp->packagelist);
-
-		comps->priv->group_data_temp = NULL;
-		goto out;
-	}
-
-	/* start of group */
-	if (g_strcmp0 (element_name, "category") == 0) {
-		comps->priv->section = ZIF_REPO_MD_COMPS_SECTION_UNKNOWN;
-
-		/* add to array */
-		g_ptr_array_add (comps->priv->array_categories, comps->priv->category_data_temp);
-
-		if (FALSE)
-		egg_debug ("added CATEGORY '%s' name:%s, desc:%s, list=%p",
-			   comps->priv->category_data_temp->id,
-			   comps->priv->category_data_temp->name,
-			   comps->priv->category_data_temp->description,
-			   comps->priv->category_data_temp->grouplist);
-
-		comps->priv->category_data_temp = NULL;
-		goto out;
-	}
-out:
-	return;
-}
-
-/**
- * zif_repo_md_comps_parser_text:
- **/
-static void
-zif_repo_md_comps_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
-			       gpointer user_data, GError **error)
-
-{
-	ZifRepoMdComps *comps = user_data;
-
-	/* skip whitespace */
-	if (text_len < 1 || text[0] == ' ' || text[0] == '\t' || text[0] == '\n')
-		goto out;
-
-	/* group section */
-	if (comps->priv->section == ZIF_REPO_MD_COMPS_SECTION_GROUP) {
-		if (comps->priv->section_group == ZIF_REPO_MD_COMPS_SECTION_GROUP_ID) {
-			comps->priv->group_data_temp->id = g_strdup (text);
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_group == ZIF_REPO_MD_COMPS_SECTION_GROUP_NAME) {
-			/* ignore translated versions for now */
-			if (comps->priv->group_data_temp->name != NULL)
-				goto out;
-			comps->priv->group_data_temp->name = g_strdup (text);
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_group == ZIF_REPO_MD_COMPS_SECTION_GROUP_DESCRIPTION) {
-			/* ignore translated versions for now */
-			if (comps->priv->group_data_temp->description != NULL)
-				goto out;
-			comps->priv->group_data_temp->description = g_strdup (text);
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_group == ZIF_REPO_MD_COMPS_SECTION_GROUP_VISIBLE) {
-			/* TODO: parse true and false */
-			comps->priv->group_data_temp->visible = atoi (text);
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_group == ZIF_REPO_MD_COMPS_SECTION_GROUP_PACKAGE) {
-			g_ptr_array_add (comps->priv->group_data_temp->packagelist, g_strdup (text));
-			comps->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-			goto out;
-		}
-		goto out;
-	}
-
-	/* category section */
-	if (comps->priv->section == ZIF_REPO_MD_COMPS_SECTION_CATEGORY) {
-		if (comps->priv->section_category == ZIF_REPO_MD_COMPS_SECTION_CATEGORY_ID) {
-			comps->priv->category_data_temp->id = g_strdup (text);
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_category == ZIF_REPO_MD_COMPS_SECTION_CATEGORY_NAME) {
-			/* ignore translated versions for now */
-			if (comps->priv->category_data_temp->name != NULL)
-				goto out;
-			comps->priv->category_data_temp->name = g_strdup (text);
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_category == ZIF_REPO_MD_COMPS_SECTION_CATEGORY_DESCRIPTION) {
-			/* ignore translated versions for now */
-			if (comps->priv->category_data_temp->description != NULL)
-				goto out;
-			comps->priv->category_data_temp->description = g_strdup (text);
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
-			goto out;
-		}
-		if (comps->priv->section_category == ZIF_REPO_MD_COMPS_SECTION_CATEGORY_GROUP) {
-			g_ptr_array_add (comps->priv->category_data_temp->grouplist, g_strdup (text));
-			comps->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
-			goto out;
-		}
-		goto out;
-	}
-out:
-	return;
-}
-
-/**
- * zif_repo_md_comps_unload:
- **/
-static gboolean
-zif_repo_md_comps_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = FALSE;
-	return ret;
-}
-
-/**
- * zif_repo_md_comps_load:
- **/
-static gboolean
-zif_repo_md_comps_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = TRUE;
-	gchar *contents = NULL;
-	const gchar *filename;
-	gsize size;
-	GMarkupParseContext *context = NULL;
-	const GMarkupParser gpk_repo_md_comps_markup_parser = {
-		zif_repo_md_comps_parser_start_element,
-		zif_repo_md_comps_parser_end_element,
-		zif_repo_md_comps_parser_text,
-		NULL, /* passthrough */
-		NULL /* error */
-	};
-	ZifRepoMdComps *comps = ZIF_REPO_MD_COMPS (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_COMPS (md), FALSE);
-
-	/* already loaded */
-	if (comps->priv->loaded)
-		goto out;
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to get filename for comps");
-		goto out;
-	}
-
-	/* open database */
-	egg_debug ("filename = %s", filename);
-
-	/* get repo contents */
-	ret = g_file_get_contents (filename, &contents, &size, error);
-	if (!ret)
-		goto out;
-
-	/* create parser */
-	context = g_markup_parse_context_new (&gpk_repo_md_comps_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, comps, NULL);
-
-	/* parse data */
-	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
-	if (!ret)
-		goto out;
-
-	comps->priv->loaded = TRUE;
-out:
-	if (context != NULL)
-		g_markup_parse_context_free (context);
-	g_free (contents);
-	return ret;
-}
-
-/**
- * zif_repo_md_comps_category_set_icon:
- *
- * Check the icon exists, otherwise fallback to the parent ID, and then
- * something sane.
- **/
-static void
-zif_repo_md_comps_category_set_icon (PkCategory *category)
-{
-	const gchar *icon;
-	GString *filename = g_string_new ("");
-
-	/* try the proper group icon */
-	icon = pk_category_get_id (category);
-	g_string_printf (filename, "/usr/share/pixmaps/comps/%s.png", icon);
-	if (g_file_test (filename->str, G_FILE_TEST_EXISTS))
-		goto out;
-
-	/* fall back to parent icon */
-	icon = pk_category_get_parent_id (category);
-	g_string_printf (filename, "/usr/share/pixmaps/comps/%s.png", icon);
-	if (g_file_test (filename->str, G_FILE_TEST_EXISTS))
-		goto out;
-
-	/* fall back to the missing icon */
-	icon = "image-missing";
-out:
-	pk_category_set_icon (category, icon);
-	g_string_free (filename, TRUE);
-}
-
-/**
- * zif_repo_md_comps_get_categories:
- * @md: the #ZifRepoMdComps object
- * @cancellable: the %GCancellable, or %NULL
- * @completion: the %ZifCompletion object
- * @error: a #GError which is used on failure, or %NULL
- *
- * Gets the available list of categories.
- *
- * Return value: %PkCategory array of categories, with parent_id set to %NULL
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_comps_get_categories (ZifRepoMdComps *md, GCancellable *cancellable,
-				  ZifCompletion *completion, GError **error)
-{
-	GPtrArray *array = NULL;
-	guint i;
-	guint len;
-	gboolean ret;
-	GError *error_local = NULL;
-	const ZifRepoMdCompsCategoryData *data;
-	PkCategory *category;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_COMPS (md), NULL);
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to get load comps: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get categories */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
-	len = md->priv->array_categories->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (md->priv->array_categories, i);
-		category = pk_category_new ();
-		pk_category_set_id (category, data->id);
-		pk_category_set_name (category, data->name);
-		pk_category_set_summary (category, data->description);
-		zif_repo_md_comps_category_set_icon (category);
-		g_ptr_array_add (array, category);
-	}
-out:
-	return array;
-}
-
-/**
- * zif_repo_md_comps_get_category_for_group:
- **/
-static PkCategory *
-zif_repo_md_comps_get_category_for_group (ZifRepoMdComps *md, const gchar *group_id)
-{
-	guint i;
-	guint len;
-	PkCategory *category = NULL;
-	ZifRepoMdCompsGroupData *data;
-
-	/* find group matching group_id */
-	len = md->priv->array_groups->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (md->priv->array_groups, i);
-		if (g_strcmp0 (group_id, data->id) == 0) {
-			category = pk_category_new ();
-			pk_category_set_id (category, data->id);
-			pk_category_set_name (category, data->name);
-			pk_category_set_summary (category, data->description);
-			break;
-		}
-	}
-	return category;
-}
-
-/**
- * zif_repo_md_comps_get_groups_for_category:
- * @md: the #ZifRepoMdComps object
- * @category_id: the category to search for
- * @cancellable: the %GCancellable, or %NULL
- * @completion: the %ZifCompletion object
- * @error: a #GError which is used on failure, or %NULL
- *
- * Gets the list of groups for a specific category.
- *
- * Return value: %PkCategory array of groups
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_comps_get_groups_for_category (ZifRepoMdComps *md, const gchar *category_id,
-					   GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	GPtrArray *array = NULL;
-	guint i;
-	guint j;
-	guint len;
-	gboolean ret;
-	GError *error_local = NULL;
-	const ZifRepoMdCompsCategoryData *data;
-	const gchar *id;
-	PkCategory *category;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_COMPS (md), NULL);
-	g_return_val_if_fail (category_id != NULL, NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to get load comps: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get categories */
-	len = md->priv->array_categories->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (md->priv->array_categories, i);
-
-		/* category matches */
-		if (g_strcmp0 (category_id, data->id) == 0) {
-			array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
-			for (j=0; j<data->grouplist->len; j++) {
-				id = g_ptr_array_index (data->grouplist, j);
-				/* find group matching group_id */
-				category = zif_repo_md_comps_get_category_for_group (md, id);
-				if (category == NULL)
-					continue;
-
-				/* add */
-				pk_category_set_parent_id (category, category_id);
-				zif_repo_md_comps_category_set_icon (category);
-				g_ptr_array_add (array, category);
-			}
-			break;
-		}
-	}
-
-	/* nothing found */
-	if (array == NULL) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "could not find category: %s", category_id);
-	}
-out:
-	return array;
-}
-
-/**
- * zif_repo_md_comps_get_packages_for_group:
- * @md: the #ZifRepoMdComps object
- * @group_id: the group to search for
- * @cancellable: the %GCancellable, or %NULL
- * @completion: the %ZifCompletion object
- * @error: a #GError which is used on failure, or %NULL
- *
- * Gets the package names for a group.
- *
- * Return value: gchar pointer array of package names (not %ZifPackage's)
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_comps_get_packages_for_group (ZifRepoMdComps *md, const gchar *group_id,
-					  GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	GPtrArray *array = NULL;
-	guint i;
-	guint j;
-	guint len;
-	gboolean ret;
-	GError *error_local = NULL;
-	const ZifRepoMdCompsGroupData *data;
-	const gchar *packagename;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_COMPS (md), NULL);
-	g_return_val_if_fail (group_id != NULL, NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to get load comps: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get packages in this group */
-	len = md->priv->array_groups->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (md->priv->array_groups, i);
-
-		/* category matches */
-		if (g_strcmp0 (group_id, data->id) == 0) {
-			array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-			for (j=0; j<data->packagelist->len; j++) {
-				packagename = g_ptr_array_index (data->packagelist, j);
-				g_ptr_array_add (array, g_strdup (packagename));
-			}
-			break;
-		}
-	}
-
-	/* nothing found */
-	if (array == NULL) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "could not find group: %s", group_id);
-	}
-out:
-	return array;
-}
-
-/**
- * zif_repo_md_comps_finalize:
- **/
-static void
-zif_repo_md_comps_finalize (GObject *object)
-{
-	ZifRepoMdComps *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD_COMPS (object));
-	md = ZIF_REPO_MD_COMPS (object);
-
-	g_ptr_array_unref (md->priv->array_groups);
-	g_ptr_array_unref (md->priv->array_categories);
-
-	G_OBJECT_CLASS (zif_repo_md_comps_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_comps_class_init:
- **/
-static void
-zif_repo_md_comps_class_init (ZifRepoMdCompsClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ZifRepoMdClass *repo_md_class = ZIF_REPO_MD_CLASS (klass);
-	object_class->finalize = zif_repo_md_comps_finalize;
-
-	/* map */
-	repo_md_class->load = zif_repo_md_comps_load;
-	repo_md_class->unload = zif_repo_md_comps_unload;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdCompsPrivate));
-}
-
-/**
- * zif_repo_md_comps_init:
- **/
-static void
-zif_repo_md_comps_init (ZifRepoMdComps *md)
-{
-	md->priv = ZIF_REPO_MD_COMPS_GET_PRIVATE (md);
-	md->priv->loaded = FALSE;
-	md->priv->section = ZIF_REPO_MD_COMPS_SECTION_UNKNOWN;
-	md->priv->section_group = ZIF_REPO_MD_COMPS_SECTION_GROUP_UNKNOWN;
-	md->priv->section_group_type = ZIF_REPO_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN;
-	md->priv->section_category = ZIF_REPO_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
-	md->priv->group_data_temp = NULL;
-	md->priv->category_data_temp = NULL;
-	md->priv->array_groups = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_repo_md_comps_group_data_free);
-	md->priv->array_categories = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_repo_md_comps_category_data_free);
-}
-
-/**
- * zif_repo_md_comps_new:
- *
- * Return value: A new #ZifRepoMdComps class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMdComps *
-zif_repo_md_comps_new (void)
-{
-	ZifRepoMdComps *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD_COMPS, NULL);
-	return ZIF_REPO_MD_COMPS (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_comps_test (EggTest *test)
-{
-	ZifRepoMdComps *md;
-	gboolean ret;
-	GError *error = NULL;
-	GPtrArray *array;
-	const gchar *id;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-	PkCategory *category;
-
-	if (!egg_test_start (test, "ZifRepoMdComps"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-
-	/************************************************************/
-	egg_test_title (test, "get repo_md_comps md");
-	md = zif_repo_md_comps_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (ZIF_REPO_MD (md), "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set type");
-	ret = zif_repo_md_set_mdtype (ZIF_REPO_MD (md), ZIF_REPO_MD_TYPE_COMPS_XML);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set filename");
-	ret = zif_repo_md_set_filename (ZIF_REPO_MD (md), "../test/cache/comps-rawhide.xml");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum type");
-	ret = zif_repo_md_set_checksum_type (ZIF_REPO_MD (md), G_CHECKSUM_SHA256);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum uncompressed");
-	ret = zif_repo_md_set_checksum_uncompressed (ZIF_REPO_MD (md), "14f17b894303b4dc9683511104848f75d98cea8f76c107bf25e1b4db5741f6a8");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "get categories");
-	array = zif_repo_md_comps_get_categories (md, cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get categories '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	if (array->len == 1)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "incorrect value %i", array->len);
-
-	/************************************************************/
-	egg_test_title (test, "correct id value");
-	category = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (pk_category_get_id (category), "apps") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct id '%s'", pk_category_get_id (category));
-
-	/************************************************************/
-	egg_test_title (test, "correct name value");
-	category = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (pk_category_get_name (category), "Applications") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct name '%s'", pk_category_get_name (category));
-
-	/************************************************************/
-	egg_test_title (test, "correct summary value");
-	category = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (pk_category_get_summary (category), "Applications to perform a variety of tasks") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct summary '%s'", pk_category_get_summary (category));
-
-	g_ptr_array_unref (array);
-
-	/************************************************************/
-	egg_test_title (test, "get groups for category");
-	array = zif_repo_md_comps_get_groups_for_category (md, "apps", cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get categories '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	if (array->len == 2)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "incorrect value %i", array->len);
-
-	/************************************************************/
-	egg_test_title (test, "correct id value");
-	category = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (pk_category_get_id (category), "admin-tools") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct id '%s'", pk_category_get_id (category));
-	g_ptr_array_unref (array);
-
-	/************************************************************/
-	egg_test_title (test, "get packages for group");
-	array = zif_repo_md_comps_get_packages_for_group (md, "admin-tools", cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get categories '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	if (array->len == 2)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "incorrect value %i", array->len);
-
-	/************************************************************/
-	egg_test_title (test, "correct value");
-	id = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (id, "gnome-packagekit") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct id '%s'", id);
-	g_ptr_array_unref (array);
-
-	g_object_unref (md);
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md-comps.h b/backends/yum/libzif/zif-repo-md-comps.h
deleted file mode 100644
index e2cef0d..0000000
--- a/backends/yum/libzif/zif-repo-md-comps.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_COMPS_H
-#define __ZIF_REPO_MD_COMPS_H
-
-#include <glib-object.h>
-
-#include "zif-repo-md.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD_COMPS		(zif_repo_md_comps_get_type ())
-#define ZIF_REPO_MD_COMPS(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD_COMPS, ZifRepoMdComps))
-#define ZIF_REPO_MD_COMPS_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD_COMPS, ZifRepoMdCompsClass))
-#define ZIF_IS_REPO_MD_COMPS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD_COMPS))
-#define ZIF_IS_REPO_MD_COMPS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD_COMPS))
-#define ZIF_REPO_MD_COMPS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD_COMPS, ZifRepoMdCompsClass))
-
-typedef struct _ZifRepoMdComps		ZifRepoMdComps;
-typedef struct _ZifRepoMdCompsPrivate	ZifRepoMdCompsPrivate;
-typedef struct _ZifRepoMdCompsClass	ZifRepoMdCompsClass;
-
-struct _ZifRepoMdComps
-{
-	ZifRepoMd			 parent;
-	ZifRepoMdCompsPrivate		*priv;
-};
-
-struct _ZifRepoMdCompsClass
-{
-	ZifRepoMdClass			 parent_class;
-};
-
-GType		 zif_repo_md_comps_get_type		(void);
-ZifRepoMdComps	*zif_repo_md_comps_new			(void);
-
-GPtrArray	*zif_repo_md_comps_get_categories		(ZifRepoMdComps		*md,
-								 GCancellable		*cancellable,
-								 ZifCompletion		*completion,
-								 GError			**error);
-GPtrArray	*zif_repo_md_comps_get_groups_for_category	(ZifRepoMdComps		*md,
-								 const gchar		*category_id,
-								 GCancellable		*cancellable,
-								 ZifCompletion		*completion,
-								 GError			**error);
-GPtrArray	*zif_repo_md_comps_get_packages_for_group	(ZifRepoMdComps		*md,
-								 const gchar		*group_id,
-								 GCancellable		*cancellable,
-								 ZifCompletion		*completion,
-								 GError			**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_COMPS_H */
-
diff --git a/backends/yum/libzif/zif-repo-md-filelists.c b/backends/yum/libzif/zif-repo-md-filelists.c
deleted file mode 100644
index 0bd808a..0000000
--- a/backends/yum/libzif/zif-repo-md-filelists.c
+++ /dev/null
@@ -1,449 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md-filelists
- * @short_description: File list metadata functionality
- *
- * Provide access to the file list metadata.
- * This object is a subclass of #ZifRepoMd
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <glib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sqlite3.h>
-#include <gio/gio.h>
-
-#include "zif-repo-md.h"
-#include "zif-repo-md-filelists.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_FILELISTS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD_FILELISTS, ZifRepoMdFilelistsPrivate))
-
-/**
- * ZifRepoMdFilelistsPrivate:
- *
- * Private #ZifRepoMdFilelists data
- **/
-struct _ZifRepoMdFilelistsPrivate
-{
-	gboolean		 loaded;
-	sqlite3			*db;
-};
-
-typedef struct {
-	gchar			*filename;
-	GPtrArray		*array;
-} ZifRepoMdFilelistsData;
-
-G_DEFINE_TYPE (ZifRepoMdFilelists, zif_repo_md_filelists, ZIF_TYPE_REPO_MD)
-
-/**
- * zif_repo_md_filelists_unload:
- **/
-static gboolean
-zif_repo_md_filelists_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = FALSE;
-	return ret;
-}
-
-/**
- * zif_repo_md_filelists_load:
- **/
-static gboolean
-zif_repo_md_filelists_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	const gchar *filename;
-	gint rc;
-	ZifRepoMdFilelists *filelists = ZIF_REPO_MD_FILELISTS (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_FILELISTS (md), FALSE);
-
-	/* already loaded */
-	if (filelists->priv->loaded)
-		goto out;
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to get filename for filelists");
-		goto out;
-	}
-
-	/* open database */
-	egg_debug ("filename = %s", filename);
-	rc = sqlite3_open (filename, &filelists->priv->db);
-	if (rc != 0) {
-		egg_warning ("Can't open database: %s\n", sqlite3_errmsg (filelists->priv->db));
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-			     "can't open database: %s", sqlite3_errmsg (filelists->priv->db));
-		goto out;
-	}
-
-	/* we don't need to keep syncing */
-	sqlite3_exec (filelists->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
-	filelists->priv->loaded = TRUE;
-out:
-	return filelists->priv->loaded;
-}
-
-/**
- * zif_store_remote_sqlite_get_id_cb:
- **/
-static gint
-zif_repo_md_filelists_sqlite_get_id_cb (void *data, gint argc, gchar **argv, gchar **col_name)
-{
-	gchar **pkgid = (gchar **) data;
-	*pkgid = g_strdup (argv[0]);
-	return 0;
-}
-
-/**
- * zif_repo_md_filelists_sqlite_get_files_cb:
- **/
-static gint
-zif_repo_md_filelists_sqlite_get_files_cb (void *data, gint argc, gchar **argv, gchar **col_name)
-{
-	gint i;
-	gchar **filenames = NULL;
-	gchar **filenames_r = NULL;
-	gchar **id_r = NULL;
-	ZifRepoMdFilelistsData *fldata = (ZifRepoMdFilelistsData *) data;
-
-	/* get pointers to the arguments */
-	for (i=0;i<argc;i++) {
-		if (g_strcmp0 (col_name[i], "pkgKey") == 0)
-			id_r = &argv[i];
-		else if (g_strcmp0 (col_name[i], "filenames") == 0)
-			filenames_r = &argv[i];
-	}
-
-	/* either is undereferencable */
-	if (filenames_r == NULL || id_r == NULL) {
-		egg_warning ("no file data");
-		goto out;
-	}
-
-	/* split the filenames */
-	filenames = g_strsplit (*filenames_r, "/", -1);
-	for (i=0; filenames[i] != NULL ;i++) {
-		/* do we match */
-		if (g_strcmp0 (fldata->filename, filenames[i]) == 0) {
-			egg_debug ("found %s for %s", filenames[i], *id_r);
-			g_ptr_array_add (fldata->array, GUINT_TO_POINTER (atoi (*id_r)));
-		}
-	}
-out:
-	g_strfreev (filenames);
-	return 0;
-}
-
-/**
- * zif_repo_md_filelists_search_file:
- * @md: the #ZifRepoMdFilelists object
- * @search: the full path that should be searched for
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Gets a list of all packages that contain the file.
- * Results are pkgId's descriptors, i.e. 64 bit hashes as test.
- *
- * Return value: a string list of pkgId's
- **/
-GPtrArray *
-zif_repo_md_filelists_search_file (ZifRepoMdFilelists *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	GPtrArray *array = NULL;
-	gchar *statement = NULL;
-	gchar *error_msg = NULL;
-	gint rc;
-	gboolean ret;
-	guint i;
-	GError *error_local = NULL;
-	gchar *filename = NULL;
-	gchar *dirname = NULL;
-	ZifRepoMdFilelistsData *data = NULL;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_FILELISTS (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to load store file: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* split the search term into directory and filename */
-	dirname = g_path_get_dirname (search);
-	filename = g_path_get_basename (search);
-	egg_debug ("dirname=%s, filename=%s", dirname, filename);
-
-	/* create data struct we can pass to the callback */
-	data = g_new0 (ZifRepoMdFilelistsData, 1);
-	data->filename = g_path_get_basename (search);
-	data->array = g_ptr_array_new ();
-
-	/* populate _array with guint pkgKey */
-	statement = g_strdup_printf ("SELECT filenames, pkgKey FROM filelist WHERE dirname = '%s'", dirname);
-	rc = sqlite3_exec (md->priv->db, statement, zif_repo_md_filelists_sqlite_get_files_cb, data, &error_msg);
-	g_free (statement);
-	if (rc != SQLITE_OK) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-			     "SQL error (failed to get keys): %s\n", error_msg);
-		sqlite3_free (error_msg);
-		goto out;
-	}
-
-	/* convert each pkgKey */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-	for (i=0; i<data->array->len; i++) {
-		guint key;
-		gchar *pkgid = NULL;
-
-		/* convert the pkgKey to a pkgId */
-		key = GPOINTER_TO_UINT (g_ptr_array_index (data->array, i));
-		statement = g_strdup_printf ("SELECT pkgId FROM packages WHERE pkgKey = %i LIMIT 1", key);
-		rc = sqlite3_exec (md->priv->db, statement, zif_repo_md_filelists_sqlite_get_id_cb, &pkgid, &error_msg);
-		g_free (statement);
-		if (rc != SQLITE_OK) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-				     "SQL error (failed to get packages): %s", error_msg);
-			sqlite3_free (error_msg);
-			goto out;
-		}
-
-		/* we failed to get any results */
-		if (pkgid == NULL) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-				     "failed to resolve pkgKey: %i", key);
-			goto out;
-		}
-
-		/* added to tracked array, so no need to free pkgid */
-		g_ptr_array_add (array, pkgid);
-	}
-out:
-	if (data != NULL) {
-		g_free (data->filename);
-		g_ptr_array_unref (data->array);
-		g_free (data);
-	}
-	g_free (dirname);
-	g_free (filename);
-	return array;
-}
-
-/**
- * zif_repo_md_filelists_finalize:
- **/
-static void
-zif_repo_md_filelists_finalize (GObject *object)
-{
-	ZifRepoMdFilelists *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD_FILELISTS (object));
-	md = ZIF_REPO_MD_FILELISTS (object);
-
-	sqlite3_close (md->priv->db);
-
-	G_OBJECT_CLASS (zif_repo_md_filelists_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_filelists_class_init:
- **/
-static void
-zif_repo_md_filelists_class_init (ZifRepoMdFilelistsClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ZifRepoMdClass *repo_md_class = ZIF_REPO_MD_CLASS (klass);
-	object_class->finalize = zif_repo_md_filelists_finalize;
-
-	/* map */
-	repo_md_class->load = zif_repo_md_filelists_load;
-	repo_md_class->unload = zif_repo_md_filelists_unload;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdFilelistsPrivate));
-}
-
-/**
- * zif_repo_md_filelists_init:
- **/
-static void
-zif_repo_md_filelists_init (ZifRepoMdFilelists *md)
-{
-	md->priv = ZIF_REPO_MD_FILELISTS_GET_PRIVATE (md);
-	md->priv->loaded = FALSE;
-	md->priv->db = NULL;
-}
-
-/**
- * zif_repo_md_filelists_new:
- *
- * Return value: A new #ZifRepoMdFilelists class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMdFilelists *
-zif_repo_md_filelists_new (void)
-{
-	ZifRepoMdFilelists *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD_FILELISTS, NULL);
-	return ZIF_REPO_MD_FILELISTS (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_filelists_test (EggTest *test)
-{
-	ZifRepoMdFilelists *md;
-	gboolean ret;
-	GError *error = NULL;
-	GPtrArray *array;
-	const gchar *pkgid;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-
-	if (!egg_test_start (test, "ZifRepoMdFilelists"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-
-	/************************************************************/
-	egg_test_title (test, "get store_remote md");
-	md = zif_repo_md_filelists_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (ZIF_REPO_MD (md), "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set type");
-	ret = zif_repo_md_set_mdtype (ZIF_REPO_MD (md), ZIF_REPO_MD_TYPE_FILELISTS_DB);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum type");
-	ret = zif_repo_md_set_checksum_type (ZIF_REPO_MD (md), G_CHECKSUM_SHA256);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum compressed");
-	ret = zif_repo_md_set_checksum (ZIF_REPO_MD (md), "e00e88a8b6eee3798544764b6fe31ef8c9d071a824177c7cdc4fe749289198a9");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum uncompressed");
-	ret = zif_repo_md_set_checksum_uncompressed (ZIF_REPO_MD (md), "2b4336cb43e75610662bc0b3a362ca4cb7ba874528735a27c0d55148c3901792");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set filename");
-	ret = zif_repo_md_set_filename (ZIF_REPO_MD (md), "../test/cache/fedora/e00e88a8b6eee3798544764b6fe31ef8c9d071a824177c7cdc4fe749289198a9-filelists.sqlite.bz2");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "load");
-	ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to load '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "search for files");
-	array = zif_repo_md_filelists_search_file (md, "/usr/bin/gnome-power-manager", cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to search '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	egg_test_assert (test, array->len == 1);
-
-	/************************************************************/
-	egg_test_title (test, "correct value");
-	pkgid = g_ptr_array_index (array, 0);
-	if (pkgid[0] != '\0' && strlen (pkgid) == 64)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get a correct pkgId '%s' (%i)", pkgid, strlen (pkgid));
-	g_ptr_array_unref (array);
-
-	g_object_unref (md);
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md-filelists.h b/backends/yum/libzif/zif-repo-md-filelists.h
deleted file mode 100644
index 465fd4f..0000000
--- a/backends/yum/libzif/zif-repo-md-filelists.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_FILELISTS_H
-#define __ZIF_REPO_MD_FILELISTS_H
-
-#include <glib-object.h>
-
-#include "zif-repo-md.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD_FILELISTS		(zif_repo_md_filelists_get_type ())
-#define ZIF_REPO_MD_FILELISTS(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD_FILELISTS, ZifRepoMdFilelists))
-#define ZIF_REPO_MD_FILELISTS_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD_FILELISTS, ZifRepoMdFilelistsClass))
-#define ZIF_IS_REPO_MD_FILELISTS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD_FILELISTS))
-#define ZIF_IS_REPO_MD_FILELISTS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD_FILELISTS))
-#define ZIF_REPO_MD_FILELISTS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD_FILELISTS, ZifRepoMdFilelistsClass))
-
-typedef struct _ZifRepoMdFilelists		ZifRepoMdFilelists;
-typedef struct _ZifRepoMdFilelistsPrivate	ZifRepoMdFilelistsPrivate;
-typedef struct _ZifRepoMdFilelistsClass		ZifRepoMdFilelistsClass;
-
-struct _ZifRepoMdFilelists
-{
-	ZifRepoMd			 parent;
-	ZifRepoMdFilelistsPrivate	*priv;
-};
-
-struct _ZifRepoMdFilelistsClass
-{
-	ZifRepoMdClass			 parent_class;
-};
-
-GType			 zif_repo_md_filelists_get_type		(void);
-ZifRepoMdFilelists	*zif_repo_md_filelists_new		(void);
-GPtrArray		*zif_repo_md_filelists_search_file	(ZifRepoMdFilelists	*md,
-								 const gchar		*search,
-								 GCancellable		*cancellable,
-								 ZifCompletion		*completion,
-								 GError			**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_FILELISTS_H */
-
diff --git a/backends/yum/libzif/zif-repo-md-metalink.c b/backends/yum/libzif/zif-repo-md-metalink.c
deleted file mode 100644
index 743a133..0000000
--- a/backends/yum/libzif/zif-repo-md-metalink.c
+++ /dev/null
@@ -1,503 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md-metalink
- * @short_description: Metalink metadata functionality
- *
- * Provide access to the metalink repo metadata.
- * This object is a subclass of #ZifRepoMd
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <glib.h>
-#include <string.h>
-
-#include "zif-repo-md.h"
-#include "zif-repo-md-metalink.h"
-#include "zif-config.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_METALINK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD_METALINK, ZifRepoMdMetalinkPrivate))
-
-typedef enum {
-	ZIF_REPO_MD_METALINK_PARSER_SECTION_URL,
-	ZIF_REPO_MD_METALINK_PARSER_SECTION_UNKNOWN
-} ZifRepoMdMetalinkParserSection;
-
-typedef enum {
-	ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_FTP,
-	ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_HTTP,
-	ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_RSYNC,
-	ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_UNKNOWN
-} ZifRepoMdMetalinkProtocolType;
-
-typedef struct {
-	ZifRepoMdMetalinkProtocolType	 protocol;
-	gchar				*uri;
-	guint				 preference;
-} ZifRepoMdMetalinkData;
-
-/**
- * ZifRepoMdMetalinkPrivate:
- *
- * Private #ZifRepoMdMetalink data
- **/
-struct _ZifRepoMdMetalinkPrivate
-{
-	gboolean			 loaded;
-	GPtrArray			*array;
-	ZifConfig			*config;
-	/* for parser */
-	ZifRepoMdMetalinkParserSection	 section;
-	ZifRepoMdMetalinkData		*temp;
-};
-
-G_DEFINE_TYPE (ZifRepoMdMetalink, zif_repo_md_metalink, ZIF_TYPE_REPO_MD)
-
-/**
- * zif_repo_md_metalink_protocol_type_from_text:
- **/
-static ZifRepoMdMetalinkProtocolType
-zif_repo_md_metalink_protocol_type_from_text (const gchar *type_text)
-{
-	if (g_strcmp0 (type_text, "ftp") == 0)
-		return ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_FTP;
-	if (g_strcmp0 (type_text, "http") == 0)
-		return ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_HTTP;
-	if (g_strcmp0 (type_text, "rsync") == 0)
-		return ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_RSYNC;
-	return ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_UNKNOWN;
-}
-
-/**
- * zif_repo_md_metalink_parser_start_element:
- **/
-static void
-zif_repo_md_metalink_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
-					   const gchar **attribute_names, const gchar **attribute_values,
-					   gpointer user_data, GError **error)
-{
-	guint i;
-	ZifRepoMdMetalink *metalink = user_data;
-
-	g_return_if_fail (ZIF_IS_REPO_MD_METALINK (metalink));
-	g_return_if_fail (metalink->priv->temp == NULL);
-
-	/* just ignore non url entries */
-	if (g_strcmp0 (element_name, "url") != 0) {
-		metalink->priv->temp = NULL;
-		metalink->priv->section = ZIF_REPO_MD_METALINK_PARSER_SECTION_UNKNOWN;
-		goto out;
-	}
-
-	/* create new element */
-	metalink->priv->section = ZIF_REPO_MD_METALINK_PARSER_SECTION_URL;
-	metalink->priv->temp = g_new0 (ZifRepoMdMetalinkData, 1);
-
-	/* read keys */
-	for (i=0; attribute_names[i] != NULL; i++) {
-		if (g_strcmp0 (attribute_names[i], "protocol") == 0)
-			metalink->priv->temp->protocol = zif_repo_md_metalink_protocol_type_from_text (attribute_values[i]);
-		if (g_strcmp0 (attribute_names[i], "preference") == 0)
-			metalink->priv->temp->preference = atoi (attribute_values[i]);
-	}
-
-	/* add to array */
-	g_ptr_array_add (metalink->priv->array, metalink->priv->temp);
-out:
-	return;
-}
-
-/**
- * zif_repo_md_metalink_parser_end_element:
- **/
-static void
-zif_repo_md_metalink_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
-					 gpointer user_data, GError **error)
-{
-	ZifRepoMdMetalink *metalink = user_data;
-	metalink->priv->temp = NULL;
-	metalink->priv->section = ZIF_REPO_MD_METALINK_PARSER_SECTION_UNKNOWN;
-}
-
-/**
- * zif_repo_md_metalink_parser_text:
- **/
-static void
-zif_repo_md_metalink_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
-				  gpointer user_data, GError **error)
-
-{
-	ZifRepoMdMetalink *metalink = user_data;
-	gchar *uri = NULL;
-	guint len;
-
-	if (metalink->priv->section != ZIF_REPO_MD_METALINK_PARSER_SECTION_URL)
-		goto out;
-
-	/* shouldn't happen */
-	if (metalink->priv->temp == NULL) {
-		egg_warning ("no data, so cannot save %s!", text);
-		goto out;
-	}
-
-	/* save uri */
-	if (metalink->priv->temp->uri != NULL) {
-		egg_warning ("previously set uri to '%s', cannot overwrite with '%s'", metalink->priv->temp->uri, text);
-		goto out;
-	}
-
-	/* copy */
-	uri = g_strdup (text);
-
-	/* do we need to trim the junk from the end */
-	if (g_str_has_suffix (uri, "/repodata/repomd.xml")) {
-		len = strlen (uri);
-		uri[len-19] = '\0';
-	}
-
-	/* save */
-	metalink->priv->temp->uri = g_strdup (uri);
-out:
-	g_free (uri);
-	return;
-}
-
-/**
- * zif_repo_md_metalink_unload:
- **/
-static gboolean
-zif_repo_md_metalink_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = FALSE;
-	return ret;
-}
-
-/**
- * zif_repo_md_metalink_load:
- **/
-static gboolean
-zif_repo_md_metalink_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = TRUE;
-	gchar *contents = NULL;
-	const gchar *filename;
-	gsize size;
-	GMarkupParseContext *context = NULL;
-	const GMarkupParser gpk_repo_md_metalink_markup_parser = {
-		zif_repo_md_metalink_parser_start_element,
-		zif_repo_md_metalink_parser_end_element,
-		zif_repo_md_metalink_parser_text,
-		NULL, /* passthrough */
-		NULL /* error */
-	};
-	ZifRepoMdMetalink *metalink = ZIF_REPO_MD_METALINK (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_METALINK (md), FALSE);
-
-	/* already loaded */
-	if (metalink->priv->loaded)
-		goto out;
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to get filename for metalink");
-		goto out;
-	}
-
-	/* open database */
-	egg_debug ("filename = %s", filename);
-
-	/* get repo contents */
-	ret = g_file_get_contents (filename, &contents, &size, error);
-	if (!ret)
-		goto out;
-
-	/* create parser */
-	context = g_markup_parse_context_new (&gpk_repo_md_metalink_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, metalink, NULL);
-
-	/* parse data */
-	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
-	if (!ret)
-		goto out;
-
-	metalink->priv->loaded = TRUE;
-out:
-	if (context != NULL)
-		g_markup_parse_context_free (context);
-	g_free (contents);
-	return ret;
-}
-
-/**
- * zif_repo_md_metalink_get_uris:
- * @md: the #ZifRepoMdMetalink object
- * @threshold: the threshold in percent
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all mirrors we should use.
- *
- * Return value: the uris to use as an array of strings
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_metalink_get_uris (ZifRepoMdMetalink *md, guint threshold, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret;
-	guint len;
-	gchar *uri;
-	GPtrArray *array = NULL;
-	GError *error_local = NULL;
-	ZifRepoMdMetalinkData *data;
-	guint i;
-	ZifRepoMdMetalink *metalink = ZIF_REPO_MD_METALINK (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_METALINK (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* if not already loaded, load */
-	if (!metalink->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to get mirrors from metalink: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get list */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-	len = metalink->priv->array->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (metalink->priv->array, i);
-
-		/* ignore not http mirrors */
-		if (data->protocol != ZIF_REPO_MD_METALINK_PROTOCOL_TYPE_HTTP)
-			continue;
-
-		/* ignore low priority */
-		if (data->preference >= threshold) {
-			uri = zif_config_expand_substitutions (md->priv->config, data->uri, &error_local);
-			if (uri == NULL) {
-				g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-					     "failed to expand substitutions: %s", error_local->message);
-				g_error_free (error_local);
-				/* rip apart what we've done already */
-				g_ptr_array_unref (array);
-				array = NULL;
-				goto out;
-			}
-			g_ptr_array_add (array, uri);
-		}
-	}
-out:
-	return array;
-}
-
-/**
- * zif_repo_md_metalink_free_data:
- **/
-static void
-zif_repo_md_metalink_free_data (ZifRepoMdMetalinkData *data)
-{
-	g_free (data->uri);
-	g_free (data);
-}
-
-/**
- * zif_repo_md_metalink_finalize:
- **/
-static void
-zif_repo_md_metalink_finalize (GObject *object)
-{
-	ZifRepoMdMetalink *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD_METALINK (object));
-	md = ZIF_REPO_MD_METALINK (object);
-
-	g_ptr_array_unref (md->priv->array);
-	g_object_unref (md->priv->config);
-
-	G_OBJECT_CLASS (zif_repo_md_metalink_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_metalink_class_init:
- **/
-static void
-zif_repo_md_metalink_class_init (ZifRepoMdMetalinkClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ZifRepoMdClass *repo_md_class = ZIF_REPO_MD_CLASS (klass);
-	object_class->finalize = zif_repo_md_metalink_finalize;
-
-	/* map */
-	repo_md_class->load = zif_repo_md_metalink_load;
-	repo_md_class->unload = zif_repo_md_metalink_unload;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdMetalinkPrivate));
-}
-
-/**
- * zif_repo_md_metalink_init:
- **/
-static void
-zif_repo_md_metalink_init (ZifRepoMdMetalink *md)
-{
-	md->priv = ZIF_REPO_MD_METALINK_GET_PRIVATE (md);
-	md->priv->loaded = FALSE;
-	md->priv->config = zif_config_new ();
-	md->priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_repo_md_metalink_free_data);
-}
-
-/**
- * zif_repo_md_metalink_new:
- *
- * Return value: A new #ZifRepoMdMetalink class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMdMetalink *
-zif_repo_md_metalink_new (void)
-{
-	ZifRepoMdMetalink *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD_METALINK, NULL);
-	return ZIF_REPO_MD_METALINK (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_metalink_test (EggTest *test)
-{
-	ZifRepoMdMetalink *md;
-	gboolean ret;
-	GError *error = NULL;
-	GPtrArray *array;
-	const gchar *uri;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-	ZifConfig *config;
-
-	if (!egg_test_start (test, "ZifRepoMdMetalink"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-	config = zif_config_new ();
-	zif_config_set_filename (config, "../test/etc/yum.conf", NULL);
-
-	/************************************************************/
-	egg_test_title (test, "get repo_md_metalink md");
-	md = zif_repo_md_metalink_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (ZIF_REPO_MD (md), "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set type");
-	ret = zif_repo_md_set_mdtype (ZIF_REPO_MD (md), ZIF_REPO_MD_TYPE_METALINK);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set filename");
-	ret = zif_repo_md_set_filename (ZIF_REPO_MD (md), "../test/cache/fedora/metalink.xml");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "load");
-	ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to load '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "get uris");
-	array = zif_repo_md_metalink_get_uris (md, 50, cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to search '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	if (array->len == 47)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "incorrect value %i", array->len);
-
-	/************************************************************/
-	egg_test_title (test, "correct value");
-	uri = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (uri, "http://www.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/releases/12/Everything/i386/os/") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct url '%s'", uri);
-	g_ptr_array_unref (array);
-
-	g_object_unref (md);
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-	g_object_unref (config);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md-metalink.h b/backends/yum/libzif/zif-repo-md-metalink.h
deleted file mode 100644
index 3d2971f..0000000
--- a/backends/yum/libzif/zif-repo-md-metalink.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_METALINK_H
-#define __ZIF_REPO_MD_METALINK_H
-
-#include <glib-object.h>
-
-#include "zif-repo-md.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD_METALINK		(zif_repo_md_metalink_get_type ())
-#define ZIF_REPO_MD_METALINK(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD_METALINK, ZifRepoMdMetalink))
-#define ZIF_REPO_MD_METALINK_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD_METALINK, ZifRepoMdMetalinkClass))
-#define ZIF_IS_REPO_MD_METALINK(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD_METALINK))
-#define ZIF_IS_REPO_MD_METALINK_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD_METALINK))
-#define ZIF_REPO_MD_METALINK_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD_METALINK, ZifRepoMdMetalinkClass))
-
-typedef struct _ZifRepoMdMetalink		ZifRepoMdMetalink;
-typedef struct _ZifRepoMdMetalinkPrivate	ZifRepoMdMetalinkPrivate;
-typedef struct _ZifRepoMdMetalinkClass		ZifRepoMdMetalinkClass;
-
-struct _ZifRepoMdMetalink
-{
-	ZifRepoMd			 parent;
-	ZifRepoMdMetalinkPrivate	*priv;
-};
-
-struct _ZifRepoMdMetalinkClass
-{
-	ZifRepoMdClass			 parent_class;
-};
-
-GType		 zif_repo_md_metalink_get_type		(void);
-ZifRepoMdMetalink *zif_repo_md_metalink_new		(void);
-GPtrArray	*zif_repo_md_metalink_get_uris		(ZifRepoMdMetalink	*md,
-							 guint			 threshold,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_METALINK_H */
-
diff --git a/backends/yum/libzif/zif-repo-md-mirrorlist.c b/backends/yum/libzif/zif-repo-md-mirrorlist.c
deleted file mode 100644
index cd9077e..0000000
--- a/backends/yum/libzif/zif-repo-md-mirrorlist.c
+++ /dev/null
@@ -1,347 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md-mirrorlist
- * @short_description: Mirrorlist metadata functionality
- *
- * Provide access to the mirrorlist repo metadata.
- * This object is a subclass of #ZifRepoMd
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <glib.h>
-
-#include "zif-repo-md.h"
-#include "zif-repo-md-mirrorlist.h"
-#include "zif-config.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_MIRRORLIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD_MIRRORLIST, ZifRepoMdMirrorlistPrivate))
-
-/**
- * ZifRepoMdMirrorlistPrivate:
- *
- * Private #ZifRepoMdMirrorlist data
- **/
-struct _ZifRepoMdMirrorlistPrivate
-{
-	gboolean			 loaded;
-	GPtrArray			*array;
-	ZifConfig			*config;
-};
-
-G_DEFINE_TYPE (ZifRepoMdMirrorlist, zif_repo_md_mirrorlist, ZIF_TYPE_REPO_MD)
-
-/**
- * zif_repo_md_mirrorlist_unload:
- **/
-static gboolean
-zif_repo_md_mirrorlist_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = FALSE;
-	return ret;
-}
-
-/**
- * zif_repo_md_mirrorlist_load:
- **/
-static gboolean
-zif_repo_md_mirrorlist_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = TRUE;
-	gchar *contents = NULL;
-	const gchar *filename;
-	gchar **lines = NULL;
-	guint i;
-	ZifRepoMdMirrorlist *mirrorlist = ZIF_REPO_MD_MIRRORLIST (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_MIRRORLIST (md), FALSE);
-
-	/* already loaded */
-	if (mirrorlist->priv->loaded)
-		goto out;
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to get filename for mirrorlist");
-		goto out;
-	}
-
-	/* open database */
-	egg_debug ("filename = %s", filename);
-
-	/* get repo contents */
-	ret = g_file_get_contents (filename, &contents, NULL, error);
-	if (!ret)
-		goto out;
-
-	/* split, and add uris */
-	lines = g_strsplit (contents, "\n", -1);
-	for (i=0; lines[i] != NULL; i++) {
-		if (lines[i][0] == '\0' ||
-		    lines[i][0] == '#')
-			continue;
-		if (g_str_has_prefix (lines[i], "http://"))
-			g_ptr_array_add (mirrorlist->priv->array, g_strdup (lines[i]));
-	}
-
-	mirrorlist->priv->loaded = TRUE;
-out:
-	g_strfreev (lines);
-	g_free (contents);
-	return ret;
-}
-
-/**
- * zif_repo_md_mirrorlist_get_uris:
- * @md: the #ZifRepoMdMirrorlist object
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all mirrors we should use.
- *
- * Return value: the uris to use as an array of strings
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_mirrorlist_get_uris (ZifRepoMdMirrorlist *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret;
-	guint len;
-	GPtrArray *array = NULL;
-	GError *error_local = NULL;
-	const gchar *data;
-	gchar *uri;
-	guint i;
-	ZifRepoMdMirrorlist *mirrorlist = ZIF_REPO_MD_MIRRORLIST (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_MIRRORLIST (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* if not already loaded, load */
-	if (!mirrorlist->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to get uris from mirrorlist: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get list */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-	len = mirrorlist->priv->array->len;
-	for (i=0; i<len; i++) {
-		data = g_ptr_array_index (mirrorlist->priv->array, i);
-		uri = zif_config_expand_substitutions (md->priv->config, data, &error_local);
-		if (uri == NULL) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to expand substitutions: %s", error_local->message);
-			g_error_free (error_local);
-			/* rip apart what we've done already */
-			g_ptr_array_unref (array);
-			array = NULL;
-			goto out;
-		}
-		g_ptr_array_add (array, uri);
-	}
-out:
-	return array;
-}
-
-/**
- * zif_repo_md_mirrorlist_finalize:
- **/
-static void
-zif_repo_md_mirrorlist_finalize (GObject *object)
-{
-	ZifRepoMdMirrorlist *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD_MIRRORLIST (object));
-	md = ZIF_REPO_MD_MIRRORLIST (object);
-
-	g_ptr_array_unref (md->priv->array);
-	g_object_unref (md->priv->config);
-
-	G_OBJECT_CLASS (zif_repo_md_mirrorlist_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_mirrorlist_class_init:
- **/
-static void
-zif_repo_md_mirrorlist_class_init (ZifRepoMdMirrorlistClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ZifRepoMdClass *repo_md_class = ZIF_REPO_MD_CLASS (klass);
-	object_class->finalize = zif_repo_md_mirrorlist_finalize;
-
-	/* map */
-	repo_md_class->load = zif_repo_md_mirrorlist_load;
-	repo_md_class->unload = zif_repo_md_mirrorlist_unload;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdMirrorlistPrivate));
-}
-
-/**
- * zif_repo_md_mirrorlist_init:
- **/
-static void
-zif_repo_md_mirrorlist_init (ZifRepoMdMirrorlist *md)
-{
-	md->priv = ZIF_REPO_MD_MIRRORLIST_GET_PRIVATE (md);
-	md->priv->loaded = FALSE;
-	md->priv->config = zif_config_new ();
-	md->priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
-}
-
-/**
- * zif_repo_md_mirrorlist_new:
- *
- * Return value: A new #ZifRepoMdMirrorlist class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMdMirrorlist *
-zif_repo_md_mirrorlist_new (void)
-{
-	ZifRepoMdMirrorlist *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD_MIRRORLIST, NULL);
-	return ZIF_REPO_MD_MIRRORLIST (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_mirrorlist_test (EggTest *test)
-{
-	ZifRepoMdMirrorlist *md;
-	gboolean ret;
-	GError *error = NULL;
-	GPtrArray *array;
-	const gchar *uri;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-	ZifConfig *config;
-
-	if (!egg_test_start (test, "ZifRepoMdMirrorlist"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-	config = zif_config_new ();
-	zif_config_set_filename (config, "../test/etc/yum.conf", NULL);
-
-	/************************************************************/
-	egg_test_title (test, "get repo_md_mirrorlist md");
-	md = zif_repo_md_mirrorlist_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (ZIF_REPO_MD (md), "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set type");
-	ret = zif_repo_md_set_mdtype (ZIF_REPO_MD (md), ZIF_REPO_MD_TYPE_MIRRORLIST);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set filename");
-	ret = zif_repo_md_set_filename (ZIF_REPO_MD (md), "../test/cache/mirrorlist.txt");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "load");
-	ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to load '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "get uris");
-	array = zif_repo_md_mirrorlist_get_uris (md, cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to search '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	if (array->len == 3)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "incorrect value %i", array->len);
-
-	/************************************************************/
-	egg_test_title (test, "correct value");
-	uri = g_ptr_array_index (array, 0);
-	if (g_strcmp0 (uri, "http://rpm.livna.org/repo/11/i386/") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct url '%s'", uri);
-	g_ptr_array_unref (array);
-
-	g_object_unref (md);
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-	g_object_unref (config);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md-mirrorlist.h b/backends/yum/libzif/zif-repo-md-mirrorlist.h
deleted file mode 100644
index 77cb548..0000000
--- a/backends/yum/libzif/zif-repo-md-mirrorlist.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_MIRRORLIST_H
-#define __ZIF_REPO_MD_MIRRORLIST_H
-
-#include <glib-object.h>
-
-#include "zif-repo-md.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD_MIRRORLIST		(zif_repo_md_mirrorlist_get_type ())
-#define ZIF_REPO_MD_MIRRORLIST(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD_MIRRORLIST, ZifRepoMdMirrorlist))
-#define ZIF_REPO_MD_MIRRORLIST_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD_MIRRORLIST, ZifRepoMdMirrorlistClass))
-#define ZIF_IS_REPO_MD_MIRRORLIST(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD_MIRRORLIST))
-#define ZIF_IS_REPO_MD_MIRRORLIST_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD_MIRRORLIST))
-#define ZIF_REPO_MD_MIRRORLIST_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD_MIRRORLIST, ZifRepoMdMirrorlistClass))
-
-typedef struct _ZifRepoMdMirrorlist		ZifRepoMdMirrorlist;
-typedef struct _ZifRepoMdMirrorlistPrivate	ZifRepoMdMirrorlistPrivate;
-typedef struct _ZifRepoMdMirrorlistClass	ZifRepoMdMirrorlistClass;
-
-struct _ZifRepoMdMirrorlist
-{
-	ZifRepoMd			 parent;
-	ZifRepoMdMirrorlistPrivate	*priv;
-};
-
-struct _ZifRepoMdMirrorlistClass
-{
-	ZifRepoMdClass			 parent_class;
-};
-
-GType		 zif_repo_md_mirrorlist_get_type		(void);
-ZifRepoMdMirrorlist *zif_repo_md_mirrorlist_new		(void);
-GPtrArray	*zif_repo_md_mirrorlist_get_uris	(ZifRepoMdMirrorlist	*md,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_MIRRORLIST_H */
-
diff --git a/backends/yum/libzif/zif-repo-md-primary.c b/backends/yum/libzif/zif-repo-md-primary.c
deleted file mode 100644
index 612cbf7..0000000
--- a/backends/yum/libzif/zif-repo-md-primary.c
+++ /dev/null
@@ -1,749 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md-primary
- * @short_description: Primary metadata functionality
- *
- * Provide access to the primary repo metadata.
- * This object is a subclass of #ZifRepoMd
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <glib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sqlite3.h>
-#include <gio/gio.h>
-
-#include "zif-repo-md.h"
-#include "zif-repo-md-primary.h"
-#include "zif-package-remote.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_PRIMARY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD_PRIMARY, ZifRepoMdPrimaryPrivate))
-
-/**
- * ZifRepoMdPrimaryPrivate:
- *
- * Private #ZifRepoMdPrimary data
- **/
-struct _ZifRepoMdPrimaryPrivate
-{
-	gboolean		 loaded;
-	sqlite3			*db;
-};
-
-typedef struct {
-	const gchar		*id;
-	GPtrArray		*packages;
-} ZifRepoMdPrimaryData;
-
-G_DEFINE_TYPE (ZifRepoMdPrimary, zif_repo_md_primary, ZIF_TYPE_REPO_MD)
-
-/**
- * zif_repo_md_primary_unload:
- **/
-static gboolean
-zif_repo_md_primary_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret = FALSE;
-	return ret;
-}
-
-/**
- * zif_repo_md_primary_load:
- **/
-static gboolean
-zif_repo_md_primary_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	const gchar *filename;
-	gint rc;
-	ZifRepoMdPrimary *primary = ZIF_REPO_MD_PRIMARY (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), FALSE);
-
-	/* already loaded */
-	if (primary->priv->loaded)
-		goto out;
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to get filename for primary");
-		goto out;
-	}
-
-	/* open database */
-	egg_debug ("filename = %s", filename);
-	rc = sqlite3_open (filename, &primary->priv->db);
-	if (rc != 0) {
-		egg_warning ("Can't open database: %s\n", sqlite3_errmsg (primary->priv->db));
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-			     "can't open database: %s", sqlite3_errmsg (primary->priv->db));
-		goto out;
-	}
-
-	/* we don't need to keep syncing */
-	sqlite3_exec (primary->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
-	primary->priv->loaded = TRUE;
-out:
-	return primary->priv->loaded;
-}
-
-/**
- * zif_repo_md_primary_sqlite_create_package_cb:
- **/
-static gint
-zif_repo_md_primary_sqlite_create_package_cb (void *data, gint argc, gchar **argv, gchar **col_name)
-{
-	ZifRepoMdPrimaryData *fldata = (ZifRepoMdPrimaryData *) data;
-	ZifPackageRemote *package;
-
-	package = zif_package_remote_new ();
-	zif_package_remote_set_from_repo (package, argc, col_name, argv, fldata->id, NULL);
-	g_ptr_array_add (fldata->packages, package);
-
-	return 0;
-}
-
-/**
- * zif_repo_md_primary_search:
- **/
-static GPtrArray *
-zif_repo_md_primary_search (ZifRepoMdPrimary *md, const gchar *pred,
-			    GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *statement = NULL;
-	gchar *error_msg = NULL;
-	gint rc;
-	gboolean ret;
-	GError *error_local = NULL;
-	ZifRepoMdPrimaryData *data = NULL;
-	GPtrArray *array = NULL;
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to load repo_md_primary file: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* create data struct we can pass to the callback */
-	data = g_new0 (ZifRepoMdPrimaryData, 1);
-	data->id = zif_repo_md_get_id (ZIF_REPO_MD (md));
-	data->packages = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
-
-	statement = g_strdup_printf ("SELECT pkgId, name, arch, version, "
-				     "epoch, release, summary, description, url, "
-				     "rpm_license, rpm_group, size_package, location_href FROM packages %s", pred);
-	rc = sqlite3_exec (md->priv->db, statement, zif_repo_md_primary_sqlite_create_package_cb, data, &error_msg);
-	if (rc != SQLITE_OK) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-			     "SQL error: %s\n", error_msg);
-		sqlite3_free (error_msg);
-		g_ptr_array_unref (data->packages);
-		goto out;
-	}
-	/* list of packages */
-	array = data->packages;
-out:
-	g_free (data);
-	g_free (statement);
-	return array;
-}
-
-/**
- * zif_repo_md_primary_resolve:
- * @md: the #ZifRepoMdPrimary object
- * @search: the search term, e.g. "gnome-power-manager"
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all remote packages that match the name exactly.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_resolve (ZifRepoMdPrimary *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE name = '%s'", search);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_search_name:
- * @md: the #ZifRepoMdPrimary object
- * @search: the search term, e.g. "power"
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the name.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_search_name (ZifRepoMdPrimary *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE name LIKE '%%%s%%'", search);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_search_details:
- * @md: the #ZifRepoMdPrimary object
- * @search: the search term, e.g. "advanced"
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the name or description.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_search_details (ZifRepoMdPrimary *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%'", search, search, search);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_search_group:
- * @md: the #ZifRepoMdPrimary object
- * @search: the search term, e.g. "games/console"
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the group.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_search_group (ZifRepoMdPrimary *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE rpm_group = '%s'", search);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_search_pkgid:
- * @md: the #ZifRepoMdPrimary object
- * @search: the search term as a 64 bit hash
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the given pkgId.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_search_pkgid (ZifRepoMdPrimary *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE pkgid = '%s'", search);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_search_pkgkey:
- * @md: the #ZifRepoMdPrimary object
- * @pkgkey: the package key, unique to this sqlite file
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the given pkgId.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_search_pkgkey (ZifRepoMdPrimary *md, guint pkgkey,
-				   GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	pred = g_strdup_printf ("WHERE pkgKey = '%i'", pkgkey);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_sqlite_pkgkey_cb:
- **/
-static gint
-zif_repo_md_primary_sqlite_pkgkey_cb (void *data, gint argc, gchar **argv, gchar **col_name)
-{
-	gint i;
-	guint pkgkey;
-	gboolean ret;
-	GPtrArray *array = (GPtrArray *) data;
-
-	/* get the ID */
-	for (i=0; i<argc; i++) {
-		if (g_strcmp0 (col_name[i], "pkgKey") == 0) {
-			ret = egg_strtouint (argv[i], &pkgkey);
-			if (ret)
-				g_ptr_array_add (array, GUINT_TO_POINTER (pkgkey));
-			else
-				egg_warning ("could not parse pkgKey '%s'", argv[i]);
-		} else {
-			egg_warning ("unrecognized: %s=%s", col_name[i], argv[i]);
-		}
-	}
-	return 0;
-}
-
-/**
- * zif_repo_md_primary_what_provides:
- * @md: the #ZifRepoMdPrimary object
- * @search: the provide, e.g. "mimehandler(application/ogg)"
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match the given provide.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_what_provides (ZifRepoMdPrimary *md, const gchar *search,
-				   GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *statement = NULL;
-	gchar *error_msg = NULL;
-	gint rc;
-	gboolean ret;
-	GError *error_local = NULL;
-	GPtrArray *array = NULL;
-	GPtrArray *array_tmp = NULL;
-	GPtrArray *pkgkey_array = NULL;
-	guint i;
-	guint pkgkey;
-	ZifCompletion *completion_local;
-	ZifCompletion *completion_loop;
-	ZifPackage *package;
-
-	/* setup completion */
-	if (md->priv->loaded)
-		zif_completion_set_number_steps (completion, 2);
-	else
-		zif_completion_set_number_steps (completion, 3);
-
-	/* if not already loaded, load */
-	if (!md->priv->loaded) {
-		completion_local = zif_completion_get_child (completion);
-		ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion_local, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-				     "failed to load repo_md_primary file: %s", error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-
-		/* this section done */
-		zif_completion_done (completion);
-	}
-
-	/* create data struct we can pass to the callback */
-	pkgkey_array = g_ptr_array_new ();
-	statement = g_strdup_printf ("SELECT pkgKey FROM provides WHERE name = '%s'", search);
-	rc = sqlite3_exec (md->priv->db, statement, zif_repo_md_primary_sqlite_pkgkey_cb, pkgkey_array, &error_msg);
-	if (rc != SQLITE_OK) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_BAD_SQL,
-			     "SQL error: %s\n", error_msg);
-		sqlite3_free (error_msg);
-		goto out;
-	}
-
-	/* this section done */
-	zif_completion_done (completion);
-
-	/* output array */
-	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
-
-	/* resolve each pkgkey to a package */
-	completion_local = zif_completion_get_child (completion);
-	if (pkgkey_array->len > 0)
-		zif_completion_set_number_steps (completion_local, pkgkey_array->len);
-	for (i=0; i<pkgkey_array->len; i++) {
-		pkgkey = GPOINTER_TO_UINT (g_ptr_array_index (pkgkey_array, i));
-
-		/* get packages for pkgKey */
-		completion_loop = zif_completion_get_child (completion_local);
-		array_tmp = zif_repo_md_primary_search_pkgkey (md, pkgkey, cancellable, completion, error);
-		if (array_tmp == NULL) {
-			g_ptr_array_unref (array);
-			array = NULL;
-			goto out;
-		}
-
-		/* check we only got one result */
-		if (array_tmp->len == 0) {
-			egg_warning ("no package for pkgKey %i", pkgkey);
-		} else if (array_tmp->len > 1 || array_tmp->len == 0) {
-			egg_warning ("more than one package for pkgKey %i", pkgkey);
-		} else {
-			package = g_ptr_array_index (array_tmp, 0);
-			g_ptr_array_add (array, g_object_ref (package));
-		}
-
-		/* clear array */
-		g_ptr_array_unref (array_tmp);
-	}
-
-	/* this section done */
-	zif_completion_done (completion);
-out:
-	g_free (statement);
-	if (pkgkey_array != NULL)
-		g_ptr_array_unref (pkgkey_array);
-	return array;
-}
-
-/**
- * zif_repo_md_primary_find_package:
- * @md: the #ZifRepoMdPrimary object
- * @package_id: the PackageId to match
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Finds all packages that match PackageId.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_find_package (ZifRepoMdPrimary *md, const gchar *package_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gchar *pred;
-	GPtrArray *array;
-	gchar **split;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate, TODO: search version (epoch+release) */
-	split = pk_package_id_split (package_id);
-	pred = g_strdup_printf ("WHERE name = '%s' AND arch = '%s'", split[PK_PACKAGE_ID_NAME], split[PK_PACKAGE_ID_ARCH]);
-	array = zif_repo_md_primary_search (md, pred, cancellable, completion, error);
-	g_free (pred);
-	g_strfreev (split);
-
-	return array;
-}
-
-/**
- * zif_repo_md_primary_get_packages:
- * @md: the #ZifRepoMdPrimary object
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Returns all packages in the repo.
- *
- * Return value: an array of #ZifPackageRemote's
- *
- * Since: 0.0.1
- **/
-GPtrArray *
-zif_repo_md_primary_get_packages (ZifRepoMdPrimary *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	GPtrArray *array;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD_PRIMARY (md), NULL);
-	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-
-	/* search with predicate */
-	array = zif_repo_md_primary_search (md, "", cancellable, completion, error);
-	return array;
-}
-
-/**
- * zif_repo_md_primary_finalize:
- **/
-static void
-zif_repo_md_primary_finalize (GObject *object)
-{
-	ZifRepoMdPrimary *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD_PRIMARY (object));
-	md = ZIF_REPO_MD_PRIMARY (object);
-
-	sqlite3_close (md->priv->db);
-
-	G_OBJECT_CLASS (zif_repo_md_primary_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_primary_class_init:
- **/
-static void
-zif_repo_md_primary_class_init (ZifRepoMdPrimaryClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ZifRepoMdClass *repo_md_class = ZIF_REPO_MD_CLASS (klass);
-	object_class->finalize = zif_repo_md_primary_finalize;
-
-	/* map */
-	repo_md_class->load = zif_repo_md_primary_load;
-	repo_md_class->unload = zif_repo_md_primary_unload;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdPrimaryPrivate));
-}
-
-/**
- * zif_repo_md_primary_init:
- **/
-static void
-zif_repo_md_primary_init (ZifRepoMdPrimary *md)
-{
-	md->priv = ZIF_REPO_MD_PRIMARY_GET_PRIVATE (md);
-	md->priv->loaded = FALSE;
-	md->priv->db = NULL;
-}
-
-/**
- * zif_repo_md_primary_new:
- *
- * Return value: A new #ZifRepoMdPrimary class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMdPrimary *
-zif_repo_md_primary_new (void)
-{
-	ZifRepoMdPrimary *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD_PRIMARY, NULL);
-	return ZIF_REPO_MD_PRIMARY (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_primary_test (EggTest *test)
-{
-	ZifRepoMdPrimary *md;
-	gboolean ret;
-	GError *error = NULL;
-	GPtrArray *array;
-	ZifPackage *package;
-	ZifString *summary;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-
-	if (!egg_test_start (test, "ZifRepoMdPrimary"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-
-	/************************************************************/
-	egg_test_title (test, "get repo_md_primary md");
-	md = zif_repo_md_primary_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (ZIF_REPO_MD (md), "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set type");
-	ret = zif_repo_md_set_mdtype (ZIF_REPO_MD (md), ZIF_REPO_MD_TYPE_PRIMARY_DB);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum type");
-	ret = zif_repo_md_set_checksum_type (ZIF_REPO_MD (md), G_CHECKSUM_SHA256);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum compressed");
-	ret = zif_repo_md_set_checksum (ZIF_REPO_MD (md), "35d817e2bac701525fa72cec57387a2e3457bf32642adeee1e345cc180044c86");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set checksum uncompressed");
-	ret = zif_repo_md_set_checksum_uncompressed (ZIF_REPO_MD (md), "9b2b072a83b5175bc88d03ee64b52b39c0d40fec1516baa62dba81eea73cc645");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "set filename");
-	ret = zif_repo_md_set_filename (ZIF_REPO_MD (md), "../test/cache/fedora/35d817e2bac701525fa72cec57387a2e3457bf32642adeee1e345cc180044c86-primary.sqlite.bz2");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "load");
-	ret = zif_repo_md_load (ZIF_REPO_MD (md), cancellable, completion, &error);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to load '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "search for files");
-	array = zif_repo_md_primary_resolve (md, "gnome-power-manager", cancellable, completion, &error);
-	if (array != NULL)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to search '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "correct number");
-	egg_test_assert (test, array->len == 1);
-
-	/************************************************************/
-	egg_test_title (test, "correct value");
-	package = g_ptr_array_index (array, 0);
-	summary = zif_package_get_summary (package, NULL);
-	if (g_strcmp0 (zif_string_get_value (summary), "GNOME Power Manager") == 0)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to get correct summary '%s'", zif_string_get_value (summary));
-	zif_string_unref (summary);
-	g_ptr_array_unref (array);
-
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-	g_object_unref (md);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md-primary.h b/backends/yum/libzif/zif-repo-md-primary.h
deleted file mode 100644
index 8b96ffa..0000000
--- a/backends/yum/libzif/zif-repo-md-primary.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_PRIMARY_H
-#define __ZIF_REPO_MD_PRIMARY_H
-
-#include <glib-object.h>
-#include <packagekit-glib2/packagekit.h>
-
-#include "zif-repo-md.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD_PRIMARY		(zif_repo_md_primary_get_type ())
-#define ZIF_REPO_MD_PRIMARY(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD_PRIMARY, ZifRepoMdPrimary))
-#define ZIF_REPO_MD_PRIMARY_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD_PRIMARY, ZifRepoMdPrimaryClass))
-#define ZIF_IS_REPO_MD_PRIMARY(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD_PRIMARY))
-#define ZIF_IS_REPO_MD_PRIMARY_CLASS(k)		(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD_PRIMARY))
-#define ZIF_REPO_MD_PRIMARY_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD_PRIMARY, ZifRepoMdPrimaryClass))
-
-typedef struct _ZifRepoMdPrimary		ZifRepoMdPrimary;
-typedef struct _ZifRepoMdPrimaryPrivate		ZifRepoMdPrimaryPrivate;
-typedef struct _ZifRepoMdPrimaryClass		ZifRepoMdPrimaryClass;
-
-struct _ZifRepoMdPrimary
-{
-	ZifRepoMd			 parent;
-	ZifRepoMdPrimaryPrivate		*priv;
-};
-
-struct _ZifRepoMdPrimaryClass
-{
-	ZifRepoMdClass			 parent_class;
-};
-
-GType		 zif_repo_md_primary_get_type		(void);
-ZifRepoMdPrimary *zif_repo_md_primary_new		(void);
-GPtrArray	*zif_repo_md_primary_search_file	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_search_name	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_search_details	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_search_group	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_search_pkgid	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_search_pkgkey	(ZifRepoMdPrimary	*md,
-							 guint			 pkgkey,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_what_provides	(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_resolve		(ZifRepoMdPrimary	*md,
-							 const gchar		*search,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_get_packages	(ZifRepoMdPrimary	*md,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-GPtrArray	*zif_repo_md_primary_find_package	(ZifRepoMdPrimary	*md,
-							 const gchar		*package_id,
-							 GCancellable		*cancellable,
-							 ZifCompletion		*completion,
-							 GError			**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_PRIMARY_H */
-
diff --git a/backends/yum/libzif/zif-repo-md.c b/backends/yum/libzif/zif-repo-md.c
deleted file mode 100644
index 7ed680a..0000000
--- a/backends/yum/libzif/zif-repo-md.c
+++ /dev/null
@@ -1,931 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-/**
- * SECTION:zif-repo-md
- * @short_description: Metadata file common functionality
- *
- * This provides an abstract metadata class.
- * It is implemented by #ZifRepoMdFilelists, #ZifRepoMdMaster and #ZifRepoMdPrimary.
- */
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <glib.h>
-#include <glib/gstdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "zif-utils.h"
-#include "zif-repo-md.h"
-#include "zif-config.h"
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
-#define ZIF_REPO_MD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_REPO_MD, ZifRepoMdPrivate))
-
-/**
- * ZifRepoMdPrivate:
- *
- * Private #ZifRepoMd data
- **/
-struct _ZifRepoMdPrivate
-{
-	gboolean		 loaded;
-	gchar			*id;			/* fedora */
-	gchar			*filename;		/* /var/cache/yum/fedora/repo.sqlite.bz2 */
-	gchar			*filename_uncompressed;	/* /var/cache/yum/fedora/repo.sqlite */
-	guint			 timestamp;
-	gchar			*location;		/* repodata/35d817e-primary.sqlite.bz2 */
-	gchar			*checksum;		/* of compressed file */
-	gchar			*checksum_uncompressed;	/* of uncompressed file */
-	GChecksumType		 checksum_type;
-	ZifRepoMdType		 type;
-	ZifStoreRemote		*remote;
-	ZifConfig		*config;
-};
-
-G_DEFINE_TYPE (ZifRepoMd, zif_repo_md, G_TYPE_OBJECT)
-
-/**
- * zif_repo_md_error_quark:
- *
- * Return value: Our personal error quark.
- *
- * Since: 0.0.1
- **/
-GQuark
-zif_repo_md_error_quark (void)
-{
-	static GQuark quark = 0;
-	if (!quark)
-		quark = g_quark_from_static_string ("zif_repo_md_error");
-	return quark;
-}
-
-/**
- * zif_repo_md_get_id:
- * @md: the #ZifRepoMd object
- *
- * Gets the md identifier, usually the repo name.
- *
- * Return value: the repo id.
- *
- * Since: 0.0.1
- **/
-const gchar *
-zif_repo_md_get_id (ZifRepoMd *md)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), NULL);
-	return md->priv->id;
-}
-
-/**
- * zif_repo_md_get_filename:
- * @md: the #ZifRepoMd object
- *
- * Gets the compressed filename of the repo.
- *
- * Return value: the filename
- *
- * Since: 0.0.1
- **/
-const gchar *
-zif_repo_md_get_filename (ZifRepoMd *md)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), NULL);
-	return md->priv->filename;
-}
-
-/**
- * zif_repo_md_get_location:
- * @md: the #ZifRepoMd object
- *
- * Gets the location of the repo.
- *
- * Return value: the location
- *
- * Since: 0.0.1
- **/
-const gchar *
-zif_repo_md_get_location (ZifRepoMd *md)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), NULL);
-	return md->priv->location;
-}
-
-/**
- * zif_repo_md_get_mdtype:
- * @md: the #ZifRepoMd object
- *
- * Gets the type of the repo.
- *
- * Return value: the type
- *
- * Since: 0.0.1
- **/
-ZifRepoMdType
-zif_repo_md_get_mdtype (ZifRepoMd *md)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), ZIF_REPO_MD_TYPE_UNKNOWN);
-	return md->priv->type;
-}
-
-/**
- * zif_repo_md_get_filename_uncompressed:
- * @md: the #ZifRepoMd object
- *
- * Gets the uncompressed filename of the repo.
- *
- * Return value: the filename
- *
- * Since: 0.0.1
- **/
-const gchar *
-zif_repo_md_get_filename_uncompressed (ZifRepoMd *md)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), NULL);
-	return md->priv->filename_uncompressed;
-}
-
-/**
- * zif_repo_md_set_filename:
- * @md: the #ZifRepoMd object
- * @filename: the base filename, e.g. "master.xml.bz2"
- *
- * Sets the filename of the compressed file.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_filename (ZifRepoMd *md, const gchar *filename)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->filename == NULL, FALSE);
-	g_return_val_if_fail (filename != NULL, FALSE);
-
-	/* this is the compressed name */
-	md->priv->filename = g_strdup (filename);
-
-	/* this is the uncompressed name */
-	md->priv->filename_uncompressed = zif_file_get_uncompressed_name (filename);
-
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_timestamp:
- * @md: the #ZifRepoMd object
- * @timestamp: the timestamp value
- *
- * Sets the timestamp of the compressed file.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_timestamp (ZifRepoMd *md, guint timestamp)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->timestamp == 0, FALSE);
-	g_return_val_if_fail (timestamp != 0, FALSE);
-
-	/* save new value */
-	md->priv->timestamp = timestamp;
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_location:
- * @md: the #ZifRepoMd object
- * @location: the location
- *
- * Sets the location of the compressed file, e.g. "repodata/35d817e-primary.sqlite.bz2"
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_location (ZifRepoMd *md, const gchar *location)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->location == NULL, FALSE);
-	g_return_val_if_fail (location != NULL, FALSE);
-
-	/* save new value */
-	md->priv->location = g_strdup (location);
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_checksum:
- * @md: the #ZifRepoMd object
- * @checksum: the checksum value
- *
- * Sets the checksum of the compressed file.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_checksum (ZifRepoMd *md, const gchar *checksum)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->checksum == NULL, FALSE);
-	g_return_val_if_fail (checksum != NULL, FALSE);
-
-	/* save new value */
-	md->priv->checksum = g_strdup (checksum);
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_checksum_uncompressed:
- * @md: the #ZifRepoMd object
- * @checksum_uncompressed: the uncompressed checksum value
- *
- * Sets the checksum of the uncompressed file.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_checksum_uncompressed (ZifRepoMd *md, const gchar *checksum_uncompressed)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->checksum_uncompressed == NULL, FALSE);
-	g_return_val_if_fail (checksum_uncompressed != NULL, FALSE);
-
-	/* save new value */
-	md->priv->checksum_uncompressed = g_strdup (checksum_uncompressed);
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_checksum_type:
- * @md: the #ZifRepoMd object
- * @checksum_type: the checksum type
- *
- * Sets the checksum_type of the files.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_checksum_type (ZifRepoMd *md, GChecksumType checksum_type)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->checksum_type == 0, FALSE);
-
-	/* save new value */
-	md->priv->checksum_type = checksum_type;
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_mdtype:
- * @md: the #ZifRepoMd object
- * @type: the metadata type
- *
- * Sets the type of the metadata, e.g. ZIF_REPO_MD_TYPE_FILELISTS_DB.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_mdtype (ZifRepoMd *md, ZifRepoMdType type)
-{
-	gboolean ret = TRUE;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->type == ZIF_REPO_MD_TYPE_UNKNOWN, FALSE);
-	g_return_val_if_fail (type != ZIF_REPO_MD_TYPE_UNKNOWN, FALSE);
-
-	/* save new value */
-	md->priv->type = type;
-
-	/* metalink is not specified in the repomd.xml file */
-	if (type == ZIF_REPO_MD_TYPE_METALINK) {
-		zif_repo_md_set_location (md, "metalink.xml");
-		goto out;
-	}
-
-	/* mirrorlist is not specified in the repomd.xml file */
-	if (type == ZIF_REPO_MD_TYPE_MIRRORLIST) {
-		zif_repo_md_set_location (md, "mirrorlist.txt");
-		goto out;
-	}
-
-	/* check we've got the needed data */
-	if (md->priv->location != NULL && (md->priv->checksum == NULL || md->priv->timestamp == 0)) {
-		egg_warning ("cannot load md for %s (loc=%s, checksum=%s, checksum_open=%s, timestamp=%i)",
-			     zif_repo_md_type_to_text (type), md->priv->location,
-			     md->priv->checksum, md->priv->checksum_uncompressed, md->priv->timestamp);
-		ret = FALSE;
-		goto out;
-	}
-out:
-	return ret;
-}
-
-/**
- * zif_repo_md_set_id:
- * @md: the #ZifRepoMd object
- * @id: the repository id, e.g. "fedora"
- *
- * Sets the repository ID for this metadata.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_id (ZifRepoMd *md, const gchar *id)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->id == NULL, FALSE);
-	g_return_val_if_fail (id != NULL, FALSE);
-
-	md->priv->id = g_strdup (id);
-	return TRUE;
-}
-
-/**
- * zif_repo_md_set_id:
- * @md: the #ZifRepoMd object
- * @id: the repository id, e.g. "fedora"
- *
- * Sets the repository ID for this metadata.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_set_store_remote (ZifRepoMd *md, ZifStoreRemote *remote)
-{
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->remote == NULL, FALSE);
-	g_return_val_if_fail (remote != NULL, FALSE);
-
-	/* do not take a reference, else the parent device never goes away */
-	md->priv->remote = remote;
-	return TRUE;
-}
-
-/**
- * zif_repo_md_delete_file:
- **/
-static gboolean
-zif_repo_md_delete_file (const gchar *filename)
-{
-	gint retval;
-	gboolean ret;
-
-	/* file exists? */
-	ret = g_file_test (filename, G_FILE_TEST_EXISTS);
-	if (!ret)
-		goto out;
-
-	egg_warning ("deleting %s", filename);
-
-	/* remove */
-	retval = g_unlink (filename);
-	if (retval != 0) {
-		egg_warning ("failed to delete %s", filename);
-		ret = FALSE;
-	}
-out:
-	return ret;
-}
-
-/**
- * zif_repo_md_load:
- * @md: the #ZifRepoMd object
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Load the metadata store.
- *
- * - Check compressed file
- *   if invalid:
- *       delete_it()
- *       if online:
- *           download_it()
- *           if failure:
- *               abort
- *           check_it()
- *           if failure:
- *               abort
- *       else
- *           abort
- *
- * - Check uncompressed file
- *   if invalid:
- *       delete_it()
- *       decompress_it()
- *           if failure:
- *               abort()
- *       check_it()
- *       if failure:
- *           abort
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_load (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	gboolean ret;
-	gboolean uncompressed_check;
-	gchar *dirname = NULL;
-	GError *error_local = NULL;
-	ZifRepoMdClass *klass = ZIF_REPO_MD_GET_CLASS (md);
-	ZifCompletion *completion_local;
-
-	/* no support */
-	if (klass->load == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_NO_SUPPORT,
-				     "operation cannot be performed on this md");
-		return FALSE;
-	}
-
-	/* setup completion */
-	zif_completion_set_number_steps (completion, 3);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-
-	/* optimise: if uncompressed file is okay, then don't even check the compressed file */
-	uncompressed_check = zif_repo_md_file_check (md, TRUE, &error_local);
-	if (uncompressed_check) {
-		zif_completion_done (completion);
-		goto skip_compressed_check;
-	}
-
-	/* display any warning */
-	egg_warning ("failed checksum for uncompressed: %s", error_local->message);
-	g_clear_error (&error_local);
-
-	/* check compressed file */
-	ret = zif_repo_md_file_check (md, FALSE, &error_local);
-	if (!ret) {
-		egg_warning ("failed checksum for compressed: %s", error_local->message);
-		g_clear_error (&error_local);
-
-		/* delete file if it exists */
-		zif_repo_md_delete_file (md->priv->filename);
-
-		/* if not online, then this is fatal */
-		ret = zif_config_get_boolean (md->priv->config, "network", NULL);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_AS_OFFLINE,
-				     "failed to check %s checksum for %s and offline",
-				     zif_repo_md_type_to_text (md->priv->type), md->priv->id);
-			goto out;
-		}
-
-		/* download file */
-		completion_local = zif_completion_get_child (completion);
-		dirname = g_path_get_dirname (md->priv->filename);
-		ret = zif_store_remote_download (md->priv->remote, md->priv->location, dirname, cancellable, completion_local, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED_DOWNLOAD,
-				     "failed to download missing compressed file: %s", error_local->message);
-			goto out;
-		}
-
-		/* check newly downloaded compressed file */
-		ret = zif_repo_md_file_check (md, FALSE, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed checksum on downloaded file: %s", error_local->message);
-			goto out;
-		}
-	}
-
-	/* this section done */
-	zif_completion_done (completion);
-
-	/* check uncompressed file */
-	if (!uncompressed_check) {
-
-		/* delete file if it exists */
-		zif_repo_md_delete_file (md->priv->filename_uncompressed);
-
-		/* decompress file */
-		egg_debug ("decompressing file");
-		completion_local = zif_completion_get_child (completion);
-		ret = zif_file_decompress (md->priv->filename, md->priv->filename_uncompressed,
-					   cancellable, completion_local, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to decompress: %s", error_local->message);
-			goto out;
-		}
-
-		/* check newly uncompressed file */
-		ret = zif_repo_md_file_check (md, TRUE, &error_local);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed checksum on decompressed file: %s", error_local->message);
-			goto out;
-		}
-	}
-
-skip_compressed_check:
-
-	/* this section done */
-	zif_completion_done (completion);
-
-	/* do subclassed load */
-	completion_local = zif_completion_get_child (completion);
-	ret = klass->load (md, cancellable, completion_local, error);
-
-	/* this section done */
-	zif_completion_done (completion);
-out:
-	g_free (dirname);
-	return ret;
-}
-
-/**
- * zif_repo_md_unload:
- * @md: the #ZifRepoMd object
- * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
- * @completion: a #ZifCompletion to use for progress reporting
- * @error: a #GError which is used on failure, or %NULL
- *
- * Unload the metadata store.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_unload (ZifRepoMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
-{
-	ZifRepoMdClass *klass = ZIF_REPO_MD_GET_CLASS (md);
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* no support */
-	if (klass->unload == NULL) {
-		g_set_error_literal (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_NO_SUPPORT,
-				     "operation cannot be performed on this md");
-		return FALSE;
-	}
-
-	return klass->unload (md, cancellable, completion, error);
-}
-
-/**
- * zif_repo_md_clean:
- * @md: the #ZifRepoMd object
- * @error: a #GError which is used on failure, or %NULL
- *
- * Clean the metadata store.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_clean (ZifRepoMd *md, GError **error)
-{
-	gboolean ret = FALSE;
-	gboolean exists;
-	const gchar *filename;
-	GFile *file;
-	GError *error_local = NULL;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* get filename */
-	filename = zif_repo_md_get_filename (md);
-	if (filename == NULL) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "failed to get filename for %s", zif_repo_md_type_to_text (md->priv->type));
-		ret = FALSE;
-		goto out;
-	}
-
-	/* file does not exist */
-	exists = g_file_test (filename, G_FILE_TEST_EXISTS);
-	if (exists) {
-		file = g_file_new_for_path (filename);
-		ret = g_file_delete (file, NULL, &error_local);
-		g_object_unref (file);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to delete metadata file %s: %s", filename, error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* get filename */
-	filename = zif_repo_md_get_filename_uncompressed (md);
-	if (filename == NULL) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "failed to get uncompressed filename for %s", zif_repo_md_type_to_text (md->priv->type));
-		ret = FALSE;
-		goto out;
-	}
-
-	/* file does not exist */
-	exists = g_file_test (filename, G_FILE_TEST_EXISTS);
-	if (exists) {
-		file = g_file_new_for_path (filename);
-		ret = g_file_delete (file, NULL, &error_local);
-		g_object_unref (file);
-		if (!ret) {
-			g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-				     "failed to delete metadata file %s: %s", filename, error_local->message);
-			g_error_free (error_local);
-			goto out;
-		}
-	}
-
-	/* okay */
-	ret = TRUE;
-out:
-	return ret;
-}
-
-/**
- * zif_repo_md_type_to_text:
- *
- * Since: 0.0.1
- **/
-const gchar *
-zif_repo_md_type_to_text (ZifRepoMdType type)
-{
-	if (type == ZIF_REPO_MD_TYPE_FILELISTS)
-		return "filelists";
-	if (type == ZIF_REPO_MD_TYPE_FILELISTS_DB)
-		return "filelists_db";
-	if (type == ZIF_REPO_MD_TYPE_PRIMARY)
-		return "primary";
-	if (type == ZIF_REPO_MD_TYPE_PRIMARY_DB)
-		return "primary_db";
-	if (type == ZIF_REPO_MD_TYPE_OTHER)
-		return "other";
-	if (type == ZIF_REPO_MD_TYPE_OTHER_DB)
-		return "other_db";
-	if (type == ZIF_REPO_MD_TYPE_COMPS)
-		return "group";
-	if (type == ZIF_REPO_MD_TYPE_COMPS_XML)
-		return "group_gz";
-	if (type == ZIF_REPO_MD_TYPE_METALINK)
-		return "metalink";
-	if (type == ZIF_REPO_MD_TYPE_MIRRORLIST)
-		return "mirrorlist";
-	if (type == ZIF_REPO_MD_TYPE_PRESTODELTA)
-		return "prestodelta";
-	if (type == ZIF_REPO_MD_TYPE_UPDATEINFO)
-		return "updateinfo";
-	return "unknown";
-}
-
-/**
- * zif_repo_md_file_check:
- * @md: the #ZifRepoMd object
- * @use_uncompressed: If we should check only the uncompresed version
- * @error: a #GError which is used on failure, or %NULL
- *
- * Check the metadata files to make sure they are valid.
- *
- * Return value: %TRUE for success, %FALSE for failure
- *
- * Since: 0.0.1
- **/
-gboolean
-zif_repo_md_file_check (ZifRepoMd *md, gboolean use_uncompressed, GError **error)
-{
-	gboolean ret = FALSE;
-	GError *error_local = NULL;
-	gchar *data = NULL;
-	gchar *checksum = NULL;
-	const gchar *filename;
-	const gchar *checksum_wanted;
-	gsize length;
-
-	g_return_val_if_fail (ZIF_IS_REPO_MD (md), FALSE);
-	g_return_val_if_fail (md->priv->id != NULL, FALSE);
-	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
-	/* metalink has no checksum... */
-	if (md->priv->type == ZIF_REPO_MD_TYPE_METALINK ||
-	    md->priv->type == ZIF_REPO_MD_TYPE_MIRRORLIST) {
-		egg_debug ("skipping checksum check on %s", zif_repo_md_type_to_text (md->priv->type));
-		ret = TRUE;
-		goto out;
-	}
-
-	/* get correct filename */
-	if (use_uncompressed)
-		filename = md->priv->filename_uncompressed;
-	else
-		filename = md->priv->filename;
-
-	/* get contents */
-	ret = g_file_get_contents (filename, &data, &length, &error_local);
-	if (!ret) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "failed to get contents of %s: %s", filename, error_local->message);
-		g_error_free (error_local);
-		goto out;
-	}
-
-	/* get the one we want */
-	if (use_uncompressed)
-		checksum_wanted = md->priv->checksum_uncompressed;
-	else
-		checksum_wanted = md->priv->checksum;
-
-	/* no checksum set */
-	if (checksum_wanted == NULL) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "checksum not set for %s", filename);
-		ret = FALSE;
-		goto out;
-	}
-
-	/* compute checksum */
-	checksum = g_compute_checksum_for_data (md->priv->checksum_type, (guchar*) data, length);
-
-	/* matches? */
-	ret = (g_strcmp0 (checksum, checksum_wanted) == 0);
-	if (!ret) {
-		g_set_error (error, ZIF_REPO_MD_ERROR, ZIF_REPO_MD_ERROR_FAILED,
-			     "checksum incorrect, wanted %s, got %s for %s", checksum_wanted, checksum, filename);
-		goto out;
-	}
-	egg_debug ("%s checksum correct (%s)", filename, checksum_wanted);
-out:
-	g_free (data);
-	g_free (checksum);
-	return ret;
-}
-
-/**
- * zif_repo_md_finalize:
- **/
-static void
-zif_repo_md_finalize (GObject *object)
-{
-	ZifRepoMd *md;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (ZIF_IS_REPO_MD (object));
-	md = ZIF_REPO_MD (object);
-
-	g_free (md->priv->id);
-	g_free (md->priv->filename);
-	g_free (md->priv->location);
-	g_free (md->priv->checksum);
-	g_free (md->priv->checksum_uncompressed);
-
-	g_object_unref (md->priv->config);
-
-	G_OBJECT_CLASS (zif_repo_md_parent_class)->finalize (object);
-}
-
-/**
- * zif_repo_md_class_init:
- **/
-static void
-zif_repo_md_class_init (ZifRepoMdClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	object_class->finalize = zif_repo_md_finalize;
-	g_type_class_add_private (klass, sizeof (ZifRepoMdPrivate));
-}
-
-/**
- * zif_repo_md_init:
- **/
-static void
-zif_repo_md_init (ZifRepoMd *md)
-{
-	md->priv = ZIF_REPO_MD_GET_PRIVATE (md);
-	md->priv->type = ZIF_REPO_MD_TYPE_UNKNOWN;
-	md->priv->loaded = FALSE;
-	md->priv->id = NULL;
-	md->priv->filename = NULL;
-	md->priv->timestamp = 0;
-	md->priv->location = NULL;
-	md->priv->checksum = NULL;
-	md->priv->checksum_uncompressed = NULL;
-	md->priv->checksum_type = 0;
-	md->priv->remote = NULL;
-	md->priv->config = zif_config_new ();
-}
-
-/**
- * zif_repo_md_new:
- *
- * Return value: A new #ZifRepoMd class instance.
- *
- * Since: 0.0.1
- **/
-ZifRepoMd *
-zif_repo_md_new (void)
-{
-	ZifRepoMd *md;
-	md = g_object_new (ZIF_TYPE_REPO_MD, NULL);
-	return ZIF_REPO_MD (md);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-zif_repo_md_test (EggTest *test)
-{
-	ZifRepoMd *md;
-	gboolean ret;
-	GError *error = NULL;
-	GCancellable *cancellable;
-	ZifCompletion *completion;
-
-	if (!egg_test_start (test, "ZifRepoMd"))
-		return;
-
-	/* use */
-	cancellable = g_cancellable_new ();
-	completion = zif_completion_new ();
-
-	/************************************************************/
-	egg_test_title (test, "get store_remote md");
-	md = zif_repo_md_new ();
-	egg_test_assert (test, md != NULL);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, !md->priv->loaded);
-
-	/************************************************************/
-	egg_test_title (test, "set id");
-	ret = zif_repo_md_set_id (md, "fedora");
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to set");
-
-	/************************************************************/
-	egg_test_title (test, "load");
-	ret = zif_repo_md_load (md, cancellable, completion, &error);
-	if (ret)
-		egg_test_success (test, NULL);
-	else
-		egg_test_failed (test, "failed to load '%s'", error->message);
-
-	/************************************************************/
-	egg_test_title (test, "loaded");
-	egg_test_assert (test, md->priv->loaded);
-
-	g_object_unref (md);
-	g_object_unref (cancellable);
-	g_object_unref (completion);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/backends/yum/libzif/zif-repo-md.h b/backends/yum/libzif/zif-repo-md.h
deleted file mode 100644
index 6c4baab..0000000
--- a/backends/yum/libzif/zif-repo-md.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
- *
- * Licensed under the GNU General Public License Version 2
- *
- * 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.
- */
-
-#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
-#error "Only <zif.h> can be included directly."
-#endif
-
-#ifndef __ZIF_REPO_MD_H
-#define __ZIF_REPO_MD_H
-
-#include <glib-object.h>
-#include <gio/gio.h>
-
-#include "zif-repo-md.h"
-#include "zif-completion.h"
-#include "zif-store-remote.h"
-
-G_BEGIN_DECLS
-
-#define ZIF_TYPE_REPO_MD		(zif_repo_md_get_type ())
-#define ZIF_REPO_MD(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_REPO_MD, ZifRepoMd))
-#define ZIF_REPO_MD_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_REPO_MD, ZifRepoMdClass))
-#define ZIF_IS_REPO_MD(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_REPO_MD))
-#define ZIF_IS_REPO_MD_CLASS(k)		(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_REPO_MD))
-#define ZIF_REPO_MD_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_REPO_MD, ZifRepoMdClass))
-#define ZIF_REPO_MD_ERROR		(zif_repo_md_error_quark ())
-
-typedef struct _ZifRepoMd		ZifRepoMd;
-typedef struct _ZifRepoMdPrivate	ZifRepoMdPrivate;
-typedef struct _ZifRepoMdClass		ZifRepoMdClass;
-
-struct _ZifRepoMd
-{
-	GObject			 parent;
-	ZifRepoMdPrivate	*priv;
-};
-
-struct _ZifRepoMdClass
-{
-	GObjectClass				 parent_class;
-	/* vtable */
-	gboolean	 (*load)		(ZifRepoMd		*md,
-						 GCancellable		*cancellable,
-						 ZifCompletion		*completion,
-						 GError			**error);
-	gboolean	 (*unload)		(ZifRepoMd		*md,
-						 GCancellable		*cancellable,
-						 ZifCompletion		*completion,
-						 GError			**error);
-};
-
-/* types of metadata */
-typedef enum {
-	ZIF_REPO_MD_TYPE_PRIMARY,
-	ZIF_REPO_MD_TYPE_PRIMARY_DB,
-	ZIF_REPO_MD_TYPE_FILELISTS,
-	ZIF_REPO_MD_TYPE_FILELISTS_DB,
-	ZIF_REPO_MD_TYPE_OTHER,
-	ZIF_REPO_MD_TYPE_OTHER_DB,
-	ZIF_REPO_MD_TYPE_COMPS,
-	ZIF_REPO_MD_TYPE_COMPS_XML,
-	ZIF_REPO_MD_TYPE_METALINK,
-	ZIF_REPO_MD_TYPE_MIRRORLIST,
-	ZIF_REPO_MD_TYPE_PRESTODELTA,
-	ZIF_REPO_MD_TYPE_UPDATEINFO,
-	ZIF_REPO_MD_TYPE_UNKNOWN
-} ZifRepoMdType;
-
-typedef enum {
-	ZIF_REPO_MD_ERROR_FAILED,
-	ZIF_REPO_MD_ERROR_NO_SUPPORT,
-	ZIF_REPO_MD_ERROR_FAILED_TO_LOAD,
-	ZIF_REPO_MD_ERROR_FAILED_AS_OFFLINE,
-	ZIF_REPO_MD_ERROR_FAILED_DOWNLOAD,
-	ZIF_REPO_MD_ERROR_BAD_SQL,
-	ZIF_REPO_MD_ERROR_LAST
-} ZifRepoMdError;
-
-GType		 zif_repo_md_get_type			(void);
-GQuark		 zif_repo_md_error_quark			(void);
-ZifRepoMd	*zif_repo_md_new			(void);
-
-/* setters */
-gboolean	 zif_repo_md_set_mdtype			(ZifRepoMd	*md,
-							 ZifRepoMdType	 type);
-gboolean	 zif_repo_md_set_store_remote		(ZifRepoMd	*md,
-							 ZifStoreRemote	*remote);
-gboolean	 zif_repo_md_set_id			(ZifRepoMd	*md,
-							 const gchar	*id);
-gboolean	 zif_repo_md_set_filename		(ZifRepoMd	*md,
-							 const gchar	*filename);
-gboolean	 zif_repo_md_set_timestamp		(ZifRepoMd	*md,
-							 guint		 timestamp);
-gboolean	 zif_repo_md_set_location		(ZifRepoMd	*md,
-							 const gchar	*location);
-gboolean	 zif_repo_md_set_checksum		(ZifRepoMd	*md,
-							 const gchar	*checksum);
-gboolean	 zif_repo_md_set_checksum_uncompressed	(ZifRepoMd	*md,
-							 const gchar	*checksum_uncompressed);
-gboolean	 zif_repo_md_set_checksum_type		(ZifRepoMd	*md,
-							 GChecksumType	 checksum_type);
-const gchar	*zif_repo_md_type_to_text		(ZifRepoMdType	 type);
-
-/* getters */
-const gchar	*zif_repo_md_get_id			(ZifRepoMd	*md);
-ZifRepoMdType	 zif_repo_md_get_mdtype			(ZifRepoMd	*md);
-const gchar	*zif_repo_md_get_filename		(ZifRepoMd	*md);
-const gchar	*zif_repo_md_get_filename_uncompressed	(ZifRepoMd	*md);
-guint		 zif_repo_md_get_age			(ZifRepoMd	*md,
-							 GError		**error);
-const gchar	*zif_repo_md_get_location		(ZifRepoMd	*md);
-
-/* actions */
-gboolean	 zif_repo_md_load			(ZifRepoMd	*md,
-							 GCancellable	*cancellable,
-							 ZifCompletion	*completion,
-							 GError		**error);
-gboolean	 zif_repo_md_unload			(ZifRepoMd	*md,
-							 GCancellable	*cancellable,
-							 ZifCompletion	*completion,
-							 GError		**error);
-gboolean	 zif_repo_md_clean			(ZifRepoMd	*md,
-							 GError		**error);
-gboolean	 zif_repo_md_file_check			(ZifRepoMd	*md,
-							 gboolean	 use_uncompressed,
-							 GError		**error);
-
-G_END_DECLS
-
-#endif /* __ZIF_REPO_MD_H */
-
diff --git a/backends/yum/libzif/zif-self-test.c b/backends/yum/libzif/zif-self-test.c
index 274290e..c758000 100644
--- a/backends/yum/libzif/zif-self-test.c
+++ b/backends/yum/libzif/zif-self-test.c
@@ -37,14 +37,15 @@ void zif_package_local_test (EggTest *test);
 void zif_store_local_test (EggTest *test);
 void zif_groups_test (EggTest *test);
 void zif_store_remote_test (EggTest *test);
-void zif_repo_md_metalink_test (EggTest *test);
-void zif_repo_md_primary_test (EggTest *test);
-void zif_repo_md_filelists_test (EggTest *test);
-void zif_repo_md_comps_test (EggTest *test);
+void zif_md_metalink_test (EggTest *test);
+void zif_md_primary_test (EggTest *test);
+void zif_md_filelists_test (EggTest *test);
+void zif_md_comps_test (EggTest *test);
 void zif_repos_test (EggTest *test);
 void zif_download_test (EggTest *test);
 void zif_string_test (EggTest *test);
 void zif_lock_test (EggTest *test);
+void zif_update_info_test (EggTest *test);
 
 int
 main (int argc, char **argv)
@@ -58,15 +59,19 @@ main (int argc, char **argv)
 	zif_init ();
 
 	/* tests go here */
+	zif_md_primary_xml_test (test);
 	zif_lock_test (test);
 	zif_completion_test (test);
 	zif_config_test (test);
 	zif_string_test (test);
-	zif_repo_md_metalink_test (test);
-	zif_repo_md_mirrorlist_test (test);
-	zif_repo_md_filelists_test (test);
-	zif_repo_md_primary_test (test);
-	zif_repo_md_comps_test (test);
+	zif_update_test (test);
+	zif_update_info_test (test);
+	zif_md_metalink_test (test);
+	zif_md_mirrorlist_test (test);
+	zif_md_filelists_test (test);
+	zif_md_primary_sql_test (test);
+	zif_md_comps_test (test);
+	zif_md_updateinfo_test (test);
 	zif_download_test (test);
 	zif_monitor_test (test);
 	zif_package_test (test);
diff --git a/backends/yum/libzif/zif-store-array.c b/backends/yum/libzif/zif-store-array.c
index a6fc2ba..467a1fd 100644
--- a/backends/yum/libzif/zif-store-array.c
+++ b/backends/yum/libzif/zif-store-array.c
@@ -260,7 +260,7 @@ zif_store_array_repos_search (GPtrArray *store_array, PkRoleEnum role, const gch
 		else if (role == PK_ROLE_ENUM_GET_PACKAGES)
 			part = zif_store_get_packages (store, cancellable, completion_local, &error_local);
 		else if (role == PK_ROLE_ENUM_GET_UPDATES)
-			part = zif_store_get_updates (store, cancellable, completion_local, &error_local);
+			part = zif_store_get_updates (store, (GPtrArray *) search, cancellable, completion_local, &error_local);
 		else if (role == PK_ROLE_ENUM_WHAT_PROVIDES)
 			part = zif_store_what_provides (store, search, cancellable, completion_local, &error_local);
 		else if (role == PK_ROLE_ENUM_GET_CATEGORIES)
@@ -713,12 +713,12 @@ zif_store_array_get_packages (GPtrArray *store_array,
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_array_get_updates (GPtrArray *store_array,
+zif_store_array_get_updates (GPtrArray *store_array, GPtrArray *packages,
 			     ZifStoreArrayErrorCb error_cb, gpointer user_data,
 			     GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
-	return zif_store_array_repos_search (store_array, PK_ROLE_ENUM_GET_UPDATES, NULL,
+	return zif_store_array_repos_search (store_array, PK_ROLE_ENUM_GET_UPDATES, (gchar *) packages,
 					     error_cb, user_data, cancellable, completion, error);
 }
 
diff --git a/backends/yum/libzif/zif-store-array.h b/backends/yum/libzif/zif-store-array.h
index 7391c77..23eeed3 100644
--- a/backends/yum/libzif/zif-store-array.h
+++ b/backends/yum/libzif/zif-store-array.h
@@ -128,6 +128,7 @@ GPtrArray	*zif_store_array_get_packages		(GPtrArray		*store_array,
 							 ZifCompletion		*completion,
 							 GError			**error);
 GPtrArray	*zif_store_array_get_updates		(GPtrArray		*store_array,
+							 GPtrArray		*packages,
 							 ZifStoreArrayErrorCb	 error_cb,
 							 gpointer		 user_data,
 							 GCancellable		*cancellable,
diff --git a/backends/yum/libzif/zif-store-remote.c b/backends/yum/libzif/zif-store-remote.c
index 138638d..483c776 100644
--- a/backends/yum/libzif/zif-store-remote.c
+++ b/backends/yum/libzif/zif-store-remote.c
@@ -1,6 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
  *
- * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ * Copyright (C) 2008-2010 Richard Hughes <richard at hughsie.com>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -41,11 +41,13 @@
 #include "zif-monitor.h"
 #include "zif-package.h"
 #include "zif-package-remote.h"
-#include "zif-repo-md-comps.h"
-#include "zif-repo-md-filelists.h"
-#include "zif-repo-md-metalink.h"
-#include "zif-repo-md-mirrorlist.h"
-#include "zif-repo-md-primary.h"
+#include "zif-md-comps.h"
+#include "zif-md-updateinfo.h"
+#include "zif-md-filelists.h"
+#include "zif-md-metalink.h"
+#include "zif-md-mirrorlist.h"
+#include "zif-md-primary-sql.h"
+#include "zif-md-primary-xml.h"
 #include "zif-store.h"
 #include "zif-store-local.h"
 #include "zif-store-remote.h"
@@ -78,18 +80,20 @@ struct _ZifStoreRemotePrivate
 	gboolean		 enabled;
 	gboolean		 loaded;
 	gboolean		 loaded_metadata;
-	ZifRepoMd		*md_primary;
-	ZifRepoMd		*md_filelists;
-	ZifRepoMd		*md_metalink;
-	ZifRepoMd		*md_mirrorlist;
-	ZifRepoMd		*md_comps;
+	ZifMd			*md_primary_db;
+	ZifMd			*md_primary_xml;
+	ZifMd			*md_filelists;
+	ZifMd			*md_metalink;
+	ZifMd			*md_mirrorlist;
+	ZifMd			*md_comps;
+	ZifMd			*md_updateinfo;
 	ZifConfig		*config;
 	ZifMonitor		*monitor;
 	ZifLock			*lock;
 	GPtrArray		*packages;
 	/* temp data for the xml parser */
-	ZifRepoMdType		 parser_type;
-	ZifRepoMdType		 parser_section;
+	ZifMdType		 parser_type;
+	ZifMdType		 parser_section;
 };
 
 G_DEFINE_TYPE (ZifStoreRemote, zif_store_remote, ZIF_TYPE_STORE)
@@ -112,25 +116,46 @@ zif_store_remote_checksum_type_from_text (const gchar *type)
 }
 
 /**
+ * zif_store_remote_get_primary:
+ **/
+static ZifMd *
+zif_store_remote_get_primary (ZifStoreRemote *store)
+{
+	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
+
+	if (zif_md_get_location (store->priv->md_primary_db) != NULL)
+		return store->priv->md_primary_db;
+	if (zif_md_get_location (store->priv->md_primary_xml) != NULL)
+		return store->priv->md_primary_xml;
+
+	/* this should never happen */
+	return NULL;
+}
+
+/**
  * zif_store_remote_get_md_from_type:
  **/
-static ZifRepoMd *
-zif_store_remote_get_md_from_type (ZifStoreRemote *store, ZifRepoMdType type)
+static ZifMd *
+zif_store_remote_get_md_from_type (ZifStoreRemote *store, ZifMdType type)
 {
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
-	g_return_val_if_fail (type != ZIF_REPO_MD_TYPE_UNKNOWN, NULL);
+	g_return_val_if_fail (type != ZIF_MD_TYPE_UNKNOWN, NULL);
 
-	if (type == ZIF_REPO_MD_TYPE_FILELISTS_DB)
+	if (type == ZIF_MD_TYPE_FILELISTS_SQL)
 		return store->priv->md_filelists;
-	if (type == ZIF_REPO_MD_TYPE_PRIMARY_DB)
-		return store->priv->md_primary;
-	if (type == ZIF_REPO_MD_TYPE_OTHER_DB)
+	if (type == ZIF_MD_TYPE_PRIMARY_SQL)
+		return store->priv->md_primary_db;
+	if (type == ZIF_MD_TYPE_PRIMARY_XML)
+		return store->priv->md_primary_xml;
+	if (type == ZIF_MD_TYPE_OTHER_SQL)
 		return NULL;
-	if (type == ZIF_REPO_MD_TYPE_COMPS_XML)
+	if (type == ZIF_MD_TYPE_COMPS_GZ)
 		return store->priv->md_comps;
-	if (type == ZIF_REPO_MD_TYPE_METALINK)
+	if (type == ZIF_MD_TYPE_UPDATEINFO)
+		return store->priv->md_updateinfo;
+	if (type == ZIF_MD_TYPE_METALINK)
 		return store->priv->md_metalink;
-	if (type == ZIF_REPO_MD_TYPE_MIRRORLIST)
+	if (type == ZIF_MD_TYPE_MIRRORLIST)
 		return store->priv->md_mirrorlist;
 	return NULL;
 }
@@ -144,7 +169,7 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 				       gpointer user_data, GError **error)
 {
 	guint i, j;
-	ZifRepoMd *md;
+	ZifMd *md;
 	ZifStoreRemote *store = user_data;
 	GString *string;
 
@@ -152,31 +177,31 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 	if (g_strcmp0 (element_name, "data") == 0) {
 
 		/* reset */
-		store->priv->parser_type = ZIF_REPO_MD_TYPE_UNKNOWN;
+		store->priv->parser_type = ZIF_MD_TYPE_UNKNOWN;
 
 		/* find type */
 		for (i=0; attribute_names[i] != NULL; i++) {
 			if (g_strcmp0 (attribute_names[i], "type") == 0) {
 				if (g_strcmp0 (attribute_values[i], "primary") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_PRIMARY;
+					store->priv->parser_type = ZIF_MD_TYPE_PRIMARY_XML;
 				else if (g_strcmp0 (attribute_values[i], "primary_db") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_PRIMARY_DB;
+					store->priv->parser_type = ZIF_MD_TYPE_PRIMARY_SQL;
 				else if (g_strcmp0 (attribute_values[i], "filelists") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_FILELISTS;
+					store->priv->parser_type = ZIF_MD_TYPE_FILELISTS_XML;
 				else if (g_strcmp0 (attribute_values[i], "filelists_db") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_FILELISTS_DB;
+					store->priv->parser_type = ZIF_MD_TYPE_FILELISTS_SQL;
 				else if (g_strcmp0 (attribute_values[i], "other") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_OTHER;
+					store->priv->parser_type = ZIF_MD_TYPE_OTHER_XML;
 				else if (g_strcmp0 (attribute_values[i], "other_db") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_OTHER_DB;
+					store->priv->parser_type = ZIF_MD_TYPE_OTHER_SQL;
 				else if (g_strcmp0 (attribute_values[i], "group") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_COMPS;
+					store->priv->parser_type = ZIF_MD_TYPE_COMPS;
 				else if (g_strcmp0 (attribute_values[i], "group_gz") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_COMPS_XML;
+					store->priv->parser_type = ZIF_MD_TYPE_COMPS_GZ;
 				else if (g_strcmp0 (attribute_values[i], "prestodelta") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_PRESTODELTA;
+					store->priv->parser_type = ZIF_MD_TYPE_PRESTODELTA;
 				else if (g_strcmp0 (attribute_values[i], "updateinfo") == 0)
-					store->priv->parser_type = ZIF_REPO_MD_TYPE_UPDATEINFO;
+					store->priv->parser_type = ZIF_MD_TYPE_UPDATEINFO;
 				else {
 					if (error != NULL) {
 						/* we didn't recognise the file type */
@@ -184,8 +209,8 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 						g_string_append_printf (string, "unhandled data type '%s', expecting ", attribute_values[i]);
 
 						/* list all the types we support */
-						for (j=0; j<ZIF_REPO_MD_TYPE_UNKNOWN; j++)
-							g_string_append_printf (string, "%s, ", zif_repo_md_type_to_text (j));
+						for (j=0; j<ZIF_MD_TYPE_UNKNOWN; j++)
+							g_string_append_printf (string, "%s, ", zif_md_type_to_text (j));
 
 						/* remove triling comma and space */
 						g_string_set_size (string, string->len - 2);
@@ -204,7 +229,7 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 	}
 
 	/* not a section we recognise */
-	if (store->priv->parser_type == ZIF_REPO_MD_TYPE_UNKNOWN)
+	if (store->priv->parser_type == ZIF_MD_TYPE_UNKNOWN)
 		goto out;
 
 	/* get MetaData object */
@@ -216,7 +241,7 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 	if (g_strcmp0 (element_name, "location") == 0) {
 		for (i=0; attribute_names[i] != NULL; i++) {
 			if (g_strcmp0 (attribute_names[i], "href") == 0) {
-				zif_repo_md_set_location (md, attribute_values[i]);
+				zif_md_set_location (md, attribute_values[i]);
 				break;
 			}
 		}
@@ -228,7 +253,7 @@ zif_store_remote_parser_start_element (GMarkupParseContext *context, const gchar
 	if (g_strcmp0 (element_name, "checksum") == 0) {
 		for (i=0; attribute_names[i] != NULL; i++) {
 			if (g_strcmp0 (attribute_names[i], "type") == 0) {
-				zif_repo_md_set_checksum_type (md, zif_store_remote_checksum_type_from_text (attribute_values[i]));
+				zif_md_set_checksum_type (md, zif_store_remote_checksum_type_from_text (attribute_values[i]));
 				break;
 			}
 		}
@@ -263,7 +288,7 @@ zif_store_remote_parser_end_element (GMarkupParseContext *context, const gchar *
 	/* reset */
 	store->priv->parser_section = ZIF_STORE_REMOTE_PARSER_SECTION_UNKNOWN;
 	if (g_strcmp0 (element_name, "data") == 0)
-		store->priv->parser_type = ZIF_REPO_MD_TYPE_UNKNOWN;
+		store->priv->parser_type = ZIF_MD_TYPE_UNKNOWN;
 }
 
 /**
@@ -274,10 +299,10 @@ zif_store_remote_parser_text (GMarkupParseContext *context, const gchar *text, g
 			      gpointer user_data, GError **error)
 
 {
-	ZifRepoMd *md;
+	ZifMd *md;
 	ZifStoreRemote *store = user_data;
 
-	if (store->priv->parser_type == ZIF_REPO_MD_TYPE_UNKNOWN)
+	if (store->priv->parser_type == ZIF_MD_TYPE_UNKNOWN)
 		return;
 
 	/* get MetaData object */
@@ -286,11 +311,11 @@ zif_store_remote_parser_text (GMarkupParseContext *context, const gchar *text, g
 		return;
 
 	if (store->priv->parser_section == ZIF_STORE_REMOTE_PARSER_SECTION_CHECKSUM)
-		zif_repo_md_set_checksum (md, text);
+		zif_md_set_checksum (md, text);
 	else if (store->priv->parser_section == ZIF_STORE_REMOTE_PARSER_SECTION_CHECKSUM_UNCOMPRESSED)
-		zif_repo_md_set_checksum_uncompressed (md, text);
+		zif_md_set_checksum_uncompressed (md, text);
 	else if (store->priv->parser_section == ZIF_STORE_REMOTE_PARSER_SECTION_TIMESTAMP)
-		zif_repo_md_set_timestamp (md, atol (text));
+		zif_md_set_timestamp (md, atol (text));
 }
 
 /**
@@ -496,6 +521,75 @@ out:
 }
 
 /**
+ * zif_store_remote_get_update_detail:
+ * @store: the #ZifStoreRemote object
+ * @package_id: the package_id of the package to find
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the update detail for a package.
+ *
+ * Return value: a %ZifUpdate, or %NULL for failure
+ *
+ * Since: 0.0.1
+ **/
+ZifUpdate *
+zif_store_remote_get_update_detail (ZifStoreRemote *store, const gchar *package_id,
+				    GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifUpdate *update = NULL;
+	ZifCompletion *completion_local;
+	GPtrArray *array = NULL;
+	GError *error_local = NULL;
+	gboolean ret;
+
+	/* setup completion */
+	if (store->priv->loaded_metadata)
+		zif_completion_set_number_steps (completion, 1);
+	else
+		zif_completion_set_number_steps (completion, 2);
+
+	/* if not already loaded, load */
+	if (!store->priv->loaded_metadata) {
+		completion_local = zif_completion_get_child (completion);
+		ret = zif_store_remote_load_metadata (store, cancellable, completion_local, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+				     "failed to load metadata: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+
+		/* this section done */
+		zif_completion_done (completion);
+	}
+
+	/* actually get the data */
+	completion_local = zif_completion_get_child (completion);
+	array = zif_md_updateinfo_get_detail_for_package (ZIF_MD_UPDATEINFO (store->priv->md_updateinfo), package_id,
+							  cancellable, completion_local, &error_local);
+	if (array == NULL) {
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "failed to find any details: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+	if (array->len == 1) {
+		update = g_object_ref (g_ptr_array_index (array, 0));
+		goto out;
+	}
+
+	/* FIXME: is this valid? */
+	g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+		     "invalid number of update entries: %i", array->len);
+out:
+	if (array != NULL)
+		g_ptr_array_unref (array);
+	return update;
+}
+
+/**
  * zif_store_remote_add_metalink:
  **/
 static gboolean
@@ -511,7 +605,7 @@ zif_store_remote_add_metalink (ZifStoreRemote *store, GCancellable *cancellable,
 	ZifDownload *download = NULL;
 
 	/* if we're loading the metadata with an empty cache, the file won't yet exist. So download it */
-	filename = zif_repo_md_get_filename_uncompressed (store->priv->md_metalink);
+	filename = zif_md_get_filename_uncompressed (store->priv->md_metalink);
 	if (filename == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "metalink filename not set for %s", store->priv->id);
@@ -545,7 +639,7 @@ zif_store_remote_add_metalink (ZifStoreRemote *store, GCancellable *cancellable,
 
 	/* get mirrors */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_metalink_get_uris (ZIF_REPO_MD_METALINK (store->priv->md_metalink), 50, cancellable, completion_local, &error_local);
+	array = zif_md_metalink_get_uris (ZIF_MD_METALINK (store->priv->md_metalink), 50, cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		ret = FALSE;
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -591,7 +685,7 @@ zif_store_remote_add_mirrorlist (ZifStoreRemote *store, GCancellable *cancellabl
 	ZifDownload *download = NULL;
 
 	/* if we're loading the metadata with an empty cache, the file won't yet exist. So download it */
-	filename = zif_repo_md_get_filename_uncompressed (store->priv->md_mirrorlist);
+	filename = zif_md_get_filename_uncompressed (store->priv->md_mirrorlist);
 	if (filename == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "mirrorlist filename not set for %s", store->priv->id);
@@ -625,7 +719,7 @@ zif_store_remote_add_mirrorlist (ZifStoreRemote *store, GCancellable *cancellabl
 
 	/* get mirrors */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_mirrorlist_get_uris (ZIF_REPO_MD_MIRRORLIST (store->priv->md_mirrorlist), cancellable, completion_local, &error_local);
+	array = zif_md_mirrorlist_get_uris (ZIF_MD_MIRRORLIST (store->priv->md_mirrorlist), cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		ret = FALSE;
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -679,9 +773,10 @@ zif_store_remote_load_metadata (ZifStoreRemote *store, GCancellable *cancellable
 	gchar *contents = NULL;
 	gchar *basename;
 	gchar *filename;
+	gboolean primary_okay = FALSE;
 	gsize size;
 	GError *error_local = NULL;
-	ZifRepoMd *md;
+	ZifMd *md;
 	GMarkupParseContext *context = NULL;
 	const GMarkupParser gpk_store_remote_markup_parser = {
 		zif_store_remote_parser_start_element,
@@ -788,44 +883,52 @@ zif_store_remote_load_metadata (ZifStoreRemote *store, GCancellable *cancellable
 		goto out;
 
 	/* set MD id and filename for each repo type */
-	for (i=0; i<ZIF_REPO_MD_TYPE_UNKNOWN; i++) {
+	for (i=0; i<ZIF_MD_TYPE_UNKNOWN; i++) {
 		md = zif_store_remote_get_md_from_type (store, i);
 		if (md == NULL) {
-			/* TODO: until we've created ZifRepoMdComps and ZifRepoMdOther we'll get warnings here */
-			egg_debug ("failed to get local store for %s with %s", zif_repo_md_type_to_text (i), store->priv->id);
+			/* TODO: until we've created ZifMdComps and ZifMdOther we'll get warnings here */
+			egg_debug ("failed to get local store for %s with %s", zif_md_type_to_text (i), store->priv->id);
 			continue;
 		}
 
 		/* no metalink? */
-		if (i == ZIF_REPO_MD_TYPE_METALINK)
+		if (i == ZIF_MD_TYPE_METALINK)
 			continue;
 
 		/* no mirrorlist? */
-		if (i == ZIF_REPO_MD_TYPE_MIRRORLIST)
+		if (i == ZIF_MD_TYPE_MIRRORLIST)
 			continue;
 
+		/* ensure we have at least one primary */
+		location = zif_md_get_location (md);
+		if (location != NULL &&
+		    (i == ZIF_MD_TYPE_PRIMARY_SQL ||
+		     i == ZIF_MD_TYPE_PRIMARY_XML)) {
+			primary_okay = TRUE;
+		}
+
 		/* location not set */
-		location = zif_repo_md_get_location (md);
 		if (location == NULL) {
-			/* messed up repo file, this is fatal */
-			if (i == ZIF_REPO_MD_TYPE_PRIMARY_DB) {
-				g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-					     "failed to get primary metadata location for %s", store->priv->id);
-				ret = FALSE;
-				goto out;
-			}
-			egg_debug ("no location set for %s with %s", zif_repo_md_type_to_text (i), store->priv->id);
+			egg_debug ("no location set for %s with %s", zif_md_type_to_text (i), store->priv->id);
 			continue;
 		}
 
 		/* set MD id and filename */
 		basename = g_path_get_basename (location);
 		filename = g_build_filename (store->priv->directory, basename, NULL);
-		zif_repo_md_set_filename (md, filename);
+		zif_md_set_filename (md, filename);
 		g_free (basename);
 		g_free (filename);
 	}
 
+	/* messed up repo file, this is fatal */
+	if (!primary_okay) {
+		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
+			     "failed to get primary metadata location for %s", store->priv->id);
+		ret = FALSE;
+		goto out;
+	}
+
 	/* all okay */
 	store->priv->loaded_metadata = TRUE;
 
@@ -876,7 +979,7 @@ zif_store_remote_refresh (ZifStore *store, gboolean force, GCancellable *cancell
 	const gchar *filename;
 	ZifCompletion *completion_local = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
-	ZifRepoMd *md;
+	ZifMd *md;
 	guint i;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), FALSE);
@@ -891,7 +994,7 @@ zif_store_remote_refresh (ZifStore *store, gboolean force, GCancellable *cancell
 	}
 
 	/* setup completion with the correct number of steps */
-	zif_completion_set_number_steps (completion, (ZIF_REPO_MD_TYPE_UNKNOWN * 2) + 2);
+	zif_completion_set_number_steps (completion, (ZIF_MD_TYPE_UNKNOWN * 2) + 2);
 
 	/* not locked */
 	ret = zif_lock_is_locked (remote->priv->lock, NULL);
@@ -930,28 +1033,28 @@ zif_store_remote_refresh (ZifStore *store, gboolean force, GCancellable *cancell
 	zif_completion_done (completion);
 
 	/* refresh each repo type */
-	for (i=0; i<ZIF_REPO_MD_TYPE_UNKNOWN; i++) {
+	for (i=0; i<ZIF_MD_TYPE_UNKNOWN; i++) {
 		md = zif_store_remote_get_md_from_type (remote, i);
 		if (md == NULL) {
-			egg_debug ("failed to get local store for %s", zif_repo_md_type_to_text (i));
+			egg_debug ("failed to get local store for %s", zif_md_type_to_text (i));
 			continue;
 		}
 
 		/* get filename */
-		filename = zif_repo_md_get_location (md);
+		filename = zif_md_get_location (md);
 		if (filename == NULL) {
-			egg_warning ("no filename set for %s", zif_repo_md_type_to_text (i));
+			egg_warning ("no filename set for %s", zif_md_type_to_text (i));
 			continue;
 		}
 
 		/* does current uncompressed file equal what repomd says it should be */
-		ret = zif_repo_md_file_check (md, TRUE, &error_local);
+		ret = zif_md_file_check (md, TRUE, &error_local);
 		if (!ret) {
 			egg_warning ("failed to verify md: %s", error_local->message);
 			g_clear_error (&error_local);
 		}
 		if (ret && !force) {
-			egg_debug ("%s is okay, and we're not forcing", zif_repo_md_type_to_text (i));
+			egg_debug ("%s is okay, and we're not forcing", zif_md_type_to_text (i));
 			continue;
 		}
 
@@ -960,7 +1063,7 @@ zif_store_remote_refresh (ZifStore *store, gboolean force, GCancellable *cancell
 		ret = zif_store_remote_download (remote, filename, remote->priv->directory, cancellable, completion_local, &error_local);
 		if (!ret) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-				     "failed to refresh %s (%s): %s", zif_repo_md_type_to_text (i), filename, error_local->message);
+				     "failed to refresh %s (%s): %s", zif_md_type_to_text (i), filename, error_local->message);
 			g_error_free (error_local);
 			goto out;
 		}
@@ -970,12 +1073,12 @@ zif_store_remote_refresh (ZifStore *store, gboolean force, GCancellable *cancell
 
 		/* decompress */
 		completion_local = zif_completion_get_child (completion);
-		filename = zif_repo_md_get_filename (md);
+		filename = zif_md_get_filename (md);
 		ret = zif_store_file_decompress (filename, cancellable, completion_local, &error_local);
 		if (!ret) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 				     "failed to decompress %s for %s: %s",
-				     filename, zif_repo_md_type_to_text (i), error_local->message);
+				     filename, zif_md_type_to_text (i), error_local->message);
 			g_error_free (error_local);
 			goto out;
 		}
@@ -1093,14 +1196,14 @@ zif_store_remote_load (ZifStore *store, GCancellable *cancellable, ZifCompletion
 	/* we have to set this here in case we are using the metalink to download repodata.xml */
 	if (remote->priv->metalink != NULL) {
 		filename = g_build_filename (remote->priv->directory, "metalink.xml", NULL);
-		zif_repo_md_set_filename (remote->priv->md_metalink, filename);
+		zif_md_set_filename (remote->priv->md_metalink, filename);
 		g_free (filename);
 	}
 
 	/* we have to set this here in case we are using the mirrorlist to download repodata.xml */
 	if (remote->priv->mirrorlist != NULL) {
 		filename = g_build_filename (remote->priv->directory, "mirrorlist.txt", NULL);
-		zif_repo_md_set_filename (remote->priv->md_mirrorlist, filename);
+		zif_md_set_filename (remote->priv->md_mirrorlist, filename);
 		g_free (filename);
 	}
 
@@ -1136,7 +1239,7 @@ zif_store_remote_clean (ZifStore *store, GCancellable *cancellable, ZifCompletio
 	GFile *file;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
-	ZifRepoMd *md;
+	ZifMd *md;
 	guint i;
 	const gchar *location;
 
@@ -1153,9 +1256,9 @@ zif_store_remote_clean (ZifStore *store, GCancellable *cancellable, ZifCompletio
 
 	/* setup completion with the correct number of steps */
 	if (remote->priv->loaded_metadata)
-		zif_completion_set_number_steps (completion, 1+ZIF_REPO_MD_TYPE_UNKNOWN);
+		zif_completion_set_number_steps (completion, 1+ZIF_MD_TYPE_UNKNOWN);
 	else
-		zif_completion_set_number_steps (completion, 2+ZIF_REPO_MD_TYPE_UNKNOWN);
+		zif_completion_set_number_steps (completion, 2+ZIF_MD_TYPE_UNKNOWN);
 
 	/* load metadata */
 	if (!remote->priv->loaded_metadata) {
@@ -1174,26 +1277,26 @@ zif_store_remote_clean (ZifStore *store, GCancellable *cancellable, ZifCompletio
 	}
 
 	/* set MD id and filename for each repo type */
-	for (i=0; i<ZIF_REPO_MD_TYPE_UNKNOWN; i++) {
+	for (i=0; i<ZIF_MD_TYPE_UNKNOWN; i++) {
 		md = zif_store_remote_get_md_from_type (remote, i);
 		if (md == NULL) {
-			/* TODO: until we've created ZifRepoMdComps and ZifRepoMdOther we'll get warnings here */
-			egg_debug ("failed to get local store for %s with %s", zif_repo_md_type_to_text (i), remote->priv->id);
+			/* TODO: until we've created ZifMdComps and ZifMdOther we'll get warnings here */
+			egg_debug ("failed to get local store for %s with %s", zif_md_type_to_text (i), remote->priv->id);
 			goto skip;
 		}
 
 		/* location not set */
-		location = zif_repo_md_get_location (md);
+		location = zif_md_get_location (md);
 		if (location == NULL) {
-			egg_debug ("no location set for %s with %s", zif_repo_md_type_to_text (i), remote->priv->id);
+			egg_debug ("no location set for %s with %s", zif_md_type_to_text (i), remote->priv->id);
 			goto skip;
 		}
 
 		/* clean md */
-		ret = zif_repo_md_clean (md, &error_local);
+		ret = zif_md_clean (md, &error_local);
 		if (!ret) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-				     "failed to clean %s: %s", zif_repo_md_type_to_text (i), error_local->message);
+				     "failed to clean %s: %s", zif_md_type_to_text (i), error_local->message);
 			g_error_free (error_local);
 			goto out;
 		}
@@ -1237,7 +1340,7 @@ zif_store_remote_set_from_file (ZifStoreRemote *store, const gchar *repo_filenam
 	gboolean ret = TRUE;
 	guint i;
 	GError *error_local = NULL;
-	ZifRepoMd *md;
+	ZifMd *md;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), FALSE);
 	g_return_val_if_fail (repo_filename != NULL, FALSE);
@@ -1264,11 +1367,11 @@ zif_store_remote_set_from_file (ZifStoreRemote *store, const gchar *repo_filenam
 	store->priv->repomd_filename = g_build_filename (store->priv->cache_dir, store->priv->id, "repomd.xml", NULL);
 
 	/* set MD id for each repo type */
-	for (i=0; i<ZIF_REPO_MD_TYPE_UNKNOWN; i++) {
+	for (i=0; i<ZIF_MD_TYPE_UNKNOWN; i++) {
 		md = zif_store_remote_get_md_from_type (store, i);
 		if (md == NULL)
 			continue;
-		zif_repo_md_set_id (md, store->priv->id);
+		zif_md_set_id (md, store->priv->id);
 	}
 
 	/* setup watch */
@@ -1417,7 +1520,7 @@ zif_store_remote_resolve (ZifStore *store, const gchar *search, GCancellable *ca
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_resolve (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), search, cancellable, completion_local, error);
+	array = zif_md_resolve (remote->priv->md_primary_db, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1436,6 +1539,7 @@ zif_store_remote_search_name (ZifStore *store, const gchar *search, GCancellable
 	GPtrArray *array = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *md;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -1470,7 +1574,8 @@ zif_store_remote_search_name (ZifStore *store, const gchar *search, GCancellable
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_search_name (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), search, cancellable, completion_local, error);
+	md = zif_store_remote_get_primary (remote);
+	array = zif_md_search_name (md, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1489,6 +1594,7 @@ zif_store_remote_search_details (ZifStore *store, const gchar *search, GCancella
 	GPtrArray *array = NULL;
 	ZifStoreRemote *remote = ZIF_STORE_REMOTE (store);
 	ZifCompletion *completion_local;
+	ZifMd *md;
 
 	g_return_val_if_fail (ZIF_IS_STORE_REMOTE (store), NULL);
 	g_return_val_if_fail (remote->priv->id != NULL, NULL);
@@ -1523,7 +1629,8 @@ zif_store_remote_search_details (ZifStore *store, const gchar *search, GCancella
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_search_details (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), search, cancellable, completion_local, error);
+	md = zif_store_remote_get_primary (remote);
+	array = zif_md_search_details (md, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1652,7 +1759,7 @@ zif_store_remote_search_category (ZifStore *store, const gchar *group_id, GCance
 	}
 
 	/* does this repo have comps data? */
-	location = zif_repo_md_get_location (remote->priv->md_comps);
+	location = zif_md_get_location (remote->priv->md_comps);
 	if (location == NULL) {
 		/* empty array, as we want success */
 		array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
@@ -1661,7 +1768,7 @@ zif_store_remote_search_category (ZifStore *store, const gchar *group_id, GCance
 
 	/* get package names for group */
 	completion_local = zif_completion_get_child (completion);
-	array_names = zif_repo_md_comps_get_packages_for_group (ZIF_REPO_MD_COMPS (remote->priv->md_comps),
+	array_names = zif_md_comps_get_packages_for_group (ZIF_MD_COMPS (remote->priv->md_comps),
 								group_id, cancellable, completion_local, &error_local);
 	if (array_names == NULL) {
 		/* ignore when group isn't present, TODO: use GError code */
@@ -1771,7 +1878,7 @@ zif_store_remote_search_group (ZifStore *store, const gchar *search, GCancellabl
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_search_group (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), search, cancellable, completion_local, error);
+	array = zif_md_search_group (remote->priv->md_primary_db, search, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1826,7 +1933,7 @@ zif_store_remote_find_package (ZifStore *store, const gchar *package_id, GCancel
 
 	/* search with predicate, TODO: search version (epoch+release) */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_find_package (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), package_id, cancellable, completion_local, &error_local);
+	array = zif_md_find_package (remote->priv->md_primary_db, package_id, cancellable, completion_local, &error_local);
 	if (array == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to search: %s", error_local->message);
@@ -1903,7 +2010,7 @@ zif_store_remote_get_packages (ZifStore *store, GCancellable *cancellable, ZifCo
 	}
 
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_get_packages (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), cancellable, completion_local, error);
+	array = zif_md_get_packages (remote->priv->md_primary_db, cancellable, completion_local, error);
 
 	/* this section done */
 	zif_completion_done (completion);
@@ -1965,7 +2072,7 @@ zif_store_remote_get_categories (ZifStore *store, GCancellable *cancellable, Zif
 	}
 
 	/* does this repo have comps data? */
-	location = zif_repo_md_get_location (remote->priv->md_comps);
+	location = zif_md_get_location (remote->priv->md_comps);
 	if (location == NULL) {
 		/* empty array, as we want success */
 		array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
@@ -1974,7 +2081,7 @@ zif_store_remote_get_categories (ZifStore *store, GCancellable *cancellable, Zif
 
 	/* get list of categories */
 	completion_local = zif_completion_get_child (completion);
-	array_cats = zif_repo_md_comps_get_categories (ZIF_REPO_MD_COMPS (remote->priv->md_comps), cancellable, completion_local, &error_local);
+	array_cats = zif_md_comps_get_categories (ZIF_MD_COMPS (remote->priv->md_comps), cancellable, completion_local, &error_local);
 	if (array_cats == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to get categories: %s", error_local->message);
@@ -2002,7 +2109,7 @@ zif_store_remote_get_categories (ZifStore *store, GCancellable *cancellable, Zif
 
 		/* get the groups for this category */
 		completion_loop = zif_completion_get_child (completion_local);
-		array_groups = zif_repo_md_comps_get_groups_for_category (ZIF_REPO_MD_COMPS (remote->priv->md_comps),
+		array_groups = zif_md_comps_get_groups_for_category (ZIF_MD_COMPS (remote->priv->md_comps),
 									  pk_category_get_id (category), cancellable, completion_loop, &error_local);
 		if (array_groups == NULL) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
@@ -2042,58 +2149,13 @@ out:
 }
 
 /**
- * zif_store_remote_filter_newest:
- **/
-static void
-zif_store_remote_filter_newest (GPtrArray *packages)
-{
-	guint i;
-	GHashTable *hash;
-	ZifPackage *package;
-	ZifPackage *package_tmp;
-	const gchar *name;
-
-	/* use a hash so it's O(n) not O(n^2) */
-	hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
-	for (i=0; i<packages->len; i++) {
-		package = ZIF_PACKAGE (g_ptr_array_index (packages, i));
-		name = zif_package_get_name (package);
-		package_tmp = g_hash_table_lookup (hash, name);
-
-		/* does not already exist */
-		if (package_tmp == NULL) {
-			g_hash_table_insert (hash, g_strdup (name), g_object_ref (package));
-			continue;
-		}
-
-		/* the new package is older */
-		if (zif_package_compare (package, package_tmp) < 0) {
-			egg_debug ("%s is older than %s, so ignoring it",
-				   zif_package_get_id (package), zif_package_get_id (package_tmp));
-			g_ptr_array_remove_index_fast (packages, i);
-			continue;
-		}
-
-		egg_debug ("removing %s", zif_package_get_id (package_tmp));
-		egg_debug ("adding %s", zif_package_get_id (package));
-
-		/* remove the old one */
-		g_hash_table_remove (hash, zif_package_get_name (package_tmp));
-		g_hash_table_insert (hash, g_strdup (name), g_object_ref (package));
-		g_ptr_array_remove_fast (packages, package_tmp);
-	}
-	g_hash_table_unref (hash);
-}
-
-/**
  * zif_store_remote_get_updates:
  **/
 static GPtrArray *
-zif_store_remote_get_updates (ZifStore *store, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_remote_get_updates (ZifStore *store, GPtrArray *packages,
+			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	gboolean ret;
-	ZifStore *store_local;
-	GPtrArray *packages;
 	GPtrArray *updates;
 	GPtrArray *array = NULL;
 	ZifPackage *package;
@@ -2118,9 +2180,9 @@ zif_store_remote_get_updates (ZifStore *store, GCancellable *cancellable, ZifCom
 
 	/* setup completion */
 	if (remote->priv->loaded_metadata)
-		zif_completion_set_number_steps (completion, 2);
+		zif_completion_set_number_steps (completion, 1);
 	else
-		zif_completion_set_number_steps (completion, 3);
+		zif_completion_set_number_steps (completion, 2);
 
 	/* load metadata */
 	if (!remote->priv->loaded_metadata) {
@@ -2137,28 +2199,11 @@ zif_store_remote_get_updates (ZifStore *store, GCancellable *cancellable, ZifCom
 		zif_completion_done (completion);
 	}
 
-	/* get list of local packages */
-	store_local = ZIF_STORE (zif_store_local_new ());
-	completion_local = zif_completion_get_child (completion);
-	packages = zif_store_get_packages (store_local, cancellable, completion_local, &error_local);
-	if (packages == NULL) {
-		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
-			     "failed to get local store: %s", error_local->message);
-		g_error_free (error_local);
-		goto out;
-	}
-	egg_debug ("searching with %i packages", packages->len);
-
-	/* remove any packages that are not newest (think kernel) */
-	zif_store_remote_filter_newest (packages);
-
-	/* this section done */
-	zif_completion_done (completion);
-
 	/* create array for packages to update */
 	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
 
 	/* find each one in a remote repo */
+	egg_debug ("searching with %i packages", packages->len);
 	for (i=0; i<packages->len; i++) {
 		package = ZIF_PACKAGE (g_ptr_array_index (packages, i));
 		package_id = zif_package_get_id (package);
@@ -2166,13 +2211,17 @@ zif_store_remote_get_updates (ZifStore *store, GCancellable *cancellable, ZifCom
 		/* find package name in repo */
 		completion_local = zif_completion_get_child (completion);
 		split = pk_package_id_split (package_id);
-		updates = zif_repo_md_primary_resolve (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), split[PK_PACKAGE_ID_NAME], cancellable, completion_local, NULL);
+		updates = zif_md_resolve (remote->priv->md_primary_db, split[PK_PACKAGE_ID_NAME],
+						  cancellable, completion_local, NULL);
 		g_strfreev (split);
 		if (updates == NULL) {
 			egg_debug ("not found %s", split[PK_PACKAGE_ID_NAME]);
 			continue;
 		}
 
+		/* some repos contain lots of versions of one package */
+		zif_package_array_filter_newest (updates);
+
 		/* find updates */
 		for (j=0; j<updates->len; j++) {
 			update = ZIF_PACKAGE (g_ptr_array_index (updates, j));
@@ -2194,9 +2243,6 @@ zif_store_remote_get_updates (ZifStore *store, GCancellable *cancellable, ZifCom
 
 	/* this section done */
 	zif_completion_done (completion);
-
-	g_ptr_array_unref (packages);
-	g_object_unref (store_local);
 out:
 	return array;
 }
@@ -2245,7 +2291,7 @@ zif_store_remote_what_provides (ZifStore *store, const gchar *search,
 
 	/* get details */
 	completion_local = zif_completion_get_child (completion);
-	array = zif_repo_md_primary_what_provides (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), search,
+	array = zif_md_what_provides (remote->priv->md_primary_db, search,
 						   cancellable, completion_local, error);
 
 	/* this section done */
@@ -2302,7 +2348,7 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 
 	/* gets a list of pkgId's that match this file */
 	completion_local = zif_completion_get_child (completion);
-	pkgids = zif_repo_md_filelists_search_file (ZIF_REPO_MD_FILELISTS (remote->priv->md_filelists), search, cancellable, completion_local, &error_local);
+	pkgids = zif_md_filelists_search_file (ZIF_MD_FILELISTS (remote->priv->md_filelists), search, cancellable, completion_local, &error_local);
 	if (pkgids == NULL) {
 		g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED,
 			     "failed to load get list of pkgids: %s", error_local->message);
@@ -2320,7 +2366,7 @@ zif_store_remote_search_file (ZifStore *store, const gchar *search, GCancellable
 
 		/* get the results (should just be one) */
 		completion_local = zif_completion_get_child (completion);
-		tmp = zif_repo_md_primary_search_pkgid (ZIF_REPO_MD_PRIMARY (remote->priv->md_primary), pkgid, cancellable, completion_local, &error_local);
+		tmp = zif_md_search_pkgid (remote->priv->md_primary_db, pkgid, cancellable, completion_local, &error_local);
 		if (tmp == NULL) {
 			g_set_error (error, ZIF_STORE_ERROR, ZIF_STORE_ERROR_FAILED_TO_FIND,
 				     "failed to resolve pkgId to package: %s", error_local->message);
@@ -2560,9 +2606,11 @@ zif_store_remote_finalize (GObject *object)
 	g_free (store->priv->repomd_filename);
 	g_free (store->priv->directory);
 
-	g_object_unref (store->priv->md_primary);
+	g_object_unref (store->priv->md_primary_db);
+	g_object_unref (store->priv->md_primary_xml);
 	g_object_unref (store->priv->md_filelists);
 	g_object_unref (store->priv->md_comps);
+	g_object_unref (store->priv->md_updateinfo);
 	g_object_unref (store->priv->md_metalink);
 	g_object_unref (store->priv->md_mirrorlist);
 	g_object_unref (store->priv->config);
@@ -2614,7 +2662,7 @@ zif_store_remote_init (ZifStoreRemote *store)
 	gchar *cache_dir = NULL;
 	guint i;
 	GError *error = NULL;
-	ZifRepoMd *md;
+	ZifMd *md;
 
 	store->priv = ZIF_STORE_REMOTE_GET_PRIVATE (store);
 	store->priv->loaded = FALSE;
@@ -2631,12 +2679,14 @@ zif_store_remote_init (ZifStoreRemote *store)
 	store->priv->config = zif_config_new ();
 	store->priv->monitor = zif_monitor_new ();
 	store->priv->lock = zif_lock_new ();
-	store->priv->md_filelists = ZIF_REPO_MD (zif_repo_md_filelists_new ());
-	store->priv->md_primary = ZIF_REPO_MD (zif_repo_md_primary_new ());
-	store->priv->md_metalink = ZIF_REPO_MD (zif_repo_md_metalink_new ());
-	store->priv->md_mirrorlist = ZIF_REPO_MD (zif_repo_md_mirrorlist_new ());
-	store->priv->md_comps = ZIF_REPO_MD (zif_repo_md_comps_new ());
-	store->priv->parser_type = ZIF_REPO_MD_TYPE_UNKNOWN;
+	store->priv->md_filelists = ZIF_MD (zif_md_filelists_new ());
+	store->priv->md_primary_db = ZIF_MD (zif_md_primary_sql_new ());
+	store->priv->md_primary_xml = ZIF_MD (zif_md_primary_xml_new ());
+	store->priv->md_metalink = ZIF_MD (zif_md_metalink_new ());
+	store->priv->md_mirrorlist = ZIF_MD (zif_md_mirrorlist_new ());
+	store->priv->md_comps = ZIF_MD (zif_md_comps_new ());
+	store->priv->md_updateinfo = ZIF_MD (zif_md_updateinfo_new ());
+	store->priv->parser_type = ZIF_MD_TYPE_UNKNOWN;
 	store->priv->parser_section = ZIF_STORE_REMOTE_PARSER_SECTION_UNKNOWN;
 	g_signal_connect (store->priv->monitor, "changed", G_CALLBACK (zif_store_remote_file_monitor_cb), store);
 
@@ -2657,16 +2707,16 @@ zif_store_remote_init (ZifStoreRemote *store)
 	}
 
 	/* set MD type on each repo */
-	for (i=0; i<ZIF_REPO_MD_TYPE_UNKNOWN; i++) {
+	for (i=0; i<ZIF_MD_TYPE_UNKNOWN; i++) {
 		md = zif_store_remote_get_md_from_type (store, i);
 		if (md == NULL)
 			continue;
 
 		/* set parent reference */
-		zif_repo_md_set_store_remote (md, store);
+		zif_md_set_store_remote (md, store);
 
 		/* set MD type */
-		zif_repo_md_set_mdtype (md, i);
+		zif_md_set_mdtype (md, i);
 	}
 out:
 	g_free (cache_dir);
@@ -2700,6 +2750,7 @@ zif_store_remote_test (EggTest *test)
 	ZifGroups *groups;
 	ZifStoreRemote *store;
 	ZifStoreLocal *store_local;
+	GPtrArray *packages;
 	ZifConfig *config;
 	ZifLock *lock;
 	ZifCompletion *completion;
@@ -2753,7 +2804,12 @@ zif_store_remote_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "get updates");
 	zif_completion_reset (completion);
-	array = zif_store_remote_get_updates (ZIF_STORE (store), NULL, completion, &error);
+	packages = zif_store_get_packages (ZIF_STORE (store_local), NULL, completion, &error);
+	if (packages == NULL)
+		egg_test_failed (test, "failed to get local store: %s", error->message);
+	zif_package_array_filter_newest (packages);
+	zif_completion_reset (completion);
+	array = zif_store_remote_get_updates (ZIF_STORE (store), packages, NULL, completion, &error);
 	if (array == NULL)
 		egg_test_failed (test, "no data: %s", error->message);
 	else if (array->len > 0)
@@ -2761,6 +2817,7 @@ zif_store_remote_test (EggTest *test)
 	else
 		egg_test_success (test, "no updates"); //TODO: failure
 	g_ptr_array_unref (array);
+	g_ptr_array_unref (packages);
 
 	/************************************************************/
 	egg_test_title (test, "is devel");
diff --git a/backends/yum/libzif/zif-store-remote.h b/backends/yum/libzif/zif-store-remote.h
index fe236d8..e6d95de 100644
--- a/backends/yum/libzif/zif-store-remote.h
+++ b/backends/yum/libzif/zif-store-remote.h
@@ -31,6 +31,7 @@
 
 #include "zif-store.h"
 #include "zif-package.h"
+#include "zif-update.h"
 
 G_BEGIN_DECLS
 
@@ -85,6 +86,11 @@ gboolean	 zif_store_remote_download		(ZifStoreRemote		*store,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
 							 GError			**error);
+ZifUpdate	*zif_store_remote_get_update_detail	(ZifStoreRemote		*store,
+							 const gchar		*package_id,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
 gboolean	 zif_store_remote_check			(ZifStoreRemote		*store,
 							 GCancellable		*cancellable,
 							 ZifCompletion		*completion,
diff --git a/backends/yum/libzif/zif-store.c b/backends/yum/libzif/zif-store.c
index efba57d..fe8b704 100644
--- a/backends/yum/libzif/zif-store.c
+++ b/backends/yum/libzif/zif-store.c
@@ -415,6 +415,7 @@ zif_store_get_packages (ZifStore *store, GCancellable *cancellable, ZifCompletio
 /**
  * zif_store_get_updates:
  * @store: the #ZifStore object
+ * @packages: an array of #ZifPackage's
  * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
  * @completion: a #ZifCompletion to use for progress reporting
  * @error: a #GError which is used on failure, or %NULL
@@ -426,12 +427,14 @@ zif_store_get_packages (ZifStore *store, GCancellable *cancellable, ZifCompletio
  * Since: 0.0.1
  **/
 GPtrArray *
-zif_store_get_updates (ZifStore *store, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+zif_store_get_updates (ZifStore *store, GPtrArray *packages,
+		       GCancellable *cancellable, ZifCompletion *completion, GError **error)
 {
 	ZifStoreClass *klass = ZIF_STORE_GET_CLASS (store);
 
 	g_return_val_if_fail (ZIF_IS_STORE (store), NULL);
 	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+	g_return_val_if_fail (packages != NULL, NULL);
 
 	/* no support */
 	if (klass->get_updates == NULL) {
@@ -440,7 +443,7 @@ zif_store_get_updates (ZifStore *store, GCancellable *cancellable, ZifCompletion
 		return NULL;
 	}
 
-	return klass->get_updates (store, cancellable, completion, error);
+	return klass->get_updates (store, packages, cancellable, completion, error);
 }
 
 /**
diff --git a/backends/yum/libzif/zif-store.h b/backends/yum/libzif/zif-store.h
index 83b1a25..a0bf212 100644
--- a/backends/yum/libzif/zif-store.h
+++ b/backends/yum/libzif/zif-store.h
@@ -110,6 +110,7 @@ struct _ZifStoreClass
 						 ZifCompletion		*completion,
 						 GError			**error);
 	GPtrArray	*(*get_updates)		(ZifStore		*store,
+						 GPtrArray		*packages,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
@@ -194,6 +195,7 @@ GPtrArray	*zif_store_get_packages		(ZifStore		*store,
 						 ZifCompletion		*completion,
 						 GError			**error);
 GPtrArray	*zif_store_get_updates		(ZifStore		*store,
+						 GPtrArray		*packages,
 						 GCancellable		*cancellable,
 						 ZifCompletion		*completion,
 						 GError			**error);
diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index daef16a..bcbd6f3 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -1433,6 +1433,7 @@ backend_get_updates_thread (PkBackend *backend)
 	ZifCompletion *completion_local;
 	GPtrArray *array = NULL;
 	GPtrArray *result = NULL;
+	GPtrArray *packages = NULL;
 	gboolean ret;
 	GError *error = NULL;
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
@@ -1449,7 +1450,7 @@ backend_get_updates_thread (PkBackend *backend)
 
 	/* setup completion */
 	zif_completion_reset (priv->completion);
-	zif_completion_set_number_steps (priv->completion, 2);
+	zif_completion_set_number_steps (priv->completion, 4);
 
 	/* get a store_array of remote stores */
 	store_array = zif_store_array_new ();
@@ -1464,9 +1465,28 @@ backend_get_updates_thread (PkBackend *backend)
 	/* this section done */
 	zif_completion_done (priv->completion);
 
+	/* get all the installed packages */
+	completion_local = zif_completion_get_child (priv->completion);
+	packages = zif_store_get_packages (ZIF_STORE (priv->store_local), NULL, completion_local, &error);
+	if (packages == NULL) {
+		g_print ("failed to get local store: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+	egg_debug ("searching for updates with %i packages", packages->len);
+
+	/* this section done */
+	zif_completion_done (priv->completion);
+
+	/* remove any packages that are not newest (think kernel) */
+	zif_package_array_filter_newest (packages);
+
+	/* this section done */
+	zif_completion_done (priv->completion);
+
 	/* get updates */
 	completion_local = zif_completion_get_child (priv->completion);
-	array = zif_store_array_get_updates (store_array, (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
+	array = zif_store_array_get_updates (store_array, packages, (ZifStoreArrayErrorCb) backend_error_handler_cb, backend,
 					     priv->cancellable, completion_local, &error);
 	if (array == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_INTERNAL_ERROR, "failed to get updates: %s\n", error->message);
@@ -1489,6 +1509,8 @@ backend_get_updates_thread (PkBackend *backend)
 out:
 	backend_unlock (backend);
 	pk_backend_finished (backend);
+	if (packages != NULL)
+		g_ptr_array_unref (packages);
 	if (array != NULL)
 		g_ptr_array_unref (array);
 	if (result != NULL)
commit 9d659a43d888c481964611c7af6182f3e5c88319
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 13:19:23 2010 +0100

    trivial: update to the latest snapshot of libzif to support legacy primary metadata

diff --git a/backends/yum/libzif/zif-md-comps.c b/backends/yum/libzif/zif-md-comps.c
new file mode 100644
index 0000000..29803ff
--- /dev/null
+++ b/backends/yum/libzif/zif-md-comps.c
@@ -0,0 +1,960 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-comps
+ * @short_description: Comps metadata functionality
+ *
+ * Provide access to the comps repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+
+#include "zif-md.h"
+#include "zif-md-comps.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_COMPS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_COMPS, ZifMdCompsPrivate))
+
+typedef enum {
+	ZIF_MD_COMPS_SECTION_GROUP,
+	ZIF_MD_COMPS_SECTION_CATEGORY,
+	ZIF_MD_COMPS_SECTION_UNKNOWN
+} ZifMdCompsSection;
+
+typedef enum {
+	ZIF_MD_COMPS_SECTION_GROUP_ID,
+	ZIF_MD_COMPS_SECTION_GROUP_NAME,
+	ZIF_MD_COMPS_SECTION_GROUP_DESCRIPTION,
+	ZIF_MD_COMPS_SECTION_GROUP_VISIBLE,
+	ZIF_MD_COMPS_SECTION_GROUP_PACKAGELIST,
+	ZIF_MD_COMPS_SECTION_GROUP_PACKAGE,
+	ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN
+} ZifMdCompsSectionGroup;
+
+typedef enum {
+	ZIF_MD_COMPS_SECTION_GROUP_TYPE_DEFAULT,
+	ZIF_MD_COMPS_SECTION_GROUP_TYPE_OPTIONAL,
+	ZIF_MD_COMPS_SECTION_GROUP_TYPE_CONDITIONAL,
+	ZIF_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN
+} ZifMdCompsSectionGroupType;
+
+typedef enum {
+	ZIF_MD_COMPS_SECTION_CATEGORY_ID,
+	ZIF_MD_COMPS_SECTION_CATEGORY_NAME,
+	ZIF_MD_COMPS_SECTION_CATEGORY_DESCRIPTION,
+	ZIF_MD_COMPS_SECTION_CATEGORY_GROUPLIST,
+	ZIF_MD_COMPS_SECTION_CATEGORY_GROUP,
+	ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN
+} ZifMdCompsSectionCategory;
+
+typedef struct {
+	gchar				*id;
+	gchar				*name;
+	gchar				*description;
+	gboolean			 visible;
+	GPtrArray			*packagelist;		/* stored as gchar */
+} ZifMdCompsGroupData;
+
+typedef struct {
+	gchar				*id;
+	gchar				*name;
+	gchar				*description;
+	GPtrArray			*grouplist;		/* stored as gchar */
+} ZifMdCompsCategoryData;
+
+/**
+ * ZifMdCompsPrivate:
+ *
+ * Private #ZifMdComps data
+ **/
+struct _ZifMdCompsPrivate
+{
+	gboolean			 loaded;
+	GPtrArray			*array_groups;		/* stored as ZifMdCompsGroupData */
+	GPtrArray			*array_categories;	/* stored as ZifMdCompsCategoryData */
+	/* for parser */
+	ZifMdCompsSection		 section;
+	ZifMdCompsSectionGroup		 section_group;
+	ZifMdCompsSectionGroupType	 section_group_type;
+	ZifMdCompsSectionCategory	 section_category;
+	ZifMdCompsGroupData		*group_data_temp;
+	ZifMdCompsCategoryData		*category_data_temp;
+};
+
+G_DEFINE_TYPE (ZifMdComps, zif_md_comps, ZIF_TYPE_MD)
+
+/**
+ * zif_md_comps_group_data_new:
+ **/
+static ZifMdCompsGroupData *
+zif_md_comps_group_data_new (void)
+{
+	ZifMdCompsGroupData *data;
+	data = g_new0 (ZifMdCompsGroupData, 1);
+	data->packagelist = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+	return data;
+}
+
+/**
+ * zif_md_comps_category_data_new:
+ **/
+static ZifMdCompsCategoryData *
+zif_md_comps_category_data_new (void)
+{
+	ZifMdCompsCategoryData *data;
+	data = g_new0 (ZifMdCompsCategoryData, 1);
+	data->grouplist = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+	return data;
+}
+
+/**
+ * zif_md_comps_group_data_free:
+ **/
+static void
+zif_md_comps_group_data_free (ZifMdCompsGroupData *data)
+{
+	g_free (data->id);
+	g_free (data->name);
+	g_free (data->description);
+	g_ptr_array_unref (data->packagelist);
+	g_free (data);
+}
+
+/**
+ * zif_md_comps_category_data_free:
+ **/
+static void
+zif_md_comps_category_data_free (ZifMdCompsCategoryData *data)
+{
+	g_free (data->id);
+	g_free (data->name);
+	g_free (data->description);
+	g_ptr_array_unref (data->grouplist);
+	g_free (data);
+}
+
+/**
+ * zif_md_comps_parser_start_element:
+ **/
+static void
+zif_md_comps_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
+				   const gchar **attribute_names, const gchar **attribute_values,
+				   gpointer user_data, GError **error)
+{
+	guint i;
+	ZifMdComps *comps = user_data;
+
+	g_return_if_fail (ZIF_IS_MD_COMPS (comps));
+
+	/* group element */
+	if (comps->priv->section == ZIF_MD_COMPS_SECTION_UNKNOWN) {
+
+		/* start of group */
+		if (g_strcmp0 (element_name, "group") == 0) {
+			comps->priv->section = ZIF_MD_COMPS_SECTION_GROUP;
+			comps->priv->group_data_temp = zif_md_comps_group_data_new ();
+			goto out;
+		}
+
+		/* start of category */
+		if (g_strcmp0 (element_name, "category") == 0) {
+			comps->priv->section = ZIF_MD_COMPS_SECTION_CATEGORY;
+			comps->priv->category_data_temp = zif_md_comps_category_data_new ();
+			goto out;
+		}
+
+		goto out;
+	}
+
+	/* group element */
+	if (comps->priv->section == ZIF_MD_COMPS_SECTION_GROUP) {
+		/* id */
+		if (g_strcmp0 (element_name, "id") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_ID;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "name") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_NAME;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "description") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_DESCRIPTION;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "uservisible") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_VISIBLE;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "packagelist") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_PACKAGELIST;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "packagereq") == 0) {
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_PACKAGE;
+
+			/* find the package type as a bonus */
+			comps->priv->section_group_type = ZIF_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN;
+			for (i=0; attribute_names[i] != NULL; i++) {
+				if (g_strcmp0 (element_name, "type") == 0) {
+					if (g_strcmp0 (attribute_values[i], "default"))
+						comps->priv->section_group_type = ZIF_MD_COMPS_SECTION_GROUP_TYPE_DEFAULT;
+					break;
+				}
+			}
+			goto out;
+		}
+	}
+
+	/* category element */
+	if (comps->priv->section == ZIF_MD_COMPS_SECTION_CATEGORY) {
+		/* id */
+		if (g_strcmp0 (element_name, "id") == 0) {
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_ID;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "name") == 0) {
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_NAME;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "description") == 0) {
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_DESCRIPTION;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "grouplist") == 0) {
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_GROUPLIST;
+			goto out;
+		}
+		if (g_strcmp0 (element_name, "groupid") == 0) {
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_GROUP;
+			goto out;
+		}
+	}
+out:
+	return;
+}
+
+/**
+ * zif_md_comps_parser_end_element:
+ **/
+static void
+zif_md_comps_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
+				 gpointer user_data, GError **error)
+{
+	ZifMdComps *comps = user_data;
+
+	/* end of group */
+	if (g_strcmp0 (element_name, "group") == 0) {
+		comps->priv->section = ZIF_MD_COMPS_SECTION_UNKNOWN;
+
+		/* add to array */
+		g_ptr_array_add (comps->priv->array_groups, comps->priv->group_data_temp);
+
+		if (FALSE)
+		egg_debug ("added GROUP '%s' name:%s, desc:%s, visible:%i, list=%p",
+			   comps->priv->group_data_temp->id,
+			   comps->priv->group_data_temp->name,
+			   comps->priv->group_data_temp->description,
+			   comps->priv->group_data_temp->visible,
+			   comps->priv->group_data_temp->packagelist);
+
+		comps->priv->group_data_temp = NULL;
+		goto out;
+	}
+
+	/* start of group */
+	if (g_strcmp0 (element_name, "category") == 0) {
+		comps->priv->section = ZIF_MD_COMPS_SECTION_UNKNOWN;
+
+		/* add to array */
+		g_ptr_array_add (comps->priv->array_categories, comps->priv->category_data_temp);
+
+		if (FALSE)
+		egg_debug ("added CATEGORY '%s' name:%s, desc:%s, list=%p",
+			   comps->priv->category_data_temp->id,
+			   comps->priv->category_data_temp->name,
+			   comps->priv->category_data_temp->description,
+			   comps->priv->category_data_temp->grouplist);
+
+		comps->priv->category_data_temp = NULL;
+		goto out;
+	}
+out:
+	return;
+}
+
+/**
+ * zif_md_comps_parser_text:
+ **/
+static void
+zif_md_comps_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
+			  gpointer user_data, GError **error)
+
+{
+	ZifMdComps *comps = user_data;
+
+	/* skip whitespace */
+	if (text_len < 1 || text[0] == ' ' || text[0] == '\t' || text[0] == '\n')
+		goto out;
+
+	/* group section */
+	if (comps->priv->section == ZIF_MD_COMPS_SECTION_GROUP) {
+		if (comps->priv->section_group == ZIF_MD_COMPS_SECTION_GROUP_ID) {
+			comps->priv->group_data_temp->id = g_strdup (text);
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_group == ZIF_MD_COMPS_SECTION_GROUP_NAME) {
+			/* ignore translated versions for now */
+			if (comps->priv->group_data_temp->name != NULL)
+				goto out;
+			comps->priv->group_data_temp->name = g_strdup (text);
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_group == ZIF_MD_COMPS_SECTION_GROUP_DESCRIPTION) {
+			/* ignore translated versions for now */
+			if (comps->priv->group_data_temp->description != NULL)
+				goto out;
+			comps->priv->group_data_temp->description = g_strdup (text);
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_group == ZIF_MD_COMPS_SECTION_GROUP_VISIBLE) {
+			/* TODO: parse true and false */
+			comps->priv->group_data_temp->visible = atoi (text);
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_group == ZIF_MD_COMPS_SECTION_GROUP_PACKAGE) {
+			g_ptr_array_add (comps->priv->group_data_temp->packagelist, g_strdup (text));
+			comps->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+			goto out;
+		}
+		goto out;
+	}
+
+	/* category section */
+	if (comps->priv->section == ZIF_MD_COMPS_SECTION_CATEGORY) {
+		if (comps->priv->section_category == ZIF_MD_COMPS_SECTION_CATEGORY_ID) {
+			comps->priv->category_data_temp->id = g_strdup (text);
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_category == ZIF_MD_COMPS_SECTION_CATEGORY_NAME) {
+			/* ignore translated versions for now */
+			if (comps->priv->category_data_temp->name != NULL)
+				goto out;
+			comps->priv->category_data_temp->name = g_strdup (text);
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_category == ZIF_MD_COMPS_SECTION_CATEGORY_DESCRIPTION) {
+			/* ignore translated versions for now */
+			if (comps->priv->category_data_temp->description != NULL)
+				goto out;
+			comps->priv->category_data_temp->description = g_strdup (text);
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
+			goto out;
+		}
+		if (comps->priv->section_category == ZIF_MD_COMPS_SECTION_CATEGORY_GROUP) {
+			g_ptr_array_add (comps->priv->category_data_temp->grouplist, g_strdup (text));
+			comps->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
+			goto out;
+		}
+		goto out;
+	}
+out:
+	return;
+}
+
+/**
+ * zif_md_comps_unload:
+ **/
+static gboolean
+zif_md_comps_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_comps_load:
+ **/
+static gboolean
+zif_md_comps_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *contents = NULL;
+	const gchar *filename;
+	gsize size;
+	GMarkupParseContext *context = NULL;
+	const GMarkupParser gpk_md_comps_markup_parser = {
+		zif_md_comps_parser_start_element,
+		zif_md_comps_parser_end_element,
+		zif_md_comps_parser_text,
+		NULL, /* passthrough */
+		NULL /* error */
+	};
+	ZifMdComps *comps = ZIF_MD_COMPS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_COMPS (md), FALSE);
+
+	/* already loaded */
+	if (comps->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for comps");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+
+	/* get repo contents */
+	ret = g_file_get_contents (filename, &contents, &size, error);
+	if (!ret)
+		goto out;
+
+	/* create parser */
+	context = g_markup_parse_context_new (&gpk_md_comps_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, comps, NULL);
+
+	/* parse data */
+	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
+	if (!ret)
+		goto out;
+
+	comps->priv->loaded = TRUE;
+out:
+	if (context != NULL)
+		g_markup_parse_context_free (context);
+	g_free (contents);
+	return ret;
+}
+
+/**
+ * zif_md_comps_category_set_icon:
+ *
+ * Check the icon exists, otherwise fallback to the parent ID, and then
+ * something sane.
+ **/
+static void
+zif_md_comps_category_set_icon (PkCategory *category)
+{
+	const gchar *icon;
+	GString *filename = g_string_new ("");
+
+	/* try the proper group icon */
+	icon = pk_category_get_id (category);
+	g_string_printf (filename, "/usr/share/pixmaps/comps/%s.png", icon);
+	if (g_file_test (filename->str, G_FILE_TEST_EXISTS))
+		goto out;
+
+	/* fall back to parent icon */
+	icon = pk_category_get_parent_id (category);
+	g_string_printf (filename, "/usr/share/pixmaps/comps/%s.png", icon);
+	if (g_file_test (filename->str, G_FILE_TEST_EXISTS))
+		goto out;
+
+	/* fall back to the missing icon */
+	icon = "image-missing";
+out:
+	pk_category_set_icon (category, icon);
+	g_string_free (filename, TRUE);
+}
+
+/**
+ * zif_md_comps_get_categories:
+ * @md: the #ZifMdComps object
+ * @cancellable: the %GCancellable, or %NULL
+ * @completion: the %ZifCompletion object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the available list of categories.
+ *
+ * Return value: %PkCategory array of categories, with parent_id set to %NULL
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_comps_get_categories (ZifMdComps *md, GCancellable *cancellable,
+			     ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	guint i;
+	guint len;
+	gboolean ret;
+	GError *error_local = NULL;
+	const ZifMdCompsCategoryData *data;
+	PkCategory *category;
+
+	g_return_val_if_fail (ZIF_IS_MD_COMPS (md), NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get load comps: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get categories */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	len = md->priv->array_categories->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (md->priv->array_categories, i);
+		category = pk_category_new ();
+		pk_category_set_id (category, data->id);
+		pk_category_set_name (category, data->name);
+		pk_category_set_summary (category, data->description);
+		zif_md_comps_category_set_icon (category);
+		g_ptr_array_add (array, category);
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_comps_get_category_for_group:
+ **/
+static PkCategory *
+zif_md_comps_get_category_for_group (ZifMdComps *md, const gchar *group_id)
+{
+	guint i;
+	guint len;
+	PkCategory *category = NULL;
+	ZifMdCompsGroupData *data;
+
+	/* find group matching group_id */
+	len = md->priv->array_groups->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (md->priv->array_groups, i);
+		if (g_strcmp0 (group_id, data->id) == 0) {
+			category = pk_category_new ();
+			pk_category_set_id (category, data->id);
+			pk_category_set_name (category, data->name);
+			pk_category_set_summary (category, data->description);
+			break;
+		}
+	}
+	return category;
+}
+
+/**
+ * zif_md_comps_get_groups_for_category:
+ * @md: the #ZifMdComps object
+ * @category_id: the category to search for
+ * @cancellable: the %GCancellable, or %NULL
+ * @completion: the %ZifCompletion object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the list of groups for a specific category.
+ *
+ * Return value: %PkCategory array of groups
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_comps_get_groups_for_category (ZifMdComps *md, const gchar *category_id,
+				      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	guint i;
+	guint j;
+	guint len;
+	gboolean ret;
+	GError *error_local = NULL;
+	const ZifMdCompsCategoryData *data;
+	const gchar *id;
+	PkCategory *category;
+
+	g_return_val_if_fail (ZIF_IS_MD_COMPS (md), NULL);
+	g_return_val_if_fail (category_id != NULL, NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get load comps: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get categories */
+	len = md->priv->array_categories->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (md->priv->array_categories, i);
+
+		/* category matches */
+		if (g_strcmp0 (category_id, data->id) == 0) {
+			array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+			for (j=0; j<data->grouplist->len; j++) {
+				id = g_ptr_array_index (data->grouplist, j);
+				/* find group matching group_id */
+				category = zif_md_comps_get_category_for_group (md, id);
+				if (category == NULL)
+					continue;
+
+				/* add */
+				pk_category_set_parent_id (category, category_id);
+				zif_md_comps_category_set_icon (category);
+				g_ptr_array_add (array, category);
+			}
+			break;
+		}
+	}
+
+	/* nothing found */
+	if (array == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "could not find category: %s", category_id);
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_comps_get_packages_for_group:
+ * @md: the #ZifMdComps object
+ * @group_id: the group to search for
+ * @cancellable: the %GCancellable, or %NULL
+ * @completion: the %ZifCompletion object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the package names for a group.
+ *
+ * Return value: gchar pointer array of package names (not %ZifPackage's)
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_comps_get_packages_for_group (ZifMdComps *md, const gchar *group_id,
+				     GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	guint i;
+	guint j;
+	guint len;
+	gboolean ret;
+	GError *error_local = NULL;
+	const ZifMdCompsGroupData *data;
+	const gchar *packagename;
+
+	g_return_val_if_fail (ZIF_IS_MD_COMPS (md), NULL);
+	g_return_val_if_fail (group_id != NULL, NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get load comps: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get packages in this group */
+	len = md->priv->array_groups->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (md->priv->array_groups, i);
+
+		/* category matches */
+		if (g_strcmp0 (group_id, data->id) == 0) {
+			array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+			for (j=0; j<data->packagelist->len; j++) {
+				packagename = g_ptr_array_index (data->packagelist, j);
+				g_ptr_array_add (array, g_strdup (packagename));
+			}
+			break;
+		}
+	}
+
+	/* nothing found */
+	if (array == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "could not find group: %s", group_id);
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_comps_finalize:
+ **/
+static void
+zif_md_comps_finalize (GObject *object)
+{
+	ZifMdComps *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_COMPS (object));
+	md = ZIF_MD_COMPS (object);
+
+	g_ptr_array_unref (md->priv->array_groups);
+	g_ptr_array_unref (md->priv->array_categories);
+
+	G_OBJECT_CLASS (zif_md_comps_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_comps_class_init:
+ **/
+static void
+zif_md_comps_class_init (ZifMdCompsClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_comps_finalize;
+
+	/* map */
+	md_class->load = zif_md_comps_load;
+	md_class->unload = zif_md_comps_unload;
+	g_type_class_add_private (klass, sizeof (ZifMdCompsPrivate));
+}
+
+/**
+ * zif_md_comps_init:
+ **/
+static void
+zif_md_comps_init (ZifMdComps *md)
+{
+	md->priv = ZIF_MD_COMPS_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->section = ZIF_MD_COMPS_SECTION_UNKNOWN;
+	md->priv->section_group = ZIF_MD_COMPS_SECTION_GROUP_UNKNOWN;
+	md->priv->section_group_type = ZIF_MD_COMPS_SECTION_GROUP_TYPE_UNKNOWN;
+	md->priv->section_category = ZIF_MD_COMPS_SECTION_CATEGORY_UNKNOWN;
+	md->priv->group_data_temp = NULL;
+	md->priv->category_data_temp = NULL;
+	md->priv->array_groups = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_md_comps_group_data_free);
+	md->priv->array_categories = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_md_comps_category_data_free);
+}
+
+/**
+ * zif_md_comps_new:
+ *
+ * Return value: A new #ZifMdComps class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdComps *
+zif_md_comps_new (void)
+{
+	ZifMdComps *md;
+	md = g_object_new (ZIF_TYPE_MD_COMPS, NULL);
+	return ZIF_MD_COMPS (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_comps_test (EggTest *test)
+{
+	ZifMdComps *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *id;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	PkCategory *category;
+
+	if (!egg_test_start (test, "ZifMdComps"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_comps md");
+	md = zif_md_comps_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_COMPS);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/comps-rawhide.xml");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum type");
+	ret = zif_md_set_checksum_type (ZIF_MD (md), G_CHECKSUM_SHA256);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum uncompressed");
+	ret = zif_md_set_checksum_uncompressed (ZIF_MD (md), "14f17b894303b4dc9683511104848f75d98cea8f76c107bf25e1b4db5741f6a8");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "get categories");
+	array = zif_md_comps_get_categories (md, cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get categories '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 1)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct id value");
+	category = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (pk_category_get_id (category), "apps") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct id '%s'", pk_category_get_id (category));
+
+	/************************************************************/
+	egg_test_title (test, "correct name value");
+	category = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (pk_category_get_name (category), "Applications") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct name '%s'", pk_category_get_name (category));
+
+	/************************************************************/
+	egg_test_title (test, "correct summary value");
+	category = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (pk_category_get_summary (category), "Applications to perform a variety of tasks") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct summary '%s'", pk_category_get_summary (category));
+
+	g_ptr_array_unref (array);
+
+	/************************************************************/
+	egg_test_title (test, "get groups for category");
+	array = zif_md_comps_get_groups_for_category (md, "apps", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get categories '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct id value");
+	category = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (pk_category_get_id (category), "admin-tools") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct id '%s'", pk_category_get_id (category));
+	g_ptr_array_unref (array);
+
+	/************************************************************/
+	egg_test_title (test, "get packages for group");
+	array = zif_md_comps_get_packages_for_group (md, "admin-tools", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get categories '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	id = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (id, "gnome-packagekit") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct id '%s'", id);
+	g_ptr_array_unref (array);
+
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-comps.h b/backends/yum/libzif/zif-md-comps.h
new file mode 100644
index 0000000..2ae15a4
--- /dev/null
+++ b/backends/yum/libzif/zif-md-comps.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_COMPS_H
+#define __ZIF_MD_COMPS_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_COMPS		(zif_md_comps_get_type ())
+#define ZIF_MD_COMPS(o)			(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_COMPS, ZifMdComps))
+#define ZIF_MD_COMPS_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_COMPS, ZifMdCompsClass))
+#define ZIF_IS_MD_COMPS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_COMPS))
+#define ZIF_IS_MD_COMPS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_COMPS))
+#define ZIF_MD_COMPS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_COMPS, ZifMdCompsClass))
+
+typedef struct _ZifMdComps		ZifMdComps;
+typedef struct _ZifMdCompsPrivate	ZifMdCompsPrivate;
+typedef struct _ZifMdCompsClass		ZifMdCompsClass;
+
+struct _ZifMdComps
+{
+	ZifMd				 parent;
+	ZifMdCompsPrivate		*priv;
+};
+
+struct _ZifMdCompsClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_comps_get_type			(void);
+ZifMdComps	*zif_md_comps_new			(void);
+
+GPtrArray	*zif_md_comps_get_categories		(ZifMdComps		*md,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+GPtrArray	*zif_md_comps_get_groups_for_category	(ZifMdComps		*md,
+							 const gchar		*category_id,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+GPtrArray	*zif_md_comps_get_packages_for_group	(ZifMdComps		*md,
+							 const gchar		*group_id,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_COMPS_H */
+
diff --git a/backends/yum/libzif/zif-md-filelists.c b/backends/yum/libzif/zif-md-filelists.c
new file mode 100644
index 0000000..46140df
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists.c
@@ -0,0 +1,450 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-filelists
+ * @short_description: File list metadata functionality
+ *
+ * Provide access to the file list metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sqlite3.h>
+#include <gio/gio.h>
+
+#include "zif-md.h"
+#include "zif-md-filelists.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_FILELISTS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_FILELISTS, ZifMdFilelistsPrivate))
+
+/**
+ * ZifMdFilelistsPrivate:
+ *
+ * Private #ZifMdFilelists data
+ **/
+struct _ZifMdFilelistsPrivate
+{
+	gboolean		 loaded;
+	sqlite3			*db;
+};
+
+typedef struct {
+	gchar			*filename;
+	GPtrArray		*array;
+} ZifMdFilelistsData;
+
+G_DEFINE_TYPE (ZifMdFilelists, zif_md_filelists, ZIF_TYPE_MD)
+
+/**
+ * zif_md_filelists_unload:
+ **/
+static gboolean
+zif_md_filelists_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_filelists_load:
+ **/
+static gboolean
+zif_md_filelists_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gint rc;
+	ZifMdFilelists *filelists = ZIF_MD_FILELISTS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS (md), FALSE);
+
+	/* already loaded */
+	if (filelists->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for filelists");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+	rc = sqlite3_open (filename, &filelists->priv->db);
+	if (rc != 0) {
+		egg_warning ("Can't open database: %s\n", sqlite3_errmsg (filelists->priv->db));
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "can't open database: %s", sqlite3_errmsg (filelists->priv->db));
+		goto out;
+	}
+
+	/* we don't need to keep syncing */
+	sqlite3_exec (filelists->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+	filelists->priv->loaded = TRUE;
+out:
+	return filelists->priv->loaded;
+}
+
+/**
+ * zif_store_remote_sqlite_get_id_cb:
+ **/
+static gint
+zif_md_filelists_sqlite_get_id_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	gchar **pkgid = (gchar **) data;
+	*pkgid = g_strdup (argv[0]);
+	return 0;
+}
+
+/**
+ * zif_md_filelists_sqlite_get_files_cb:
+ **/
+static gint
+zif_md_filelists_sqlite_get_files_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	gint i;
+	gchar **filenames = NULL;
+	gchar **filenames_r = NULL;
+	gchar **id_r = NULL;
+	ZifMdFilelistsData *fldata = (ZifMdFilelistsData *) data;
+
+	/* get pointers to the arguments */
+	for (i=0;i<argc;i++) {
+		if (g_strcmp0 (col_name[i], "pkgKey") == 0)
+			id_r = &argv[i];
+		else if (g_strcmp0 (col_name[i], "filenames") == 0)
+			filenames_r = &argv[i];
+	}
+
+	/* either is undereferencable */
+	if (filenames_r == NULL || id_r == NULL) {
+		egg_warning ("no file data");
+		goto out;
+	}
+
+	/* split the filenames */
+	filenames = g_strsplit (*filenames_r, "/", -1);
+	for (i=0; filenames[i] != NULL ;i++) {
+		/* do we match */
+		if (g_strcmp0 (fldata->filename, filenames[i]) == 0) {
+			egg_debug ("found %s for %s", filenames[i], *id_r);
+			g_ptr_array_add (fldata->array, GUINT_TO_POINTER (atoi (*id_r)));
+		}
+	}
+out:
+	g_strfreev (filenames);
+	return 0;
+}
+
+/**
+ * zif_md_filelists_search_file:
+ * @md: the #ZifMdFilelists object
+ * @search: the full path that should be searched for
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets a list of all packages that contain the file.
+ * Results are pkgId's descriptors, i.e. 64 bit hashes as test.
+ *
+ * Return value: a string list of pkgId's
+ **/
+GPtrArray *
+zif_md_filelists_search_file (ZifMdFilelists *md, const gchar *search,
+			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	gchar *statement = NULL;
+	gchar *error_msg = NULL;
+	gint rc;
+	gboolean ret;
+	guint i;
+	GError *error_local = NULL;
+	gchar *filename = NULL;
+	gchar *dirname = NULL;
+	ZifMdFilelistsData *data = NULL;
+
+	g_return_val_if_fail (ZIF_IS_MD_FILELISTS (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to load store file: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* split the search term into directory and filename */
+	dirname = g_path_get_dirname (search);
+	filename = g_path_get_basename (search);
+	egg_debug ("dirname=%s, filename=%s", dirname, filename);
+
+	/* create data struct we can pass to the callback */
+	data = g_new0 (ZifMdFilelistsData, 1);
+	data->filename = g_path_get_basename (search);
+	data->array = g_ptr_array_new ();
+
+	/* populate _array with guint pkgKey */
+	statement = g_strdup_printf ("SELECT filenames, pkgKey FROM filelist WHERE dirname = '%s'", dirname);
+	rc = sqlite3_exec (md->priv->db, statement, zif_md_filelists_sqlite_get_files_cb, data, &error_msg);
+	g_free (statement);
+	if (rc != SQLITE_OK) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "SQL error (failed to get keys): %s\n", error_msg);
+		sqlite3_free (error_msg);
+		goto out;
+	}
+
+	/* convert each pkgKey */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+	for (i=0; i<data->array->len; i++) {
+		guint key;
+		gchar *pkgid = NULL;
+
+		/* convert the pkgKey to a pkgId */
+		key = GPOINTER_TO_UINT (g_ptr_array_index (data->array, i));
+		statement = g_strdup_printf ("SELECT pkgId FROM packages WHERE pkgKey = %i LIMIT 1", key);
+		rc = sqlite3_exec (md->priv->db, statement, zif_md_filelists_sqlite_get_id_cb, &pkgid, &error_msg);
+		g_free (statement);
+		if (rc != SQLITE_OK) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+				     "SQL error (failed to get packages): %s", error_msg);
+			sqlite3_free (error_msg);
+			goto out;
+		}
+
+		/* we failed to get any results */
+		if (pkgid == NULL) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+				     "failed to resolve pkgKey: %i", key);
+			goto out;
+		}
+
+		/* added to tracked array, so no need to free pkgid */
+		g_ptr_array_add (array, pkgid);
+	}
+out:
+	if (data != NULL) {
+		g_free (data->filename);
+		g_ptr_array_unref (data->array);
+		g_free (data);
+	}
+	g_free (dirname);
+	g_free (filename);
+	return array;
+}
+
+/**
+ * zif_md_filelists_finalize:
+ **/
+static void
+zif_md_filelists_finalize (GObject *object)
+{
+	ZifMdFilelists *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_FILELISTS (object));
+	md = ZIF_MD_FILELISTS (object);
+
+	sqlite3_close (md->priv->db);
+
+	G_OBJECT_CLASS (zif_md_filelists_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_filelists_class_init:
+ **/
+static void
+zif_md_filelists_class_init (ZifMdFilelistsClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_filelists_finalize;
+
+	/* map */
+	md_class->load = zif_md_filelists_load;
+	md_class->unload = zif_md_filelists_unload;
+	g_type_class_add_private (klass, sizeof (ZifMdFilelistsPrivate));
+}
+
+/**
+ * zif_md_filelists_init:
+ **/
+static void
+zif_md_filelists_init (ZifMdFilelists *md)
+{
+	md->priv = ZIF_MD_FILELISTS_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->db = NULL;
+}
+
+/**
+ * zif_md_filelists_new:
+ *
+ * Return value: A new #ZifMdFilelists class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdFilelists *
+zif_md_filelists_new (void)
+{
+	ZifMdFilelists *md;
+	md = g_object_new (ZIF_TYPE_MD_FILELISTS, NULL);
+	return ZIF_MD_FILELISTS (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_filelists_test (EggTest *test)
+{
+	ZifMdFilelists *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *pkgid;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+
+	if (!egg_test_start (test, "ZifMdFilelists"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get store_remote md");
+	md = zif_md_filelists_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_FILELISTS_SQL);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum type");
+	ret = zif_md_set_checksum_type (ZIF_MD (md), G_CHECKSUM_SHA256);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum compressed");
+	ret = zif_md_set_checksum (ZIF_MD (md), "e00e88a8b6eee3798544764b6fe31ef8c9d071a824177c7cdc4fe749289198a9");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum uncompressed");
+	ret = zif_md_set_checksum_uncompressed (ZIF_MD (md), "2b4336cb43e75610662bc0b3a362ca4cb7ba874528735a27c0d55148c3901792");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/fedora/e00e88a8b6eee3798544764b6fe31ef8c9d071a824177c7cdc4fe749289198a9-filelists.sqlite.bz2");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "search for files");
+	array = zif_md_filelists_search_file (md, "/usr/bin/gnome-power-manager", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to search '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	egg_test_assert (test, array->len == 1);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	pkgid = g_ptr_array_index (array, 0);
+	if (pkgid[0] != '\0' && strlen (pkgid) == 64)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get a correct pkgId '%s' (%i)", pkgid, strlen (pkgid));
+	g_ptr_array_unref (array);
+
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-filelists.h b/backends/yum/libzif/zif-md-filelists.h
new file mode 100644
index 0000000..d270479
--- /dev/null
+++ b/backends/yum/libzif/zif-md-filelists.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_FILELISTS_H
+#define __ZIF_MD_FILELISTS_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_FILELISTS		(zif_md_filelists_get_type ())
+#define ZIF_MD_FILELISTS(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_FILELISTS, ZifMdFilelists))
+#define ZIF_MD_FILELISTS_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_FILELISTS, ZifMdFilelistsClass))
+#define ZIF_IS_MD_FILELISTS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_FILELISTS))
+#define ZIF_IS_MD_FILELISTS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_FILELISTS))
+#define ZIF_MD_FILELISTS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_FILELISTS, ZifMdFilelistsClass))
+
+typedef struct _ZifMdFilelists		ZifMdFilelists;
+typedef struct _ZifMdFilelistsPrivate	ZifMdFilelistsPrivate;
+typedef struct _ZifMdFilelistsClass	ZifMdFilelistsClass;
+
+struct _ZifMdFilelists
+{
+	ZifMd				 parent;
+	ZifMdFilelistsPrivate		*priv;
+};
+
+struct _ZifMdFilelistsClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_filelists_get_type		(void);
+ZifMdFilelists	*zif_md_filelists_new			(void);
+GPtrArray	*zif_md_filelists_search_file		(ZifMdFilelists	*md,
+							 const gchar		*search,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_FILELISTS_H */
+
diff --git a/backends/yum/libzif/zif-md-metalink.c b/backends/yum/libzif/zif-md-metalink.c
new file mode 100644
index 0000000..91f5cec
--- /dev/null
+++ b/backends/yum/libzif/zif-md-metalink.c
@@ -0,0 +1,504 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-metalink
+ * @short_description: Metalink metadata functionality
+ *
+ * Provide access to the metalink repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+#include <string.h>
+
+#include "zif-md.h"
+#include "zif-md-metalink.h"
+#include "zif-config.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_METALINK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_METALINK, ZifMdMetalinkPrivate))
+
+typedef enum {
+	ZIF_MD_METALINK_PARSER_SECTION_URL,
+	ZIF_MD_METALINK_PARSER_SECTION_UNKNOWN
+} ZifMdMetalinkParserSection;
+
+typedef enum {
+	ZIF_MD_METALINK_PROTOCOL_TYPE_FTP,
+	ZIF_MD_METALINK_PROTOCOL_TYPE_HTTP,
+	ZIF_MD_METALINK_PROTOCOL_TYPE_RSYNC,
+	ZIF_MD_METALINK_PROTOCOL_TYPE_UNKNOWN
+} ZifMdMetalinkProtocolType;
+
+typedef struct {
+	ZifMdMetalinkProtocolType	 protocol;
+	gchar				*uri;
+	guint				 preference;
+} ZifMdMetalinkData;
+
+/**
+ * ZifMdMetalinkPrivate:
+ *
+ * Private #ZifMdMetalink data
+ **/
+struct _ZifMdMetalinkPrivate
+{
+	gboolean			 loaded;
+	GPtrArray			*array;
+	ZifConfig			*config;
+	/* for parser */
+	ZifMdMetalinkParserSection	 section;
+	ZifMdMetalinkData		*temp;
+};
+
+G_DEFINE_TYPE (ZifMdMetalink, zif_md_metalink, ZIF_TYPE_MD)
+
+/**
+ * zif_md_metalink_protocol_type_from_text:
+ **/
+static ZifMdMetalinkProtocolType
+zif_md_metalink_protocol_type_from_text (const gchar *type_text)
+{
+	if (g_strcmp0 (type_text, "ftp") == 0)
+		return ZIF_MD_METALINK_PROTOCOL_TYPE_FTP;
+	if (g_strcmp0 (type_text, "http") == 0)
+		return ZIF_MD_METALINK_PROTOCOL_TYPE_HTTP;
+	if (g_strcmp0 (type_text, "rsync") == 0)
+		return ZIF_MD_METALINK_PROTOCOL_TYPE_RSYNC;
+	return ZIF_MD_METALINK_PROTOCOL_TYPE_UNKNOWN;
+}
+
+/**
+ * zif_md_metalink_parser_start_element:
+ **/
+static void
+zif_md_metalink_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
+				      const gchar **attribute_names, const gchar **attribute_values,
+				      gpointer user_data, GError **error)
+{
+	guint i;
+	ZifMdMetalink *metalink = user_data;
+
+	g_return_if_fail (ZIF_IS_MD_METALINK (metalink));
+	g_return_if_fail (metalink->priv->temp == NULL);
+
+	/* just ignore non url entries */
+	if (g_strcmp0 (element_name, "url") != 0) {
+		metalink->priv->temp = NULL;
+		metalink->priv->section = ZIF_MD_METALINK_PARSER_SECTION_UNKNOWN;
+		goto out;
+	}
+
+	/* create new element */
+	metalink->priv->section = ZIF_MD_METALINK_PARSER_SECTION_URL;
+	metalink->priv->temp = g_new0 (ZifMdMetalinkData, 1);
+
+	/* read keys */
+	for (i=0; attribute_names[i] != NULL; i++) {
+		if (g_strcmp0 (attribute_names[i], "protocol") == 0)
+			metalink->priv->temp->protocol = zif_md_metalink_protocol_type_from_text (attribute_values[i]);
+		if (g_strcmp0 (attribute_names[i], "preference") == 0)
+			metalink->priv->temp->preference = atoi (attribute_values[i]);
+	}
+
+	/* add to array */
+	g_ptr_array_add (metalink->priv->array, metalink->priv->temp);
+out:
+	return;
+}
+
+/**
+ * zif_md_metalink_parser_end_element:
+ **/
+static void
+zif_md_metalink_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
+				    gpointer user_data, GError **error)
+{
+	ZifMdMetalink *metalink = user_data;
+	metalink->priv->temp = NULL;
+	metalink->priv->section = ZIF_MD_METALINK_PARSER_SECTION_UNKNOWN;
+}
+
+/**
+ * zif_md_metalink_parser_text:
+ **/
+static void
+zif_md_metalink_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
+			     gpointer user_data, GError **error)
+
+{
+	ZifMdMetalink *metalink = user_data;
+	gchar *uri = NULL;
+	guint len;
+
+	if (metalink->priv->section != ZIF_MD_METALINK_PARSER_SECTION_URL)
+		goto out;
+
+	/* shouldn't happen */
+	if (metalink->priv->temp == NULL) {
+		egg_warning ("no data, so cannot save %s!", text);
+		goto out;
+	}
+
+	/* save uri */
+	if (metalink->priv->temp->uri != NULL) {
+		egg_warning ("previously set uri to '%s', cannot overwrite with '%s'", metalink->priv->temp->uri, text);
+		goto out;
+	}
+
+	/* copy */
+	uri = g_strdup (text);
+
+	/* do we need to trim the junk from the end */
+	if (g_str_has_suffix (uri, "/repodata/repomd.xml")) {
+		len = strlen (uri);
+		uri[len-19] = '\0';
+	}
+
+	/* save */
+	metalink->priv->temp->uri = g_strdup (uri);
+out:
+	g_free (uri);
+	return;
+}
+
+/**
+ * zif_md_metalink_unload:
+ **/
+static gboolean
+zif_md_metalink_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_metalink_load:
+ **/
+static gboolean
+zif_md_metalink_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *contents = NULL;
+	const gchar *filename;
+	gsize size;
+	GMarkupParseContext *context = NULL;
+	const GMarkupParser gpk_md_metalink_markup_parser = {
+		zif_md_metalink_parser_start_element,
+		zif_md_metalink_parser_end_element,
+		zif_md_metalink_parser_text,
+		NULL, /* passthrough */
+		NULL /* error */
+	};
+	ZifMdMetalink *metalink = ZIF_MD_METALINK (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_METALINK (md), FALSE);
+
+	/* already loaded */
+	if (metalink->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for metalink");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+
+	/* get repo contents */
+	ret = g_file_get_contents (filename, &contents, &size, error);
+	if (!ret)
+		goto out;
+
+	/* create parser */
+	context = g_markup_parse_context_new (&gpk_md_metalink_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, metalink, NULL);
+
+	/* parse data */
+	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
+	if (!ret)
+		goto out;
+
+	metalink->priv->loaded = TRUE;
+out:
+	if (context != NULL)
+		g_markup_parse_context_free (context);
+	g_free (contents);
+	return ret;
+}
+
+/**
+ * zif_md_metalink_get_uris:
+ * @md: the #ZifMdMetalink object
+ * @threshold: the threshold in percent
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all mirrors we should use.
+ *
+ * Return value: the uris to use as an array of strings
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_metalink_get_uris (ZifMdMetalink *md, guint threshold,
+			  GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret;
+	guint len;
+	gchar *uri;
+	GPtrArray *array = NULL;
+	GError *error_local = NULL;
+	ZifMdMetalinkData *data;
+	guint i;
+	ZifMdMetalink *metalink = ZIF_MD_METALINK (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_METALINK (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!metalink->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get mirrors from metalink: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get list */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+	len = metalink->priv->array->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (metalink->priv->array, i);
+
+		/* ignore not http mirrors */
+		if (data->protocol != ZIF_MD_METALINK_PROTOCOL_TYPE_HTTP)
+			continue;
+
+		/* ignore low priority */
+		if (data->preference >= threshold) {
+			uri = zif_config_expand_substitutions (md->priv->config, data->uri, &error_local);
+			if (uri == NULL) {
+				g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+					     "failed to expand substitutions: %s", error_local->message);
+				g_error_free (error_local);
+				/* rip apart what we've done already */
+				g_ptr_array_unref (array);
+				array = NULL;
+				goto out;
+			}
+			g_ptr_array_add (array, uri);
+		}
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_metalink_free_data:
+ **/
+static void
+zif_md_metalink_free_data (ZifMdMetalinkData *data)
+{
+	g_free (data->uri);
+	g_free (data);
+}
+
+/**
+ * zif_md_metalink_finalize:
+ **/
+static void
+zif_md_metalink_finalize (GObject *object)
+{
+	ZifMdMetalink *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_METALINK (object));
+	md = ZIF_MD_METALINK (object);
+
+	g_ptr_array_unref (md->priv->array);
+	g_object_unref (md->priv->config);
+
+	G_OBJECT_CLASS (zif_md_metalink_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_metalink_class_init:
+ **/
+static void
+zif_md_metalink_class_init (ZifMdMetalinkClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_metalink_finalize;
+
+	/* map */
+	md_class->load = zif_md_metalink_load;
+	md_class->unload = zif_md_metalink_unload;
+	g_type_class_add_private (klass, sizeof (ZifMdMetalinkPrivate));
+}
+
+/**
+ * zif_md_metalink_init:
+ **/
+static void
+zif_md_metalink_init (ZifMdMetalink *md)
+{
+	md->priv = ZIF_MD_METALINK_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->config = zif_config_new ();
+	md->priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) zif_md_metalink_free_data);
+}
+
+/**
+ * zif_md_metalink_new:
+ *
+ * Return value: A new #ZifMdMetalink class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdMetalink *
+zif_md_metalink_new (void)
+{
+	ZifMdMetalink *md;
+	md = g_object_new (ZIF_TYPE_MD_METALINK, NULL);
+	return ZIF_MD_METALINK (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_metalink_test (EggTest *test)
+{
+	ZifMdMetalink *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *uri;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	ZifConfig *config;
+
+	if (!egg_test_start (test, "ZifMdMetalink"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+	config = zif_config_new ();
+	zif_config_set_filename (config, "../test/etc/yum.conf", NULL);
+
+	/************************************************************/
+	egg_test_title (test, "get md_metalink md");
+	md = zif_md_metalink_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_METALINK);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/fedora/metalink.xml");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "get uris");
+	array = zif_md_metalink_get_uris (md, 50, cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to search '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 47)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	uri = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (uri, "http://www.mirrorservice.org/sites/download.fedora.redhat.com/pub/fedora/linux/releases/12/Everything/i386/os/") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct url '%s'", uri);
+	g_ptr_array_unref (array);
+
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+	g_object_unref (config);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-metalink.h b/backends/yum/libzif/zif-md-metalink.h
new file mode 100644
index 0000000..0032c0b
--- /dev/null
+++ b/backends/yum/libzif/zif-md-metalink.h
@@ -0,0 +1,68 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_METALINK_H
+#define __ZIF_MD_METALINK_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_METALINK		(zif_md_metalink_get_type ())
+#define ZIF_MD_METALINK(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_METALINK, ZifMdMetalink))
+#define ZIF_MD_METALINK_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_METALINK, ZifMdMetalinkClass))
+#define ZIF_IS_MD_METALINK(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_METALINK))
+#define ZIF_IS_MD_METALINK_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_METALINK))
+#define ZIF_MD_METALINK_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_METALINK, ZifMdMetalinkClass))
+
+typedef struct _ZifMdMetalink		ZifMdMetalink;
+typedef struct _ZifMdMetalinkPrivate	ZifMdMetalinkPrivate;
+typedef struct _ZifMdMetalinkClass	ZifMdMetalinkClass;
+
+struct _ZifMdMetalink
+{
+	ZifMd				 parent;
+	ZifMdMetalinkPrivate		*priv;
+};
+
+struct _ZifMdMetalinkClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_metalink_get_type		(void);
+ZifMdMetalink	*zif_md_metalink_new			(void);
+GPtrArray	*zif_md_metalink_get_uris		(ZifMdMetalink		*md,
+							 guint			 threshold,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_METALINK_H */
+
diff --git a/backends/yum/libzif/zif-md-mirrorlist.c b/backends/yum/libzif/zif-md-mirrorlist.c
new file mode 100644
index 0000000..80fdce6
--- /dev/null
+++ b/backends/yum/libzif/zif-md-mirrorlist.c
@@ -0,0 +1,347 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-mirrorlist
+ * @short_description: Mirrorlist metadata functionality
+ *
+ * Provide access to the mirrorlist repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+
+#include "zif-md.h"
+#include "zif-md-mirrorlist.h"
+#include "zif-config.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_MIRRORLIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_MIRRORLIST, ZifMdMirrorlistPrivate))
+
+/**
+ * ZifMdMirrorlistPrivate:
+ *
+ * Private #ZifMdMirrorlist data
+ **/
+struct _ZifMdMirrorlistPrivate
+{
+	gboolean			 loaded;
+	GPtrArray			*array;
+	ZifConfig			*config;
+};
+
+G_DEFINE_TYPE (ZifMdMirrorlist, zif_md_mirrorlist, ZIF_TYPE_MD)
+
+/**
+ * zif_md_mirrorlist_unload:
+ **/
+static gboolean
+zif_md_mirrorlist_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_mirrorlist_load:
+ **/
+static gboolean
+zif_md_mirrorlist_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *contents = NULL;
+	const gchar *filename;
+	gchar **lines = NULL;
+	guint i;
+	ZifMdMirrorlist *mirrorlist = ZIF_MD_MIRRORLIST (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_MIRRORLIST (md), FALSE);
+
+	/* already loaded */
+	if (mirrorlist->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for mirrorlist");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+
+	/* get repo contents */
+	ret = g_file_get_contents (filename, &contents, NULL, error);
+	if (!ret)
+		goto out;
+
+	/* split, and add uris */
+	lines = g_strsplit (contents, "\n", -1);
+	for (i=0; lines[i] != NULL; i++) {
+		if (lines[i][0] == '\0' ||
+		    lines[i][0] == '#')
+			continue;
+		if (g_str_has_prefix (lines[i], "http://"))
+			g_ptr_array_add (mirrorlist->priv->array, g_strdup (lines[i]));
+	}
+
+	mirrorlist->priv->loaded = TRUE;
+out:
+	g_strfreev (lines);
+	g_free (contents);
+	return ret;
+}
+
+/**
+ * zif_md_mirrorlist_get_uris:
+ * @md: the #ZifMdMirrorlist object
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all mirrors we should use.
+ *
+ * Return value: the uris to use as an array of strings
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_mirrorlist_get_uris (ZifMdMirrorlist *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret;
+	guint len;
+	GPtrArray *array = NULL;
+	GError *error_local = NULL;
+	const gchar *data;
+	gchar *uri;
+	guint i;
+	ZifMdMirrorlist *mirrorlist = ZIF_MD_MIRRORLIST (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_MIRRORLIST (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!mirrorlist->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get uris from mirrorlist: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get list */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+	len = mirrorlist->priv->array->len;
+	for (i=0; i<len; i++) {
+		data = g_ptr_array_index (mirrorlist->priv->array, i);
+		uri = zif_config_expand_substitutions (md->priv->config, data, &error_local);
+		if (uri == NULL) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to expand substitutions: %s", error_local->message);
+			g_error_free (error_local);
+			/* rip apart what we've done already */
+			g_ptr_array_unref (array);
+			array = NULL;
+			goto out;
+		}
+		g_ptr_array_add (array, uri);
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_mirrorlist_finalize:
+ **/
+static void
+zif_md_mirrorlist_finalize (GObject *object)
+{
+	ZifMdMirrorlist *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_MIRRORLIST (object));
+	md = ZIF_MD_MIRRORLIST (object);
+
+	g_ptr_array_unref (md->priv->array);
+	g_object_unref (md->priv->config);
+
+	G_OBJECT_CLASS (zif_md_mirrorlist_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_mirrorlist_class_init:
+ **/
+static void
+zif_md_mirrorlist_class_init (ZifMdMirrorlistClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_mirrorlist_finalize;
+
+	/* map */
+	md_class->load = zif_md_mirrorlist_load;
+	md_class->unload = zif_md_mirrorlist_unload;
+	g_type_class_add_private (klass, sizeof (ZifMdMirrorlistPrivate));
+}
+
+/**
+ * zif_md_mirrorlist_init:
+ **/
+static void
+zif_md_mirrorlist_init (ZifMdMirrorlist *md)
+{
+	md->priv = ZIF_MD_MIRRORLIST_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->config = zif_config_new ();
+	md->priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_free);
+}
+
+/**
+ * zif_md_mirrorlist_new:
+ *
+ * Return value: A new #ZifMdMirrorlist class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdMirrorlist *
+zif_md_mirrorlist_new (void)
+{
+	ZifMdMirrorlist *md;
+	md = g_object_new (ZIF_TYPE_MD_MIRRORLIST, NULL);
+	return ZIF_MD_MIRRORLIST (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_mirrorlist_test (EggTest *test)
+{
+	ZifMdMirrorlist *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *uri;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	ZifConfig *config;
+
+	if (!egg_test_start (test, "ZifMdMirrorlist"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+	config = zif_config_new ();
+	zif_config_set_filename (config, "../test/etc/yum.conf", NULL);
+
+	/************************************************************/
+	egg_test_title (test, "get md_mirrorlist md");
+	md = zif_md_mirrorlist_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_MIRRORLIST);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/mirrorlist.txt");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "get uris");
+	array = zif_md_mirrorlist_get_uris (md, cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to search '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 3)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	uri = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (uri, "http://rpm.livna.org/repo/11/i386/") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct url '%s'", uri);
+	g_ptr_array_unref (array);
+
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+	g_object_unref (config);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-mirrorlist.h b/backends/yum/libzif/zif-md-mirrorlist.h
new file mode 100644
index 0000000..9b6e36a
--- /dev/null
+++ b/backends/yum/libzif/zif-md-mirrorlist.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_MIRRORLIST_H
+#define __ZIF_MD_MIRRORLIST_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_MIRRORLIST		(zif_md_mirrorlist_get_type ())
+#define ZIF_MD_MIRRORLIST(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_MIRRORLIST, ZifMdMirrorlist))
+#define ZIF_MD_MIRRORLIST_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_MIRRORLIST, ZifMdMirrorlistClass))
+#define ZIF_IS_MD_MIRRORLIST(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_MIRRORLIST))
+#define ZIF_IS_MD_MIRRORLIST_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_MIRRORLIST))
+#define ZIF_MD_MIRRORLIST_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_MIRRORLIST, ZifMdMirrorlistClass))
+
+typedef struct _ZifMdMirrorlist		ZifMdMirrorlist;
+typedef struct _ZifMdMirrorlistPrivate	ZifMdMirrorlistPrivate;
+typedef struct _ZifMdMirrorlistClass	ZifMdMirrorlistClass;
+
+struct _ZifMdMirrorlist
+{
+	ZifMd				 parent;
+	ZifMdMirrorlistPrivate		*priv;
+};
+
+struct _ZifMdMirrorlistClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_mirrorlist_get_type		(void);
+ZifMdMirrorlist *zif_md_mirrorlist_new			(void);
+GPtrArray	*zif_md_mirrorlist_get_uris		(ZifMdMirrorlist	*md,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_MIRRORLIST_H */
+
diff --git a/backends/yum/libzif/zif-md-primary-sql.c b/backends/yum/libzif/zif-md-primary-sql.c
new file mode 100644
index 0000000..d9bcd7f
--- /dev/null
+++ b/backends/yum/libzif/zif-md-primary-sql.c
@@ -0,0 +1,668 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009-2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-primary-sql
+ * @short_description: Primary metadata functionality
+ *
+ * Provide access to the primary repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sqlite3.h>
+#include <gio/gio.h>
+
+#include "zif-md.h"
+#include "zif-md-primary-sql.h"
+#include "zif-package-remote.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_PRIMARY_SQL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_PRIMARY_SQL, ZifMdPrimarySqlPrivate))
+
+/**
+ * ZifMdPrimarySqlPrivate:
+ *
+ * Private #ZifMdPrimarySql data
+ **/
+struct _ZifMdPrimarySqlPrivate
+{
+	gboolean		 loaded;
+	sqlite3			*db;
+};
+
+typedef struct {
+	const gchar		*id;
+	GPtrArray		*packages;
+} ZifMdPrimarySqlData;
+
+G_DEFINE_TYPE (ZifMdPrimarySql, zif_md_primary_sql, ZIF_TYPE_MD)
+
+/**
+ * zif_md_primary_sql_unload:
+ **/
+static gboolean
+zif_md_primary_sql_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_primary_sql_load:
+ **/
+static gboolean
+zif_md_primary_sql_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gint rc;
+	ZifMdPrimarySql *primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), FALSE);
+
+	/* already loaded */
+	if (primary_sql->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for primary_sql");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+	rc = sqlite3_open (filename, &primary_sql->priv->db);
+	if (rc != 0) {
+		egg_warning ("Can't open database: %s\n", sqlite3_errmsg (primary_sql->priv->db));
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "can't open database: %s", sqlite3_errmsg (primary_sql->priv->db));
+		goto out;
+	}
+
+	/* we don't need to keep syncing */
+	sqlite3_exec (primary_sql->priv->db, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
+	primary_sql->priv->loaded = TRUE;
+out:
+	return primary_sql->priv->loaded;
+}
+
+/**
+ * zif_md_primary_sql_sqlite_create_package_cb:
+ **/
+static gint
+zif_md_primary_sql_sqlite_create_package_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	ZifMdPrimarySqlData *fldata = (ZifMdPrimarySqlData *) data;
+	ZifPackageRemote *package;
+
+	package = zif_package_remote_new ();
+	zif_package_remote_set_from_repo (package, argc, col_name, argv, fldata->id, NULL);
+	g_ptr_array_add (fldata->packages, package);
+
+	return 0;
+}
+
+/**
+ * zif_md_primary_sql_search:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search (ZifMdPrimarySql *md, const gchar *pred,
+			   GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *statement = NULL;
+	gchar *error_msg = NULL;
+	gint rc;
+	gboolean ret;
+	GError *error_local = NULL;
+	ZifMdPrimarySqlData *data = NULL;
+	GPtrArray *array = NULL;
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to load md_primary_sql file: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* create data struct we can pass to the callback */
+	data = g_new0 (ZifMdPrimarySqlData, 1);
+	data->id = zif_md_get_id (ZIF_MD (md));
+	data->packages = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+
+	statement = g_strdup_printf ("SELECT pkgId, name, arch, version, "
+				     "epoch, release, summary, description, url, "
+				     "rpm_license, rpm_group, size_package, location_href FROM packages %s", pred);
+	rc = sqlite3_exec (md->priv->db, statement, zif_md_primary_sql_sqlite_create_package_cb, data, &error_msg);
+	if (rc != SQLITE_OK) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "SQL error: %s\n", error_msg);
+		sqlite3_free (error_msg);
+		g_ptr_array_unref (data->packages);
+		goto out;
+	}
+	/* list of packages */
+	array = data->packages;
+out:
+	g_free (data);
+	g_free (statement);
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_resolve:
+ **/
+static GPtrArray *
+zif_md_primary_sql_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE name = '%s'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_search_name:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search_name (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE name LIKE '%%%s%%'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_search_details:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search_details (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE name LIKE '%%%s%%' OR summary LIKE '%%%s%%' OR description LIKE '%%%s%%'", search, search, search);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_search_group:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search_group (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE rpm_group = '%s'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_search_pkgid:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search_pkgid (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE pkgid = '%s'", search);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_search_pkgkey:
+ **/
+static GPtrArray *
+zif_md_primary_sql_search_pkgkey (ZifMd *md, guint pkgkey,
+			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	pred = g_strdup_printf ("WHERE pkgKey = '%i'", pkgkey);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_sqlite_pkgkey_cb:
+ **/
+static gint
+zif_md_primary_sql_sqlite_pkgkey_cb (void *data, gint argc, gchar **argv, gchar **col_name)
+{
+	gint i;
+	guint pkgkey;
+	gboolean ret;
+	GPtrArray *array = (GPtrArray *) data;
+
+	/* get the ID */
+	for (i=0; i<argc; i++) {
+		if (g_strcmp0 (col_name[i], "pkgKey") == 0) {
+			ret = egg_strtouint (argv[i], &pkgkey);
+			if (ret)
+				g_ptr_array_add (array, GUINT_TO_POINTER (pkgkey));
+			else
+				egg_warning ("could not parse pkgKey '%s'", argv[i]);
+		} else {
+			egg_warning ("unrecognized: %s=%s", col_name[i], argv[i]);
+		}
+	}
+	return 0;
+}
+
+/**
+ * zif_md_primary_sql_what_provides:
+ **/
+static GPtrArray *
+zif_md_primary_sql_what_provides (ZifMd *md, const gchar *search,
+			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *statement = NULL;
+	gchar *error_msg = NULL;
+	gint rc;
+	gboolean ret;
+	GError *error_local = NULL;
+	GPtrArray *array = NULL;
+	GPtrArray *array_tmp = NULL;
+	GPtrArray *pkgkey_array = NULL;
+	guint i;
+	guint pkgkey;
+	ZifCompletion *completion_local;
+	ZifCompletion *completion_loop;
+	ZifPackage *package;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	/* setup completion */
+	if (md_primary_sql->priv->loaded)
+		zif_completion_set_number_steps (completion, 2);
+	else
+		zif_completion_set_number_steps (completion, 3);
+
+	/* if not already loaded, load */
+	if (!md_primary_sql->priv->loaded) {
+		completion_local = zif_completion_get_child (completion);
+		ret = zif_md_load (md, cancellable, completion_local, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to load md_primary_sql file: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+
+		/* this section done */
+		zif_completion_done (completion);
+	}
+
+	/* create data struct we can pass to the callback */
+	pkgkey_array = g_ptr_array_new ();
+	statement = g_strdup_printf ("SELECT pkgKey FROM provides WHERE name = '%s'", search);
+	rc = sqlite3_exec (md_primary_sql->priv->db, statement, zif_md_primary_sql_sqlite_pkgkey_cb, pkgkey_array, &error_msg);
+	if (rc != SQLITE_OK) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_BAD_SQL,
+			     "SQL error: %s\n", error_msg);
+		sqlite3_free (error_msg);
+		goto out;
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* output array */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+
+	/* resolve each pkgkey to a package */
+	completion_local = zif_completion_get_child (completion);
+	if (pkgkey_array->len > 0)
+		zif_completion_set_number_steps (completion_local, pkgkey_array->len);
+	for (i=0; i<pkgkey_array->len; i++) {
+		pkgkey = GPOINTER_TO_UINT (g_ptr_array_index (pkgkey_array, i));
+
+		/* get packages for pkgKey */
+		completion_loop = zif_completion_get_child (completion_local);
+		array_tmp = zif_md_primary_sql_search_pkgkey (md, pkgkey, cancellable, completion, error);
+		if (array_tmp == NULL) {
+			g_ptr_array_unref (array);
+			array = NULL;
+			goto out;
+		}
+
+		/* check we only got one result */
+		if (array_tmp->len == 0) {
+			egg_warning ("no package for pkgKey %i", pkgkey);
+		} else if (array_tmp->len > 1 || array_tmp->len == 0) {
+			egg_warning ("more than one package for pkgKey %i", pkgkey);
+		} else {
+			package = g_ptr_array_index (array_tmp, 0);
+			g_ptr_array_add (array, g_object_ref (package));
+		}
+
+		/* clear array */
+		g_ptr_array_unref (array_tmp);
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	g_free (statement);
+	if (pkgkey_array != NULL)
+		g_ptr_array_unref (pkgkey_array);
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_find_package:
+ **/
+static GPtrArray *
+zif_md_primary_sql_find_package (ZifMd *md, const gchar *package_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gchar *pred;
+	GPtrArray *array;
+	gchar **split;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate, TODO: search version (epoch+release) */
+	split = pk_package_id_split (package_id);
+	pred = g_strdup_printf ("WHERE name = '%s' AND arch = '%s'", split[PK_PACKAGE_ID_NAME], split[PK_PACKAGE_ID_ARCH]);
+	array = zif_md_primary_sql_search (md_primary_sql, pred, cancellable, completion, error);
+	g_free (pred);
+	g_strfreev (split);
+
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_get_packages:
+ **/
+static GPtrArray *
+zif_md_primary_sql_get_packages (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array;
+	ZifMdPrimarySql *md_primary_sql = ZIF_MD_PRIMARY_SQL (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_SQL (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* search with predicate */
+	array = zif_md_primary_sql_search (md_primary_sql, "", cancellable, completion, error);
+	return array;
+}
+
+/**
+ * zif_md_primary_sql_finalize:
+ **/
+static void
+zif_md_primary_sql_finalize (GObject *object)
+{
+	ZifMdPrimarySql *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_PRIMARY_SQL (object));
+	md = ZIF_MD_PRIMARY_SQL (object);
+
+	sqlite3_close (md->priv->db);
+
+	G_OBJECT_CLASS (zif_md_primary_sql_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_primary_sql_class_init:
+ **/
+static void
+zif_md_primary_sql_class_init (ZifMdPrimarySqlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_primary_sql_finalize;
+
+	/* map */
+	md_class->load = zif_md_primary_sql_load;
+	md_class->unload = zif_md_primary_sql_unload;
+	md_class->search_name = zif_md_primary_sql_search_name;
+	md_class->search_details = zif_md_primary_sql_search_details;
+	md_class->search_group = zif_md_primary_sql_search_group;
+	md_class->search_pkgid = zif_md_primary_sql_search_pkgid;
+	md_class->what_provides = zif_md_primary_sql_what_provides;
+	md_class->resolve = zif_md_primary_sql_resolve;
+	md_class->get_packages = zif_md_primary_sql_get_packages;
+	md_class->find_package = zif_md_primary_sql_find_package;
+	g_type_class_add_private (klass, sizeof (ZifMdPrimarySqlPrivate));
+}
+
+/**
+ * zif_md_primary_sql_init:
+ **/
+static void
+zif_md_primary_sql_init (ZifMdPrimarySql *md)
+{
+	md->priv = ZIF_MD_PRIMARY_SQL_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->db = NULL;
+}
+
+/**
+ * zif_md_primary_sql_new:
+ *
+ * Return value: A new #ZifMdPrimarySql class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdPrimarySql *
+zif_md_primary_sql_new (void)
+{
+	ZifMdPrimarySql *md;
+	md = g_object_new (ZIF_TYPE_MD_PRIMARY_SQL, NULL);
+	return ZIF_MD_PRIMARY_SQL (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_primary_sql_test (EggTest *test)
+{
+	ZifMdPrimarySql *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	ZifPackage *package;
+	ZifString *summary;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+
+	if (!egg_test_start (test, "ZifMdPrimarySql"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_primary_sql md");
+	md = zif_md_primary_sql_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_PRIMARY_SQL);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum type");
+	ret = zif_md_set_checksum_type (ZIF_MD (md), G_CHECKSUM_SHA256);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum compressed");
+	ret = zif_md_set_checksum (ZIF_MD (md), "35d817e2bac701525fa72cec57387a2e3457bf32642adeee1e345cc180044c86");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum uncompressed");
+	ret = zif_md_set_checksum_uncompressed (ZIF_MD (md), "9b2b072a83b5175bc88d03ee64b52b39c0d40fec1516baa62dba81eea73cc645");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/fedora/35d817e2bac701525fa72cec57387a2e3457bf32642adeee1e345cc180044c86-primary.sqlite.bz2");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "search for files");
+	array = zif_md_primary_sql_resolve (md, "gnome-power-manager", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to search '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	egg_test_assert (test, array->len == 1);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	package = g_ptr_array_index (array, 0);
+	summary = zif_package_get_summary (package, NULL);
+	if (g_strcmp0 (zif_string_get_value (summary), "GNOME Power Manager") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct summary '%s'", zif_string_get_value (summary));
+	zif_string_unref (summary);
+	g_ptr_array_unref (array);
+
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+	g_object_unref (md);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-primary-sql.h b/backends/yum/libzif/zif-md-primary-sql.h
new file mode 100644
index 0000000..746cb10
--- /dev/null
+++ b/backends/yum/libzif/zif-md-primary-sql.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009-2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_PRIMARY_SQL_H
+#define __ZIF_MD_PRIMARY_SQL_H
+
+#include <glib-object.h>
+#include <packagekit-glib2/packagekit.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_PRIMARY_SQL		(zif_md_primary_sql_get_type ())
+#define ZIF_MD_PRIMARY_SQL(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_PRIMARY_SQL, ZifMdPrimarySql))
+#define ZIF_MD_PRIMARY_SQL_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_PRIMARY_SQL, ZifMdPrimarySqlClass))
+#define ZIF_IS_MD_PRIMARY_SQL(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_PRIMARY_SQL))
+#define ZIF_IS_MD_PRIMARY_SQL_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_PRIMARY_SQL))
+#define ZIF_MD_PRIMARY_SQL_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_PRIMARY_SQL, ZifMdPrimarySqlClass))
+
+typedef struct _ZifMdPrimarySql		ZifMdPrimarySql;
+typedef struct _ZifMdPrimarySqlPrivate	ZifMdPrimarySqlPrivate;
+typedef struct _ZifMdPrimarySqlClass	ZifMdPrimarySqlClass;
+
+struct _ZifMdPrimarySql
+{
+	ZifMd				 parent;
+	ZifMdPrimarySqlPrivate		*priv;
+};
+
+struct _ZifMdPrimarySqlClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_primary_sql_get_type		(void);
+ZifMdPrimarySql	*zif_md_primary_sql_new			(void);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_PRIMARY_SQL_H */
+
diff --git a/backends/yum/libzif/zif-md-primary-xml.c b/backends/yum/libzif/zif-md-primary-xml.c
new file mode 100644
index 0000000..1ad8c66
--- /dev/null
+++ b/backends/yum/libzif/zif-md-primary-xml.c
@@ -0,0 +1,890 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-primary-xml
+ * @short_description: PrimaryXml metadata functionality
+ *
+ * Provide access to the primary_xml repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+typedef enum {
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE,
+	ZIF_MD_PRIMARY_XML_SECTION_UNKNOWN
+} ZifMdPrimaryXmlSection;
+
+typedef enum {
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_NAME,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_ARCH,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_VERSION,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_CHECKSUM,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_SUMMARY,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_DESCRIPTION,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_URL,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_SIZE,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_LICENCE,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_LOCATION,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_GROUP,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_PROVIDES,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_REQUIRES,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_OBSOLETES,
+	ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN
+} ZifMdPrimaryXmlSectionPackage;
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sqlite3.h>
+#include <gio/gio.h>
+
+#include "zif-md.h"
+#include "zif-utils.h"
+#include "zif-md-primary-xml.h"
+#include "zif-package-remote.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_PRIMARY_XML_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_PRIMARY_XML, ZifMdPrimaryXmlPrivate))
+
+/**
+ * ZifMdPrimaryXmlPrivate:
+ *
+ * Private #ZifMdPrimaryXml data
+ **/
+struct _ZifMdPrimaryXmlPrivate
+{
+	gboolean			 loaded;
+	ZifMdPrimaryXmlSection		 section;
+	ZifMdPrimaryXmlSectionPackage	 section_package;
+	ZifPackage			*package_temp;
+	GPtrArray			*array;
+	gchar				*package_name_temp;
+	gchar				*package_arch_temp;
+	gchar				*package_version_temp;
+	gchar				*package_release_temp;
+	guint				 package_epoch_temp;
+};
+
+G_DEFINE_TYPE (ZifMdPrimaryXml, zif_md_primary_xml, ZIF_TYPE_MD)
+
+/**
+ * zif_md_primary_xml_unload:
+ **/
+static gboolean
+zif_md_primary_xml_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+
+/**
+ * zif_md_primary_xml_parser_start_element:
+ **/
+static void
+zif_md_primary_xml_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
+					const gchar **attribute_names, const gchar **attribute_values,
+					gpointer user_data, GError **error)
+{
+	guint i;
+	ZifMdPrimaryXml *primary_xml = user_data;
+
+	g_return_if_fail (ZIF_IS_MD_PRIMARY_XML (primary_xml));
+
+	/* group element */
+	if (primary_xml->priv->section == ZIF_MD_PRIMARY_XML_SECTION_UNKNOWN) {
+
+		/* start of list */
+		if (g_strcmp0 (element_name, "metadata") == 0)
+			goto out;
+
+		/* start of update */
+		if (g_strcmp0 (element_name, "package") == 0) {
+			primary_xml->priv->section = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE;
+			primary_xml->priv->package_temp = zif_package_new ();
+			goto out;
+		}
+
+		egg_warning ("unhandled element: %s", element_name);
+
+		goto out;
+	}
+
+	/* update element */
+	if (primary_xml->priv->section == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE) {
+
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN) {
+			if (g_strcmp0 (element_name, "packager") == 0 ||
+			    g_strcmp0 (element_name, "format") == 0 ||
+			    g_strcmp0 (element_name, "file") == 0 ||
+			    g_strcmp0 (element_name, "rpm:vendor") == 0 ||
+			    g_strcmp0 (element_name, "rpm:buildhost") == 0 ||
+			    g_strcmp0 (element_name, "rpm:header-range") == 0 ||
+			    g_strcmp0 (element_name, "rpm:sourcerpm") == 0 ||
+			    g_strcmp0 (element_name, "time") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "name") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_NAME;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "checksum") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_CHECKSUM;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "arch") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_ARCH;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "summary") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_SUMMARY;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "description") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_DESCRIPTION;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "url") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_URL;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "version") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_VERSION;
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "rel") == 0) {
+						primary_xml->priv->package_release_temp = g_strdup (attribute_values[i]);
+					} else if (g_strcmp0 (attribute_names[i], "epoch") == 0) {
+						primary_xml->priv->package_epoch_temp = atoi (attribute_values[i]);
+					} else if (g_strcmp0 (attribute_names[i], "ver") == 0) {
+						primary_xml->priv->package_version_temp = g_strdup (attribute_values[i]);
+					}
+				}
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "size") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_SIZE;
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "package") == 0) {
+						zif_package_set_size (primary_xml->priv->package_temp, atoi (attribute_values[i]));
+					}
+				}
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "location") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_LOCATION;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "rpm:license") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_LICENCE;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "rpm:group") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_GROUP;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "rpm:provides") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_PROVIDES;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "rpm:requires") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_REQUIRES;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "rpm:obsoletes") == 0) {
+				primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_OBSOLETES;
+				goto out;
+			}
+			egg_warning ("unhandled update base tag: %s", element_name);
+			goto out;
+
+		} else if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_REQUIRES) {
+			if (g_strcmp0 (element_name, "rpm:entry") == 0) {
+				goto out;
+			}
+		} else if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_OBSOLETES) {
+			if (g_strcmp0 (element_name, "rpm:entry") == 0) {
+				goto out;
+			}
+		} else if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_PROVIDES) {
+			if (g_strcmp0 (element_name, "rpm:entry") == 0) {
+				goto out;
+			}
+			goto out;
+		}
+		egg_warning ("unhandled package tag: %s", element_name);
+	}
+
+	egg_warning ("unhandled base tag: %s", element_name);
+
+out:
+	return;
+}
+
+/**
+ * zif_md_primary_xml_parser_end_element:
+ **/
+static void
+zif_md_primary_xml_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
+				      gpointer user_data, GError **error)
+{
+	ZifMdPrimaryXml *primary_xml = user_data;
+	gchar *package_id = NULL;
+
+	/* no element */
+	if (primary_xml->priv->section == ZIF_MD_PRIMARY_XML_SECTION_UNKNOWN) {
+		/* end of list */
+		if (g_strcmp0 (element_name, "metadata") == 0)
+			goto out;
+		egg_warning ("unhandled base end tag: %s", element_name);
+	}
+
+	/* update element */
+	if (primary_xml->priv->section == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE) {
+
+		/* end of update */
+		if (g_strcmp0 (element_name, "package") == 0) {
+			primary_xml->priv->section = ZIF_MD_PRIMARY_XML_SECTION_UNKNOWN;
+
+			/* add to array */
+			package_id = zif_package_id_from_nevra (primary_xml->priv->package_name_temp,
+								primary_xml->priv->package_epoch_temp,
+								primary_xml->priv->package_version_temp,
+								primary_xml->priv->package_release_temp,
+								primary_xml->priv->package_arch_temp,
+								zif_md_get_id (ZIF_MD (primary_xml)));
+			zif_package_set_id (primary_xml->priv->package_temp, package_id);
+			g_ptr_array_add (primary_xml->priv->array, primary_xml->priv->package_temp);
+			primary_xml->priv->package_temp = NULL;
+			goto out;
+		}
+
+		/* do not change section */
+		if (g_strcmp0 (element_name, "rpm:entry") == 0) {
+			goto out;
+		}
+
+		if (g_strcmp0 (element_name, "name") == 0 ||
+		    g_strcmp0 (element_name, "summary") == 0 ||
+		    g_strcmp0 (element_name, "arch") == 0 ||
+		    g_strcmp0 (element_name, "version") == 0 ||
+		    g_strcmp0 (element_name, "checksum") == 0 ||
+		    g_strcmp0 (element_name, "file") == 0 ||
+		    g_strcmp0 (element_name, "time") == 0 ||
+		    g_strcmp0 (element_name, "size") == 0 ||
+		    g_strcmp0 (element_name, "rpm:license") == 0 ||
+		    g_strcmp0 (element_name, "rpm:vendor") == 0 ||
+		    g_strcmp0 (element_name, "rpm:group") == 0 ||
+		    g_strcmp0 (element_name, "rpm:buildhost") == 0 ||
+		    g_strcmp0 (element_name, "rpm:provides") == 0 ||
+		    g_strcmp0 (element_name, "rpm:requires") == 0 ||
+		    g_strcmp0 (element_name, "rpm:obsoletes") == 0 ||
+		    g_strcmp0 (element_name, "rpm:sourcerpm") == 0 ||
+		    g_strcmp0 (element_name, "rpm:header-range") == 0 ||
+		    g_strcmp0 (element_name, "location") == 0 ||
+		    g_strcmp0 (element_name, "format") == 0 ||
+		    g_strcmp0 (element_name, "packager") == 0 ||
+		    g_strcmp0 (element_name, "description") == 0 ||
+		    g_strcmp0 (element_name, "url") == 0) {
+			primary_xml->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN;
+			goto out;
+		}
+
+		egg_warning ("unhandled update end tag: %s", element_name);
+		goto out;
+	}
+
+	egg_warning ("unhandled end tag: %s", element_name);
+out:
+	g_free (package_id);
+	return;
+}
+
+/**
+ * zif_md_primary_xml_parser_text:
+ **/
+static void
+zif_md_primary_xml_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
+			       gpointer user_data, GError **error)
+
+{
+	ZifMdPrimaryXml *primary_xml = user_data;
+	ZifString *string = NULL;
+
+	/* skip whitespace */
+	if (text_len < 1 || text[0] == ' ' || text[0] == '\t' || text[0] == '\n')
+		goto out;
+
+	/* group section */
+	if (primary_xml->priv->section == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE) {
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN)
+			goto out;
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_NAME) {
+			primary_xml->priv->package_name_temp = g_strdup (text);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_ARCH) {
+			primary_xml->priv->package_arch_temp = g_strdup (text);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_SUMMARY) {
+			string = zif_string_new (text);
+			zif_package_set_summary (primary_xml->priv->package_temp, string);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_DESCRIPTION) {
+			string = zif_string_new (text);
+			zif_package_set_description (primary_xml->priv->package_temp, string);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_URL) {
+			string = zif_string_new (text);
+			zif_package_set_url (primary_xml->priv->package_temp, string);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_GROUP) {
+			string = zif_string_new (text);
+			zif_package_set_category (primary_xml->priv->package_temp, string);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_LICENCE) {
+			string = zif_string_new (text);
+			zif_package_set_license (primary_xml->priv->package_temp, string);
+			goto out;
+		}
+		if (primary_xml->priv->section_package == ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_CHECKSUM) {
+			/* TODO: put in to the zif API? */
+			g_object_set_data_full (G_OBJECT(primary_xml->priv->package_temp), "pkgid", g_strdup (text), g_free);
+			goto out;
+		}
+		egg_error ("not saving: %s", text);
+		goto out;
+	}
+out:
+	if (string != NULL)
+		zif_string_unref (string);
+	return;
+}
+
+/**
+ * zif_md_primary_xml_load:
+ **/
+static gboolean
+zif_md_primary_xml_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	const gchar *filename;
+	gboolean ret;
+	gchar *contents = NULL;
+	gsize size;
+	ZifMdPrimaryXml *primary_xml = ZIF_MD_PRIMARY_XML (md);
+	GMarkupParseContext *context = NULL;
+	const GMarkupParser gpk_md_primary_xml_markup_parser = {
+		zif_md_primary_xml_parser_start_element,
+		zif_md_primary_xml_parser_end_element,
+		zif_md_primary_xml_parser_text,
+		NULL, /* passthrough */
+		NULL /* error */
+	};
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_XML (md), FALSE);
+
+	/* already loaded */
+	if (primary_xml->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for primary_xml");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+	ret = g_file_get_contents (filename, &contents, &size, error);
+	if (!ret)
+		goto out;
+
+	/* create parser */
+	context = g_markup_parse_context_new (&gpk_md_primary_xml_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, primary_xml, NULL);
+
+	/* parse data */
+	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
+	if (!ret)
+		goto out;
+
+	/* we don't need to keep syncing */
+	primary_xml->priv->loaded = TRUE;
+out:
+	g_free (contents);
+	return primary_xml->priv->loaded;
+}
+
+typedef gboolean (*ZifPackageFilterFunc)		(ZifPackage		*package,
+							 gpointer		 user_data);
+
+/**
+ * zif_md_primary_xml_filter:
+ **/
+static GPtrArray *
+zif_md_primary_xml_filter (ZifMd *md, ZifPackageFilterFunc filter_func, gpointer user_data,
+			   GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	GPtrArray *packages;
+	ZifPackage *package;
+	guint i;
+	gboolean ret;
+	GError *error_local = NULL;
+	ZifCompletion *completion_local;
+	ZifMdPrimaryXml *md_primary = ZIF_MD_PRIMARY_XML (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_PRIMARY_XML (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* setup completion */
+	if (md_primary->priv->loaded)
+		zif_completion_set_number_steps (completion, 2);
+	else
+		zif_completion_set_number_steps (completion, 3);
+
+	/* if not already loaded, load */
+	if (!md_primary->priv->loaded) {
+		completion_local = zif_completion_get_child (completion);
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion_local, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to load md_primary_xml file: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+
+		/* this section done */
+		zif_completion_done (completion);
+	}
+
+	/* search array */
+	array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	packages = md_primary->priv->array;
+	for (i=0; i<packages->len; i++) {
+		package = g_ptr_array_index (packages, i);
+		if (filter_func (package, user_data))
+			g_ptr_array_add (array, g_object_ref (package));
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	return array;
+}
+
+/**
+ * zif_md_primary_xml_resolve_cb:
+ **/
+static gboolean
+zif_md_primary_xml_resolve_cb (ZifPackage *package, gpointer user_data)
+{
+	const gchar *value;
+	const gchar *search = (const gchar *) user_data;
+	value = zif_package_get_name (package);
+	return (g_strcmp0 (value, search) == 0);
+}
+
+/**
+ * zif_md_primary_xml_resolve:
+ **/
+static GPtrArray *
+zif_md_primary_xml_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_resolve_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_search_name_cb:
+ **/
+static gboolean
+zif_md_primary_xml_search_name_cb (ZifPackage *package, gpointer user_data)
+{
+	const gchar *value;
+	const gchar *search = (const gchar *) user_data;
+	value = zif_package_get_name (package);
+	return (g_strstr_len (value, -1, search) != NULL);
+}
+
+/**
+ * zif_md_primary_xml_search_name:
+ **/
+static GPtrArray *
+zif_md_primary_xml_search_name (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_search_name_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_search_details_cb:
+ **/
+static gboolean
+zif_md_primary_xml_search_details_cb (ZifPackage *package, gpointer user_data)
+{
+	gboolean ret;
+	const gchar *value;
+	ZifString *string;
+	const gchar *search = (const gchar *) user_data;
+	value = zif_package_get_name (package);
+	ret = (g_strstr_len (value, -1, search) != NULL);
+	if (ret)
+		goto out;
+	string = zif_package_get_summary (package, NULL);
+	ret = (g_strstr_len (zif_string_get_value (string), -1, search) != NULL);
+	zif_string_unref (string);
+	if (ret)
+		goto out;
+	string = zif_package_get_description (package, NULL);
+	ret = (g_strstr_len (zif_string_get_value (string), -1, search) != NULL);
+	zif_string_unref (string);
+	if (ret)
+		goto out;
+out:
+	return ret;
+}
+
+/**
+ * zif_md_primary_xml_search_details:
+ **/
+static GPtrArray *
+zif_md_primary_xml_search_details (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_search_details_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_search_group_cb:
+ **/
+static gboolean
+zif_md_primary_xml_search_group_cb (ZifPackage *package, gpointer user_data)
+{
+	gboolean ret;
+	ZifString *value;
+	const gchar *search = (const gchar *) user_data;
+	value = zif_package_get_category (package, NULL);
+	ret = (g_strstr_len (zif_string_get_value (value), -1, search) != NULL);
+	zif_string_unref (value);
+	return ret;
+}
+
+/**
+ * zif_md_primary_xml_search_group:
+ **/
+static GPtrArray *
+zif_md_primary_xml_search_group (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_search_group_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_search_pkgid_cb:
+ **/
+static gboolean
+zif_md_primary_xml_search_pkgid_cb (ZifPackage *package, gpointer user_data)
+{
+	const gchar *value;
+	const gchar *search = (const gchar *) user_data;
+	value = (const gchar *) g_object_get_data (G_OBJECT (package), "pkgid");
+	return (g_strcmp0 (value, search) == 0);
+}
+
+/**
+ * zif_md_primary_xml_search_pkgid:
+ **/
+static GPtrArray *
+zif_md_primary_xml_search_pkgid (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_search_pkgid_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_what_provides_cb:
+ **/
+static gboolean
+zif_md_primary_xml_what_provides_cb (ZifPackage *package, gpointer user_data)
+{
+	gboolean ret;
+	GPtrArray *array;
+//	const gchar *search = (const gchar *) user_data;
+	array = zif_package_get_provides (package, NULL);
+	/* TODO: do something with the ZifDepend objects */
+	ret = FALSE;
+	g_ptr_array_unref (array);
+	return ret;
+}
+
+/**
+ * zif_md_primary_xml_what_provides:
+ **/
+static GPtrArray *
+zif_md_primary_xml_what_provides (ZifMd *md, const gchar *search,
+				  GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_what_provides_cb, (gpointer) search,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_find_package_cb:
+ **/
+static gboolean
+zif_md_primary_xml_find_package_cb (ZifPackage *package, gpointer user_data)
+{
+	const gchar *value;
+	const gchar *search = (const gchar *) user_data;
+	value = zif_package_get_id (package);
+	return (g_strcmp0 (value, search) == 0);
+}
+
+/**
+ * zif_md_primary_xml_find_package:
+ **/
+static GPtrArray *
+zif_md_primary_xml_find_package (ZifMd *md, const gchar *package_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	return zif_md_primary_xml_filter (md, zif_md_primary_xml_find_package_cb, (gpointer) package_id,
+					  cancellable, completion, error);
+}
+
+/**
+ * zif_md_primary_xml_get_packages:
+ **/
+static GPtrArray *
+zif_md_primary_xml_get_packages (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifMdPrimaryXml *primary_xml = ZIF_MD_PRIMARY_XML (md);
+	return g_ptr_array_ref (primary_xml->priv->array);
+}
+
+/**
+ * zif_md_primary_xml_finalize:
+ **/
+static void
+zif_md_primary_xml_finalize (GObject *object)
+{
+	ZifMdPrimaryXml *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_PRIMARY_XML (object));
+	md = ZIF_MD_PRIMARY_XML (object);
+
+	g_ptr_array_unref (md->priv->array);
+
+	G_OBJECT_CLASS (zif_md_primary_xml_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_primary_xml_class_init:
+ **/
+static void
+zif_md_primary_xml_class_init (ZifMdPrimaryXmlClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_primary_xml_finalize;
+
+	/* map */
+	md_class->load = zif_md_primary_xml_load;
+	md_class->unload = zif_md_primary_xml_unload;
+	md_class->search_name = zif_md_primary_xml_search_name;
+	md_class->search_details = zif_md_primary_xml_search_details;
+	md_class->search_group = zif_md_primary_xml_search_group;
+	md_class->search_pkgid = zif_md_primary_xml_search_pkgid;
+	md_class->what_provides = zif_md_primary_xml_what_provides;
+	md_class->resolve = zif_md_primary_xml_resolve;
+	md_class->get_packages = zif_md_primary_xml_get_packages;
+	md_class->find_package = zif_md_primary_xml_find_package;
+
+	g_type_class_add_private (klass, sizeof (ZifMdPrimaryXmlPrivate));
+}
+
+/**
+ * zif_md_primary_xml_init:
+ **/
+static void
+zif_md_primary_xml_init (ZifMdPrimaryXml *md)
+{
+	md->priv = ZIF_MD_PRIMARY_XML_GET_PRIVATE (md);
+	md->priv->array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	md->priv->loaded = FALSE;
+	md->priv->section = ZIF_MD_PRIMARY_XML_SECTION_UNKNOWN;
+	md->priv->section_package = ZIF_MD_PRIMARY_XML_SECTION_PACKAGE_UNKNOWN;
+	md->priv->package_temp = NULL;
+}
+
+/**
+ * zif_md_primary_xml_new:
+ *
+ * Return value: A new #ZifMdPrimaryXml class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdPrimaryXml *
+zif_md_primary_xml_new (void)
+{
+	ZifMdPrimaryXml *md;
+	md = g_object_new (ZIF_TYPE_MD_PRIMARY_XML, NULL);
+	return ZIF_MD_PRIMARY_XML (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_primary_xml_test (EggTest *test)
+{
+	ZifMdPrimaryXml *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	ZifPackage *package;
+	ZifString *summary;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+
+	if (!egg_test_start (test, "ZifMdPrimaryXml"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_primary_xml md");
+	md = zif_md_primary_xml_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_PRIMARY_XML);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum type");
+	ret = zif_md_set_checksum_type (ZIF_MD (md), G_CHECKSUM_SHA256);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum compressed");
+	ret = zif_md_set_checksum (ZIF_MD (md), "33a0eed8e12f445618756b18aa49d05ee30069d280d37b03a7a15d1ec954f833");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum uncompressed");
+	ret = zif_md_set_checksum_uncompressed (ZIF_MD (md), "52e4c37b13b4b23ae96432962186e726550b19e93cf3cbf7bf55c2a673a20086");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/fedora/primary.xml.gz");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "search for files");
+	zif_completion_reset (completion);
+	array = zif_md_primary_xml_resolve (md, "gnome-power-manager", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to search '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	egg_test_assert (test, array->len == 1);
+
+	/************************************************************/
+	egg_test_title (test, "correct value");
+	package = g_ptr_array_index (array, 0);
+	summary = zif_package_get_summary (package, NULL);
+	if (g_strcmp0 (zif_string_get_value (summary), "GNOME power management service") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct summary '%s'", zif_string_get_value (summary));
+	zif_string_unref (summary);
+	g_ptr_array_unref (array);
+
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+	g_object_unref (md);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-primary-xml.h b/backends/yum/libzif/zif-md-primary-xml.h
new file mode 100644
index 0000000..2b38406
--- /dev/null
+++ b/backends/yum/libzif/zif-md-primary-xml.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_PRIMARY_XML_H
+#define __ZIF_MD_PRIMARY_XML_H
+
+#include <glib-object.h>
+#include <packagekit-glib2/packagekit.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_PRIMARY_XML		(zif_md_primary_xml_get_type ())
+#define ZIF_MD_PRIMARY_XML(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_PRIMARY_XML, ZifMdPrimaryXml))
+#define ZIF_MD_PRIMARY_XML_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_PRIMARY_XML, ZifMdPrimaryXmlClass))
+#define ZIF_IS_MD_PRIMARY_XML(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_PRIMARY_XML))
+#define ZIF_IS_MD_PRIMARY_XML_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_PRIMARY_XML))
+#define ZIF_MD_PRIMARY_XML_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_PRIMARY_XML, ZifMdPrimaryXmlClass))
+
+typedef struct _ZifMdPrimaryXml		ZifMdPrimaryXml;
+typedef struct _ZifMdPrimaryXmlPrivate	ZifMdPrimaryXmlPrivate;
+typedef struct _ZifMdPrimaryXmlClass	ZifMdPrimaryXmlClass;
+
+struct _ZifMdPrimaryXml
+{
+	ZifMd				 parent;
+	ZifMdPrimaryXmlPrivate		*priv;
+};
+
+struct _ZifMdPrimaryXmlClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_primary_xml_get_type		(void);
+ZifMdPrimaryXml	*zif_md_primary_xml_new			(void);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_PRIMARY_XML_H */
+
diff --git a/backends/yum/libzif/zif-md-updateinfo.c b/backends/yum/libzif/zif-md-updateinfo.c
new file mode 100644
index 0000000..8e9c3ee
--- /dev/null
+++ b/backends/yum/libzif/zif-md-updateinfo.c
@@ -0,0 +1,763 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md-updateinfo
+ * @short_description: Updateinfo metadata functionality
+ *
+ * Provide access to the updateinfo repo metadata.
+ * This object is a subclass of #ZifMd
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <glib.h>
+
+#include "zif-md.h"
+#include "zif-md-updateinfo.h"
+#include "zif-update.h"
+#include "zif-update-info.h"
+#include "zif-utils.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_UPDATEINFO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD_UPDATEINFO, ZifMdUpdateinfoPrivate))
+
+typedef enum {
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE,
+	ZIF_MD_UPDATEINFO_SECTION_UNKNOWN
+} ZifMdUpdateinfoSection;
+
+typedef enum {
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_ID,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_TITLE,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_DESCRIPTION,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_ISSUED,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN
+} ZifMdUpdateinfoSectionGroup;
+
+typedef enum {
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST_PACKAGE,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST_FILENAME,
+	ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST_UNKNOWN
+} ZifMdUpdateinfoSectionUpdatePkglistType;
+
+/**
+ * ZifMdUpdateinfoPrivate:
+ *
+ * Private #ZifMdUpdateinfo data
+ **/
+struct _ZifMdUpdateinfoPrivate
+{
+	gboolean			 loaded;
+	GPtrArray			*array_updates;		/* stored as ZifUpdate */
+	/* for parser */
+	ZifMdUpdateinfoSection		 section;
+	ZifMdUpdateinfoSectionGroup	 section_group;
+	ZifMdUpdateinfoSectionUpdatePkglistType section_group_type;
+	ZifUpdate			*update_temp;
+	ZifUpdateInfo			*update_info_temp;
+	ZifPackage			*package_temp;
+};
+
+G_DEFINE_TYPE (ZifMdUpdateinfo, zif_md_updateinfo, ZIF_TYPE_MD)
+
+/**
+ * zif_md_updateinfo_parser_start_element:
+ **/
+static void
+zif_md_updateinfo_parser_start_element (GMarkupParseContext *context, const gchar *element_name,
+					const gchar **attribute_names, const gchar **attribute_values,
+					gpointer user_data, GError **error)
+{
+	guint i;
+	ZifMdUpdateinfo *updateinfo = user_data;
+
+	g_return_if_fail (ZIF_IS_MD_UPDATEINFO (updateinfo));
+
+	/* group element */
+	if (updateinfo->priv->section == ZIF_MD_UPDATEINFO_SECTION_UNKNOWN) {
+
+		/* start of list */
+		if (g_strcmp0 (element_name, "updates") == 0)
+			goto out;
+
+		/* start of update */
+		if (g_strcmp0 (element_name, "update") == 0) {
+			updateinfo->priv->section = ZIF_MD_UPDATEINFO_SECTION_UPDATE;
+			updateinfo->priv->update_temp = zif_update_new ();
+
+			/* find the update type as a bonus */
+			for (i=0; attribute_names[i] != NULL; i++) {
+				if (g_strcmp0 (attribute_names[i], "status") == 0) {
+					zif_update_set_state (updateinfo->priv->update_temp,
+							      pk_update_state_enum_from_string (attribute_values[i]));
+				}
+				if (g_strcmp0 (element_name, "type") == 0) {
+					zif_update_set_kind (updateinfo->priv->update_temp,
+							     pk_info_enum_from_string (attribute_values[i]));
+				}
+			}
+			goto out;
+		}
+
+		egg_warning ("unhandled element: %s", element_name);
+
+		goto out;
+	}
+
+	/* update element */
+	if (updateinfo->priv->section == ZIF_MD_UPDATEINFO_SECTION_UPDATE) {
+
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN) {
+			if (g_strcmp0 (element_name, "release") == 0)
+				goto out;
+			if (g_strcmp0 (element_name, "id") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_ID;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "title") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_TITLE;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "description") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_DESCRIPTION;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "issued") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_ISSUED;
+
+				/* find the issued date */
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "date") == 0) {
+						zif_update_set_issued (updateinfo->priv->update_temp, attribute_values[i]);
+					}
+				}
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "references") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES;
+				goto out;
+			}
+			if (g_strcmp0 (element_name, "pkglist") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST;
+				goto out;
+			}
+			egg_warning ("unhandled update base tag: %s", element_name);
+			goto out;
+
+		} else if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES) {
+			if (g_strcmp0 (element_name, "reference") == 0) {
+				updateinfo->priv->update_info_temp = zif_update_info_new ();
+
+				/* find the details about the info */
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "href") == 0) {
+						zif_update_info_set_url (updateinfo->priv->update_info_temp,
+									 attribute_values[i]);
+					}
+					if (g_strcmp0 (attribute_names[i], "title") == 0) {
+						zif_update_info_set_title (updateinfo->priv->update_info_temp,
+									   attribute_values[i]);
+					}
+					if (g_strcmp0 (attribute_names[i], "type") == 0) {
+						zif_update_info_set_kind (updateinfo->priv->update_info_temp,
+									  zif_update_info_kind_from_string (attribute_values[i]));
+					}
+				}
+
+				goto out;
+			}
+
+			egg_warning ("unhandled references tag: %s", element_name);
+			goto out;
+
+		} else if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST) {
+			if (g_strcmp0 (element_name, "collection") == 0)
+				goto out;
+			if (g_strcmp0 (element_name, "name") == 0)
+				goto out;
+			//TODO: is this better than src?
+			if (g_strcmp0 (element_name, "filename") == 0)
+				goto out;
+
+			if (g_strcmp0 (element_name, "package") == 0) {
+				const gchar *name = NULL;
+				guint epoch = 0;
+				const gchar *version = NULL;
+				const gchar *release = NULL;
+				const gchar *arch = NULL;
+				const gchar *src = NULL;
+				const gchar *data;
+				gchar *package_id;
+				ZifString *string;
+
+				updateinfo->priv->package_temp = zif_package_new ();
+
+				/* find the details about the package */
+				for (i=0; attribute_names[i] != NULL; i++) {
+					if (g_strcmp0 (attribute_names[i], "name") == 0)
+						name = attribute_values[i];
+					else if (g_strcmp0 (attribute_names[i], "epoch") == 0)
+						epoch = atoi (attribute_values[i]);
+					else if (g_strcmp0 (attribute_names[i], "version") == 0)
+						version = attribute_values[i];
+					else if (g_strcmp0 (attribute_names[i], "release") == 0)
+						release = attribute_values[i];
+					else if (g_strcmp0 (attribute_names[i], "arch") == 0)
+						arch = attribute_values[i];
+					else if (g_strcmp0 (attribute_names[i], "src") == 0)
+						src = attribute_values[i];
+				}
+
+				/* create a package from what we know */
+				data = zif_md_get_id (ZIF_MD (updateinfo));
+				package_id = zif_package_id_from_nevra (name, epoch, version, release, arch, data);
+				zif_package_set_id (updateinfo->priv->package_temp, package_id);
+				string = zif_string_new (src);
+				zif_package_set_location_href (updateinfo->priv->package_temp, string);
+				g_free (package_id);
+				zif_string_unref (string);
+				goto out;
+			}
+
+			egg_warning ("unexpected pklist tag: %s", element_name);
+		}
+
+		egg_warning ("unexpected update tag: %s", element_name);
+	}
+
+	egg_warning ("unhandled base tag: %s", element_name);
+
+out:
+	return;
+}
+
+/**
+ * zif_md_updateinfo_parser_end_element:
+ **/
+static void
+zif_md_updateinfo_parser_end_element (GMarkupParseContext *context, const gchar *element_name,
+				      gpointer user_data, GError **error)
+{
+	ZifMdUpdateinfo *updateinfo = user_data;
+
+	/* no element */
+	if (updateinfo->priv->section == ZIF_MD_UPDATEINFO_SECTION_UNKNOWN) {
+
+		/* end of list */
+		if (g_strcmp0 (element_name, "updates") == 0)
+			goto out;
+
+		egg_warning ("unhandled base end tag: %s", element_name);
+	}
+
+	/* update element */
+	if (updateinfo->priv->section == ZIF_MD_UPDATEINFO_SECTION_UPDATE) {
+
+		/* end of update */
+		if (g_strcmp0 (element_name, "update") == 0) {
+			updateinfo->priv->section = ZIF_MD_UPDATEINFO_SECTION_UNKNOWN;
+
+			/* add to array */
+			g_ptr_array_add (updateinfo->priv->array_updates, updateinfo->priv->update_temp);
+			updateinfo->priv->update_temp = NULL;
+			goto out;
+		}
+
+		if (g_strcmp0 (element_name, "id") == 0 ||
+		    g_strcmp0 (element_name, "title") == 0 ||
+		    g_strcmp0 (element_name, "release") == 0 ||
+		    g_strcmp0 (element_name, "description") == 0 ||
+		    g_strcmp0 (element_name, "issued") == 0) {
+			updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN;
+			goto out;
+		}
+
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_REFERENCES) {
+
+			if (g_strcmp0 (element_name, "references") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN;
+				goto out;
+			}
+
+			if (g_strcmp0 (element_name, "reference") == 0) {
+				zif_update_add_update_info (updateinfo->priv->update_temp,
+							    updateinfo->priv->update_info_temp);
+				g_object_unref (updateinfo->priv->update_info_temp);
+				updateinfo->priv->update_info_temp = NULL;
+				goto out;
+			}
+			egg_warning ("unhandled references end tag: %s", element_name);
+			goto out;
+		}
+
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST) {
+
+			if (g_strcmp0 (element_name, "pkglist") == 0) {
+				updateinfo->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN;
+				goto out;
+			}
+
+			if (g_strcmp0 (element_name, "name") == 0)
+				goto out;
+			if (g_strcmp0 (element_name, "filename") == 0)
+				goto out;
+			if (g_strcmp0 (element_name, "collection") == 0)
+				goto out;
+
+			/* add to the update */
+			if (g_strcmp0 (element_name, "package") == 0) {
+				zif_update_add_package (updateinfo->priv->update_temp,
+							updateinfo->priv->package_temp);
+				g_object_unref (updateinfo->priv->package_temp);
+				updateinfo->priv->package_temp = NULL;
+				goto out;
+			}
+
+			egg_warning ("unhandled pkglist end tag: %s", element_name);
+		}
+
+		egg_warning ("unhandled update end tag: %s", element_name);
+		goto out;
+	}
+
+	egg_warning ("unhandled end tag: %s", element_name);
+out:
+	return;
+}
+
+/**
+ * zif_md_updateinfo_parser_text:
+ **/
+static void
+zif_md_updateinfo_parser_text (GMarkupParseContext *context, const gchar *text, gsize text_len,
+			       gpointer user_data, GError **error)
+
+{
+	ZifMdUpdateinfo *updateinfo = user_data;
+
+	/* skip whitespace */
+	if (text_len < 1 || text[0] == ' ' || text[0] == '\t' || text[0] == '\n')
+		goto out;
+
+	/* group section */
+	if (updateinfo->priv->section == ZIF_MD_UPDATEINFO_SECTION_UPDATE) {
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_ID) {
+			zif_update_set_id (updateinfo->priv->update_temp, text);
+			goto out;
+		}
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_TITLE) {
+			zif_update_set_title (updateinfo->priv->update_temp, text);
+			goto out;
+		}
+		if (updateinfo->priv->section_group == ZIF_MD_UPDATEINFO_SECTION_UPDATE_DESCRIPTION) {
+			zif_update_set_description (updateinfo->priv->update_temp, text);
+			goto out;
+		}
+		goto out;
+	}
+out:
+	return;
+}
+
+/**
+ * zif_md_updateinfo_unload:
+ **/
+static gboolean
+zif_md_updateinfo_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = FALSE;
+	return ret;
+}
+
+/**
+ * zif_md_updateinfo_load:
+ **/
+static gboolean
+zif_md_updateinfo_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret = TRUE;
+	gchar *contents = NULL;
+	const gchar *filename;
+	gsize size;
+	GMarkupParseContext *context = NULL;
+	const GMarkupParser gpk_md_updateinfo_markup_parser = {
+		zif_md_updateinfo_parser_start_element,
+		zif_md_updateinfo_parser_end_element,
+		zif_md_updateinfo_parser_text,
+		NULL, /* passthrough */
+		NULL /* error */
+	};
+	ZifMdUpdateinfo *updateinfo = ZIF_MD_UPDATEINFO (md);
+
+	g_return_val_if_fail (ZIF_IS_MD_UPDATEINFO (md), FALSE);
+
+	/* already loaded */
+	if (updateinfo->priv->loaded)
+		goto out;
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to get filename for updateinfo");
+		goto out;
+	}
+
+	/* open database */
+	egg_debug ("filename = %s", filename);
+
+	/* get repo contents */
+	ret = g_file_get_contents (filename, &contents, &size, error);
+	if (!ret)
+		goto out;
+
+	/* create parser */
+	context = g_markup_parse_context_new (&gpk_md_updateinfo_markup_parser, G_MARKUP_PREFIX_ERROR_POSITION, updateinfo, NULL);
+
+	/* parse data */
+	ret = g_markup_parse_context_parse (context, contents, (gssize) size, error);
+	if (!ret)
+		goto out;
+
+	updateinfo->priv->loaded = TRUE;
+out:
+	if (context != NULL)
+		g_markup_parse_context_free (context);
+	g_free (contents);
+	return ret;
+}
+
+/**
+ * zif_md_updateinfo_get_detail:
+ * @md: the #ZifMdUpdateinfo object
+ * @cancellable: the %GCancellable, or %NULL
+ * @completion: the %ZifCompletion object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets all the available update data.
+ *
+ * Return value: #GPtrArray of #ZifUpdate's, free with g_ptr_array_unref()
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_updateinfo_get_detail (ZifMdUpdateinfo *md,
+			      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	gboolean ret;
+	GError *error_local = NULL;
+
+	g_return_val_if_fail (ZIF_IS_MD_UPDATEINFO (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get load updateinfo: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	array = g_ptr_array_ref (md->priv->array_updates);
+out:
+	return array;
+}
+
+/**
+ * zif_md_updateinfo_get_detail_for_package:
+ * @md: the #ZifMdUpdateinfo object
+ * @package_id: the group to search for
+ * @cancellable: the %GCancellable, or %NULL
+ * @completion: the %ZifCompletion object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Gets the list of update details for the package_id.
+ *
+ * Return value: #GPtrArray of #ZifUpdate's, free with g_ptr_array_unref()
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_updateinfo_get_detail_for_package (ZifMdUpdateinfo *md, const gchar *package_id,
+					  GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	GPtrArray *array_tmp;
+	guint i;
+	guint j;
+	guint len;
+	gboolean ret;
+	GError *error_local = NULL;
+	ZifUpdate *update;
+	ZifPackage *package;
+
+	g_return_val_if_fail (ZIF_IS_MD_UPDATEINFO (md), NULL);
+	g_return_val_if_fail (package_id != NULL, NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* if not already loaded, load */
+	if (!md->priv->loaded) {
+		ret = zif_md_load (ZIF_MD (md), cancellable, completion, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_TO_LOAD,
+				     "failed to get load updateinfo: %s", error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get packages in this group */
+	len = md->priv->array_updates->len;
+	for (i=0; i<len; i++) {
+		update = g_ptr_array_index (md->priv->array_updates, i);
+
+		/* have we matched on any entries */
+		ret = FALSE;
+
+		array_tmp = zif_update_get_packages (update);
+		for (j=0; j<array_tmp->len; j++) {
+			package = g_ptr_array_index (array_tmp, j);
+			if (g_strcmp0 (zif_package_get_id (package), package_id) == 0) {
+				ret = TRUE;
+				break;
+			}
+		}
+
+		/* we found a package match */
+		if (ret) {
+			if (array == NULL)
+				array = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+			g_ptr_array_add (array, g_object_ref (update));
+		}
+	}
+
+	/* nothing found */
+	if (array == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "could not find package: %s", package_id);
+	}
+out:
+	return array;
+}
+
+/**
+ * zif_md_updateinfo_finalize:
+ **/
+static void
+zif_md_updateinfo_finalize (GObject *object)
+{
+	ZifMdUpdateinfo *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD_UPDATEINFO (object));
+	md = ZIF_MD_UPDATEINFO (object);
+
+	g_ptr_array_unref (md->priv->array_updates);
+
+	G_OBJECT_CLASS (zif_md_updateinfo_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_updateinfo_class_init:
+ **/
+static void
+zif_md_updateinfo_class_init (ZifMdUpdateinfoClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	ZifMdClass *md_class = ZIF_MD_CLASS (klass);
+	object_class->finalize = zif_md_updateinfo_finalize;
+
+	/* map */
+	md_class->load = zif_md_updateinfo_load;
+	md_class->unload = zif_md_updateinfo_unload;
+	g_type_class_add_private (klass, sizeof (ZifMdUpdateinfoPrivate));
+}
+
+/**
+ * zif_md_updateinfo_init:
+ **/
+static void
+zif_md_updateinfo_init (ZifMdUpdateinfo *md)
+{
+	md->priv = ZIF_MD_UPDATEINFO_GET_PRIVATE (md);
+	md->priv->loaded = FALSE;
+	md->priv->section = ZIF_MD_UPDATEINFO_SECTION_UNKNOWN;
+	md->priv->section_group = ZIF_MD_UPDATEINFO_SECTION_UPDATE_UNKNOWN;
+	md->priv->section_group_type = ZIF_MD_UPDATEINFO_SECTION_UPDATE_PKGLIST_UNKNOWN;
+	md->priv->update_temp = NULL;
+	md->priv->update_info_temp = NULL;
+	md->priv->package_temp = NULL;
+	md->priv->array_updates = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+}
+
+/**
+ * zif_md_updateinfo_new:
+ *
+ * Return value: A new #ZifMdUpdateinfo class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMdUpdateinfo *
+zif_md_updateinfo_new (void)
+{
+	ZifMdUpdateinfo *md;
+	md = g_object_new (ZIF_TYPE_MD_UPDATEINFO, NULL);
+	return ZIF_MD_UPDATEINFO (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_updateinfo_test (EggTest *test)
+{
+	ZifMdUpdateinfo *md;
+	gboolean ret;
+	GError *error = NULL;
+	GPtrArray *array;
+	const gchar *id;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+	ZifUpdate *update;
+
+	if (!egg_test_start (test, "ZifMdUpdateinfo"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get md_updateinfo md");
+	md = zif_md_updateinfo_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (ZIF_MD (md), "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set type");
+	ret = zif_md_set_mdtype (ZIF_MD (md), ZIF_MD_TYPE_UPDATEINFO);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set filename");
+	ret = zif_md_set_filename (ZIF_MD (md), "../test/cache/updateinfo.xml");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum type");
+	ret = zif_md_set_checksum_type (ZIF_MD (md), G_CHECKSUM_SHA256);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "set checksum uncompressed");
+	ret = zif_md_set_checksum_uncompressed (ZIF_MD (md), "4fa3657a79af078c588e2ab181ab0a3a156c6008a084d85edccaf6c57d67d47d");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "get categories");
+	array = zif_md_updateinfo_get_detail_for_package (md, "device-mapper-libs;1.02.27-7.fc10;ppc64;fedora", cancellable, completion, &error);
+	if (array != NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get categories '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "correct number");
+	if (array->len == 1)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "incorrect value %i", array->len);
+
+	/************************************************************/
+	egg_test_title (test, "correct id value");
+	update = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (zif_update_get_id (update), "FEDORA-2008-9969") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct id '%s'", zif_update_get_id (update));
+
+	/************************************************************/
+	egg_test_title (test, "correct title value");
+	update = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (zif_update_get_title (update), "lvm2-2.02.39-7.fc10") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct title '%s'", zif_update_get_title (update));
+
+	/************************************************************/
+	egg_test_title (test, "correct description value");
+	update = g_ptr_array_index (array, 0);
+	if (g_strcmp0 (zif_update_get_description (update), "Fix an incorrect path that prevents the clvmd init script from working and include licence files with the sub-packages.") == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to get correct id '%s'", zif_update_get_description (update));
+
+	g_ptr_array_unref (array);
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md-updateinfo.h b/backends/yum/libzif/zif-md-updateinfo.h
new file mode 100644
index 0000000..38e708d
--- /dev/null
+++ b/backends/yum/libzif/zif-md-updateinfo.h
@@ -0,0 +1,73 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_UPDATEINFO_H
+#define __ZIF_MD_UPDATEINFO_H
+
+#include <glib-object.h>
+
+#include "zif-md.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD_UPDATEINFO		(zif_md_updateinfo_get_type ())
+#define ZIF_MD_UPDATEINFO(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD_UPDATEINFO, ZifMdUpdateinfo))
+#define ZIF_MD_UPDATEINFO_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD_UPDATEINFO, ZifMdUpdateinfoClass))
+#define ZIF_IS_MD_UPDATEINFO(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD_UPDATEINFO))
+#define ZIF_IS_MD_UPDATEINFO_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD_UPDATEINFO))
+#define ZIF_MD_UPDATEINFO_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD_UPDATEINFO, ZifMdUpdateinfoClass))
+
+typedef struct _ZifMdUpdateinfo		ZifMdUpdateinfo;
+typedef struct _ZifMdUpdateinfoPrivate	ZifMdUpdateinfoPrivate;
+typedef struct _ZifMdUpdateinfoClass	ZifMdUpdateinfoClass;
+
+struct _ZifMdUpdateinfo
+{
+	ZifMd				 parent;
+	ZifMdUpdateinfoPrivate		*priv;
+};
+
+struct _ZifMdUpdateinfoClass
+{
+	ZifMdClass			 parent_class;
+};
+
+GType		 zif_md_updateinfo_get_type		(void);
+ZifMdUpdateinfo	*zif_md_updateinfo_new			(void);
+
+GPtrArray	*zif_md_updateinfo_get_detail		(ZifMdUpdateinfo	*md,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+GPtrArray	*zif_md_updateinfo_get_detail_for_package (ZifMdUpdateinfo	*md,
+							 const gchar		*package_id,
+							 GCancellable		*cancellable,
+							 ZifCompletion		*completion,
+							 GError			**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_UPDATEINFO_H */
+
diff --git a/backends/yum/libzif/zif-md.c b/backends/yum/libzif/zif-md.c
new file mode 100644
index 0000000..e85f2e0
--- /dev/null
+++ b/backends/yum/libzif/zif-md.c
@@ -0,0 +1,1242 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-md
+ * @short_description: Metadata file common functionality
+ *
+ * This provides an abstract metadata class.
+ * It is implemented by #ZifMdFilelists, #ZifMdMaster and #ZifMdPrimary.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "zif-utils.h"
+#include "zif-md.h"
+#include "zif-config.h"
+
+#include "egg-debug.h"
+#include "egg-string.h"
+
+#define ZIF_MD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_MD, ZifMdPrivate))
+
+/**
+ * ZifMdPrivate:
+ *
+ * Private #ZifMd data
+ **/
+struct _ZifMdPrivate
+{
+	gboolean		 loaded;
+	gchar			*id;			/* fedora */
+	gchar			*filename;		/* /var/cache/yum/fedora/repo.sqlite.bz2 */
+	gchar			*filename_uncompressed;	/* /var/cache/yum/fedora/repo.sqlite */
+	guint			 timestamp;
+	gchar			*location;		/* repodata/35d817e-primary.sqlite.bz2 */
+	gchar			*checksum;		/* of compressed file */
+	gchar			*checksum_uncompressed;	/* of uncompressed file */
+	GChecksumType		 checksum_type;
+	ZifMdType		 type;
+	ZifStoreRemote		*remote;
+	ZifConfig		*config;
+};
+
+G_DEFINE_TYPE (ZifMd, zif_md, G_TYPE_OBJECT)
+
+/**
+ * zif_md_error_quark:
+ *
+ * Return value: Our personal error quark.
+ *
+ * Since: 0.0.1
+ **/
+GQuark
+zif_md_error_quark (void)
+{
+	static GQuark quark = 0;
+	if (!quark)
+		quark = g_quark_from_static_string ("zif_md_error");
+	return quark;
+}
+
+/**
+ * zif_md_get_id:
+ * @md: the #ZifMd object
+ *
+ * Gets the md identifier, usually the repo name.
+ *
+ * Return value: the repo id.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_md_get_id (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	return md->priv->id;
+}
+
+/**
+ * zif_md_get_filename:
+ * @md: the #ZifMd object
+ *
+ * Gets the compressed filename of the repo.
+ *
+ * Return value: the filename
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_md_get_filename (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	return md->priv->filename;
+}
+
+/**
+ * zif_md_get_location:
+ * @md: the #ZifMd object
+ *
+ * Gets the location of the repo.
+ *
+ * Return value: the location
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_md_get_location (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	return md->priv->location;
+}
+
+/**
+ * zif_md_get_mdtype:
+ * @md: the #ZifMd object
+ *
+ * Gets the type of the repo.
+ *
+ * Return value: the type
+ *
+ * Since: 0.0.1
+ **/
+ZifMdType
+zif_md_get_mdtype (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), ZIF_MD_TYPE_UNKNOWN);
+	return md->priv->type;
+}
+
+/**
+ * zif_md_get_filename_uncompressed:
+ * @md: the #ZifMd object
+ *
+ * Gets the uncompressed filename of the repo.
+ *
+ * Return value: the filename
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_md_get_filename_uncompressed (ZifMd *md)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	return md->priv->filename_uncompressed;
+}
+
+/**
+ * zif_md_set_filename:
+ * @md: the #ZifMd object
+ * @filename: the base filename, e.g. "master.xml.bz2"
+ *
+ * Sets the filename of the compressed file.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_filename (ZifMd *md, const gchar *filename)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->filename == NULL, FALSE);
+	g_return_val_if_fail (filename != NULL, FALSE);
+
+	/* this is the compressed name */
+	md->priv->filename = g_strdup (filename);
+
+	/* this is the uncompressed name */
+	md->priv->filename_uncompressed = zif_file_get_uncompressed_name (filename);
+
+	return TRUE;
+}
+
+/**
+ * zif_md_set_timestamp:
+ * @md: the #ZifMd object
+ * @timestamp: the timestamp value
+ *
+ * Sets the timestamp of the compressed file.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_timestamp (ZifMd *md, guint timestamp)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->timestamp == 0, FALSE);
+	g_return_val_if_fail (timestamp != 0, FALSE);
+
+	/* save new value */
+	md->priv->timestamp = timestamp;
+	return TRUE;
+}
+
+/**
+ * zif_md_set_location:
+ * @md: the #ZifMd object
+ * @location: the location
+ *
+ * Sets the location of the compressed file, e.g. "repodata/35d817e-primary.sqlite.bz2"
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_location (ZifMd *md, const gchar *location)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->location == NULL, FALSE);
+	g_return_val_if_fail (location != NULL, FALSE);
+
+	/* save new value */
+	md->priv->location = g_strdup (location);
+	return TRUE;
+}
+
+/**
+ * zif_md_set_checksum:
+ * @md: the #ZifMd object
+ * @checksum: the checksum value
+ *
+ * Sets the checksum of the compressed file.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_checksum (ZifMd *md, const gchar *checksum)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->checksum == NULL, FALSE);
+	g_return_val_if_fail (checksum != NULL, FALSE);
+
+	/* save new value */
+	md->priv->checksum = g_strdup (checksum);
+	return TRUE;
+}
+
+/**
+ * zif_md_set_checksum_uncompressed:
+ * @md: the #ZifMd object
+ * @checksum_uncompressed: the uncompressed checksum value
+ *
+ * Sets the checksum of the uncompressed file.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_checksum_uncompressed (ZifMd *md, const gchar *checksum_uncompressed)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->checksum_uncompressed == NULL, FALSE);
+	g_return_val_if_fail (checksum_uncompressed != NULL, FALSE);
+
+	/* save new value */
+	md->priv->checksum_uncompressed = g_strdup (checksum_uncompressed);
+	return TRUE;
+}
+
+/**
+ * zif_md_set_checksum_type:
+ * @md: the #ZifMd object
+ * @checksum_type: the checksum type
+ *
+ * Sets the checksum_type of the files.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_checksum_type (ZifMd *md, GChecksumType checksum_type)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->checksum_type == 0, FALSE);
+
+	/* save new value */
+	md->priv->checksum_type = checksum_type;
+	return TRUE;
+}
+
+/**
+ * zif_md_set_mdtype:
+ * @md: the #ZifMd object
+ * @type: the metadata type
+ *
+ * Sets the type of the metadata, e.g. ZIF_MD_TYPE_FILELISTS_SQL.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_mdtype (ZifMd *md, ZifMdType type)
+{
+	gboolean ret = TRUE;
+
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->type == ZIF_MD_TYPE_UNKNOWN, FALSE);
+	g_return_val_if_fail (type != ZIF_MD_TYPE_UNKNOWN, FALSE);
+
+	/* save new value */
+	md->priv->type = type;
+
+	/* metalink is not specified in the repomd.xml file */
+	if (type == ZIF_MD_TYPE_METALINK) {
+		zif_md_set_location (md, "metalink.xml");
+		goto out;
+	}
+
+	/* mirrorlist is not specified in the repomd.xml file */
+	if (type == ZIF_MD_TYPE_MIRRORLIST) {
+		zif_md_set_location (md, "mirrorlist.txt");
+		goto out;
+	}
+
+	/* check we've got the needed data */
+	if (md->priv->location != NULL && (md->priv->checksum == NULL || md->priv->timestamp == 0)) {
+		egg_warning ("cannot load md for %s (loc=%s, checksum=%s, checksum_open=%s, timestamp=%i)",
+			     zif_md_type_to_text (type), md->priv->location,
+			     md->priv->checksum, md->priv->checksum_uncompressed, md->priv->timestamp);
+		ret = FALSE;
+		goto out;
+	}
+out:
+	return ret;
+}
+
+/**
+ * zif_md_set_id:
+ * @md: the #ZifMd object
+ * @id: the repository id, e.g. "fedora"
+ *
+ * Sets the repository ID for this metadata.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_id (ZifMd *md, const gchar *id)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->id == NULL, FALSE);
+	g_return_val_if_fail (id != NULL, FALSE);
+
+	md->priv->id = g_strdup (id);
+	return TRUE;
+}
+
+/**
+ * zif_md_set_id:
+ * @md: the #ZifMd object
+ * @id: the repository id, e.g. "fedora"
+ *
+ * Sets the repository ID for this metadata.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_set_store_remote (ZifMd *md, ZifStoreRemote *remote)
+{
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->remote == NULL, FALSE);
+	g_return_val_if_fail (remote != NULL, FALSE);
+
+	/* do not take a reference, else the parent device never goes away */
+	md->priv->remote = remote;
+	return TRUE;
+}
+
+/**
+ * zif_md_delete_file:
+ **/
+static gboolean
+zif_md_delete_file (const gchar *filename)
+{
+	gint retval;
+	gboolean ret;
+
+	/* file exists? */
+	ret = g_file_test (filename, G_FILE_TEST_EXISTS);
+	if (!ret)
+		goto out;
+
+	egg_warning ("deleting %s", filename);
+
+	/* remove */
+	retval = g_unlink (filename);
+	if (retval != 0) {
+		egg_warning ("failed to delete %s", filename);
+		ret = FALSE;
+	}
+out:
+	return ret;
+}
+
+/**
+ * zif_md_load:
+ * @md: the #ZifMd object
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Load the metadata store.
+ *
+ * - Check compressed file
+ *   if invalid:
+ *       delete_it()
+ *       if online:
+ *           download_it()
+ *           if failure:
+ *               abort
+ *           check_it()
+ *           if failure:
+ *               abort
+ *       else
+ *           abort
+ *
+ * - Check uncompressed file
+ *   if invalid:
+ *       delete_it()
+ *       decompress_it()
+ *           if failure:
+ *               abort()
+ *       check_it()
+ *       if failure:
+ *           abort
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_load (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	gboolean ret;
+	gboolean uncompressed_check;
+	gchar *dirname = NULL;
+	GError *error_local = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+	ZifCompletion *completion_local;
+
+	/* no support */
+	if (klass->load == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		return FALSE;
+	}
+
+	/* setup completion */
+	zif_completion_set_number_steps (completion, 3);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+
+	/* optimise: if uncompressed file is okay, then don't even check the compressed file */
+	uncompressed_check = zif_md_file_check (md, TRUE, &error_local);
+	if (uncompressed_check) {
+		zif_completion_done (completion);
+		goto skip_compressed_check;
+	}
+
+	/* display any warning */
+	egg_warning ("failed checksum for uncompressed: %s", error_local->message);
+	g_clear_error (&error_local);
+
+	/* check compressed file */
+	ret = zif_md_file_check (md, FALSE, &error_local);
+	if (!ret) {
+
+		/* this one really is fatal */
+		if (g_strstr_len (error_local->message, -1, "no filename") != NULL) {
+			g_propagate_error (error, error_local);
+			goto out;
+		}
+
+		egg_warning ("failed checksum for compressed: %s", error_local->message);
+		g_clear_error (&error_local);
+
+		/* delete file if it exists */
+		zif_md_delete_file (md->priv->filename);
+
+		/* if not online, then this is fatal */
+		ret = zif_config_get_boolean (md->priv->config, "network", NULL);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_AS_OFFLINE,
+				     "failed to check %s checksum for %s and offline",
+				     zif_md_type_to_text (md->priv->type), md->priv->id);
+			goto out;
+		}
+
+		/* download file */
+		completion_local = zif_completion_get_child (completion);
+		dirname = g_path_get_dirname (md->priv->filename);
+		ret = zif_store_remote_download (md->priv->remote, md->priv->location, dirname, cancellable, completion_local, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED_DOWNLOAD,
+				     "failed to download missing compressed file: %s", error_local->message);
+			goto out;
+		}
+
+		/* check newly downloaded compressed file */
+		ret = zif_md_file_check (md, FALSE, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed checksum on downloaded file: %s", error_local->message);
+			goto out;
+		}
+	}
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* check uncompressed file */
+	if (!uncompressed_check) {
+
+		/* delete file if it exists */
+		zif_md_delete_file (md->priv->filename_uncompressed);
+
+		/* decompress file */
+		egg_debug ("decompressing file");
+		completion_local = zif_completion_get_child (completion);
+		ret = zif_file_decompress (md->priv->filename, md->priv->filename_uncompressed,
+					   cancellable, completion_local, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to decompress: %s", error_local->message);
+			goto out;
+		}
+
+		/* check newly uncompressed file */
+		ret = zif_md_file_check (md, TRUE, &error_local);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed checksum on decompressed file: %s", error_local->message);
+			goto out;
+		}
+	}
+
+skip_compressed_check:
+
+	/* this section done */
+	zif_completion_done (completion);
+
+	/* do subclassed load */
+	completion_local = zif_completion_get_child (completion);
+	ret = klass->load (md, cancellable, completion_local, error);
+
+	/* this section done */
+	zif_completion_done (completion);
+out:
+	g_free (dirname);
+	return ret;
+}
+
+/**
+ * zif_md_unload:
+ * @md: the #ZifMd object
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Unload the metadata store.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_unload (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	/* no support */
+	if (klass->unload == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		return FALSE;
+	}
+
+	return klass->unload (md, cancellable, completion, error);
+}
+
+/**
+ * zif_md_resolve:
+ * @md: the #ZifMd object
+ * @search: the search term, e.g. "gnome-power-manager"
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all remote packages that match the name exactly.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_resolve (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->resolve == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->resolve (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_search_name:
+ * @md: the #ZifMd object
+ * @search: the search term, e.g. "power"
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match the name.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_search_name (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->search_name == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->search_name (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_search_details:
+ * @md: the #ZifMd object
+ * @search: the search term, e.g. "advanced"
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match the name or description.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_search_details (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->search_details == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->search_details (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_search_group:
+ * @md: the #ZifMd object
+ * @search: the search term, e.g. "games/console"
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match the group.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_search_group (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->search_group == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->search_group (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_search_pkgid:
+ * @md: the #ZifMd object
+ * @search: the search term as a 64 bit hash
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match the given pkgId.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_search_pkgid (ZifMd *md, const gchar *search, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->search_pkgid == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->search_pkgid (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_what_provides:
+ * @md: the #ZifMd object
+ * @search: the provide, e.g. "mimehandler(application/ogg)"
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match the given provide.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_what_provides (ZifMd *md, const gchar *search,
+		      GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->what_provides == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->what_provides (md, search, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_find_package:
+ * @md: the #ZifMd object
+ * @package_id: the PackageId to match
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Finds all packages that match PackageId.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_find_package (ZifMd *md, const gchar *package_id, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->find_package == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->find_package (md, package_id, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_get_packages:
+ * @md: the #ZifMd object
+ * @cancellable: a #GCancellable which is used to cancel tasks, or %NULL
+ * @completion: a #ZifCompletion to use for progress reporting
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Returns all packages in the repo.
+ *
+ * Return value: an array of #ZifPackageRemote's
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_md_get_packages (ZifMd *md, GCancellable *cancellable, ZifCompletion *completion, GError **error)
+{
+	GPtrArray *array = NULL;
+	ZifMdClass *klass = ZIF_MD_GET_CLASS (md);
+
+	g_return_val_if_fail (ZIF_IS_MD (md), NULL);
+	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+	/* no support */
+	if (klass->get_packages == NULL) {
+		g_set_error_literal (error, ZIF_MD_ERROR, ZIF_MD_ERROR_NO_SUPPORT,
+				     "operation cannot be performed on this md");
+		goto out;
+	}
+
+	
+	/* do subclassed action */
+	array = klass->get_packages (md, cancellable, completion, error);
+out:
+	return array;
+}
+
+/**
+ * zif_md_clean:
+ * @md: the #ZifMd object
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Clean the metadata store.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_clean (ZifMd *md, GError **error)
+{
+	gboolean ret = FALSE;
+	gboolean exists;
+	const gchar *filename;
+	GFile *file;
+	GError *error_local = NULL;
+
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	/* get filename */
+	filename = zif_md_get_filename (md);
+	if (filename == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "failed to get filename for %s", zif_md_type_to_text (md->priv->type));
+		ret = FALSE;
+		goto out;
+	}
+
+	/* file does not exist */
+	exists = g_file_test (filename, G_FILE_TEST_EXISTS);
+	if (exists) {
+		file = g_file_new_for_path (filename);
+		ret = g_file_delete (file, NULL, &error_local);
+		g_object_unref (file);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to delete metadata file %s: %s", filename, error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* get filename */
+	filename = zif_md_get_filename_uncompressed (md);
+	if (filename == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "failed to get uncompressed filename for %s", zif_md_type_to_text (md->priv->type));
+		ret = FALSE;
+		goto out;
+	}
+
+	/* file does not exist */
+	exists = g_file_test (filename, G_FILE_TEST_EXISTS);
+	if (exists) {
+		file = g_file_new_for_path (filename);
+		ret = g_file_delete (file, NULL, &error_local);
+		g_object_unref (file);
+		if (!ret) {
+			g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+				     "failed to delete metadata file %s: %s", filename, error_local->message);
+			g_error_free (error_local);
+			goto out;
+		}
+	}
+
+	/* okay */
+	ret = TRUE;
+out:
+	return ret;
+}
+
+/**
+ * zif_md_type_to_text:
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_md_type_to_text (ZifMdType type)
+{
+	if (type == ZIF_MD_TYPE_FILELISTS_XML)
+		return "filelists";
+	if (type == ZIF_MD_TYPE_FILELISTS_SQL)
+		return "filelists_db";
+	if (type == ZIF_MD_TYPE_PRIMARY_XML)
+		return "primary";
+	if (type == ZIF_MD_TYPE_PRIMARY_SQL)
+		return "primary_db";
+	if (type == ZIF_MD_TYPE_OTHER_XML)
+		return "other";
+	if (type == ZIF_MD_TYPE_OTHER_SQL)
+		return "other_db";
+	if (type == ZIF_MD_TYPE_COMPS)
+		return "group";
+	if (type == ZIF_MD_TYPE_COMPS_GZ)
+		return "group_gz";
+	if (type == ZIF_MD_TYPE_METALINK)
+		return "metalink";
+	if (type == ZIF_MD_TYPE_MIRRORLIST)
+		return "mirrorlist";
+	if (type == ZIF_MD_TYPE_PRESTODELTA)
+		return "prestodelta";
+	if (type == ZIF_MD_TYPE_UPDATEINFO)
+		return "updateinfo";
+	return "unknown";
+}
+
+/**
+ * zif_md_file_check:
+ * @md: the #ZifMd object
+ * @use_uncompressed: If we should check only the uncompresed version
+ * @error: a #GError which is used on failure, or %NULL
+ *
+ * Check the metadata files to make sure they are valid.
+ *
+ * Return value: %TRUE for success, %FALSE for failure
+ *
+ * Since: 0.0.1
+ **/
+gboolean
+zif_md_file_check (ZifMd *md, gboolean use_uncompressed, GError **error)
+{
+	gboolean ret = FALSE;
+	GError *error_local = NULL;
+	gchar *data = NULL;
+	gchar *checksum = NULL;
+	const gchar *filename;
+	const gchar *checksum_wanted;
+	gsize length;
+
+	g_return_val_if_fail (ZIF_IS_MD (md), FALSE);
+	g_return_val_if_fail (md->priv->id != NULL, FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	/* metalink has no checksum... */
+	if (md->priv->type == ZIF_MD_TYPE_METALINK ||
+	    md->priv->type == ZIF_MD_TYPE_MIRRORLIST) {
+		egg_debug ("skipping checksum check on %s", zif_md_type_to_text (md->priv->type));
+		ret = TRUE;
+		goto out;
+	}
+
+	/* get correct filename */
+	if (use_uncompressed)
+		filename = md->priv->filename_uncompressed;
+	else
+		filename = md->priv->filename;
+
+	/* no checksum set */
+	if (filename == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "no filename for %s [%s]", md->priv->id, zif_md_type_to_text (md->priv->type));
+		ret = FALSE;
+		goto out;
+	}
+
+	/* get contents */
+	ret = g_file_get_contents (filename, &data, &length, &error_local);
+	if (!ret) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "failed to get contents of %s: %s", filename, error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* get the one we want */
+	if (use_uncompressed)
+		checksum_wanted = md->priv->checksum_uncompressed;
+	else
+		checksum_wanted = md->priv->checksum;
+
+	/* no checksum set */
+	if (checksum_wanted == NULL) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "checksum not set for %s", filename);
+		ret = FALSE;
+		goto out;
+	}
+
+	/* compute checksum */
+	checksum = g_compute_checksum_for_data (md->priv->checksum_type, (guchar*) data, length);
+
+	/* matches? */
+	ret = (g_strcmp0 (checksum, checksum_wanted) == 0);
+	if (!ret) {
+		g_set_error (error, ZIF_MD_ERROR, ZIF_MD_ERROR_FAILED,
+			     "checksum incorrect, wanted %s, got %s for %s", checksum_wanted, checksum, filename);
+		goto out;
+	}
+	egg_debug ("%s checksum correct (%s)", filename, checksum_wanted);
+out:
+	g_free (data);
+	g_free (checksum);
+	return ret;
+}
+
+/**
+ * zif_md_finalize:
+ **/
+static void
+zif_md_finalize (GObject *object)
+{
+	ZifMd *md;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_MD (object));
+	md = ZIF_MD (object);
+
+	g_free (md->priv->id);
+	g_free (md->priv->filename);
+	g_free (md->priv->location);
+	g_free (md->priv->checksum);
+	g_free (md->priv->checksum_uncompressed);
+
+	g_object_unref (md->priv->config);
+
+	G_OBJECT_CLASS (zif_md_parent_class)->finalize (object);
+}
+
+/**
+ * zif_md_class_init:
+ **/
+static void
+zif_md_class_init (ZifMdClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = zif_md_finalize;
+	g_type_class_add_private (klass, sizeof (ZifMdPrivate));
+}
+
+/**
+ * zif_md_init:
+ **/
+static void
+zif_md_init (ZifMd *md)
+{
+	md->priv = ZIF_MD_GET_PRIVATE (md);
+	md->priv->type = ZIF_MD_TYPE_UNKNOWN;
+	md->priv->loaded = FALSE;
+	md->priv->id = NULL;
+	md->priv->filename = NULL;
+	md->priv->timestamp = 0;
+	md->priv->location = NULL;
+	md->priv->checksum = NULL;
+	md->priv->checksum_uncompressed = NULL;
+	md->priv->checksum_type = 0;
+	md->priv->remote = NULL;
+	md->priv->config = zif_config_new ();
+}
+
+/**
+ * zif_md_new:
+ *
+ * Return value: A new #ZifMd class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifMd *
+zif_md_new (void)
+{
+	ZifMd *md;
+	md = g_object_new (ZIF_TYPE_MD, NULL);
+	return ZIF_MD (md);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_md_test (EggTest *test)
+{
+	ZifMd *md;
+	gboolean ret;
+	GError *error = NULL;
+	GCancellable *cancellable;
+	ZifCompletion *completion;
+
+	if (!egg_test_start (test, "ZifMd"))
+		return;
+
+	/* use */
+	cancellable = g_cancellable_new ();
+	completion = zif_completion_new ();
+
+	/************************************************************/
+	egg_test_title (test, "get store_remote md");
+	md = zif_md_new ();
+	egg_test_assert (test, md != NULL);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, !md->priv->loaded);
+
+	/************************************************************/
+	egg_test_title (test, "set id");
+	ret = zif_md_set_id (md, "fedora");
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to set");
+
+	/************************************************************/
+	egg_test_title (test, "load");
+	ret = zif_md_load (md, cancellable, completion, &error);
+	if (ret)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to load '%s'", error->message);
+
+	/************************************************************/
+	egg_test_title (test, "loaded");
+	egg_test_assert (test, md->priv->loaded);
+
+	g_object_unref (md);
+	g_object_unref (cancellable);
+	g_object_unref (completion);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-md.h b/backends/yum/libzif/zif-md.h
new file mode 100644
index 0000000..e589a5f
--- /dev/null
+++ b/backends/yum/libzif/zif-md.h
@@ -0,0 +1,237 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_MD_H
+#define __ZIF_MD_H
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include "zif-md.h"
+#include "zif-completion.h"
+#include "zif-store-remote.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_MD		(zif_md_get_type ())
+#define ZIF_MD(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_MD, ZifMd))
+#define ZIF_MD_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_MD, ZifMdClass))
+#define ZIF_IS_MD(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_MD))
+#define ZIF_IS_MD_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_MD))
+#define ZIF_MD_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_MD, ZifMdClass))
+#define ZIF_MD_ERROR		(zif_md_error_quark ())
+
+typedef struct _ZifMd		ZifMd;
+typedef struct _ZifMdPrivate	ZifMdPrivate;
+typedef struct _ZifMdClass	ZifMdClass;
+
+struct _ZifMd
+{
+	GObject			 parent;
+	ZifMdPrivate	*priv;
+};
+
+struct _ZifMdClass
+{
+	GObjectClass				 parent_class;
+	/* vtable */
+	gboolean	 (*load)		(ZifMd			*md,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	gboolean	 (*unload)		(ZifMd			*md,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*search_file)		(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*search_name)		(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*search_details)	(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*search_group)	(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*search_pkgid)	(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*what_provides)	(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*resolve)		(ZifMd			*md,
+						 const gchar		*search,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*get_packages)	(ZifMd			*md,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+	GPtrArray	*(*find_package)	(ZifMd			*md,
+						 const gchar		*package_id,
+						 GCancellable		*cancellable,
+						 ZifCompletion		*completion,
+						 GError			**error);
+};
+
+/* types of metadata */
+typedef enum {
+	ZIF_MD_TYPE_PRIMARY_XML,
+	ZIF_MD_TYPE_PRIMARY_SQL,
+	ZIF_MD_TYPE_FILELISTS_XML,
+	ZIF_MD_TYPE_FILELISTS_SQL,
+	ZIF_MD_TYPE_OTHER_XML,
+	ZIF_MD_TYPE_OTHER_SQL,
+	ZIF_MD_TYPE_COMPS,
+	ZIF_MD_TYPE_COMPS_GZ,
+	ZIF_MD_TYPE_METALINK,
+	ZIF_MD_TYPE_MIRRORLIST,
+	ZIF_MD_TYPE_PRESTODELTA,
+	ZIF_MD_TYPE_UPDATEINFO,
+	ZIF_MD_TYPE_UNKNOWN
+} ZifMdType;
+
+typedef enum {
+	ZIF_MD_ERROR_FAILED,
+	ZIF_MD_ERROR_NO_SUPPORT,
+	ZIF_MD_ERROR_FAILED_TO_LOAD,
+	ZIF_MD_ERROR_FAILED_AS_OFFLINE,
+	ZIF_MD_ERROR_FAILED_DOWNLOAD,
+	ZIF_MD_ERROR_BAD_SQL,
+	ZIF_MD_ERROR_LAST
+} ZifMdError;
+
+GType		 zif_md_get_type			(void);
+GQuark		 zif_md_error_quark			(void);
+ZifMd		*zif_md_new				(void);
+
+/* setters */
+gboolean	 zif_md_set_mdtype			(ZifMd		*md,
+							 ZifMdType	 type);
+gboolean	 zif_md_set_store_remote		(ZifMd		*md,
+							 ZifStoreRemote	*remote);
+gboolean	 zif_md_set_id				(ZifMd		*md,
+							 const gchar	*id);
+gboolean	 zif_md_set_filename			(ZifMd		*md,
+							 const gchar	*filename);
+gboolean	 zif_md_set_timestamp			(ZifMd		*md,
+							 guint		 timestamp);
+gboolean	 zif_md_set_location			(ZifMd		*md,
+							 const gchar	*location);
+gboolean	 zif_md_set_checksum			(ZifMd		*md,
+							 const gchar	*checksum);
+gboolean	 zif_md_set_checksum_uncompressed	(ZifMd		*md,
+							 const gchar	*checksum_uncompressed);
+gboolean	 zif_md_set_checksum_type		(ZifMd		*md,
+							 GChecksumType	 checksum_type);
+const gchar	*zif_md_type_to_text			(ZifMdType	 type);
+
+/* getters */
+const gchar	*zif_md_get_id				(ZifMd		*md);
+ZifMdType	 zif_md_get_mdtype			(ZifMd		*md);
+const gchar	*zif_md_get_filename			(ZifMd		*md);
+const gchar	*zif_md_get_filename_uncompressed	(ZifMd		*md);
+guint		 zif_md_get_age				(ZifMd		*md,
+							 GError		**error);
+const gchar	*zif_md_get_location			(ZifMd		*md);
+
+/* actions */
+gboolean	 zif_md_load				(ZifMd		*md,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+gboolean	 zif_md_unload				(ZifMd		*md,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+gboolean	 zif_md_clean				(ZifMd		*md,
+							 GError		**error);
+gboolean	 zif_md_file_check			(ZifMd		*md,
+							 gboolean	 use_uncompressed,
+							 GError		**error);
+GPtrArray	*zif_md_search_file			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_search_name			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_search_details			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_search_group			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_search_pkgid			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_what_provides			(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_resolve				(ZifMd		*md,
+							 const gchar	*search,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_get_packages			(ZifMd		*md,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+GPtrArray	*zif_md_find_package			(ZifMd		*md,
+							 const gchar	*package_id,
+							 GCancellable	*cancellable,
+							 ZifCompletion	*completion,
+							 GError		**error);
+
+G_END_DECLS
+
+#endif /* __ZIF_MD_H */
+
diff --git a/backends/yum/libzif/zif-update-info.c b/backends/yum/libzif/zif-update-info.c
new file mode 100644
index 0000000..d780cc8
--- /dev/null
+++ b/backends/yum/libzif/zif-update-info.c
@@ -0,0 +1,345 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-update-info
+ * @short_description: Generic object to represent some information about an update.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "egg-debug.h"
+
+#include "zif-update-info.h"
+
+#define ZIF_UPDATE_INFO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_UPDATE_INFO, ZifUpdateInfoPrivate))
+
+struct _ZifUpdateInfoPrivate
+{
+	ZifUpdateInfoKind	 kind;
+	gchar			*url;
+	gchar			*title;
+};
+
+enum {
+	PROP_0,
+	PROP_KIND,
+	PROP_URL,
+	PROP_TITLE,
+	PROP_LAST
+};
+
+G_DEFINE_TYPE (ZifUpdateInfo, zif_update_info, G_TYPE_OBJECT)
+
+/**
+ * zif_update_info_get_kind:
+ * @update_info: the #ZifUpdateInfo object
+ *
+ * Gets the update info kind.
+ *
+ * Return value: the kind of update info, e.g. %ZIF_UPDATE_INFO_KIND_CVE.
+ *
+ * Since: 0.0.1
+ **/
+ZifUpdateInfoKind
+zif_update_info_get_kind (ZifUpdateInfo *update_info)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE_INFO (update_info), ZIF_UPDATE_INFO_KIND_LAST);
+	return update_info->priv->kind;
+}
+
+/**
+ * zif_update_info_get_url:
+ * @update_info: the #ZifUpdateInfo object
+ *
+ * Gets the URL for this update.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_info_get_url (ZifUpdateInfo *update_info)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE_INFO (update_info), NULL);
+	return update_info->priv->url;
+}
+
+/**
+ * zif_update_info_get_title:
+ * @update_info: the #ZifUpdateInfo object
+ *
+ * Gets the title for this update.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_info_get_title (ZifUpdateInfo *update_info)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE_INFO (update_info), NULL);
+	return update_info->priv->title;
+}
+
+/**
+ * zif_update_info_set_kind:
+ * @update_info: the #ZifUpdateInfo object
+ * @kind: the kind of update info, e.g. %ZIF_UPDATE_INFO_KIND_BUGZILLA
+ *
+ * Sets the update_info kind status.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_info_set_kind (ZifUpdateInfo *update_info, ZifUpdateInfoKind kind)
+{
+	g_return_if_fail (ZIF_IS_UPDATE_INFO (update_info));
+	update_info->priv->kind = kind;
+}
+
+/**
+ * zif_update_info_set_url:
+ * @update_info: the #ZifUpdateInfo object
+ * @url: the update info URL
+ *
+ * Sets the update info URL.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_info_set_url (ZifUpdateInfo *update_info, const gchar *url)
+{
+	g_return_if_fail (ZIF_IS_UPDATE_INFO (update_info));
+	g_return_if_fail (url != NULL);
+	g_return_if_fail (update_info->priv->url == NULL);
+
+	update_info->priv->url = g_strdup (url);
+}
+
+/**
+ * zif_update_info_set_title:
+ * @update_info: the #ZifUpdateInfo object
+ * @title: the update info title
+ *
+ * Sets the update info title.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_info_set_title (ZifUpdateInfo *update_info, const gchar *title)
+{
+	g_return_if_fail (ZIF_IS_UPDATE_INFO (update_info));
+	g_return_if_fail (title != NULL);
+	g_return_if_fail (update_info->priv->title == NULL);
+
+	update_info->priv->title = g_strdup (title);
+}
+
+/**
+ * zif_update_info_kind_to_string:
+ * @type: the #ZifUpdateInfoKind enumerated value
+ *
+ * Gets the string representation of a #ZifUpdateInfoKind
+ *
+ * Return value: The #ZifUpdateInfoKind represented as a string
+ **/
+const gchar *
+zif_update_info_kind_to_string (ZifUpdateInfoKind kind)
+{
+	if (kind == ZIF_UPDATE_INFO_KIND_CVE)
+		return "cve";
+	if (kind == ZIF_UPDATE_INFO_KIND_BUGZILLA)
+		return "bugzilla";
+	return "unknown";
+}
+
+/**
+ * zif_update_info_kind_from_string:
+ * @type: the #ZifUpdateInfoKind enumerated value
+ *
+ * Gets the string representation of a #ZifUpdateInfoKind
+ *
+ * Return value: The #ZifUpdateInfoKind represented as a string
+ **/
+ZifUpdateInfoKind
+zif_update_info_kind_from_string (const gchar *type)
+{
+	if (g_strcmp0 (type, "cve") == 0)
+		return ZIF_UPDATE_INFO_KIND_CVE;
+	if (g_strcmp0 (type, "bz") == 0)
+		return ZIF_UPDATE_INFO_KIND_BUGZILLA;
+	return ZIF_UPDATE_INFO_KIND_LAST;
+}
+
+/**
+ * zif_update_info_get_property:
+ **/
+static void
+zif_update_info_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	ZifUpdateInfo *update_info = ZIF_UPDATE_INFO (object);
+	ZifUpdateInfoPrivate *priv = update_info->priv;
+
+	switch (prop_id) {
+	case PROP_KIND:
+		g_value_set_uint (value, priv->kind);
+		break;
+	case PROP_URL:
+		g_value_set_string (value, priv->url);
+		break;
+	case PROP_TITLE:
+		g_value_set_string (value, priv->title);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
+ * zif_update_info_set_property:
+ **/
+static void
+zif_update_info_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+}
+
+/**
+ * zif_update_info_finalize:
+ **/
+static void
+zif_update_info_finalize (GObject *object)
+{
+	ZifUpdateInfo *update_info;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_UPDATE_INFO (object));
+	update_info = ZIF_UPDATE_INFO (object);
+
+	g_free (update_info->priv->url);
+	g_free (update_info->priv->title);
+
+	G_OBJECT_CLASS (zif_update_info_parent_class)->finalize (object);
+}
+
+/**
+ * zif_update_info_class_init:
+ **/
+static void
+zif_update_info_class_init (ZifUpdateInfoClass *klass)
+{
+	GParamSpec *pspec;
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = zif_update_info_finalize;
+	object_class->get_property = zif_update_info_get_property;
+	object_class->set_property = zif_update_info_set_property;
+
+	/**
+	 * ZifUpdateInfo:kind:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_uint ("kind", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_KIND, pspec);
+
+	/**
+	 * ZifUpdateInfo:url:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("url", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_URL, pspec);
+
+	/**
+	 * ZifUpdateInfo:title:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("title", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_TITLE, pspec);
+	g_type_class_add_private (klass, sizeof (ZifUpdateInfoPrivate));
+}
+
+/**
+ * zif_update_info_init:
+ **/
+static void
+zif_update_info_init (ZifUpdateInfo *update_info)
+{
+	update_info->priv = ZIF_UPDATE_INFO_GET_PRIVATE (update_info);
+	update_info->priv->kind = ZIF_UPDATE_INFO_KIND_LAST;
+	update_info->priv->url = NULL;
+	update_info->priv->title = NULL;
+}
+
+/**
+ * zif_update_info_new:
+ *
+ * Return value: A new #ZifUpdateInfo class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifUpdateInfo *
+zif_update_info_new (void)
+{
+	ZifUpdateInfo *update_info;
+	update_info = g_object_new (ZIF_TYPE_UPDATE_INFO, NULL);
+	return ZIF_UPDATE_INFO (update_info);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_update_info_test (EggTest *test)
+{
+	ZifUpdateInfo *update_info;
+
+	if (!egg_test_start (test, "ZifUpdateInfo"))
+		return;
+
+	/************************************************************/
+	egg_test_title (test, "get update_info");
+	update_info = zif_update_info_new ();
+	egg_test_assert (test, update_info != NULL);
+
+	g_object_unref (update_info);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-update-info.h b/backends/yum/libzif/zif-update-info.h
new file mode 100644
index 0000000..ced7585
--- /dev/null
+++ b/backends/yum/libzif/zif-update-info.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_UPDATE_INFO_H
+#define __ZIF_UPDATE_INFO_H
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_UPDATE_INFO		(zif_update_info_get_type ())
+#define ZIF_UPDATE_INFO(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_UPDATE_INFO, ZifUpdateInfo))
+#define ZIF_UPDATE_INFO_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_UPDATE_INFO, ZifUpdateInfoClass))
+#define ZIF_IS_UPDATE_INFO(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_UPDATE_INFO))
+#define ZIF_IS_UPDATE_INFO_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_UPDATE_INFO))
+#define ZIF_UPDATE_INFO_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_UPDATE_INFO, ZifUpdateInfoClass))
+#define ZIF_UPDATE_INFO_ERROR		(zif_update_info_error_quark ())
+
+typedef struct _ZifUpdateInfo		ZifUpdateInfo;
+typedef struct _ZifUpdateInfoPrivate	ZifUpdateInfoPrivate;
+typedef struct _ZifUpdateInfoClass	ZifUpdateInfoClass;
+
+typedef enum {
+	ZIF_UPDATE_INFO_KIND_CVE,
+	ZIF_UPDATE_INFO_KIND_BUGZILLA,
+	ZIF_UPDATE_INFO_KIND_LAST
+} ZifUpdateInfoKind;
+
+struct _ZifUpdateInfo
+{
+	GObject			 parent;
+	ZifUpdateInfoPrivate	*priv;
+};
+
+struct _ZifUpdateInfoClass
+{
+	GObjectClass	parent_class;
+};
+
+GType			 zif_update_info_get_type		(void);
+ZifUpdateInfo		*zif_update_info_new		(void);
+
+/* public getters */
+ZifUpdateInfoKind	 zif_update_info_get_kind	(ZifUpdateInfo		*update_info);
+const gchar		*zif_update_info_get_url	(ZifUpdateInfo		*update_info);
+const gchar		*zif_update_info_get_title	(ZifUpdateInfo		*update_info);
+
+/* internal setters: TODO, in seporate -internal header file */
+void			 zif_update_info_set_kind	(ZifUpdateInfo		*update_info,
+							 ZifUpdateInfoKind	 kind);
+void			 zif_update_info_set_url	(ZifUpdateInfo		*update_info,
+							 const gchar		*url);
+void			 zif_update_info_set_title	(ZifUpdateInfo		*update_info,
+							 const gchar		*title);
+
+/* utility functions */
+const gchar		*zif_update_info_kind_to_string	(ZifUpdateInfoKind	 type);
+ZifUpdateInfoKind	 zif_update_info_kind_from_string	(const gchar	*type);
+
+G_END_DECLS
+
+#endif /* __ZIF_UPDATE_INFO_H */
+
diff --git a/backends/yum/libzif/zif-update.c b/backends/yum/libzif/zif-update.c
new file mode 100644
index 0000000..3ba9dcf
--- /dev/null
+++ b/backends/yum/libzif/zif-update.c
@@ -0,0 +1,539 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:zif-update
+ * @short_description: Generic object to represent some information about an update.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "egg-debug.h"
+
+#include "zif-update.h"
+
+#define ZIF_UPDATE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ZIF_TYPE_UPDATE, ZifUpdatePrivate))
+
+struct _ZifUpdatePrivate
+{
+	PkUpdateStateEnum	 state;
+	PkInfoEnum		 kind;
+	gchar			*id;
+	gchar			*title;
+	gchar			*description;
+	gchar			*issued;
+	GPtrArray		*update_infos;
+	GPtrArray		*packages;
+};
+
+enum {
+	PROP_0,
+	PROP_STATE,
+	PROP_KIND,
+	PROP_ID,
+	PROP_TITLE,
+	PROP_DESCRIPTION,
+	PROP_ISSUED,
+	PROP_LAST
+};
+
+G_DEFINE_TYPE (ZifUpdate, zif_update, G_TYPE_OBJECT)
+
+/**
+ * zif_update_get_state:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the update state.
+ *
+ * Return value: the state of update, e.g. %PK_UPDATE_STATE_ENUM_STABLE.
+ *
+ * Since: 0.0.1
+ **/
+PkUpdateStateEnum
+zif_update_get_state (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), PK_UPDATE_STATE_ENUM_LAST);
+	return update->priv->state;
+}
+
+/**
+ * zif_update_get_kind:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the update kind.
+ *
+ * Return value: the state of update, e.g. %PK_INFO_ENUM_SECURITY.
+ *
+ * Since: 0.0.1
+ **/
+PkInfoEnum
+zif_update_get_kind (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), PK_INFO_ENUM_LAST);
+	return update->priv->state;
+}
+
+/**
+ * zif_update_get_id:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the ID for this update.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_get_id (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->id;
+}
+
+/**
+ * zif_update_get_title:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the title for this update.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_get_title (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->title;
+}
+
+/**
+ * zif_update_get_description:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the description for this update.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_get_description (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->description;
+}
+
+/**
+ * zif_update_get_issued:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the time this update was issued.
+ *
+ * Return value: A string value, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+const gchar *
+zif_update_get_issued (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->issued;
+}
+
+/**
+ * zif_update_get_update_infos:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the update info for this update.
+ *
+ * Return value: A #GPtrArray of #ZifUpdateInfo, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_update_get_update_infos (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->update_infos;
+}
+
+/**
+ * zif_update_get_packages:
+ * @update: the #ZifUpdate object
+ *
+ * Gets the packages for this update.
+ *
+ * Return value: A #GPtrArray of #ZifPackage, or %NULL.
+ *
+ * Since: 0.0.1
+ **/
+GPtrArray *
+zif_update_get_packages (ZifUpdate *update)
+{
+	g_return_val_if_fail (ZIF_IS_UPDATE (update), NULL);
+	return update->priv->packages;
+}
+
+/**
+ * zif_update_set_state:
+ * @update: the #ZifUpdate object
+ * @state: If the update is state
+ *
+ * Sets the update state status.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_state (ZifUpdate *update, PkUpdateStateEnum state)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	update->priv->state = state;
+}
+
+/**
+ * zif_update_set_kind:
+ * @update: the #ZifUpdate object
+ * @kind: If the update kind, e.g. %PK_INFO_ENUM_SECURITY.
+ *
+ * Sets the kind of update.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_kind (ZifUpdate *update, PkInfoEnum kind)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	update->priv->kind = kind;
+}
+
+/**
+ * zif_update_set_id:
+ * @update: the #ZifUpdate object
+ * @id: the update ID
+ *
+ * Sets the update ID.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_id (ZifUpdate *update, const gchar *id)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (update->priv->id == NULL);
+
+	update->priv->id = g_strdup (id);
+}
+
+/**
+ * zif_update_set_title:
+ * @update: the #ZifUpdate object
+ * @title: the update title
+ *
+ * Sets the update title.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_title (ZifUpdate *update, const gchar *title)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (title != NULL);
+	g_return_if_fail (update->priv->title == NULL);
+
+	update->priv->title = g_strdup (title);
+}
+
+/**
+ * zif_update_set_description:
+ * @update: the #ZifUpdate object
+ * @description: the update description
+ *
+ * Sets the update description.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_description (ZifUpdate *update, const gchar *description)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (description != NULL);
+	g_return_if_fail (update->priv->description == NULL);
+
+	update->priv->description = g_strdup (description);
+}
+
+/**
+ * zif_update_set_issued:
+ * @update: the #ZifUpdate object
+ * @issued: the update issued time
+ *
+ * Sets the time the update was issued.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_set_issued (ZifUpdate *update, const gchar *issued)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (issued != NULL);
+	g_return_if_fail (update->priv->issued == NULL);
+
+	update->priv->issued = g_strdup (issued);
+}
+
+/**
+ * zif_update_add_update_info:
+ * @update: the #ZifUpdate object
+ * @update_info: the #ZifUpdateInfo
+ *
+ * Adds some update info to the update.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_add_update_info (ZifUpdate *update, ZifUpdateInfo *update_info)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (update_info != NULL);
+	g_ptr_array_add (update->priv->update_infos, g_object_ref (update_info));
+}
+
+/**
+ * zif_update_add_package:
+ * @update: the #ZifUpdate object
+ * @package: the #ZifPackage
+ *
+ * Adds some update info to the update.
+ *
+ * Since: 0.0.1
+ **/
+void
+zif_update_add_package (ZifUpdate *update, ZifPackage *package)
+{
+	g_return_if_fail (ZIF_IS_UPDATE (update));
+	g_return_if_fail (package != NULL);
+	g_ptr_array_add (update->priv->packages, g_object_ref (package));
+}
+
+/**
+ * zif_update_get_property:
+ **/
+static void
+zif_update_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	ZifUpdate *update = ZIF_UPDATE (object);
+	ZifUpdatePrivate *priv = update->priv;
+
+	switch (prop_id) {
+	case PROP_STATE:
+		g_value_set_uint (value, priv->state);
+		break;
+	case PROP_KIND:
+		g_value_set_uint (value, priv->kind);
+		break;
+	case PROP_ID:
+		g_value_set_string (value, priv->id);
+		break;
+	case PROP_TITLE:
+		g_value_set_string (value, priv->title);
+		break;
+	case PROP_DESCRIPTION:
+		g_value_set_string (value, priv->description);
+		break;
+	case PROP_ISSUED:
+		g_value_set_string (value, priv->issued);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
+ * zif_update_set_property:
+ **/
+static void
+zif_update_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+}
+
+/**
+ * zif_update_finalize:
+ **/
+static void
+zif_update_finalize (GObject *object)
+{
+	ZifUpdate *update;
+
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (ZIF_IS_UPDATE (object));
+	update = ZIF_UPDATE (object);
+
+	g_free (update->priv->id);
+	g_free (update->priv->title);
+	g_free (update->priv->description);
+	g_free (update->priv->issued);
+	g_ptr_array_unref (update->priv->update_infos);
+	g_ptr_array_unref (update->priv->packages);
+
+	G_OBJECT_CLASS (zif_update_parent_class)->finalize (object);
+}
+
+/**
+ * zif_update_class_init:
+ **/
+static void
+zif_update_class_init (ZifUpdateClass *klass)
+{
+	GParamSpec *pspec;
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = zif_update_finalize;
+	object_class->get_property = zif_update_get_property;
+	object_class->set_property = zif_update_set_property;
+
+	/**
+	 * ZifUpdate:state:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_uint ("state", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_STATE, pspec);
+
+	/**
+	 * ZifUpdate:kind:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_uint ("kind", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_KIND, pspec);
+
+	/**
+	 * ZifUpdate:id:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("id", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_ID, pspec);
+
+	/**
+	 * ZifUpdate:title:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("title", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_TITLE, pspec);
+
+	/**
+	 * ZifUpdate:description:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("description", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_DESCRIPTION, pspec);
+
+	/**
+	 * ZifUpdate:issued:
+	 *
+	 * Since: 0.0.1
+	 */
+	pspec = g_param_spec_string ("issued", NULL, NULL,
+				     NULL,
+				     G_PARAM_READABLE);
+	g_object_class_install_property (object_class, PROP_ISSUED, pspec);
+
+	g_type_class_add_private (klass, sizeof (ZifUpdatePrivate));
+}
+
+/**
+ * zif_update_init:
+ **/
+static void
+zif_update_init (ZifUpdate *update)
+{
+	update->priv = ZIF_UPDATE_GET_PRIVATE (update);
+	update->priv->state = PK_UPDATE_STATE_ENUM_LAST;
+	update->priv->kind = PK_INFO_ENUM_LAST;
+	update->priv->id = NULL;
+	update->priv->title = NULL;
+	update->priv->description = NULL;
+	update->priv->issued = NULL;
+	update->priv->update_infos = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+	update->priv->packages = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+}
+
+/**
+ * zif_update_new:
+ *
+ * Return value: A new #ZifUpdate class instance.
+ *
+ * Since: 0.0.1
+ **/
+ZifUpdate *
+zif_update_new (void)
+{
+	ZifUpdate *update;
+	update = g_object_new (ZIF_TYPE_UPDATE, NULL);
+	return ZIF_UPDATE (update);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef EGG_TEST
+#include "egg-test.h"
+
+void
+zif_update_test (EggTest *test)
+{
+	ZifUpdate *update;
+
+	if (!egg_test_start (test, "ZifUpdate"))
+		return;
+
+	/************************************************************/
+	egg_test_title (test, "get update");
+	update = zif_update_new ();
+	egg_test_assert (test, update != NULL);
+
+	g_object_unref (update);
+
+	egg_test_end (test);
+}
+#endif
+
diff --git a/backends/yum/libzif/zif-update.h b/backends/yum/libzif/zif-update.h
new file mode 100644
index 0000000..881b0d8
--- /dev/null
+++ b/backends/yum/libzif/zif-update.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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.
+ */
+
+#if !defined (__ZIF_H_INSIDE__) && !defined (ZIF_COMPILATION)
+#error "Only <zif.h> can be included directly."
+#endif
+
+#ifndef __ZIF_UPDATE_H
+#define __ZIF_UPDATE_H
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <packagekit-glib2/packagekit.h>
+
+#include "zif-update-info.h"
+
+G_BEGIN_DECLS
+
+#define ZIF_TYPE_UPDATE		(zif_update_get_type ())
+#define ZIF_UPDATE(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), ZIF_TYPE_UPDATE, ZifUpdate))
+#define ZIF_UPDATE_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), ZIF_TYPE_UPDATE, ZifUpdateClass))
+#define ZIF_IS_UPDATE(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), ZIF_TYPE_UPDATE))
+#define ZIF_IS_UPDATE_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), ZIF_TYPE_UPDATE))
+#define ZIF_UPDATE_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), ZIF_TYPE_UPDATE, ZifUpdateClass))
+#define ZIF_UPDATE_ERROR	(zif_update_error_quark ())
+
+typedef struct _ZifUpdate	 ZifUpdate;
+typedef struct _ZifUpdatePrivate ZifUpdatePrivate;
+typedef struct _ZifUpdateClass	 ZifUpdateClass;
+
+#include "zif-package.h"
+
+struct _ZifUpdate
+{
+	GObject			 parent;
+	ZifUpdatePrivate	*priv;
+};
+
+struct _ZifUpdateClass
+{
+	GObjectClass		 parent_class;
+};
+
+GType			 zif_update_get_type		(void);
+ZifUpdate		*zif_update_new			(void);
+
+/* public getters */
+PkUpdateStateEnum	 zif_update_get_state		(ZifUpdate		*update);
+PkInfoEnum		 zif_update_get_kind		(ZifUpdate		*update);
+const gchar		*zif_update_get_id		(ZifUpdate		*update);
+const gchar		*zif_update_get_title		(ZifUpdate		*update);
+const gchar		*zif_update_get_description	(ZifUpdate		*update);
+const gchar		*zif_update_get_issued		(ZifUpdate		*update);
+GPtrArray		*zif_update_get_update_infos	(ZifUpdate		*update);
+GPtrArray		*zif_update_get_packages	(ZifUpdate		*update);
+
+/* internal setters: TODO, in seporate -internal header file */
+void			 zif_update_set_state		(ZifUpdate		*update,
+							 PkUpdateStateEnum	 state);
+void			 zif_update_set_kind		(ZifUpdate		*update,
+							 PkInfoEnum		 type);
+void			 zif_update_set_id		(ZifUpdate		*update,
+							 const gchar		*id);
+void			 zif_update_set_title		(ZifUpdate		*update,
+							 const gchar		*title);
+void			 zif_update_set_description	(ZifUpdate		*update,
+							 const gchar		*description);
+void			 zif_update_set_issued		(ZifUpdate		*update,
+							 const gchar		*issued);
+void			 zif_update_add_update_info	(ZifUpdate		*update,
+							 ZifUpdateInfo		*update_info);
+void			 zif_update_add_package		(ZifUpdate		*update,
+							 ZifPackage		*package);
+
+G_END_DECLS
+
+#endif /* __ZIF_UPDATE_H */
+
commit 45bad680ec2ab1c274fe3709871919cc1be28f49
Author: kmilos <kmilos at fedoraproject.org>
Date:   Wed Apr 7 22:24:39 2010 +0000

    l10n: Updates to Serbian (sr) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/sr.po b/po/sr.po
index bc292ac..84b1876 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -11,8 +11,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-16 19:09+0000\n"
-"PO-Revision-Date: 2010-03-16 20:40+0100\n"
+"POT-Creation-Date: 2010-04-07 19:20+0000\n"
+"PO-Revision-Date: 2010-04-07 23:02-0000\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian <trans-sr at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -23,115 +23,115 @@ msgstr ""
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175 ../client/pk-console.c:597
+#: ../client/pk-console.c:176 ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Трансакција"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Системско време"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Успела"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Тачно"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Нетачно"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Радња"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Трајање"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(секунди)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Командна линија"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "Кориснички ИБ"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Корисничко име"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "Стварно име"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Обухваћени пакети:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Обухваћени пакети: ни један"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Дистрибуција"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Врста"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252 ../client/pk-console.c:291
+#: ../client/pk-console.c:253 ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Сажетак"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Категорија"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "Идентификатор"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Родитељ"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Назив"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Икона"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Више о надградњи:"
 
@@ -140,7 +140,7 @@ msgstr "Више о надградњи:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346 ../client/pk-console.c:616
+#: ../client/pk-console.c:347 ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -151,165 +151,165 @@ msgstr[1] "Пакета"
 msgstr[2] "Пакета"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Ажурира"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Превазилази"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357 ../lib/packagekit-glib2/pk-task-text.c:211
+#: ../client/pk-console.c:358 ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Издавач"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Поновно покретање"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Опис ажурирања"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Промене"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Стање"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Издато"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389 ../lib/packagekit-glib2/pk-console-shared.c:511
+#: ../client/pk-console.c:390 ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Датум ажурирања"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Укључена"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Искључена"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Поновно покретање система захтева пакет:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Неопходно је поновно покретање сесије:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Поновно покретање система (безбедносно) захтева:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Неопходно је поновно покретање сесије (безбедносно):"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Поновно покретање програма захтева пакет:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Опис пакета"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Порука:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Нема датотека"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Списак датотека"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Проценат"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Статус"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Резултати:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Кобна грешка"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "Трансакција није успела"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "Тренутно нема доступних ажурирања."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Тренутно нема доступних надградњи."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Неопходно је поновно покретање система ради завршетка ажурирања."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr "Неопходно је одјављивање и поновна пријава ради завршетка ажурирања."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
@@ -318,7 +318,7 @@ msgstr ""
 "инсталирана важна безбедносна ажурирања."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
@@ -327,29 +327,29 @@ msgstr ""
 "инсталирана важна безбедносна ажурирања."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid ""
-"Extected package name, actually got file. Try using 'pkcon install-local %s' "
+"Expected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
 "Очекивано је име пакета, уствари је добијена датотека. Покушајте да "
 "употребите „pkcon install-local %s“ наместо."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Ова алатка није могла пронаћи никакве доступне пакете: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Ова алатка није могла пронаћи инсталирани пакет: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915 ../client/pk-console.c:943
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Ова алатка није могла пронаћи пакет: %s"
@@ -358,180 +358,185 @@ msgstr "Ова алатка није могла пронаћи пакет: %s"
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971 ../client/pk-console.c:999
-#: ../client/pk-console.c:1027 ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972 ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028 ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Ова алатка није пронашла све пакете: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "Услужни програм се изненада прекинуо!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Текстуално сучеље програма ПакетКит"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Наредбе:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr "Датум последњег извршавања ове радње није пронађен"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263 ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Прикажи верзију програма и заврши рад"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Намести филтер, нпр. инсталирани"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Заврши рад без чекања да се послови заврше"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Инсталирај пакете без питања за потврду"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Изврши наредбу користећи неискоришћени мрежни опсег и такође трошећи мање "
 "енергије"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
 "Штампај излаз читљив машини на екрану, уместо употребе анимираних виџета"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Неуспешно контактирање ПакетКита."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "Прокси није могао да буде постављен"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "Наведени филтер није исправан"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Морате навести врсту претраге, нпр. по имену"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384 ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408 ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Морате навести термин за претрагу"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Неисправна врста претраге"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Неопходно је име пакета за инсталацију"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Неопходно је име датотеке за инсталацију"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Морате навести врсту, ИБ кључа и ИБ пакета (key_id и package_id)"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Морате навести назив пакета за уклањање"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr "Неопходни су одредишни директоријум и имена пакета за преузимање"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Директоријум није нађен"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Морете навести идентификатор лиценце (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Морате навести идентификатор трансакције (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Морате навести име пакета за разрешавање"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536 ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Морате навести име ризнице"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Морате навести име, параметар и вредност ризнице"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Морате навести радњу, нпр. „update-system“ (ажурирање система)"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Морате навести важећу радњу"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592 ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616 ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645 ../client/pk-generate-pack.c:316
+#: ../client/pk-console.c:1611 ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635 ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Морате навести име пакета"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Морате навести „provide“ низ (шта пакет пружа)"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Опција „%s“ није подржана"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Наредба није успела"
 
@@ -542,11 +547,10 @@ msgstr "Поставите име датотеке за међузависнос
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
+msgid "The output file or directory (the current directory is used if omitted)"
 msgstr ""
-"Директоријум за излазну датотеку (текући директоријум се користити ако није "
-"наведен)"
+"Излазна датотека или директоријум (користи се текући директоријум ако је "
+"изостављено)"
 
 #. TRANSLATORS: put a list of packages in the pack
 #: ../client/pk-generate-pack.c:261
@@ -573,9 +577,9 @@ msgstr "Обе опције изабране."
 msgid "A output directory or file name is required"
 msgstr "Морате навести име излазне датотеке или директоријума"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
+msgid "The daemon failed to startup"
 msgstr "Демон није успео да се покрене"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
@@ -646,12 +650,12 @@ msgstr "Сервисна група је направљена „%s“"
 msgid "Failed to create '%s': %s"
 msgstr "Неуспело прављење „%s“: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Неуспео покушај добављања стања демона"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "ПакетКит редар"
 
@@ -710,42 +714,42 @@ msgid "Installing..."
 msgstr "Инсталирам..."
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Преузимам детаље о изворима софтвера."
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr "Преузимам спискове датотека (ово може да потраје док се не заврши)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Чекање на закључавање управника пакета."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Учитавам списак пакета."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Датотека није пронађена"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Неуспешно покретање:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "Неуспешна инсталација пакета"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "ПакетКит наредба није нађена"
 
@@ -755,51 +759,51 @@ msgid "Command not found."
 msgstr "Наредба није нађена."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Слична наредба је:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Покрени сличну наредбу:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Сличне наредбе су:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Изаберите наредбу за покретање"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "Пакет који пружа ову датотеку је:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Да инсталирам пакет „%s“ који пружа наредбу „%s“?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Пакети који пружају ову датотеку су:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Прикладни пакети су:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Изаберите пакет за инсталацију"
 
@@ -1993,25 +1997,25 @@ msgid "Show debugging information for all files"
 msgstr "Прикажи информације о отклону грешака за све датотеке"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Отклон грешака ових изричитих модула"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Отклон грешака ових изричитих функција"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Запиши податке о отклону грешака у датотеку"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Опције за отклон грешака"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Прикажи опције за отклон грешака"
 
@@ -2118,9 +2122,6 @@ msgstr "Прикажи опције за отклон грешака"
 #~ msgid "Incorrect privileges for this operation"
 #~ msgstr "Неисправна овлашћења за ову операцију"
 
-#~ msgid "The package could not be found"
-#~ msgstr "Пакет није нађен"
-
 #~ msgid "You need to specify a search type, e.g. name"
 #~ msgstr "Морате навести врсту претраге, нпр. име"
 
commit c8971f45c7c3b90039d09f2ab47f2766ffa76dc9
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 13:14:20 2010 +0100

    trivial: Fix two warnings from clang, neither of them look like bugs

diff --git a/lib/packagekit-glib2/pk-task.c b/lib/packagekit-glib2/pk-task.c
index e6d4834..fd0709e 100644
--- a/lib/packagekit-glib2/pk-task.c
+++ b/lib/packagekit-glib2/pk-task.c
@@ -320,6 +320,7 @@ pk_task_simulate_ready_cb (GObject *source_object, GAsyncResult *res, PkTaskStat
 
 			/* remove all the original packages */
 			ret = FALSE;
+			length = g_strv_length (state->package_ids);
 			for (i=0; i<length; i++) {
 				if (g_strcmp0 (package_id, state->package_ids[i]) == 0) {
 					egg_debug ("removing %s", package_id);
diff --git a/src/pk-transaction-extra.c b/src/pk-transaction-extra.c
index d252c89..5f8f772 100644
--- a/src/pk-transaction-extra.c
+++ b/src/pk-transaction-extra.c
@@ -1039,6 +1039,8 @@ out:
  *  4) The list of pids are converted to a list of files
  *  5) The list of files is converted to a list of packages
  *  6) For each package, emit a RequireRestart of the correct type (according to the UID)
+ *
+ * Return value: success, so %TRUE means the library check completed okay
  **/
 gboolean
 pk_transaction_extra_check_library_restart_pre (PkTransactionExtra *extra, gchar **package_ids)
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index c78f2db..a0e9d33 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1534,6 +1534,10 @@ pk_transaction_pre_transaction_checks (PkTransaction *transaction, gchar **packa
 
 	/* find files in security updates */
 	ret = pk_transaction_extra_check_library_restart_pre (transaction->priv->transaction_extra, package_ids_security);
+	if (!ret) {
+		egg_debug ("could not check the library list");
+		goto out;
+	}
 out:
 	g_strfreev (package_ids_security);
 	return success;
commit d062c6b64d684a6c8ce9959c86b95e612a078f7d
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 13:13:55 2010 +0100

    Fix up an unintialized g_free() spotted by clang

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index bc182da..8fee5fd 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -674,7 +674,7 @@ pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
 	gchar *line;
 	gchar *uri;
 	gchar *eulas;
-	gchar *transaction_id;
+	gchar *transaction_id = NULL;
 	guint i;
 	GPtrArray *array;
 	gboolean ret;
commit 52e651a4cef05a01ca796e550cc529be5b322d01
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 10:36:36 2010 +0100

    trivial: Remove some prototypes without bodies which caused warnings with gobject-introspection

diff --git a/lib/packagekit-glib2/pk-package-sack.h b/lib/packagekit-glib2/pk-package-sack.h
index 0fbaa1f..a05665c 100644
--- a/lib/packagekit-glib2/pk-package-sack.h
+++ b/lib/packagekit-glib2/pk-package-sack.h
@@ -39,7 +39,6 @@ G_BEGIN_DECLS
 #define PK_IS_PACKAGE_SACK(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_PACKAGE_SACK))
 #define PK_IS_PACKAGE_SACK_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_PACKAGE_SACK))
 #define PK_PACKAGE_SACK_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_PACKAGE_SACK, PkPackageSackClass))
-#define PK_PACKAGE_SACK_ERROR		(pk_package_sack_error_quark ())
 #define PK_PACKAGE_SACK_TYPE_ERROR	(pk_package_sack_error_get_type ())
 
 typedef struct _PkPackageSackPrivate	PkPackageSackPrivate;
@@ -75,7 +74,6 @@ typedef enum {
 	PK_PACKAGE_SACK_SORT_TYPE_LAST
 } PkPackageSackSortType;
 
-GQuark		 pk_package_sack_error_quark		(void);
 GType		 pk_package_sack_get_type		(void);
 PkPackageSack	*pk_package_sack_new			(void);
 void		 pk_package_sack_test			(gpointer		 user_data);
diff --git a/lib/packagekit-glib2/pk-package.h b/lib/packagekit-glib2/pk-package.h
index ef82f1c..96a7a40 100644
--- a/lib/packagekit-glib2/pk-package.h
+++ b/lib/packagekit-glib2/pk-package.h
@@ -39,7 +39,6 @@ G_BEGIN_DECLS
 #define PK_IS_PACKAGE(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_PACKAGE))
 #define PK_IS_PACKAGE_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_PACKAGE))
 #define PK_PACKAGE_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_PACKAGE, PkPackageClass))
-#define PK_PACKAGE_ERROR	(pk_package_error_quark ())
 #define PK_PACKAGE_TYPE_ERROR	(pk_package_error_get_type ())
 
 typedef struct _PkPackagePrivate	PkPackagePrivate;
@@ -66,7 +65,6 @@ struct _PkPackageClass
 	void (*_pk_reserved5) (void);
 };
 
-GQuark		 pk_package_error_quark			(void);
 GType		 pk_package_get_type		  	(void);
 PkPackage	*pk_package_new				(void);
 void		 pk_package_test			(gpointer	 user_data);
diff --git a/lib/packagekit-glib2/pk-progress.h b/lib/packagekit-glib2/pk-progress.h
index 51aa698..3aada72 100644
--- a/lib/packagekit-glib2/pk-progress.h
+++ b/lib/packagekit-glib2/pk-progress.h
@@ -38,7 +38,6 @@ G_BEGIN_DECLS
 #define PK_IS_PROGRESS(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_PROGRESS))
 #define PK_IS_PROGRESS_CLASS(k)		(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_PROGRESS))
 #define PK_PROGRESS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_PROGRESS, PkProgressClass))
-#define PK_PROGRESS_ERROR		(pk_progress_error_quark ())
 #define PK_PROGRESS_TYPE_ERROR		(pk_progress_error_get_type ())
 
 typedef struct _PkProgressPrivate	PkProgressPrivate;
@@ -62,7 +61,6 @@ struct _PkProgressClass
 	void (*_pk_reserved5) (void);
 };
 
-GQuark		 pk_progress_error_quark		(void);
 GType		 pk_progress_get_type		  	(void);
 PkProgress	*pk_progress_new			(void);
 void		 pk_progress_test			(gpointer		 user_data);
diff --git a/lib/packagekit-glib2/pk-results.h b/lib/packagekit-glib2/pk-results.h
index 82f08dc..aa82e38 100644
--- a/lib/packagekit-glib2/pk-results.h
+++ b/lib/packagekit-glib2/pk-results.h
@@ -51,7 +51,6 @@ G_BEGIN_DECLS
 #define PK_IS_RESULTS(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_RESULTS))
 #define PK_IS_RESULTS_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_RESULTS))
 #define PK_RESULTS_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_RESULTS, PkResultsClass))
-#define PK_RESULTS_ERROR	(pk_results_error_quark ())
 #define PK_RESULTS_TYPE_ERROR	(pk_results_error_get_type ())
 
 typedef struct _PkResultsPrivate	PkResultsPrivate;
@@ -75,7 +74,6 @@ struct _PkResultsClass
 	void (*_pk_reserved5) (void);
 };
 
-GQuark		 pk_results_error_quark			(void);
 GType		 pk_results_get_type		  	(void);
 PkResults	*pk_results_new				(void);
 void		 pk_results_test			(gpointer		 user_data);
diff --git a/lib/packagekit-glib2/pk-task.h b/lib/packagekit-glib2/pk-task.h
index de62c66..f128941 100644
--- a/lib/packagekit-glib2/pk-task.h
+++ b/lib/packagekit-glib2/pk-task.h
@@ -41,7 +41,6 @@ G_BEGIN_DECLS
 #define PK_IS_TASK(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_TASK))
 #define PK_IS_TASK_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_TASK))
 #define PK_TASK_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_TASK, PkTaskClass))
-#define PK_TASK_ERROR		(pk_task_error_quark ())
 #define PK_TASK_TYPE_ERROR	(pk_task_error_get_type ())
 
 typedef struct _PkTaskPrivate	PkTaskPrivate;
@@ -80,7 +79,6 @@ struct _PkTaskClass
 	void (*_pk_reserved5)	(void);
 };
 
-GQuark		 pk_task_error_quark			(void);
 GType		 pk_task_get_type			(void);
 PkTask		*pk_task_new				(void);
 void		 pk_task_test				(gpointer		 user_data);
commit 84c92b6494bd91568567b75c35f91af2518e940d
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 10:34:37 2010 +0100

    glib: add some more simple C accessors for package data

diff --git a/lib/packagekit-glib2/pk-package.c b/lib/packagekit-glib2/pk-package.c
index cf90caa..8fe7dad 100644
--- a/lib/packagekit-glib2/pk-package.c
+++ b/lib/packagekit-glib2/pk-package.c
@@ -52,6 +52,7 @@ struct _PkPackagePrivate
 {
 	PkInfoEnum		 info;
 	gchar			*package_id;
+	gchar			**package_id_split;
 	gchar			*summary;
 	gchar			*license;
 	PkGroupEnum		 group;
@@ -190,6 +191,7 @@ pk_package_set_id (PkPackage *package, const gchar *package_id, GError **error)
 
 	/* save */
 	priv->package_id = g_strdup (package_id);
+	priv->package_id_split = g_strdupv (sections);
 out:
 	g_strfreev (sections);
 	return ret;
@@ -247,6 +249,76 @@ pk_package_get_summary (PkPackage *package)
 }
 
 /**
+ * pk_package_get_name:
+ * @package: a valid #PkPackage instance
+ *
+ * Gets the package name.
+ *
+ * Return value: the name, or %NULL if unset
+ *
+ * Since: 0.6.4
+ **/
+const gchar *
+pk_package_get_name (PkPackage *package)
+{
+	g_return_val_if_fail (PK_IS_PACKAGE (package), NULL);
+	return package->priv->package_id_split[PK_PACKAGE_ID_NAME];
+}
+
+/**
+ * pk_package_get_version:
+ * @package: a valid #PkPackage instance
+ *
+ * Gets the package version.
+ *
+ * Return value: the version, or %NULL if unset
+ *
+ * Since: 0.6.4
+ **/
+const gchar *
+pk_package_get_version (PkPackage *package)
+{
+	g_return_val_if_fail (PK_IS_PACKAGE (package), NULL);
+	return package->priv->package_id_split[PK_PACKAGE_ID_VERSION];
+}
+
+/**
+ * pk_package_get_arch:
+ * @package: a valid #PkPackage instance
+ *
+ * Gets the package arch.
+ *
+ * Return value: the arch, or %NULL if unset
+ *
+ * Since: 0.6.4
+ **/
+const gchar *
+pk_package_get_arch (PkPackage *package)
+{
+	g_return_val_if_fail (PK_IS_PACKAGE (package), NULL);
+	return package->priv->package_id_split[PK_PACKAGE_ID_ARCH];
+}
+
+/**
+ * pk_package_get_data:
+ * @package: a valid #PkPackage instance
+ *
+ * Gets the package data, which is usually the repository ID that contains the
+ * package. Special ID's include "installed" for installed packages, and "local"
+ * for local packages that exist on disk but not in a repoitory.
+ *
+ * Return value: the data, or %NULL if unset
+ *
+ * Since: 0.6.4
+ **/
+const gchar *
+pk_package_get_data (PkPackage *package)
+{
+	g_return_val_if_fail (PK_IS_PACKAGE (package), NULL);
+	return package->priv->package_id_split[PK_PACKAGE_ID_DATA];
+}
+
+/**
  * pk_package_print:
  * @package: a valid #PkPackage instance
  *
@@ -257,17 +329,14 @@ pk_package_get_summary (PkPackage *package)
 void
 pk_package_print (PkPackage *package)
 {
-	gchar **parts;
+	PkPackagePrivate *priv = package->priv;
 	g_return_if_fail (PK_IS_PACKAGE (package));
-
-	parts = pk_package_id_split (package->priv->package_id);
 	g_print ("%s-%s.%s\t%s\t%s\n",
-		 parts[PK_PACKAGE_ID_NAME],
-		 parts[PK_PACKAGE_ID_VERSION],
-		 parts[PK_PACKAGE_ID_ARCH],
-		 parts[PK_PACKAGE_ID_DATA],
+		 priv->package_id_split[PK_PACKAGE_ID_NAME],
+		 priv->package_id_split[PK_PACKAGE_ID_VERSION],
+		 priv->package_id_split[PK_PACKAGE_ID_ARCH],
+		 priv->package_id_split[PK_PACKAGE_ID_DATA],
 		 package->priv->summary);
-	g_strfreev (parts);
 }
 
 /**
@@ -702,6 +771,7 @@ pk_package_finalize (GObject *object)
 	g_free (priv->update_changelog);
 	g_free (priv->update_issued);
 	g_free (priv->update_updated);
+	g_strfreev (priv->package_id_split);
 
 	G_OBJECT_CLASS (pk_package_parent_class)->finalize (object);
 }
diff --git a/lib/packagekit-glib2/pk-package.h b/lib/packagekit-glib2/pk-package.h
index e0cc3ec..ef82f1c 100644
--- a/lib/packagekit-glib2/pk-package.h
+++ b/lib/packagekit-glib2/pk-package.h
@@ -74,15 +74,21 @@ void		 pk_package_test			(gpointer	 user_data);
 gboolean	 pk_package_set_id			(PkPackage	*package,
 							 const gchar	*package_id,
 							 GError		**error);
-const gchar	*pk_package_get_id			(PkPackage	*package);
-PkInfoEnum	 pk_package_get_info			(PkPackage	*package);
-const gchar	*pk_package_get_summary			(PkPackage	*package);
 void		 pk_package_print			(PkPackage	*package);
 gboolean	 pk_package_equal			(PkPackage	*package1,
 							 PkPackage	*package2);
 gboolean	 pk_package_equal_id			(PkPackage	*package1,
 							 PkPackage	*package2);
 
+/* accessors */
+const gchar	*pk_package_get_id			(PkPackage	*package);
+PkInfoEnum	 pk_package_get_info			(PkPackage	*package);
+const gchar	*pk_package_get_summary			(PkPackage	*package);
+const gchar	*pk_package_get_name			(PkPackage	*package);
+const gchar	*pk_package_get_version			(PkPackage	*package);
+const gchar	*pk_package_get_arch			(PkPackage	*package);
+const gchar	*pk_package_get_data			(PkPackage	*package);
+
 G_END_DECLS
 
 #endif /* __PK_PACKAGE_H */
commit 6f293f11aa49c0421cdc5a3a4035f6714299bd4c
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 09:40:26 2010 +0100

    yum: catch exceptions.IOError whenever we do a low-level yum call. Fixes rh#577549

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 1aa7ce4..9ccbeff 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -321,6 +321,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 self.yumbase.doLock(YUM_PID_FILE)
                 PackageKitBaseBackend.doLock(self)
                 self.allow_cancel(False)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except yum.Errors.LockError, e:
                 self.allow_cancel(True)
                 self.status(STATUS_WAITING_FOR_LOCK)
@@ -350,6 +352,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             try:
                 self.yumbase.closeRpmDB()
                 self.yumbase.doUnlock(YUM_PID_FILE)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -394,6 +398,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                         available.append(pkg)
             except yum.Errors.RepoError, e:
                 raise PkError(ERROR_NO_CACHE, "failed to use search generator: %s" %_to_unicode(e))
+            except exceptions.IOError, e:
+                raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             else:
@@ -425,6 +431,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         self.status(STATUS_QUERY)
         try:
             self.yumbase.doConfigSetup(errorlevel=0, debuglevel=0)# Setup Yum Config
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         try:
@@ -443,6 +451,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             return
         try:
             self.yumbase.doConfigSetup(errorlevel=0, debuglevel=0)# Setup Yum Config
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         self.yumbase.conf.cache = 0 # Allow new files
@@ -461,6 +471,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         for package in name_list:
             try:
                 pkgs = self.yumbase.rpmdb.searchNevra(name=package)
+            except exceptions.IOError, e:
+                raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             else:
@@ -473,6 +485,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             pkgs = self.yumbase.pkgSack.searchNames(names=name_list)
         except yum.Errors.RepoError, e:
             raise PkError(ERROR_NO_CACHE, "failed to search names: %s" %_to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         return pkgs
@@ -490,7 +504,7 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         except yum.Errors.RepoError, e:
             raise PkError(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
         except exceptions.IOError, e:
-            raise PkError(ERROR_NO_SPACE_ON_DEVICE, _to_unicode(e))
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
@@ -499,6 +513,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             for pkg in pkgs:
                 try:
                     instpo = self.yumbase.rpmdb.searchNevra(name=pkg.name, epoch=pkg.epoch, ver=pkg.ver, rel=pkg.rel, arch=pkg.arch)
+                except exceptions.IOError, e:
+                    raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 if len(instpo) > 0:
@@ -544,6 +560,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             raise PkError(ERROR_NO_CACHE, "failed to get groups from comps: %s" %_to_unicode(e))
         except yum.Errors.GroupsError, e:
             raise PkError(ERROR_GROUP_NOT_FOUND, _to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
@@ -568,6 +586,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         self.allow_cancel(True)
         try:
             self.yumbase.doConfigSetup(errorlevel=0, debuglevel=0)# Setup Yum Config
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         self.yumbase.conf.cache = 0 # TODO: can we just look in the cache?
@@ -638,6 +658,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         self.allow_cancel(True)
         try:
             self.yumbase.doConfigSetup(errorlevel=0, debuglevel=0)# Setup Yum Config
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         self.yumbase.conf.cache = 0 # TODO: can we just look in the cache?
@@ -648,6 +670,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # Now show installed packages.
         try:
             pkgs = self.yumbase.rpmdb
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         pkgfilter.add_installed(pkgs)
@@ -659,6 +683,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             except yum.Errors.RepoError, e:
                 self.error(ERROR_NO_CACHE, "failed to get package sack: %s" %_to_unicode(e), exit=False)
                 return
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             else:
@@ -690,6 +716,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             for value in values:
                 try:
                     pkgs = self.yumbase.rpmdb.searchFiles(value)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 pkgfilter.add_installed(pkgs)
@@ -703,6 +731,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 except yum.Errors.RepoError, e:
                     self.error(ERROR_NO_CACHE, "failed to search sack: %s" %_to_unicode(e), exit=False)
                     return
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 else:
@@ -781,6 +811,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                         except yum.Errors.RepoError, e:
                             self.error(ERROR_NO_CACHE, "failed to get provides for sack: %s" %_to_unicode(e), exit=False)
                             return
+                        except exceptions.IOError, e:
+                            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                         except Exception, e:
                             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                         else:
@@ -801,6 +833,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             cats = self.yumbase.comps.categories
         except yum.Errors.RepoError, e:
             self.error(ERROR_NO_CACHE, "failed to get comps list: %s" %_to_unicode(e), exit=False)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
@@ -837,6 +871,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             for grp_id in self.comps.get_groups(cat):
                 try:
                     grp = self.yumbase.comps.return_group(grp_id)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 if grp:
@@ -890,6 +926,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             except yum.Errors.RepoError, e:
                 self.error(ERROR_NO_CACHE, "failed to search package sack: %s" %_to_unicode(e), exit=False)
                 return
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -903,6 +941,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 self._show_package(pkg_download, INFO_DOWNLOADING)
                 try:
                     repo = self.yumbase.repos.getRepo(pkg_download.repoid)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 remote = pkg_download.returnSimple('relativepath')
@@ -941,12 +981,16 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             if repo == 'meta':
                 try:
                     grp = self.yumbase.comps.return_group(name)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 isGroup = True
             elif name[0] == '@':
                 try:
                     grp = self.yumbase.comps.return_group(name[1:])
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 isGroup = True
@@ -975,6 +1019,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             # search the rpmdb for the nevra
             try:
                 pkgs = self.yumbase.rpmdb.searchNevra(name=n, epoch=e, ver=v, rel=r, arch=a)
+            except exceptions.IOError, e:
+                raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             # if the package is found, then return it (do not have to match the repo_id)
@@ -985,6 +1031,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # searches all repos and takes 66ms
         try:
             repos = self.yumbase.repos.findRepos(repo)
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         if len(repos) == 0:
@@ -997,6 +1045,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # populate the sack with data
         try:
             self.yumbase.repos.populateSack(repo)
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -1005,6 +1055,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             pkgs = repos[0].sack.searchNevra(name=n, epoch=e, ver=v, rel=r, arch=a)
         except yum.Errors.RepoError, e:
             raise PkError(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -1047,6 +1099,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 else:
                     try:
                         txmbrs = self.yumbase.groupRemove(grp.groupid)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                     for txmbr in self.yumbase.tsInfo:
@@ -1065,6 +1119,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     resolve_list.append(pkg)
                     try:
                         txmbrs = self.yumbase.remove(po=pkg)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             percentage += bump
@@ -1075,6 +1131,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 rc, msgs =  self.yumbase.buildTransaction()
             except yum.Errors.RepoError, e:
                 self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             if rc != 2:
@@ -1099,6 +1157,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # search only for requested arch
         try:
             ret = self.yumbase.rpmdb.installed(po=pkg)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         return ret
@@ -1122,6 +1182,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
 
         try:
             exactarchlist = self.yumbase.conf.exactarchlist
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         # we look through each returned possibility and rule out the
@@ -1133,6 +1195,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # everything installed that matches the name
         try:
             installedByKey = self.yumbase.rpmdb.searchNevra(name=pkg.name, arch=pkg.arch)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         comparable = []
@@ -1164,6 +1228,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     if ematch:
                         try:
                             ret = self.yumbase.allowedMultipleInstalls(pkg)
+                        except exceptions.IOError, e:
+                            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                         except Exception, e:
                             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                         if ret:
@@ -1185,6 +1251,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             n, a, e, v, r = pkgi.pkgtup
             try:
                 pkgs = self.yumbase.rpmdb.searchNevra(name=n, epoch=e, ver=v, arch=a)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             for pkg in pkgs:
@@ -1215,6 +1283,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         # get the dep list
         try:
             results = self.yumbase.findDeps(pkgs)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         require_list = []
@@ -1254,11 +1324,15 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         if not grp.installed:
             try:
                 txmbrs = self.yumbase.selectGroup(grp.groupid)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
             try:
                 txmbrs = self.yumbase.groupRemove(grp.groupid)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         pkgs = []
@@ -1267,11 +1341,15 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         if not grp.installed:
             try:
                 self.yumbase.deselectGroup(grp.groupid)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
             try:
                 self.yumbase.groupUnremove(grp.groupid)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         return pkgs
@@ -1296,6 +1374,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 else:
                     try:
                         txmbrs = self.yumbase.selectGroup(grp.groupid)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                     for txmbr in self.yumbase.tsInfo:
@@ -1303,6 +1383,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     # unselect what we previously selected
                     try:
                         self.yumbase.deselectGroup(grp.groupid)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             else:
@@ -1318,6 +1400,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                         txmbrs = self.yumbase.install(po=pkg)
                     except yum.Errors.RepoError, e:
                         self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             percentage += bump
@@ -1327,6 +1411,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 rc, msgs =  self.yumbase.buildTransaction()
             except yum.Errors.RepoError, e:
                 self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             if rc != 2:
@@ -1445,6 +1531,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             signed = repo.gpgcheck
         except yum.Errors.RepoError, e:
             raise PkError(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         return signed
@@ -1475,6 +1563,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             txmbr = self.yumbase.update() # Add all updates to Transaction
         except yum.Errors.RepoError, e:
             self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e), exit=False)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
@@ -1549,6 +1639,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 self.yumbase.doGroupSetup()
             except yum.Errors.GroupsError, e:
                 pass
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             #we might have a rounding error
@@ -1581,6 +1673,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         self.percentage(None)
         try:
             self.yumbase.doConfigSetup(errorlevel=0, debuglevel=0)# Setup Yum Config
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         self.yumbase.conf.cache = 0 # TODO: can we just look in the cache?
@@ -1595,6 +1689,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             if FILTER_NOT_INSTALLED not in filters:
                 try:
                     pkgs = self.yumbase.rpmdb.searchNevra(name=package)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 else:
@@ -1610,6 +1706,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 except yum.Errors.RepoError, e:
                     self.error(ERROR_NO_CACHE, "failed to return newest by package sack: %s" %_to_unicode(e), exit=False)
                     return
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 else:
@@ -1660,6 +1758,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     txmbr = self.yumbase.selectGroup(grp.groupid)
                     if not txmbr:
                         self.error(ERROR_GROUP_NOT_FOUND, "No packages were found in the %s group for %s." % (grp.groupid, _format_package_id(package_id)))
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 txmbrs.extend(txmbr)
@@ -1708,6 +1808,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             pass
         except yum.Errors.RepoError, e:
             pass
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         if pkgs:
@@ -1802,6 +1904,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                         self.error(ERROR_INVALID_PACKAGE_FILE, "%s does not appear to be a valid package." % inst_file)
                     except yum.Errors.YumBaseError, e:
                         self.error(ERROR_INVALID_PACKAGE_FILE, 'Package could not be decompressed')
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except:
                         self.error(ERROR_UNKNOWN, "Failed to open local file -- please report")
                     else:
@@ -1842,6 +1946,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             except yum.Errors.MiscError:
                 self.error(ERROR_INVALID_PACKAGE_FILE, "%s does not appear to be a valid package." % inst_file, exit=False)
                 return
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             try:
@@ -1851,6 +1957,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     self.error(ERROR_MISSING_GPG_SIGNATURE, _to_unicode(e), exit=False)
                     return
                 self.message (MESSAGE_UNTRUSTED_PACKAGE, "The package %s is untrusted" % po.name)
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -1864,6 +1972,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             for inst_file in inst_files:
                 try:
                     txmbr = self.yumbase.installLocal(inst_file)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 if txmbr:
@@ -1895,6 +2005,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 for inst_file in inst_files:
                     try:
                         txmbr = self.yumbase.installLocal(inst_file)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                     if txmbr:
@@ -1926,6 +2038,9 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         except yum.Errors.MiscError:
             self.error(ERROR_INVALID_PACKAGE_FILE, "%s does not appear to be a valid package." % pkg, exit=False)
             return False
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
+            return False
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             return False
@@ -1992,6 +2107,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 if pkg:
                     try:
                         txmbr = self.yumbase.update(po=pkg)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                     if not txmbr:
@@ -2053,6 +2170,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             raise PkError(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
         except yum.Errors.PackageSackError, e:
             raise PkError(ERROR_PACKAGE_DATABASE_CHANGED, _to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2064,6 +2183,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 message += " : %s" % _format_msgs(msgs)
             except yum.Errors.RepoError, e:
                 raise PkError(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+            except exceptions.IOError, e:
+                raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2130,6 +2251,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 raise PkError(ERROR_PACKAGE_CONFLICTS, message)
             else:
                 raise PkError(ERROR_TRANSACTION_ERROR, message)
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2166,6 +2289,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     self.error(ERROR_PACKAGE_NOT_INSTALLED, "This Group %s is not installed" % grp.groupid)
                 try:
                     txmbr = self.yumbase.groupRemove(grp.groupid)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 txmbrs.extend(txmbr)
@@ -2178,6 +2303,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 if pkg and inst:
                     try:
                         txmbr = self.yumbase.remove(po=pkg)
+                    except exceptions.IOError, e:
+                        self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                     except Exception, e:
                         self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                     txmbrs.extend(txmbr)
@@ -2189,6 +2316,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 rc, msgs =  self.yumbase.buildTransaction()
             except yum.Errors.RepoError, e:
                 self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except Exception, e:
                 self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             if rc != 2:
@@ -2416,7 +2545,7 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         except yum.Errors.RepoError, e:
             self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
         except exceptions.IOError, e:
-            self.error(ERROR_NO_SPACE_ON_DEVICE, _to_unicode(e))
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2443,6 +2572,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     changelog = pkg.returnChangelog()
                 except yum.Errors.RepoError, e:
                     self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2490,6 +2621,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                         self.message(MESSAGE_REPO_FOR_DEVELOPERS_ONLY, warning.replace("\n", ";"))
         except yum.Errors.RepoError, e:
             self.error(ERROR_REPO_NOT_FOUND, _to_unicode(e))
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
@@ -2507,6 +2640,9 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
 
         try:
             repos = self.yumbase.repos.repos.values()
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
+            return
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
             return
@@ -2524,6 +2660,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 if obsoleting[0] == name:
                     pkg =  self.yumbase.rpmdb.searchPkgTuple(installed)[0]
                     return self._pkg_to_id(pkg)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             pass # no obsolete data - fd#17528
         return ""
@@ -2531,6 +2669,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
     def _get_updated(self, pkg):
         try:
             pkgs = self.yumbase.rpmdb.searchNevra(name=pkg.name, arch=pkg.arch)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         if pkgs:
@@ -2544,6 +2684,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             for repo in self.yumbase.repos.listEnabled():
                 try:
                     self._updateMetadata.add(repo)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     pass # No updateinfo.xml.gz in repo
         return self._updateMetadata
@@ -2640,6 +2782,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                 instpkg = None
                 try:
                     instpkgs = self.yumbase.rpmdb.searchNevra(name=pkg.name)
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 if len(instpkgs) == 1:
@@ -2650,6 +2794,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     changes = pkg.returnChangelog()
                 except yum.Errors.RepoError, e:
                     self.error(ERROR_REPO_NOT_AVAILABLE, _to_unicode(e))
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 for change in changes:
@@ -2697,6 +2843,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
             repo = self.yumbase.repos.getRepo(repoid)
         except yum.Errors.RepoError, e:
             self.error(ERROR_REPO_NOT_FOUND, "repo '%s' cannot be found in list" % repoid, exit=False)
+        except exceptions.IOError, e:
+            self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
         else:
@@ -2728,6 +2876,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     self.yumbase.getKeyForRepo(repo, callback = lambda x: True)
                 except yum.Errors.YumBaseError, e:
                     self.error(ERROR_UNKNOWN, "cannot install signature: %s" % str(e))
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_GPG_FAILURE, "Error importing GPG Key for the %s repository: %s" % (repo, str(e)))
         else: # This is a package signature
@@ -2741,6 +2891,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
                     self.yumbase.getKeyForPackage(pkg, askcb = lambda x, y, z: True)
                 except yum.Errors.YumBaseError, e:
                     self.error(ERROR_UNKNOWN, "cannot install signature: %s" % str(e))
+                except exceptions.IOError, e:
+                    self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
                 except Exception, e:
                     self.error(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
                 except:
@@ -2779,6 +2931,8 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         for repo in self.yumbase.repos.listEnabled():
             try:
                 repo.repoXML
+            except exceptions.IOError, e:
+                self.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except yum.Errors.RepoError, e:
                 self.yumbase.repos.disableRepo(repo.id)
                 self.message(MESSAGE_REPO_METADATA_DOWNLOAD_FAILED, "Could not contact source '%s', so it will be disabled" % repo.id)
@@ -2958,6 +3112,8 @@ class PackageKitCallback(RPMBaseCallback):
             try:
                 self.base.status(TransactionsStateMap[action])
                 self._showName(TransactionsInfoMap[action])
+            except exceptions.IOError, e:
+                self.base.error(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
             except exceptions.KeyError, e:
                 self.base.message(MESSAGE_BACKEND_ERROR, "The constant '%s' was unknown, please report. details: %s" % (action, _to_unicode(e)))
 
@@ -3053,6 +3209,8 @@ class PackageKitYumBase(yum.YumBase):
             pc.disabled_plugins = disabled_plugins
         except yum.Errors.ConfigError, e:
             raise PkError(ERROR_REPO_CONFIGURATION_ERROR, _to_unicode(e))
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except ValueError, e:
             raise PkError(ERROR_FAILED_CONFIG_PARSING, _to_unicode(e))
 
@@ -3068,6 +3226,8 @@ class PackageKitYumBase(yum.YumBase):
         try:
             self.repos.confirm_func = self._repo_gpg_confirm
             self.repos.gpg_import_func = self._repo_gpg_import
+        except exceptions.IOError, e:
+            raise PkError(ERROR_NO_SPACE_ON_DEVICE, "Disk error: %s" % _to_unicode(e))
         except Exception, e:
             # helpfully, yum gives us TypeError when it can't open the rpmdb
             if str(e).find('rpmdb open failed') != -1:
commit 0da7f62bf7d8cc34a04c6d2721edd3f00286ecba
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Apr 7 09:39:20 2010 +0100

    yum: Ensure we force a cache update if the comps groups cannot be loaded

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 0d608ed..1aa7ce4 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -240,7 +240,7 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         self.package_summary_cache = {}
         self.comps = yumComps(self.yumbase)
         if not self.comps.connect():
-            self.refresh_cache()
+            self.refresh_cache(True)
             if not self.comps.connect():
                 self.error(ERROR_GROUP_LIST_INVALID, 'comps categories could not be loaded')
 
commit 44b63a9d0204c9cbb5d4700ffa5e51b8bf08b17d
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 6 15:37:30 2010 +0100

    trivial: sync spec file with fedora upstream

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 293f899..ffcfb53 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -18,8 +18,6 @@ Source0:   http://www.packagekit.org/releases/%{name}-%{version}.tar.gz
 Requires: dbus >= %{dbus_version}
 Requires: dbus-glib >= %{dbus_glib_version}
 Requires: PackageKit-glib = %{version}-%{release}
-Requires: PackageKit-gtk-module = %{version}-%{release}
-Requires: PackageKit-yum-plugin = %{version}-%{release}
 Requires: PackageKit-yum = %{version}-%{release}
 Requires: shared-mime-info
 Requires: comps-extras
commit dcf9aaf5fada567a06e7a3aacbb797e01f3372a8
Author: warrink <warrink at fedoraproject.org>
Date:   Sun Apr 4 10:14:11 2010 +0000

    l10n: Updates to Dutch (Flemish) (nl) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/nl.po b/po/nl.po
index 59e4859..4e823bd 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -2,132 +2,133 @@
 # R.E. van der Luit <nippur at fedoraproject.org>, 2009.
 # Geert Warrink <geert.warrink at onsnet.nu>, 2009.
 # Richard van der Luit <nippur at fedoraproject.org>, 2009, 2010.
+# Geert Warrink <geert.warrink at onsnet.nu>, 2010.
 msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-10 09:24+0000\n"
-"PO-Revision-Date: 2010-03-10 10:31+0100\n"
-"Last-Translator: Richard van der Luit <nippur at fedoraproject.org>\n"
-"Language-Team: Dutch <nl at li.org>\n"
+"POT-Creation-Date: 2010-04-04 08:18+0000\n"
+"PO-Revision-Date: 2010-04-04 12:13+0200\n"
+"Last-Translator: Geert Warrink <geert.warrink at onsnet.nu>\n"
+"Language-Team: nl <fedora-trans-list at redhat.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Transfer-Encoding:  \n"
 "Plural-Forms:  nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: Dutch\n"
 "X-Generator: KBabel 1.11.4\n"
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175 ../client/pk-console.c:597
+#: ../client/pk-console.c:176 ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Transactie"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Systeemtijd"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Geslaagd"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Waar"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Niet waar"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Rol"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Duur"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(seconden)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Commando regel"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "Gebruiker ID"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Gebruikernaam"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "Werkelijke naam"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Betreffende pakketten"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Betreffende pakketten: Geen"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Distributie"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Type"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252 ../client/pk-console.c:291
+#: ../client/pk-console.c:253 ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Samenvatting"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Categorie"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "ID"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Ouder"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Naam"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Icoon"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Details van de vernieuwing:"
 
@@ -136,7 +137,7 @@ msgstr "Details van de vernieuwing:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346 ../client/pk-console.c:616
+#: ../client/pk-console.c:347 ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -146,165 +147,165 @@ msgstr[0] "Pakket"
 msgstr[1] "Pakketten"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Vernieuwingen"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Verouderde pakketten"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357 ../lib/packagekit-glib2/pk-task-text.c:211
+#: ../client/pk-console.c:358 ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Verkoper"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Herstarten"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Vernieuw tekst"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Veranderingen"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Status"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Uitgegeven"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389 ../lib/packagekit-glib2/pk-console-shared.c:510
+#: ../client/pk-console.c:390 ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Vernieuwd"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Aangezit"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Uitgezet"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Herstart systeem vereist door:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Het is vereist het systeem te herstarten:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Herstart systeem (beveiliging) vereist door:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Herstart sessie (beveiliging) vereist door:"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Herstart vereist door toepassing:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Pakketomschrijving"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Bericht:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Geen bestanden"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Pakketbestanden"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Percentage"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Status"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Resultaten:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Fatale fout"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "De transactie faalde"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "Er zijn op dit moment geen vernieuwingen beschikbaar."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Er zijn op dit moment geen upgrades beschikbaar."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Herstart a.u.b de computer om de verneuwing af te maken."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr "Log a.u.b uit en weer in om de vernieuwing af te maken."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
@@ -313,36 +314,36 @@ msgstr ""
 "beveiligings vernieuwingen geïnstaleerd zijn."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
 msgstr "Log a.u.b. uit en weer in om de verniewing af te maken."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid ""
-"Extected package name, actually got file. Try using 'pkcon install-local %s' "
+"Expected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
 "Verwachtte pakketnaam, maar kreeg een bestand. Probeer in plaats daarvan "
 "'pkcon install-local %s' te gebruiken."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Dit programma kon geen enkel beschikbaar pakket %s vinden."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Dit programma kon het geïinstallerde pakket %s niet vinden."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915 ../client/pk-console.c:943
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Dit programma kon het pakket %s niet vinden."
@@ -351,64 +352,64 @@ msgstr "Dit programma kon het pakket %s niet vinden."
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971 ../client/pk-console.c:999
-#: ../client/pk-console.c:1027 ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972 ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028 ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Dit programma kon niet alle pakketten vinden: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "De service is midden in de transactie gecrashed!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "PackageKit console-interface"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Subopdrachten:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr ""
 "Verkrijgen van de tijd tussen laatste actie en deze actie is niet gelukt"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263 ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Programmaversie tonen en sluiten"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Filter instellen, bijvoorbeeld geïnstalleerd"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Afsluiten zonder te wachten tot de transacties zijn afgerond"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Installeer het pakket zonder goedkeuring te vragen"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Voer het commando uit met gebruik van onbenutte netwerk bandbreedte en ook "
 "om minder vermogen te gebruiken"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -416,117 +417,122 @@ msgstr ""
 "widgets te gebruiken"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Contact met PackageKit krijgen mislukte."
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "De proxy kon niet ingesteld worden"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "De opgegeven filter was ongeldig"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Een zoektype is verplicht, b.v. naam"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384 ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408 ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Een zoekterm is vereist"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Ongeldig zoektype"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Een pakketnaam om te installeren is vereist"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Een bestandsnaam om te installeren is vereist"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Er moet een type worden opgegeven, key_id of package_id"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Een te verwijderen pakketnaam is vereist"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr "Een doelmap en dan de namen van te downloaden pakketten zijn vereist"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Map niet gevonden"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Een licentie indentificatie (eula-id) is vereis"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Een transactie indentificatie (tid) is vereist"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Een pakketnaam om te gebruiken is vereist"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536 ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Een naam van een repository is vereist"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Een repo naam, parameter en waarde zijn vereist"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Een actie, b.v. 'update-system' is vereist"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Een correcte rol is vereist"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592 ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616 ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645 ../client/pk-generate-pack.c:316
+#: ../client/pk-console.c:1611 ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635 ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Een pakketnaam is vereist"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Een pakket geleverde string is vereist"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Optie '%s' wordt niet ondersteund"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Opdracht mislukt"
 
@@ -538,10 +544,9 @@ msgstr ""
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
+msgid "The output file or directory (the current directory is used if omitted)"
 msgstr ""
-"Het doelbestand of map (huidige map wordt gebruikt als dit niet wordt "
+"Het doel bestand of map (de huidige map wordt gebruikt als dit niet wordt "
 "opgegeven)"
 
 #. TRANSLATORS: put a list of packages in the pack
@@ -569,10 +574,10 @@ msgstr "Beide opties geselecteerd."
 msgid "A output directory or file name is required"
 msgstr "Een doelmap of bestandsnaam is vereist"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
-msgstr "De daemon faalde op te starten"
+msgid "The daemon failed to startup"
+msgstr "De daemon faalde om op te starten"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
 #. TRANSLATORS: This is when the backend doesn't have the capability to download
@@ -643,12 +648,12 @@ msgstr "Servicepack aangemaakt '%s'"
 msgid "Failed to create '%s': %s"
 msgstr "'%s' aanmaken niet gelukt: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Daemon toestand verkrijgen mislukte."
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "PackageKit-monitor"
 
@@ -707,42 +712,42 @@ msgid "Installing..."
 msgstr "Aan het installeren......"
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Download details over de software bronnen."
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr "Bestands lijsten downloaden (dit kan enige tijd duren)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Wachten op pakket beheerder blokkering."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Lijst van pakketten downloaden."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Zoeken naar bestand niet gelukt"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Starten mislukt:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "Kon pakketen niet installeren"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "PackageKit Command niet gevonden"
 
@@ -752,51 +757,51 @@ msgid "Command not found."
 msgstr "Commando niet gevonden."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Een gelijkend commando is:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Start gelijkend commando:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Gelijkende commando's zijn:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Kies alstublieft een commando om te starten"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "Het pakket dat dit bestand levert is:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Pakket '%s' installeren om commando '%s' te verkrijgen?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Pakketten die dit bestand leveren zijn:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Geschikte pakketten zijn:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Kies alstublieft een pakket om te installeren"
 
@@ -967,7 +972,7 @@ msgstr "Pakketten niet installeren in de simulatie mode"
 #. TRANSLATORS: we are now installing the debuginfo packages we found earlier
 #. TRANSLATORS: transaction state, installing packages
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:862
-#: ../lib/packagekit-glib2/pk-console-shared.c:282
+#: ../lib/packagekit-glib2/pk-console-shared.c:283
 #, c-format
 msgid "Installing packages"
 msgstr "Pakketten installeren"
@@ -1104,7 +1109,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Voer een nummer in van 1 tot %i: "
 
 #. TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:183
+#: ../lib/packagekit-glib2/pk-console-shared.c:185
 msgid "More than one package matches:"
 msgstr "Er zijn meerdere pakketten die overeenkomen:"
 
@@ -1114,448 +1119,448 @@ msgid "Please choose the correct package: "
 msgstr "Kies alstublieft het juiste pakket: "
 
 #. TRANSLATORS: This is when the transaction status is not known
-#: ../lib/packagekit-glib2/pk-console-shared.c:250
+#: ../lib/packagekit-glib2/pk-console-shared.c:251
 msgid "Unknown state"
 msgstr "Onbekende toestand"
 
 #. TRANSLATORS: transaction state, the daemon is in the process of starting
-#: ../lib/packagekit-glib2/pk-console-shared.c:254
+#: ../lib/packagekit-glib2/pk-console-shared.c:255
 msgid "Starting"
 msgstr "Opstarten"
 
 #. TRANSLATORS: transaction state, the transaction is waiting for another to complete
-#: ../lib/packagekit-glib2/pk-console-shared.c:258
+#: ../lib/packagekit-glib2/pk-console-shared.c:259
 msgid "Waiting in queue"
 msgstr "Wachten in wachtrij"
 
 #. TRANSLATORS: transaction state, just started
-#: ../lib/packagekit-glib2/pk-console-shared.c:262
+#: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
 msgstr "Draaiende"
 
 #. TRANSLATORS: transaction state, is querying data
-#: ../lib/packagekit-glib2/pk-console-shared.c:266
+#: ../lib/packagekit-glib2/pk-console-shared.c:267
 msgid "Querying"
 msgstr "Informatie ophalen"
 
 #. TRANSLATORS: transaction state, getting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:270
+#: ../lib/packagekit-glib2/pk-console-shared.c:271
 msgid "Getting information"
 msgstr "Informatie krijgen"
 
 #. TRANSLATORS: transaction state, removing packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:274
+#: ../lib/packagekit-glib2/pk-console-shared.c:275
 msgid "Removing packages"
 msgstr "Pakketten verwijderen"
 
 #. TRANSLATORS: transaction state, downloading package files
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:278
-#: ../lib/packagekit-glib2/pk-console-shared.c:656
+#: ../lib/packagekit-glib2/pk-console-shared.c:279
+#: ../lib/packagekit-glib2/pk-console-shared.c:657
 msgid "Downloading packages"
 msgstr "Pakketten aan het downloaden"
 
 #. TRANSLATORS: transaction state, refreshing internal lists
-#: ../lib/packagekit-glib2/pk-console-shared.c:286
+#: ../lib/packagekit-glib2/pk-console-shared.c:287
 msgid "Refreshing software list"
 msgstr "Software lijst verversen"
 
 #. TRANSLATORS: transaction state, installing updates
-#: ../lib/packagekit-glib2/pk-console-shared.c:290
+#: ../lib/packagekit-glib2/pk-console-shared.c:291
 msgid "Installing updates"
 msgstr "Vernieuwingen installeren"
 
 #. TRANSLATORS: transaction state, removing old packages, and cleaning config files
-#: ../lib/packagekit-glib2/pk-console-shared.c:294
+#: ../lib/packagekit-glib2/pk-console-shared.c:295
 msgid "Cleaning up packages"
 msgstr "Pakketten opschonen"
 
 #. TRANSLATORS: transaction state, obsoleting old packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:298
+#: ../lib/packagekit-glib2/pk-console-shared.c:299
 msgid "Obsoleting packages"
 msgstr "Pakketten achterhaald maken"
 
 #. TRANSLATORS: transaction state, checking the transaction before we do it
-#: ../lib/packagekit-glib2/pk-console-shared.c:302
+#: ../lib/packagekit-glib2/pk-console-shared.c:303
 msgid "Resolving dependencies"
 msgstr "Afhankelijkheden oplossen"
 
 #. TRANSLATORS: transaction state, checking if we have all the security keys for the operation
-#: ../lib/packagekit-glib2/pk-console-shared.c:306
+#: ../lib/packagekit-glib2/pk-console-shared.c:307
 msgid "Checking signatures"
 msgstr "Ondertekeningen controleren"
 
 #. TRANSLATORS: transaction state, when we return to a previous system state
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:310
-#: ../lib/packagekit-glib2/pk-console-shared.c:616
+#: ../lib/packagekit-glib2/pk-console-shared.c:311
+#: ../lib/packagekit-glib2/pk-console-shared.c:617
 msgid "Rolling back"
 msgstr "Terug draaien"
 
 #. TRANSLATORS: transaction state, when we're doing a test transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:314
+#: ../lib/packagekit-glib2/pk-console-shared.c:315
 msgid "Testing changes"
 msgstr "Veranderingen testen"
 
 #. TRANSLATORS: transaction state, when we're writing to the system package database
-#: ../lib/packagekit-glib2/pk-console-shared.c:318
+#: ../lib/packagekit-glib2/pk-console-shared.c:319
 msgid "Committing changes"
 msgstr "Veranderingen beschikbaar maken"
 
 #. TRANSLATORS: transaction state, requesting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:322
+#: ../lib/packagekit-glib2/pk-console-shared.c:323
 msgid "Requesting data"
 msgstr "Data aanvragen"
 
 #. TRANSLATORS: transaction state, all done!
-#: ../lib/packagekit-glib2/pk-console-shared.c:326
+#: ../lib/packagekit-glib2/pk-console-shared.c:327
 msgid "Finished"
 msgstr "Klaar"
 
 #. TRANSLATORS: transaction state, in the process of cancelling
-#: ../lib/packagekit-glib2/pk-console-shared.c:330
+#: ../lib/packagekit-glib2/pk-console-shared.c:331
 msgid "Cancelling"
 msgstr "Afbreken"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:334
+#: ../lib/packagekit-glib2/pk-console-shared.c:335
 msgid "Downloading repository information"
 msgstr "Repository informatie downloaden"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:338
+#: ../lib/packagekit-glib2/pk-console-shared.c:339
 msgid "Downloading list of packages"
 msgstr "Lijst van pakketten downloaden"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:342
+#: ../lib/packagekit-glib2/pk-console-shared.c:343
 msgid "Downloading file lists"
 msgstr "Bestandslijsten downloaden"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:346
+#: ../lib/packagekit-glib2/pk-console-shared.c:347
 msgid "Downloading lists of changes"
 msgstr "Lijst van veranderingen downloaden."
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:350
+#: ../lib/packagekit-glib2/pk-console-shared.c:351
 msgid "Downloading groups"
 msgstr "Groepen downloaden"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:354
+#: ../lib/packagekit-glib2/pk-console-shared.c:355
 msgid "Downloading update information"
 msgstr "Pakketinformatie downloaden"
 
 #. TRANSLATORS: transaction state, repackaging delta files
-#: ../lib/packagekit-glib2/pk-console-shared.c:358
+#: ../lib/packagekit-glib2/pk-console-shared.c:359
 msgid "Repackaging files"
 msgstr "Bestanden opnieuw inpakken"
 
 #. TRANSLATORS: transaction state, loading databases
-#: ../lib/packagekit-glib2/pk-console-shared.c:362
+#: ../lib/packagekit-glib2/pk-console-shared.c:363
 msgid "Loading cache"
 msgstr "Cache laden"
 
 #. TRANSLATORS: transaction state, scanning for running processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:366
+#: ../lib/packagekit-glib2/pk-console-shared.c:367
 msgid "Scanning applications"
 msgstr "Toepassingen doorzoeken"
 
 #. TRANSLATORS: transaction state, generating a list of packages installed on the system
-#: ../lib/packagekit-glib2/pk-console-shared.c:370
+#: ../lib/packagekit-glib2/pk-console-shared.c:371
 msgid "Generating package lists"
 msgstr "Pakketlijst aanmaken"
 
 #. TRANSLATORS: transaction state, when we're waiting for the native tools to exit
-#: ../lib/packagekit-glib2/pk-console-shared.c:374
+#: ../lib/packagekit-glib2/pk-console-shared.c:375
 msgid "Waiting for package manager lock"
 msgstr "Wachten op pakket beheerder blokkering"
 
 #. TRANSLATORS: transaction state, waiting for user to type in a password
-#: ../lib/packagekit-glib2/pk-console-shared.c:378
+#: ../lib/packagekit-glib2/pk-console-shared.c:379
 msgid "Waiting for authentication"
 msgstr "Wachten op authenticatie"
 
 #. TRANSLATORS: transaction state, we are updating the list of processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:382
+#: ../lib/packagekit-glib2/pk-console-shared.c:383
 msgid "Updating running applications"
 msgstr "Draaiende toepassingen vernieuwen"
 
 #. TRANSLATORS: transaction state, we are checking executable files currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:386
+#: ../lib/packagekit-glib2/pk-console-shared.c:387
 msgid "Checking applications in use"
 msgstr "Controleren van toepassingen in gebruik"
 
 #. TRANSLATORS: transaction state, we are checking for libraries currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:390
+#: ../lib/packagekit-glib2/pk-console-shared.c:391
 msgid "Checking libraries in use"
 msgstr "Controleren van bibliotheken in gebruik"
 
 #. TRANSLATORS: transaction state, we are copying package files before or after the transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:394
+#: ../lib/packagekit-glib2/pk-console-shared.c:395
 msgid "Copying files"
 msgstr "Bestanden kopiëren"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:412
+#: ../lib/packagekit-glib2/pk-console-shared.c:413
 msgid "Trivial"
 msgstr "Triviaal"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:416
+#: ../lib/packagekit-glib2/pk-console-shared.c:417
 msgid "Normal"
 msgstr "Normaal"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:420
+#: ../lib/packagekit-glib2/pk-console-shared.c:421
 msgid "Important"
 msgstr "Belangrijk"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:424
+#: ../lib/packagekit-glib2/pk-console-shared.c:425
 msgid "Security"
 msgstr "Beveiliging"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:428
+#: ../lib/packagekit-glib2/pk-console-shared.c:429
 msgid "Bug fix "
 msgstr "Fout reparatie"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:432
+#: ../lib/packagekit-glib2/pk-console-shared.c:433
 msgid "Enhancement"
 msgstr "Verbetering"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:436
+#: ../lib/packagekit-glib2/pk-console-shared.c:437
 msgid "Blocked"
 msgstr "Geblokkeerd"
 
 #. TRANSLATORS: The state of a package
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:441
-#: ../lib/packagekit-glib2/pk-console-shared.c:514
+#: ../lib/packagekit-glib2/pk-console-shared.c:442
+#: ../lib/packagekit-glib2/pk-console-shared.c:515
 msgid "Installed"
 msgstr "Geïnstalleerd"
 
 #. TRANSLATORS: The state of a package, i.e. not installed
-#: ../lib/packagekit-glib2/pk-console-shared.c:446
+#: ../lib/packagekit-glib2/pk-console-shared.c:447
 msgid "Available"
 msgstr "Beschikbaar"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:464
+#: ../lib/packagekit-glib2/pk-console-shared.c:465
 msgid "Downloading"
 msgstr "Downloaden"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:468
+#: ../lib/packagekit-glib2/pk-console-shared.c:469
 msgid "Updating"
 msgstr "Vernieuwen"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:472
-#: ../lib/packagekit-glib2/pk-console-shared.c:592
+#: ../lib/packagekit-glib2/pk-console-shared.c:473
+#: ../lib/packagekit-glib2/pk-console-shared.c:593
 msgid "Installing"
 msgstr "Installeren"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:476
-#: ../lib/packagekit-glib2/pk-console-shared.c:588
+#: ../lib/packagekit-glib2/pk-console-shared.c:477
+#: ../lib/packagekit-glib2/pk-console-shared.c:589
 msgid "Removing"
 msgstr "Verwijderen"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:480
+#: ../lib/packagekit-glib2/pk-console-shared.c:481
 msgid "Cleaning up"
 msgstr "Opschonen"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:484
+#: ../lib/packagekit-glib2/pk-console-shared.c:485
 msgid "Obsoleting"
 msgstr "Verouderd maken"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:488
+#: ../lib/packagekit-glib2/pk-console-shared.c:489
 msgid "Reinstalling"
 msgstr "Hergeïnstalleerd"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:506
+#: ../lib/packagekit-glib2/pk-console-shared.c:507
 msgid "Downloaded"
 msgstr "Downloaden"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:518
+#: ../lib/packagekit-glib2/pk-console-shared.c:519
 msgid "Removed"
 msgstr "Verwijderd"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:522
+#: ../lib/packagekit-glib2/pk-console-shared.c:523
 msgid "Cleaned up"
 msgstr "Opgeruimd"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:526
+#: ../lib/packagekit-glib2/pk-console-shared.c:527
 msgid "Obsoleted"
 msgstr "Verouderd"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:530
+#: ../lib/packagekit-glib2/pk-console-shared.c:531
 msgid "Reinstalled"
 msgstr "Herge"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:548
+#: ../lib/packagekit-glib2/pk-console-shared.c:549
 msgid "Unknown role type"
 msgstr "Onbekend rol type"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:552
+#: ../lib/packagekit-glib2/pk-console-shared.c:553
 msgid "Getting dependencies"
 msgstr "Afhankelijkheden ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:556
+#: ../lib/packagekit-glib2/pk-console-shared.c:557
 msgid "Getting update details"
 msgstr "Vernieuwings details ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:560
+#: ../lib/packagekit-glib2/pk-console-shared.c:561
 msgid "Getting details"
 msgstr "Details ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:564
+#: ../lib/packagekit-glib2/pk-console-shared.c:565
 msgid "Getting requires"
 msgstr "Vereisten ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:568
+#: ../lib/packagekit-glib2/pk-console-shared.c:569
 msgid "Getting updates"
 msgstr "Vernieuwingen ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:572
+#: ../lib/packagekit-glib2/pk-console-shared.c:573
 msgid "Searching by details"
 msgstr "Opzoeken volgens details"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:576
+#: ../lib/packagekit-glib2/pk-console-shared.c:577
 msgid "Searching by file"
 msgstr "Opzoeken volgens bestand"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:580
+#: ../lib/packagekit-glib2/pk-console-shared.c:581
 msgid "Searching groups"
 msgstr "Opzoeken volgens groepen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:584
+#: ../lib/packagekit-glib2/pk-console-shared.c:585
 msgid "Searching by name"
 msgstr "Opzoeken volgens naam"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:596
+#: ../lib/packagekit-glib2/pk-console-shared.c:597
 msgid "Installing files"
 msgstr "Bestanden installeren"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:600
+#: ../lib/packagekit-glib2/pk-console-shared.c:601
 msgid "Refreshing cache"
 msgstr "Cache verversen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:604
+#: ../lib/packagekit-glib2/pk-console-shared.c:605
 msgid "Updating packages"
 msgstr "Pakketten vernieuwen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:608
+#: ../lib/packagekit-glib2/pk-console-shared.c:609
 msgid "Updating system"
 msgstr "Systeem vernieuwen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:612
+#: ../lib/packagekit-glib2/pk-console-shared.c:613
 msgid "Canceling"
 msgstr "Afbreken"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:620
+#: ../lib/packagekit-glib2/pk-console-shared.c:621
 msgid "Getting repositories"
 msgstr "Repositories ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:624
+#: ../lib/packagekit-glib2/pk-console-shared.c:625
 msgid "Enabling repository"
 msgstr "Repository aanzetten"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:628
+#: ../lib/packagekit-glib2/pk-console-shared.c:629
 msgid "Setting data"
 msgstr "Data instellen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:632
+#: ../lib/packagekit-glib2/pk-console-shared.c:633
 msgid "Resolving"
 msgstr "Oplossen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:636
+#: ../lib/packagekit-glib2/pk-console-shared.c:637
 msgid "Getting file list"
 msgstr "Bestandslijst ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:640
+#: ../lib/packagekit-glib2/pk-console-shared.c:641
 msgid "Getting provides"
 msgstr "Voorzieningen ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:644
+#: ../lib/packagekit-glib2/pk-console-shared.c:645
 msgid "Installing signature"
 msgstr "Onderstekening installeren"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:648
+#: ../lib/packagekit-glib2/pk-console-shared.c:649
 msgid "Getting packages"
 msgstr "Pakketten ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:652
+#: ../lib/packagekit-glib2/pk-console-shared.c:653
 msgid "Accepting EULA"
 msgstr "EULA accepteren"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:660
+#: ../lib/packagekit-glib2/pk-console-shared.c:661
 msgid "Getting upgrades"
 msgstr "Vernieuwingen ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:664
+#: ../lib/packagekit-glib2/pk-console-shared.c:665
 msgid "Getting categories"
 msgstr "Categorieën ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:668
+#: ../lib/packagekit-glib2/pk-console-shared.c:669
 msgid "Getting transactions"
 msgstr "Transcaties ophalen"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:672
-#: ../lib/packagekit-glib2/pk-console-shared.c:676
+#: ../lib/packagekit-glib2/pk-console-shared.c:673
+#: ../lib/packagekit-glib2/pk-console-shared.c:677
 msgid "Simulating install"
 msgstr "Installatie simuleren"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:680
+#: ../lib/packagekit-glib2/pk-console-shared.c:681
 msgid "Simulating remove"
 msgstr "Verwijderen simuleren"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:684
+#: ../lib/packagekit-glib2/pk-console-shared.c:685
 msgid "Simulating update"
 msgstr "Vernieuwing simuleren"
 
@@ -1997,25 +2002,25 @@ msgid "Show debugging information for all files"
 msgstr "Toon debuginformatie voor alle bestanden"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Debug deze specifieke modules"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Debug deze specifieke functies"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Log debuggingdata naar een file"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Debugging Opties"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Toon debugopties"
 
commit 1025e26da681cfefa29980f00495a03e28185448
Author: logan <logan at fedoraproject.org>
Date:   Sat Apr 3 17:44:45 2010 +0000

    l10n: Updates to Spanish (Castilian) (es) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/es.po b/po/es.po
index 7e47401..94b6c9e 100644
--- a/po/es.po
+++ b/po/es.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-02 14:15+0000\n"
-"PO-Revision-Date: 2010-04-02 13:17-0300\n"
+"POT-Creation-Date: 2010-04-03 16:16+0000\n"
+"PO-Revision-Date: 2010-04-03 14:43-0300\n"
 "Last-Translator: Héctor Daniel Cabrera <logan at fedoraproject.org>\n"
 "Language-Team: Fedora Spanish <trans-es at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -36,7 +36,7 @@ msgstr "Hora del sistema"
 #. TRANSLATORS: this is if the transaction succeeded or not
 #: ../client/pk-console.c:180
 msgid "Succeeded"
-msgstr "Existosa"
+msgstr "Exitosa"
 
 #: ../client/pk-console.c:180
 msgid "True"
@@ -51,7 +51,7 @@ msgstr "Falso"
 #: ../client/pk-console.c:182
 #: ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
-msgstr "Rol"
+msgstr "Función"
 
 #. TRANSLATORS: this is The duration of the transaction
 #: ../client/pk-console.c:187
@@ -72,7 +72,7 @@ msgstr "Línea de comandos"
 #. TRANSLATORS: this is the user ID of the user that started the action
 #: ../client/pk-console.c:193
 msgid "User ID"
-msgstr "ID del usuario"
+msgstr "ID de usuario"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
 #: ../client/pk-console.c:200
@@ -86,11 +86,11 @@ msgstr "Nombre real"
 
 #: ../client/pk-console.c:212
 msgid "Affected packages:"
-msgstr "Paquete afectados:"
+msgstr "Paquetes involucrados:"
 
 #: ../client/pk-console.c:214
 msgid "Affected packages: None"
-msgstr "Paquetes afectados: Ninguno"
+msgstr "Paquetes involucrados: Ninguno"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
 #: ../client/pk-console.c:249
@@ -107,7 +107,7 @@ msgstr "Tipo"
 #: ../client/pk-console.c:253
 #: ../client/pk-console.c:292
 msgid "Summary"
-msgstr "Resúmen"
+msgstr "Resumen"
 
 #. TRANSLATORS: this is the group category name
 #: ../client/pk-console.c:281
@@ -298,7 +298,7 @@ msgstr "La transacción no pudo realizarse"
 #. TRANSLATORS: print a message when there are no updates
 #: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
-msgstr "No hay actualizaciones disponibles en este momento."
+msgstr "En este momento no existen actualizaciones disponibles."
 
 #: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
@@ -312,23 +312,23 @@ msgstr "Reinicie el equipo para completar la actualización."
 #. TRANSLATORS: a package needs to restart the session
 #: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
-msgstr "Cierre la sesión y vuelva a entrar para completar la actualización."
+msgstr "Cierre la sesión y vuelva a ingresar para completar la actualización."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
 #: ../client/pk-console.c:823
 msgid "Please restart the computer to complete the update as important security updates have been installed."
-msgstr "Por favor, reinicie el equipo para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
+msgstr "Por favor, debido a que se han instalado actualizaciones de seguridad importantes, reinicie el equipo para completar la actualización. "
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
 #: ../client/pk-console.c:826
 msgid "Please logout and login to complete the update as important security updates have been installed."
-msgstr "Por favor, cierre la sesión y vuelva a registrarse para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
+msgstr "Por favor, debido a que se han instalado actualizaciones de seguridad importantes, cierre la sesión y vuelva a registrarse para completar la actualización."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
 #: ../client/pk-console.c:852
 #, c-format
-msgid "Extected package name, actually got file. Try using 'pkcon install-local %s' instead."
-msgstr "Nombre de paquete esperado, actualmente tiene archivo. Trate de usar 'pkcon install-local %s' en su lugar."
+msgid "Expected package name, actually got file. Try using 'pkcon install-local %s' instead."
+msgstr "Se esperaba el nombre de un paquete, pero se obtuvo un archivo. En su lugar, trate de utilizar 'pkcon install-local %s'."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
 #: ../client/pk-console.c:860
@@ -365,7 +365,7 @@ msgstr "Esta herramienta no pudo encontrar todos los paquetes: %s"
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
 #: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
-msgstr "El demonio se colgó en medio de una transacción."
+msgstr "¡El demonio se ha caído en plena transacción!"
 
 #. TRANSLATORS: This is the header to the --help menu
 #: ../client/pk-console.c:1147
@@ -391,7 +391,7 @@ msgstr "Mostrar la versión del programa y salir"
 #. TRANSLATORS: command line argument, use a filter to narrow down results
 #: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
-msgstr "Establecer el filtro, ej. instalado"
+msgstr "Establecer el filtro, p. ej. instalado"
 
 #. TRANSLATORS: command line argument, work asynchronously
 #: ../client/pk-console.c:1273
@@ -407,12 +407,12 @@ msgstr "Instalar los paquetes sin confirmación"
 #. TRANSLATORS: command line argument, this command is not a priority
 #: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
-msgstr "Corra el comando usando ancho de bando libre y también usando menos potencia"
+msgstr "Ejecuta el comando utilizando menos potencia, y el ancho de bando libre"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
 #: ../client/pk-console.c:1282
 msgid "Print to screen a machine readable output, rather than using animated widgets"
-msgstr "Imprimir en la pantalla una salida legible por una máquina, en vez de usar controles animados"
+msgstr "Imprime en la pantalla una salida legible por una máquina, en lugar de utilizar widgets animados"
 
 #. TRANSLATORS: we failed to contact the daemon
 #: ../client/pk-console.c:1304
@@ -533,7 +533,7 @@ msgstr "Se necesita la cadena de lo que proporciona el paquete"
 #: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
-msgstr "La opción «%s» no está soportada"
+msgstr "La opción '%s' no está soportada"
 
 #. TRANSLATORS: Generic failure of what they asked to do
 #: ../client/pk-console.c:1734
@@ -547,13 +547,13 @@ msgstr "Establezca el nombre del archivo de dependencias para excluir"
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid "The output file or directory (the current directory is used if ommitted)"
-msgstr "El directorio o archivo de salida (se usará si se omite el directorio actual)"
+msgid "The output file or directory (the current directory is used if omitted)"
+msgstr "El directorio o archivo de salida (si se imite, será utilizado el directorio actual)"
 
 #. TRANSLATORS: put a list of packages in the pack
 #: ../client/pk-generate-pack.c:261
 msgid "The package to be put into the service pack"
-msgstr "El paquete será puesto en el paquete de servicio"
+msgstr "El paquete a ser colocado en el paquete de servicio"
 
 #. TRANSLATORS: put all pending updates in the pack
 #: ../client/pk-generate-pack.c:264
@@ -563,7 +563,7 @@ msgstr "Poner todas las actualizaciones disponibles en el paquete de servicio"
 #. TRANSLATORS: This is when the user fails to supply the correct arguments
 #: ../client/pk-generate-pack.c:300
 msgid "Neither --package or --updates option selected."
-msgstr "No se seleccionó ni la opción --package o --updates."
+msgstr "No se seleccionó la opción --package o --updates."
 
 #. TRANSLATORS: This is when the user fails to supply just one argument
 #: ../client/pk-generate-pack.c:308
@@ -575,10 +575,10 @@ msgstr "Se seleccionaron ambas opciones."
 msgid "A output directory or file name is required"
 msgstr "Se necesita un directorio o nombre de archivo de salida"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
-msgstr "Fallo del demonio en el inicio"
+msgid "The daemon failed to startup"
+msgstr "El demonio falló al tratar de iniciarse"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
 #. TRANSLATORS: This is when the backend doesn't have the capability to download
@@ -600,12 +600,12 @@ msgstr "Si especifica un archivo, el nombre del paquete de servicio debe finaliz
 #. TRANSLATORS: This is when file already exists
 #: ../client/pk-generate-pack.c:393
 msgid "A pack with the same name already exists, do you want to overwrite it?"
-msgstr "Ya existe un paquete con ese nombre, ¿desea sobreescribirlo?"
+msgstr "Ya existe un paquete con ese nombre, ¿desea sobrescribirlo?"
 
 #. TRANSLATORS: This is when the pack was not overwritten
 #: ../client/pk-generate-pack.c:396
 msgid "The pack was not overwritten."
-msgstr "No se sobreescribió el paquete."
+msgstr "No se sobrescribió el paquete."
 
 #. TRANSLATORS: This is when the temporary directory cannot be created, the directory name follows
 #: ../client/pk-generate-pack.c:409
@@ -626,7 +626,7 @@ msgstr "Buscando el nombre de paquete."
 #: ../client/pk-generate-pack.c:434
 #, c-format
 msgid "Failed to find package '%s': %s"
-msgstr "Falló al buscar el paquete «%s»: %s"
+msgstr "Falló al buscar el paquete '%s': %s"
 
 #. TRANSLATORS: This is telling the user we are in the process of making the pack
 #: ../client/pk-generate-pack.c:442
@@ -637,13 +637,13 @@ msgstr "Creando el paquete de servicio..."
 #: ../client/pk-generate-pack.c:457
 #, c-format
 msgid "Service pack created '%s'"
-msgstr "Paquete de servicio «%s» creado"
+msgstr "Ha sido creado el paquete de servicio '%s'"
 
 #. TRANSLATORS: we failed to make te file
 #: ../client/pk-generate-pack.c:462
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr "Falló al crear «%s»: %s"
+msgstr "Falló al crear '%s': %s"
 
 #: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
@@ -726,7 +726,7 @@ msgstr "Esperando bloqueo del administrador de paquetes."
 #. TRANSLATORS: loading package cache so we can search
 #: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
-msgstr "Cargando listas de paquetes"
+msgstr "Cargando listas de paquetes."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
 #: ../contrib/command-not-found/pk-command-not-found.c:424
@@ -761,7 +761,7 @@ msgstr "Un comando similar es:"
 #. TRANSLATORS: Ask the user if we should run the similar command
 #: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
-msgstr "Ejecutar un comando similar:"
+msgstr "Ejecuta un comando similar:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
@@ -784,7 +784,7 @@ msgstr "El paquete que proporciona este archivo es:"
 #: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
-msgstr "¿Instalar el paquete «%s» para proporcionar el comando «%s»?"
+msgstr "¿Instalar el paquete '%s' para proporcionar el comando '%s'?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
 #: ../contrib/command-not-found/pk-command-not-found.c:804
@@ -794,7 +794,7 @@ msgstr "Los paquetes que proporcionan este archivo son:"
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
 #: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
-msgstr "Los posibles paquetes son:"
+msgstr "Los paquetes posibles son:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
@@ -816,7 +816,7 @@ msgstr "No se ha podido encontrar el paquete %s, o tal vez ya se encuentre insta
 #. command line argument, simulate what would be done, but don't actually do it
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:518
 msgid "Don't actually install any packages, only simulate what would be installed"
-msgstr "No se instala ningún paquete realmente, solo se indica cuáles serían instalados"
+msgstr "No se instala ningún paquete, solo se indica cuáles serían instalados"
 
 #. command line argument, do we skip packages that depend on the ones specified
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:521
@@ -1029,26 +1029,26 @@ msgstr "Falló al registrar el controlador"
 #. TRANSLATORS: user did not specify a device sysfs path that exists
 #: ../contrib/device-rebind/pk-device-rebind.c:261
 msgid "Device path not found"
-msgstr "Dirección de dispositivo no encontrado"
+msgstr "No se ha encontrado la ruta de dispositivo"
 
 #. TRANSLATORS: user did not specify a valid device sysfs path
 #: ../contrib/device-rebind/pk-device-rebind.c:269
 msgid "Incorrect device path specified"
-msgstr "Dirección de dispositivo especificada incorrecta"
+msgstr "Se ha especificado una ruta de dispositivo incorrecta"
 
 #: ../contrib/device-rebind/pk-device-rebind.c:294
 msgid "Show extra debugging information"
-msgstr "Mostrar información extra de depuración"
+msgstr "Muestra información extra de depuración"
 
 #. command line argument, simulate what would be done, but don't actually do it
 #: ../contrib/device-rebind/pk-device-rebind.c:297
 msgid "Don't actually touch the hardware, only simulate what would be done"
-msgstr "No tocar el hardware, solamente simular lo que se haría"
+msgstr "No toca el hardware, solamente simula lo que se haría"
 
 #. TRANSLATORS: command line option: a list of files to install
 #: ../contrib/device-rebind/pk-device-rebind.c:300
 msgid "Device paths"
-msgstr "Dirección de dispositivo"
+msgstr "Rutas de dispositivo"
 
 #. TRANSLATORS: tool that gets called when the device needs reloading after installing firmware
 #: ../contrib/device-rebind/pk-device-rebind.c:315
@@ -1058,32 +1058,32 @@ msgstr "Recargador de Dispositivo de PackageKit"
 #. TRANSLATORS: user did not specify a valid device sysfs path
 #: ../contrib/device-rebind/pk-device-rebind.c:323
 msgid "You need to specify at least one valid device path"
-msgstr "Necesita especificar al menos una dirección de dispositivo válida"
+msgstr "Necesita especificar al menos una ruta de dispositivo válida"
 
 #. TRANSLATORS: user did not specify a valid device sysfs path
 #: ../contrib/device-rebind/pk-device-rebind.c:333
 msgid "This script can only be used by the root user"
-msgstr "Este script sólo puede ser usado por el usuario root"
+msgstr "Este script sólo puede ser utilizado por el usuario root"
 
 #. TRANSLATORS: we're going to verify the path first
 #: ../contrib/device-rebind/pk-device-rebind.c:342
 msgid "Verifying device path"
-msgstr "Verificando dirección de dispositivo"
+msgstr "Verificando ruta de dispositivo"
 
 #. TRANSLATORS: user did not specify a device sysfs path that exists
 #: ../contrib/device-rebind/pk-device-rebind.c:347
 msgid "Failed to verify device path"
-msgstr "Falló al verificar la dirección del dispositivo"
+msgstr "Falló al verificar la ruta del dispositivo"
 
 #. TRANSLATORS: we're going to try
 #: ../contrib/device-rebind/pk-device-rebind.c:361
 msgid "Attempting to rebind device"
-msgstr "Intentando reconectar dispositivo"
+msgstr "Intentando volver a asociar dispositivo"
 
 #. TRANSLATORS: we failed to release the current driver
 #: ../contrib/device-rebind/pk-device-rebind.c:366
 msgid "Failed to rebind device"
-msgstr "Falló al reconectar el dispositivo"
+msgstr "Falló al reasociar el dispositivo"
 
 #: ../data/packagekit-catalog.xml.in.h:1
 msgid "PackageKit Catalog"
@@ -1100,7 +1100,7 @@ msgstr "Paquete de servicio de PackageKit"
 #: ../lib/packagekit-glib2/pk-console-shared.c:59
 #, c-format
 msgid "Please enter a number from 1 to %i: "
-msgstr "Introduzca un número de 1 a %i: "
+msgstr "Introduzca un número del 1 al %i: "
 
 #. TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages
 #: ../lib/packagekit-glib2/pk-console-shared.c:185
@@ -1130,7 +1130,7 @@ msgstr "Esperando en cola"
 #. TRANSLATORS: transaction state, just started
 #: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
-msgstr "Corriendo"
+msgstr "Ejecutando"
 
 #. TRANSLATORS: transaction state, is querying data
 #: ../lib/packagekit-glib2/pk-console-shared.c:267
@@ -1140,7 +1140,7 @@ msgstr "Consultando"
 #. TRANSLATORS: transaction state, getting data from a server
 #: ../lib/packagekit-glib2/pk-console-shared.c:271
 msgid "Getting information"
-msgstr "Obteniendo.información"
+msgstr "Obteniendo información"
 
 #. TRANSLATORS: transaction state, removing packages
 #: ../lib/packagekit-glib2/pk-console-shared.c:275
@@ -1157,7 +1157,7 @@ msgstr "Descargando paquetes"
 #. TRANSLATORS: transaction state, refreshing internal lists
 #: ../lib/packagekit-glib2/pk-console-shared.c:287
 msgid "Refreshing software list"
-msgstr "Refrescando listado de software"
+msgstr "Actualizando la lista de software"
 
 #. TRANSLATORS: transaction state, installing updates
 #: ../lib/packagekit-glib2/pk-console-shared.c:291
@@ -1194,12 +1194,12 @@ msgstr "Retrocediendo"
 #. TRANSLATORS: transaction state, when we're doing a test transaction
 #: ../lib/packagekit-glib2/pk-console-shared.c:315
 msgid "Testing changes"
-msgstr "Comprobando cambios"
+msgstr "Comprobando modificaciones"
 
 #. TRANSLATORS: transaction state, when we're writing to the system package database
 #: ../lib/packagekit-glib2/pk-console-shared.c:319
 msgid "Committing changes"
-msgstr "Realizando cambios"
+msgstr "Realizando modificaciones"
 
 #. TRANSLATORS: transaction state, requesting data from a server
 #: ../lib/packagekit-glib2/pk-console-shared.c:323
@@ -1214,7 +1214,7 @@ msgstr "Finalizado"
 #. TRANSLATORS: transaction state, in the process of cancelling
 #: ../lib/packagekit-glib2/pk-console-shared.c:331
 msgid "Cancelling"
-msgstr "Cancelado"
+msgstr "Cancelando"
 
 #. TRANSLATORS: transaction state, downloading metadata
 #: ../lib/packagekit-glib2/pk-console-shared.c:335
@@ -1229,12 +1229,12 @@ msgstr "Descargando listas de paquetes"
 #. TRANSLATORS: transaction state, downloading metadata
 #: ../lib/packagekit-glib2/pk-console-shared.c:343
 msgid "Downloading file lists"
-msgstr "Descargando listados de archivos"
+msgstr "Descargando listas de archivos"
 
 #. TRANSLATORS: transaction state, downloading metadata
 #: ../lib/packagekit-glib2/pk-console-shared.c:347
 msgid "Downloading lists of changes"
-msgstr "Descargando listas de cambios"
+msgstr "Descargando listas de modificaciones"
 
 #. TRANSLATORS: transaction state, downloading metadata
 #: ../lib/packagekit-glib2/pk-console-shared.c:351
@@ -1249,7 +1249,7 @@ msgstr "Descargando información de la actualización"
 #. TRANSLATORS: transaction state, repackaging delta files
 #: ../lib/packagekit-glib2/pk-console-shared.c:359
 msgid "Repackaging files"
-msgstr "Empaquetando archivos"
+msgstr "Volviendo a empaquetar archivos"
 
 #. TRANSLATORS: transaction state, loading databases
 #: ../lib/packagekit-glib2/pk-console-shared.c:363
@@ -1274,7 +1274,7 @@ msgstr "Esperando bloqueo del administrador de paquetes"
 #. TRANSLATORS: transaction state, waiting for user to type in a password
 #: ../lib/packagekit-glib2/pk-console-shared.c:379
 msgid "Waiting for authentication"
-msgstr "Esperando por la autentificación"
+msgstr "Esperando autenticación"
 
 #. TRANSLATORS: transaction state, we are updating the list of processes
 #: ../lib/packagekit-glib2/pk-console-shared.c:383
@@ -1289,7 +1289,7 @@ msgstr "Comprobando aplicaciones en uso"
 #. TRANSLATORS: transaction state, we are checking for libraries currently in use
 #: ../lib/packagekit-glib2/pk-console-shared.c:391
 msgid "Checking libraries in use"
-msgstr "Comprobando Librerías en uso"
+msgstr "Comprobando bibliotecas en uso"
 
 #. TRANSLATORS: transaction state, we are copying package files before or after the transaction
 #: ../lib/packagekit-glib2/pk-console-shared.c:395
@@ -1319,7 +1319,7 @@ msgstr "Seguridad"
 #. TRANSLATORS: The type of update
 #: ../lib/packagekit-glib2/pk-console-shared.c:429
 msgid "Bug fix "
-msgstr "Corrijiendo error"
+msgstr "Solución de error"
 
 #. TRANSLATORS: The type of update
 #: ../lib/packagekit-glib2/pk-console-shared.c:433
@@ -1395,22 +1395,22 @@ msgstr "Eliminados"
 #. TRANSLATORS: The action of the package, in past tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:523
 msgid "Cleaned up"
-msgstr "Limpiados"
+msgstr "Limpios"
 
 #. TRANSLATORS: The action of the package, in past tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:527
 msgid "Obsoleted"
-msgstr "Obsoleto"
+msgstr "Obsoletos"
 
 #. TRANSLATORS: The action of the package, in past tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:531
 msgid "Reinstalled"
-msgstr "Reinstalado"
+msgstr "Reinstalados"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:549
 msgid "Unknown role type"
-msgstr "Tipo de rol desconocido"
+msgstr "Tipo de función desconocido"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:553
@@ -1465,7 +1465,7 @@ msgstr "Instalando archivos"
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:601
 msgid "Refreshing cache"
-msgstr "Refrescando caché"
+msgstr "Actualizando el caché"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:605
@@ -1475,7 +1475,7 @@ msgstr "Actualizando paquetes"
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:609
 msgid "Updating system"
-msgstr "Actualizando sistema"
+msgstr "Actualizando el sistema"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:613
@@ -1495,7 +1495,7 @@ msgstr "Habilitando repositorio"
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:629
 msgid "Setting data"
-msgstr "Poniendo datos"
+msgstr "Definiendo los datos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:633
@@ -1525,7 +1525,7 @@ msgstr "Obteniendo paquetes"
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:653
 msgid "Accepting EULA"
-msgstr "Aceptando EULA"
+msgstr "Aceptando el Acuerdo de licencia de usuario final (EULA, por las iniciales en inglés de End User License Agreement)"
 
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:661
@@ -1556,7 +1556,7 @@ msgstr "Simulando eliminación"
 #. TRANSLATORS: The role of the transaction, in present tense
 #: ../lib/packagekit-glib2/pk-console-shared.c:685
 msgid "Simulating update"
-msgstr "Sumulando la actualización"
+msgstr "Simulando la actualización"
 
 #. TRANSLATORS: ask the user if they are comfortable installing insecure packages
 #: ../lib/packagekit-glib2/pk-task-text.c:69
@@ -1651,7 +1651,7 @@ msgstr "Etiqueta del medio"
 #. TRANSLATORS: the media description, usually like 'Fedora 12 disk 5'
 #: ../lib/packagekit-glib2/pk-task-text.c:276
 msgid "Text"
-msgstr "TExto"
+msgstr "Texto"
 
 #. TRANSLATORS: ask the user to insert the media
 #: ../lib/packagekit-glib2/pk-task-text.c:282
@@ -1666,32 +1666,32 @@ msgstr "El medio correcto no fue insertado."
 #. TRANSLATORS: When processing, we might have to remove other dependencies
 #: ../lib/packagekit-glib2/pk-task-text.c:302
 msgid "The following packages have to be removed:"
-msgstr "Se eliminarán los siguientes paquetes:"
+msgstr "Los siguientes paquetes deben ser eliminados:"
 
 #. TRANSLATORS: When processing, we might have to install other dependencies
 #: ../lib/packagekit-glib2/pk-task-text.c:307
 msgid "The following packages have to be installed:"
-msgstr "Los siguientes paquetes se deben instalar:"
+msgstr "Los siguientes paquetes tienen que ser instalados:"
 
 #. TRANSLATORS: When processing, we might have to update other dependencies
 #: ../lib/packagekit-glib2/pk-task-text.c:312
 msgid "The following packages have to be updated:"
-msgstr "Los siguientes paquetes se deben actualizar:"
+msgstr "Los siguientes paquetes tienen que ser actualizados:"
 
 #. TRANSLATORS: When processing, we might have to reinstall other dependencies
 #: ../lib/packagekit-glib2/pk-task-text.c:317
 msgid "The following packages have to be reinstalled:"
-msgstr "Los siguientes paquetes se deben reinstalar:"
+msgstr "Los siguientes paquetes tienen que ser reinstalados:"
 
 #. TRANSLATORS: When processing, we might have to downgrade other dependencies
 #: ../lib/packagekit-glib2/pk-task-text.c:322
 msgid "The following packages have to be downgraded:"
-msgstr "Los siguientes paquetes se deben desactualizar:"
+msgstr "Los siguientes paquetes tienen que ser desactualizados:"
 
 #. TRANSLATORS: ask the user if the proposed changes are okay
 #: ../lib/packagekit-glib2/pk-task-text.c:382
 msgid "Proceed with changes?"
-msgstr "¿Proceder con los cambios?"
+msgstr "¿Continuar con las modificaciones?"
 
 #. TRANSLATORS: tell the user we didn't do anything
 #: ../lib/packagekit-glib2/pk-task-text.c:387
@@ -1710,51 +1710,51 @@ msgstr "Aceptar EULA"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:8
 msgid "Authentication is required to accept a EULA"
-msgstr "Se necesita autenticación para aceptar una EULA"
+msgstr "Es necesario autenticarse para aceptar un EULA"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:9
 msgid "Authentication is required to cancel a task that was not started by yourself"
-msgstr "Se necesita autenticación para cancelar una tarea que no inició usted"
+msgstr "Es necesario autenticarse para cancelar una tarea que usted no ha iniciado"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:10
 msgid "Authentication is required to change software source parameters"
-msgstr "Se necesita autenticación para cambiar los parámetros de fuente de software"
+msgstr "Es necesario autenticarse para modificar parámetros de una fuente de software"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:11
 msgid "Authentication is required to consider a key used for signing packages as trusted"
-msgstr "Se necesita autenticación para considerar una clave usada para firmar paquetes como confiable"
+msgstr "Es necesario autenticarse para considerar confiable a una clave utilizada para identificar paquetes"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:12
 msgid "Authentication is required to install a signed package"
-msgstr "Se necesita autenticación para instalar un paquete firmado"
+msgstr "Es necesario autenticarse para instalar un paquete firmado"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:13
 msgid "Authentication is required to install an untrusted package"
-msgstr "Se necesita autenticación para instalar un paquete no confiable"
+msgstr "Es necesario autenticarse para instalar un paquete no confiable"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:14
 msgid "Authentication is required to refresh the system sources"
-msgstr "Se necesita autenticación para refrescar las fuentes del sistema"
+msgstr "Es necesario autenticarse para actualizar las fuentes del sistema"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:15
 msgid "Authentication is required to reload the device with a new driver"
-msgstr "Se necesita autenticación para recargar el dispositivo con un controlador nuevo"
+msgstr "Es necesario autenticarse para recargar el dispositivo con un controlador nuevo"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:16
 msgid "Authentication is required to remove packages"
-msgstr "Se necesita autenticación para eliminar paquetes"
+msgstr "Es necesario autenticarse para eliminar paquetes"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:17
 msgid "Authentication is required to rollback a transaction"
-msgstr "Se necesita autenticación para deshacer una transacción"
+msgstr "Es necesario autenticarse para deshacer una transacción"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:18
 msgid "Authentication is required to set the network proxy used for downloading packages"
-msgstr "Se necesita autenticación para cambiar el proxy de red usado para descargar paquetes"
+msgstr "Es necesario autenticarse para modificar el proxy de red utilizado para descargar paquetes"
 
 #: ../policy/org.freedesktop.packagekit.policy.in.h:19
 msgid "Authentication is required to update packages"
-msgstr "Se necesita autenticación para actualizar paquetes"
+msgstr "Es necesario autenticarse para actualizar paquetes"
 
 #. SECURITY:
 #. - Normal users are allowed to cancel their own task without
@@ -1772,7 +1772,7 @@ msgstr "Cancelar tarea externa"
 #.
 #: ../policy/org.freedesktop.packagekit.policy.in.h:31
 msgid "Change software source parameters"
-msgstr "Cambiar los parámetros de fuente de software"
+msgstr "Modificar los parámetros de fuente de software"
 
 #. SECURITY:
 #. - Normal users do not need authentication to install signed packages
@@ -1800,7 +1800,7 @@ msgstr "Instalar archivo local no-confiable"
 #.
 #: ../policy/org.freedesktop.packagekit.policy.in.h:50
 msgid "Refresh system sources"
-msgstr "Refrescar las fuentes del sistema"
+msgstr "Actualizar las fuentes del sistema"
 
 #. SECURITY:
 #. - Normal users require admin authentication to rebind a driver
@@ -1851,7 +1851,7 @@ msgstr "Establecer el proxy de la red"
 #.
 #: ../policy/org.freedesktop.packagekit.policy.in.h:86
 msgid "Trust a key used for signing packages"
-msgstr "Confiar en una llave usada para firmar paquetes"
+msgstr "Confiar en una llave utilizada para firmar paquetes"
 
 #. SECURITY:
 #. - Normal users do not require admin authentication to update the
@@ -1872,12 +1872,12 @@ msgstr "El arranque falló debido a políticas de seguridad en esta máquina."
 #. TRANSLATORS: only two ways this can fail...
 #: ../src/pk-main.c:89
 msgid "This can happen for two reasons:"
-msgstr "Esto puede pasar por dos razones:"
+msgstr "Esto puede suceder por dos razones:"
 
 #. TRANSLATORS: only allowed to be owned by root
 #: ../src/pk-main.c:91
 msgid "The correct user is not launching the executable (usually root)"
-msgstr "El usuario correcto no esta lanzando el ejecutable (generalmente root)"
+msgstr "El usuario correcto no esta iniciando el ejecutable (generalmente root)"
 
 #. TRANSLATORS: or we are installed in a prefix
 #: ../src/pk-main.c:93
@@ -1887,12 +1887,12 @@ msgstr "El archivo org.freedesktop.PackageKit.conf no está instalado en el dire
 #. TRANSLATORS: a backend is the system package tool, e.g. yum, apt
 #: ../src/pk-main.c:199
 msgid "Packaging backend to use, e.g. dummy"
-msgstr "Administrador de paquetes que usar, ej. dummy"
+msgstr "Motor de paquetes a ser utilizado, ej. dummy"
 
 #. TRANSLATORS: if we should run in the background
 #: ../src/pk-main.c:202
 msgid "Daemonize and detach from the terminal"
-msgstr "Demonizar y desacoplar de la terminal"
+msgstr "Demonizar y desasociar de la terminal"
 
 #. TRANSLATORS: if we should not monitor how long we are inactive for
 #: ../src/pk-main.c:205
@@ -1912,7 +1912,7 @@ msgstr "Salir después de una pequeña pausa"
 #. TRANSLATORS: exit straight away, used for automatic profiling
 #: ../src/pk-main.c:214
 msgid "Exit after the engine has loaded"
-msgstr "Salir después de que el motor este cargado"
+msgstr "Salir después que sea cargado el motor"
 
 #. TRANSLATORS: describing the service that is running
 #: ../src/pk-main.c:229
@@ -1945,7 +1945,7 @@ msgstr "No actualice este paquete a menos que sepa con certeza que es seguro hac
 
 #: ../src/pk-polkit-action-lookup.c:177
 msgid "Do not update these packages unless you are sure it is safe to do so."
-msgstr "No actualice estos paquete a menos que sepa con certeza que es seguro hacerlo."
+msgstr "No actualice estos paquetes a menos que sepa con certeza que es seguro hacerlo."
 
 #: ../src/pk-polkit-action-lookup.c:195
 msgid "Do not install this package unless you are sure it is safe to do so."
@@ -1953,7 +1953,7 @@ msgstr "No instale este paquete a menos que sepa con certeza que es seguro hacer
 
 #: ../src/pk-polkit-action-lookup.c:196
 msgid "Do not install these packages unless you are sure it is safe to do so."
-msgstr "No instale estos paquete a menos que sepa con certeza que es seguro hacerlo."
+msgstr "No instale estos paquetes a menos que sepa con certeza que es seguro hacerlo."
 
 #. TRANSLATORS: too many packages to list each one
 #: ../src/pk-polkit-action-lookup.c:273
commit 0e674e4f4fc54670dcd0d8c46df9c07be949e78f
Author: raven <raven at fedoraproject.org>
Date:   Sat Apr 3 11:35:41 2010 +0000

    l10n: Updates to Polish (pl) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pl.po b/po/pl.po
index d9d426f..f8d6c60 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-02 10:29+0000\n"
-"PO-Revision-Date: 2010-04-02 12:54+0200\n"
+"POT-Creation-Date: 2010-04-03 11:30+0000\n"
+"PO-Revision-Date: 2010-04-03 13:35+0200\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <trans-pl at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -324,7 +324,7 @@ msgstr ""
 #: ../client/pk-console.c:852
 #, c-format
 msgid ""
-"Extected package name, actually got file. Try using 'pkcon install-local %s' "
+"Expected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
 "Oczekiwano nazwy pakietu, otrzymano plik. Proszę zamiast tego spróbować "
@@ -543,10 +543,9 @@ msgstr "Proszę ustawić nazwy plików zależności do wykluczenia"
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
+msgid "The output file or directory (the current directory is used if omitted)"
 msgstr ""
-"Plik lub katalog wyjścia (użyty zostanie bieżący katalog, jeśli zostanie "
+"Plik lub katalog wyjściowy (użyty zostanie bieżący katalog, jeśli zostanie "
 "pominięte)"
 
 #. TRANSLATORS: put a list of packages in the pack
@@ -572,11 +571,11 @@ msgstr "Wybrano obie opcje."
 #. TRANSLATORS: This is when the user fails to supply the output
 #: ../client/pk-generate-pack.c:324
 msgid "A output directory or file name is required"
-msgstr "Wymagany jest katalog lub nazwa pliku wyjścia"
+msgstr "Wymagany jest katalog lub nazwa pliku wyjściowego"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
+msgid "The daemon failed to startup"
 msgstr "Uruchomienie demona nie powiodło się"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
commit 0a0c741e1968add33bf3f63bfbc2cc4d672889d6
Author: yurchor <yurchor at fedoraproject.org>
Date:   Sat Apr 3 05:57:11 2010 +0000

    l10n: Updates to Ukrainian (uk) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/uk.po b/po/uk.po
index c8659a7..f7a3967 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-04-02 14:15+0000\n"
-"PO-Revision-Date: 2010-04-02 20:17+0300\n"
+"POT-Creation-Date: 2010-04-03 04:18+0000\n"
+"PO-Revision-Date: 2010-04-03 08:56+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor at ukr.net>\n"
 "Language-Team: Ukrainian <translation at linux.org.ua>\n"
 "MIME-Version: 1.0\n"
@@ -326,7 +326,7 @@ msgstr ""
 #: ../client/pk-console.c:852
 #, c-format
 msgid ""
-"Extected package name, actually got file. Try using 'pkcon install-local %s' "
+"Expected package name, actually got file. Try using 'pkcon install-local %s' "
 "instead."
 msgstr ""
 "Мало бути передано назву пакунка, передано файл. Спробуйте скористатися "
@@ -545,8 +545,7 @@ msgstr "Вкажіть назви файлів залежностей, які с
 
 #. TRANSLATORS: the output location
 #: ../client/pk-generate-pack.c:258
-msgid ""
-"The output file or directory (the current directory is used if ommitted)"
+msgid "The output file or directory (the current directory is used if omitted)"
 msgstr ""
 "Файл або каталог виведення даних (якщо пропустити, буде використано поточний "
 "каталог)"
@@ -576,9 +575,9 @@ msgstr "Обрано обидва параметра."
 msgid "A output directory or file name is required"
 msgstr "Слід вказати каталог або файл для виведення даних"
 
-#. TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup
+#. TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup
 #: ../client/pk-generate-pack.c:342
-msgid "The dameon failed to startup"
+msgid "The daemon failed to startup"
 msgstr "Не вдалося запустити фонову службу"
 
 #. TRANSLATORS: This is when the backend doesn't have the capability to get-depends
commit a215659436fd2a1abf2295b844d73008235c8f21
Author: Yuri Chornoivan <yurchor at ukr.net>
Date:   Fri Apr 2 20:47:13 2010 +0100

    Fix up three typos in translated strings
    
    Signed-off-by: Richard Hughes <richard at hughsie.com>

diff --git a/client/pk-console.c b/client/pk-console.c
index d9c1317..24a4402 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -849,7 +849,7 @@ pk_console_install_packages (gchar **packages, GError **error)
 		ret = !g_file_test (packages[i], G_FILE_TEST_EXISTS);
 		if (!ret) {
 			/* TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm' */
-			*error = g_error_new (1, 0, _("Extected package name, actually got file. Try using 'pkcon install-local %s' instead."), packages[i]);
+			*error = g_error_new (1, 0, _("Expected package name, actually got file. Try using 'pkcon install-local %s' instead."), packages[i]);
 			goto out;
 		}
 	}
diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index 4959428..1b2da1d 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -255,7 +255,7 @@ main (int argc, char *argv[])
 			_("Set the file name of dependencies to be excluded"), NULL},
 		{ "output", 'o', 0, G_OPTION_ARG_STRING, &directory,
 			/* TRANSLATORS: the output location */
-			_("The output file or directory (the current directory is used if ommitted)"), NULL},
+			_("The output file or directory (the current directory is used if omitted)"), NULL},
 		{ "package", 'p', 0, G_OPTION_ARG_STRING, &package,
 			/* TRANSLATORS: put a list of packages in the pack */
 			_("The package to be put into the service pack"), NULL},
@@ -338,8 +338,8 @@ main (int argc, char *argv[])
 	control = pk_control_new ();
 	ret = pk_control_get_properties (control, NULL, &error);
 	if (!ret) {
-		/* TRANSLATORS: This is when the dameon is not-installed/broken and fails to startup */
-		g_print ("%s: %s\n", _("The dameon failed to startup"), error->message);
+		/* TRANSLATORS: This is when the daemon is not-installed/broken and fails to startup */
+		g_print ("%s: %s\n", _("The daemon failed to startup"), error->message);
 		goto out;
 	}
 
commit 6d937aaeab8173494ae4aa4ac018311c5ace2131
Author: yurchor <yurchor at fedoraproject.org>
Date:   Fri Apr 2 17:17:53 2010 +0000

    l10n: Updates to Ukrainian (uk) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/uk.po b/po/uk.po
index 5bbb994..c8659a7 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit.master\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-10 17:38+0000\n"
-"PO-Revision-Date: 2010-03-10 20:19+0200\n"
+"POT-Creation-Date: 2010-04-02 14:15+0000\n"
+"PO-Revision-Date: 2010-04-02 20:17+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor at ukr.net>\n"
 "Language-Team: Ukrainian <translation at linux.org.ua>\n"
 "MIME-Version: 1.0\n"
@@ -20,115 +20,115 @@ msgstr ""
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175 ../client/pk-console.c:597
+#: ../client/pk-console.c:176 ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Операція"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Системний час"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Успішне"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Так"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Ні"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Роль"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Тривалість"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(секунд)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Командний рядок"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "ІД користувача"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Користувач"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "Справжнє ім’я"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Задіяні пакунки:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Задіяні пакунки: Немає"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Дистрибутив"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Тип"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252 ../client/pk-console.c:291
+#: ../client/pk-console.c:253 ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Резюме"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Категорія"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "ІД"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Батьківська"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Назва"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Значок"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Подробиці щодо оновлення:"
 
@@ -137,7 +137,7 @@ msgstr "Подробиці щодо оновлення:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346 ../client/pk-console.c:616
+#: ../client/pk-console.c:347 ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -148,165 +148,165 @@ msgstr[1] "Пакунки"
 msgstr[2] "Пакунки"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Оновлює"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Робить застарілим"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357 ../lib/packagekit-glib2/pk-task-text.c:211
+#: ../client/pk-console.c:358 ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Постачальник"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Перезапуск"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Текст оновлення"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Зміни"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Стан"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Випущено"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389 ../lib/packagekit-glib2/pk-console-shared.c:510
+#: ../client/pk-console.c:390 ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Оновлено"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Увімкнено"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Вимкнено"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Перезавантаження системи потрібне для:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Перезапуск сеансу потрібен:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Потрібне перезавантаження системи (безпека) для:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Потрібен перезапуск сеансу (безпека):"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Потрібен перезапуск програми для:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Опис пакунка"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Повідомлення:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Без файлів"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Файли пакунка"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Відсотки"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Стан"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Результат:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Критична помилка"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "Спроба виконання операції зазнала невдачі"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "На поточний момент оновлень не виявлено."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "На поточний момент оновлень не виявлено."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Щоб завершити оновлення, перезавантажте систему."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr "Щоб завершити оновлення, вийдіть з облікового запису і увійдіть знову."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
@@ -314,7 +314,7 @@ msgstr ""
 "перезавантажте систему, щоб завершити встановлення важливих оновлень безпеки."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
@@ -323,7 +323,7 @@ msgstr ""
 "запису і увійдіть до нього знову."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid ""
 "Extected package name, actually got file. Try using 'pkcon install-local %s' "
@@ -333,19 +333,19 @@ msgstr ""
 "командою «pkcon install-local %s»."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Програмі не вдалося знайти жодного доступного пакунка: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Програмі не вдалося знайти встановлений пакунок: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915 ../client/pk-console.c:943
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Програмі не вдалося знайти пакунок: %s"
@@ -354,63 +354,63 @@ msgstr "Програмі не вдалося знайти пакунок: %s"
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971 ../client/pk-console.c:999
-#: ../client/pk-console.c:1027 ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972 ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028 ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Програмі не вдалося знайти всі пакунки: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "Аварійне завершення фонової служби під час операції!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Консольний інтерфейс PackageKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Підкоманди:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr "Не вдалося визначити час, коли цю дію було виконано востаннє"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263 ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Показати версію програми і завершити роботу"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Встановити фільтр, наприклад, встановлені"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Завершити роботу, не чекаючи на завершення дії"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Встановити пакунки без запиту щодо підтвердження"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Виконати команду з мінімальним використанням мережевого каналу і меншою "
 "витратою ресурсів системи"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -418,118 +418,123 @@ msgstr ""
 "анімованих віджетів"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Не вдалося зв’язатися з PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "Не вдалося встановити параметри проксі-сервера"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "Вказано некоректний фільтр"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Тип пошуку, якщо такий потрібен, наприклад, назва"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384 ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408 ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Потрібен ключ пошуку"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Некоректний тип пошуку"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Слід вказати назву пакунка, який слід встановити"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Слід вказати назву файла, який слід встановити"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Слід вказати тип, ідентифікатор ключа і ідентифікатор пакунка"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Слід вказати назву пакунка, який потрібно вилучити"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr ""
 "Слід вказати каталог призначення і назви пакунків, які потрібно звантажити"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Каталог не знайдено"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Слід вказати ідентифікатор ліцензії (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Слід вказати ідентифікатор операції (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Слід вказати назву пакунка для розв’язання конфлікту"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536 ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Слід вказати назву сховища"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Слід вказати назву сховища, параметр і значення"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Слід вказати дію, наприклад «update-system»"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Слід вказати належну роль"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592 ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616 ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645 ../client/pk-generate-pack.c:316
+#: ../client/pk-console.c:1611 ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635 ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Слід вказати назву пакунка"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Слід вказати рядок вмісту"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Підтримки параметра «%s» не передбачено"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Спроба виконання команди зазнала невдачі"
 
@@ -644,12 +649,12 @@ msgstr "Створено пакунок з обслуговування «%s»"
 msgid "Failed to create '%s': %s"
 msgstr "Не вдалося створити «%s»: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Спроба визначення стану фонової служби завершилася невдало"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "Монітор PackageKit"
 
@@ -708,43 +713,43 @@ msgid "Installing..."
 msgstr "Встановлення..."
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Звантаження даних щодо джерел програмного забезпечення."
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr ""
 "Звантаження списків файлів (виконання цієї дії може бути досить тривалим)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Очікування на зняття блокування керування пакунками."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Завантаження списку пакунків."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Не вдалося виконати пошук файла"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Не вдалося запустити:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "Не вдалося встановити пакунки"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "Команди PackageKit не знайдено"
 
@@ -754,51 +759,51 @@ msgid "Command not found."
 msgstr "Команду не знайдено."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Подібною командою є:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Виконати подібну команду:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Подібними командами є:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Будь ласка, оберіть команду, яку слід виконати"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "Пакунком, що містити цей файл є:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Встановити пакунок «%s», щоб забезпечити виконання команди «%s»?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Серед пакунків, що містять цей файл:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Відповідними пакунками є:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Будь ласка, оберіть пакунок, який слід встановити"
 
@@ -967,7 +972,7 @@ msgstr "Не встановлювати пакунки у режимі іміт
 #. TRANSLATORS: we are now installing the debuginfo packages we found earlier
 #. TRANSLATORS: transaction state, installing packages
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:862
-#: ../lib/packagekit-glib2/pk-console-shared.c:282
+#: ../lib/packagekit-glib2/pk-console-shared.c:283
 #, c-format
 msgid "Installing packages"
 msgstr "Встановлення пакунків"
@@ -1104,7 +1109,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Будь ласка, введіть число від 1 до %i: "
 
 #. TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:183
+#: ../lib/packagekit-glib2/pk-console-shared.c:185
 msgid "More than one package matches:"
 msgstr "З ключем пошуку збігається декілька пакунків:"
 
@@ -1114,448 +1119,448 @@ msgid "Please choose the correct package: "
 msgstr "Будь ласка, оберіть належний пакунок:"
 
 #. TRANSLATORS: This is when the transaction status is not known
-#: ../lib/packagekit-glib2/pk-console-shared.c:250
+#: ../lib/packagekit-glib2/pk-console-shared.c:251
 msgid "Unknown state"
 msgstr "Невідомий стан"
 
 #. TRANSLATORS: transaction state, the daemon is in the process of starting
-#: ../lib/packagekit-glib2/pk-console-shared.c:254
+#: ../lib/packagekit-glib2/pk-console-shared.c:255
 msgid "Starting"
 msgstr "Запуск"
 
 #. TRANSLATORS: transaction state, the transaction is waiting for another to complete
-#: ../lib/packagekit-glib2/pk-console-shared.c:258
+#: ../lib/packagekit-glib2/pk-console-shared.c:259
 msgid "Waiting in queue"
 msgstr "Очікування у черзі"
 
 #. TRANSLATORS: transaction state, just started
-#: ../lib/packagekit-glib2/pk-console-shared.c:262
+#: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
 msgstr "Виконання"
 
 #. TRANSLATORS: transaction state, is querying data
-#: ../lib/packagekit-glib2/pk-console-shared.c:266
+#: ../lib/packagekit-glib2/pk-console-shared.c:267
 msgid "Querying"
 msgstr "Виконання запиту"
 
 #. TRANSLATORS: transaction state, getting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:270
+#: ../lib/packagekit-glib2/pk-console-shared.c:271
 msgid "Getting information"
 msgstr "Отримання інформації"
 
 #. TRANSLATORS: transaction state, removing packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:274
+#: ../lib/packagekit-glib2/pk-console-shared.c:275
 msgid "Removing packages"
 msgstr "Вилучення пакунків"
 
 #. TRANSLATORS: transaction state, downloading package files
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:278
-#: ../lib/packagekit-glib2/pk-console-shared.c:656
+#: ../lib/packagekit-glib2/pk-console-shared.c:279
+#: ../lib/packagekit-glib2/pk-console-shared.c:657
 msgid "Downloading packages"
 msgstr "Звантаження пакунків"
 
 #. TRANSLATORS: transaction state, refreshing internal lists
-#: ../lib/packagekit-glib2/pk-console-shared.c:286
+#: ../lib/packagekit-glib2/pk-console-shared.c:287
 msgid "Refreshing software list"
 msgstr "Освіження списку програм"
 
 #. TRANSLATORS: transaction state, installing updates
-#: ../lib/packagekit-glib2/pk-console-shared.c:290
+#: ../lib/packagekit-glib2/pk-console-shared.c:291
 msgid "Installing updates"
 msgstr "Встановлення оновлень"
 
 #. TRANSLATORS: transaction state, removing old packages, and cleaning config files
-#: ../lib/packagekit-glib2/pk-console-shared.c:294
+#: ../lib/packagekit-glib2/pk-console-shared.c:295
 msgid "Cleaning up packages"
 msgstr "Вилучення зайвих пакунків"
 
 #. TRANSLATORS: transaction state, obsoleting old packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:298
+#: ../lib/packagekit-glib2/pk-console-shared.c:299
 msgid "Obsoleting packages"
 msgstr "Вилучення застарілих пакунків"
 
 #. TRANSLATORS: transaction state, checking the transaction before we do it
-#: ../lib/packagekit-glib2/pk-console-shared.c:302
+#: ../lib/packagekit-glib2/pk-console-shared.c:303
 msgid "Resolving dependencies"
 msgstr "Розв’язання залежностей"
 
 #. TRANSLATORS: transaction state, checking if we have all the security keys for the operation
-#: ../lib/packagekit-glib2/pk-console-shared.c:306
+#: ../lib/packagekit-glib2/pk-console-shared.c:307
 msgid "Checking signatures"
 msgstr "Перевірка підписів"
 
 #. TRANSLATORS: transaction state, when we return to a previous system state
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:310
-#: ../lib/packagekit-glib2/pk-console-shared.c:616
+#: ../lib/packagekit-glib2/pk-console-shared.c:311
+#: ../lib/packagekit-glib2/pk-console-shared.c:617
 msgid "Rolling back"
 msgstr "Повернення до попереднього"
 
 #. TRANSLATORS: transaction state, when we're doing a test transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:314
+#: ../lib/packagekit-glib2/pk-console-shared.c:315
 msgid "Testing changes"
 msgstr "Випробування змін"
 
 #. TRANSLATORS: transaction state, when we're writing to the system package database
-#: ../lib/packagekit-glib2/pk-console-shared.c:318
+#: ../lib/packagekit-glib2/pk-console-shared.c:319
 msgid "Committing changes"
 msgstr "Застосування змін"
 
 #. TRANSLATORS: transaction state, requesting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:322
+#: ../lib/packagekit-glib2/pk-console-shared.c:323
 msgid "Requesting data"
 msgstr "Запит щодо даних"
 
 #. TRANSLATORS: transaction state, all done!
-#: ../lib/packagekit-glib2/pk-console-shared.c:326
+#: ../lib/packagekit-glib2/pk-console-shared.c:327
 msgid "Finished"
 msgstr "Завершено"
 
 #. TRANSLATORS: transaction state, in the process of cancelling
-#: ../lib/packagekit-glib2/pk-console-shared.c:330
+#: ../lib/packagekit-glib2/pk-console-shared.c:331
 msgid "Cancelling"
 msgstr "Скасування"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:334
+#: ../lib/packagekit-glib2/pk-console-shared.c:335
 msgid "Downloading repository information"
 msgstr "Звантаження інформації про сховище"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:338
+#: ../lib/packagekit-glib2/pk-console-shared.c:339
 msgid "Downloading list of packages"
 msgstr "Звантаження списку пакунків"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:342
+#: ../lib/packagekit-glib2/pk-console-shared.c:343
 msgid "Downloading file lists"
 msgstr "Звантаження списків файлів"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:346
+#: ../lib/packagekit-glib2/pk-console-shared.c:347
 msgid "Downloading lists of changes"
 msgstr "Звантаження списків змін"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:350
+#: ../lib/packagekit-glib2/pk-console-shared.c:351
 msgid "Downloading groups"
 msgstr "Звантаження груп"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:354
+#: ../lib/packagekit-glib2/pk-console-shared.c:355
 msgid "Downloading update information"
 msgstr "Звантаження інформації про оновлення"
 
 #. TRANSLATORS: transaction state, repackaging delta files
-#: ../lib/packagekit-glib2/pk-console-shared.c:358
+#: ../lib/packagekit-glib2/pk-console-shared.c:359
 msgid "Repackaging files"
 msgstr "Перепакування файлів"
 
 #. TRANSLATORS: transaction state, loading databases
-#: ../lib/packagekit-glib2/pk-console-shared.c:362
+#: ../lib/packagekit-glib2/pk-console-shared.c:363
 msgid "Loading cache"
 msgstr "Завантаження кешу"
 
 #. TRANSLATORS: transaction state, scanning for running processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:366
+#: ../lib/packagekit-glib2/pk-console-shared.c:367
 msgid "Scanning applications"
 msgstr "Пошук програм"
 
 #. TRANSLATORS: transaction state, generating a list of packages installed on the system
-#: ../lib/packagekit-glib2/pk-console-shared.c:370
+#: ../lib/packagekit-glib2/pk-console-shared.c:371
 msgid "Generating package lists"
 msgstr "Створення списків пакунків"
 
 #. TRANSLATORS: transaction state, when we're waiting for the native tools to exit
-#: ../lib/packagekit-glib2/pk-console-shared.c:374
+#: ../lib/packagekit-glib2/pk-console-shared.c:375
 msgid "Waiting for package manager lock"
 msgstr "Очікування на зняття блокування керування пакунками"
 
 #. TRANSLATORS: transaction state, waiting for user to type in a password
-#: ../lib/packagekit-glib2/pk-console-shared.c:378
+#: ../lib/packagekit-glib2/pk-console-shared.c:379
 msgid "Waiting for authentication"
 msgstr "Очікування на завершення розпізнавання"
 
 #. TRANSLATORS: transaction state, we are updating the list of processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:382
+#: ../lib/packagekit-glib2/pk-console-shared.c:383
 msgid "Updating running applications"
 msgstr "Оновлення списку запущенний програм"
 
 #. TRANSLATORS: transaction state, we are checking executable files currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:386
+#: ../lib/packagekit-glib2/pk-console-shared.c:387
 msgid "Checking applications in use"
 msgstr "Виявлення програм, що використовуються"
 
 #. TRANSLATORS: transaction state, we are checking for libraries currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:390
+#: ../lib/packagekit-glib2/pk-console-shared.c:391
 msgid "Checking libraries in use"
 msgstr "Виявлення бібліотек, що використовуються"
 
 #. TRANSLATORS: transaction state, we are copying package files before or after the transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:394
+#: ../lib/packagekit-glib2/pk-console-shared.c:395
 msgid "Copying files"
 msgstr "Копіювання файлів"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:412
+#: ../lib/packagekit-glib2/pk-console-shared.c:413
 msgid "Trivial"
 msgstr "Незначне"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:416
+#: ../lib/packagekit-glib2/pk-console-shared.c:417
 msgid "Normal"
 msgstr "Звичайне"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:420
+#: ../lib/packagekit-glib2/pk-console-shared.c:421
 msgid "Important"
 msgstr "Важливе"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:424
+#: ../lib/packagekit-glib2/pk-console-shared.c:425
 msgid "Security"
 msgstr "Безпека"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:428
+#: ../lib/packagekit-glib2/pk-console-shared.c:429
 msgid "Bug fix "
 msgstr "Виправлення вад"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:432
+#: ../lib/packagekit-glib2/pk-console-shared.c:433
 msgid "Enhancement"
 msgstr "Покращення"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:436
+#: ../lib/packagekit-glib2/pk-console-shared.c:437
 msgid "Blocked"
 msgstr "Заблоковане"
 
 #. TRANSLATORS: The state of a package
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:441
-#: ../lib/packagekit-glib2/pk-console-shared.c:514
+#: ../lib/packagekit-glib2/pk-console-shared.c:442
+#: ../lib/packagekit-glib2/pk-console-shared.c:515
 msgid "Installed"
 msgstr "Встановлене"
 
 #. TRANSLATORS: The state of a package, i.e. not installed
-#: ../lib/packagekit-glib2/pk-console-shared.c:446
+#: ../lib/packagekit-glib2/pk-console-shared.c:447
 msgid "Available"
 msgstr "Доступний"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:464
+#: ../lib/packagekit-glib2/pk-console-shared.c:465
 msgid "Downloading"
 msgstr "Звантаження"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:468
+#: ../lib/packagekit-glib2/pk-console-shared.c:469
 msgid "Updating"
 msgstr "Оновлення"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:472
-#: ../lib/packagekit-glib2/pk-console-shared.c:592
+#: ../lib/packagekit-glib2/pk-console-shared.c:473
+#: ../lib/packagekit-glib2/pk-console-shared.c:593
 msgid "Installing"
 msgstr "Встановлення"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:476
-#: ../lib/packagekit-glib2/pk-console-shared.c:588
+#: ../lib/packagekit-glib2/pk-console-shared.c:477
+#: ../lib/packagekit-glib2/pk-console-shared.c:589
 msgid "Removing"
 msgstr "Вилучення"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:480
+#: ../lib/packagekit-glib2/pk-console-shared.c:481
 msgid "Cleaning up"
 msgstr "Очищення"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:484
+#: ../lib/packagekit-glib2/pk-console-shared.c:485
 msgid "Obsoleting"
 msgstr "Робить застарілим"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:488
+#: ../lib/packagekit-glib2/pk-console-shared.c:489
 msgid "Reinstalling"
 msgstr "Перевстановлення"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:506
+#: ../lib/packagekit-glib2/pk-console-shared.c:507
 msgid "Downloaded"
 msgstr "Звантажено"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:518
+#: ../lib/packagekit-glib2/pk-console-shared.c:519
 msgid "Removed"
 msgstr "Вилучено"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:522
+#: ../lib/packagekit-glib2/pk-console-shared.c:523
 msgid "Cleaned up"
 msgstr "Очищено"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:526
+#: ../lib/packagekit-glib2/pk-console-shared.c:527
 msgid "Obsoleted"
 msgstr "Став застарілим"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:530
+#: ../lib/packagekit-glib2/pk-console-shared.c:531
 msgid "Reinstalled"
 msgstr "Перевстановлено"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:548
+#: ../lib/packagekit-glib2/pk-console-shared.c:549
 msgid "Unknown role type"
 msgstr "Невідомий тип"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:552
+#: ../lib/packagekit-glib2/pk-console-shared.c:553
 msgid "Getting dependencies"
 msgstr "Отримання залежностей"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:556
+#: ../lib/packagekit-glib2/pk-console-shared.c:557
 msgid "Getting update details"
 msgstr "Отримання подробиць оновлення"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:560
+#: ../lib/packagekit-glib2/pk-console-shared.c:561
 msgid "Getting details"
 msgstr "Отримання подробиць"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:564
+#: ../lib/packagekit-glib2/pk-console-shared.c:565
 msgid "Getting requires"
 msgstr "Отримання даних про вимоги"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:568
+#: ../lib/packagekit-glib2/pk-console-shared.c:569
 msgid "Getting updates"
 msgstr "Отримання оновлень"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:572
+#: ../lib/packagekit-glib2/pk-console-shared.c:573
 msgid "Searching by details"
 msgstr "Пошук за подробицями"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:576
+#: ../lib/packagekit-glib2/pk-console-shared.c:577
 msgid "Searching by file"
 msgstr "Пошук за файлом"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:580
+#: ../lib/packagekit-glib2/pk-console-shared.c:581
 msgid "Searching groups"
 msgstr "Пошук груп"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:584
+#: ../lib/packagekit-glib2/pk-console-shared.c:585
 msgid "Searching by name"
 msgstr "Пошук за назвою"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:596
+#: ../lib/packagekit-glib2/pk-console-shared.c:597
 msgid "Installing files"
 msgstr "Встановлення файлів"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:600
+#: ../lib/packagekit-glib2/pk-console-shared.c:601
 msgid "Refreshing cache"
 msgstr "Освіження кешу"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:604
+#: ../lib/packagekit-glib2/pk-console-shared.c:605
 msgid "Updating packages"
 msgstr "Оновлення пакунків"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:608
+#: ../lib/packagekit-glib2/pk-console-shared.c:609
 msgid "Updating system"
 msgstr "Оновлення системи"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:612
+#: ../lib/packagekit-glib2/pk-console-shared.c:613
 msgid "Canceling"
 msgstr "Скасування"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:620
+#: ../lib/packagekit-glib2/pk-console-shared.c:621
 msgid "Getting repositories"
 msgstr "Отримання списку сховищ"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:624
+#: ../lib/packagekit-glib2/pk-console-shared.c:625
 msgid "Enabling repository"
 msgstr "Увімкнення сховища"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:628
+#: ../lib/packagekit-glib2/pk-console-shared.c:629
 msgid "Setting data"
 msgstr "Встановлення даних"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:632
+#: ../lib/packagekit-glib2/pk-console-shared.c:633
 msgid "Resolving"
 msgstr "Розв’язання"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:636
+#: ../lib/packagekit-glib2/pk-console-shared.c:637
 msgid "Getting file list"
 msgstr "Отримання списку файлів"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:640
+#: ../lib/packagekit-glib2/pk-console-shared.c:641
 msgid "Getting provides"
 msgstr "Отримання даних про вміст"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:644
+#: ../lib/packagekit-glib2/pk-console-shared.c:645
 msgid "Installing signature"
 msgstr "Встановлення підпису"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:648
+#: ../lib/packagekit-glib2/pk-console-shared.c:649
 msgid "Getting packages"
 msgstr "Отримання списку пакунків"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:652
+#: ../lib/packagekit-glib2/pk-console-shared.c:653
 msgid "Accepting EULA"
 msgstr "Згода з EULA"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:660
+#: ../lib/packagekit-glib2/pk-console-shared.c:661
 msgid "Getting upgrades"
 msgstr "Отримання оновлень"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:664
+#: ../lib/packagekit-glib2/pk-console-shared.c:665
 msgid "Getting categories"
 msgstr "Отримання категорій"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:668
+#: ../lib/packagekit-glib2/pk-console-shared.c:669
 msgid "Getting transactions"
 msgstr "Отримання списку дій"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:672
-#: ../lib/packagekit-glib2/pk-console-shared.c:676
+#: ../lib/packagekit-glib2/pk-console-shared.c:673
+#: ../lib/packagekit-glib2/pk-console-shared.c:677
 msgid "Simulating install"
 msgstr "Імітація встановлення"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:680
+#: ../lib/packagekit-glib2/pk-console-shared.c:681
 msgid "Simulating remove"
 msgstr "Імітація вилучення"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:684
+#: ../lib/packagekit-glib2/pk-console-shared.c:685
 msgid "Simulating update"
 msgstr "Імітація оновлення"
 
@@ -1994,25 +1999,25 @@ msgid "Show debugging information for all files"
 msgstr "Показувати діагностичні дані для всіх файлів"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Діагностика вказаних модулів"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Діагностика вказаних функцій"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Записати дані діагностики до файла"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Параметри діагностики"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Показувати параметри діагностики"
 
@@ -2158,6 +2163,3 @@ msgstr "Показувати параметри діагностики"
 
 #~ msgid "Media ID"
 #~ msgstr "Ідентифікатор носія"
-
-#~ msgid "The package could not be found"
-#~ msgstr "Не вдалося знайти пакунок"
commit abd582cc9daed8bd573477a4053827183b4ebf78
Author: logan <logan at fedoraproject.org>
Date:   Fri Apr 2 16:18:59 2010 +0000

    l10n: Updates to Spanish (Castilian) (es) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/es.po b/po/es.po
index 6b63057..7e47401 100644
--- a/po/es.po
+++ b/po/es.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: packagekit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-09 09:20+0000\n"
-"PO-Revision-Date: 2010-03-09 09:39-0300\n"
+"POT-Creation-Date: 2010-04-02 14:15+0000\n"
+"PO-Revision-Date: 2010-04-02 13:17-0300\n"
 "Last-Translator: Héctor Daniel Cabrera <logan at fedoraproject.org>\n"
 "Language-Team: Fedora Spanish <trans-es at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -23,119 +23,119 @@ msgstr ""
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175
-#: ../client/pk-console.c:597
+#: ../client/pk-console.c:176
+#: ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Transacción"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Hora del sistema"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Existosa"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Verdadero"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Falso"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181
+#: ../client/pk-console.c:182
 #: ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Rol"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Duración"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(segundos)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190
+#: ../client/pk-console.c:191
 #: ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Línea de comandos"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "ID del usuario"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Nombre de usuario"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "Nombre real"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Paquete afectados:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Paquetes afectados: Ninguno"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Distribución"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Tipo"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252
-#: ../client/pk-console.c:291
+#: ../client/pk-console.c:253
+#: ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Resúmen"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Categoría"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "ID"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Padre"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Nombre"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Icono"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Detalles acerca de la actualización:"
 
@@ -144,8 +144,8 @@ msgstr "Detalles acerca de la actualización:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346
-#: ../client/pk-console.c:616
+#: ../client/pk-console.c:347
+#: ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -155,196 +155,196 @@ msgstr[0] "Paquete"
 msgstr[1] "Paquetes"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Actualizaciones"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Sustituye"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357
+#: ../client/pk-console.c:358
 #: ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Fabricante"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Reiniciar"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Texto de actualización"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Cambios"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Estado"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Emitido"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389
-#: ../lib/packagekit-glib2/pk-console-shared.c:510
+#: ../client/pk-console.c:390
+#: ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Actualizado"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "Habilitado"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Deshabilitado"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Se necesita reiniciar el sistema debido a:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Se necesita reiniciar la sesión:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Reinicio del sistema (seguridad) solicitado por:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Reinicio de la sesión (seguridad) solicitado por:"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Se necesita reiniciar una aplicación debido a:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Descripción del paquete"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Mensaje:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "No hay archivos"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Archivos del paquete"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Porcentaje"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Estado"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Resultados:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Error fatal"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "La transacción no pudo realizarse"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "No hay actualizaciones disponibles en este momento."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "En este momento no existen actualizaciones disponibles."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Reinicie el equipo para completar la actualización."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr "Cierre la sesión y vuelva a entrar para completar la actualización."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid "Please restart the computer to complete the update as important security updates have been installed."
 msgstr "Por favor, reinicie el equipo para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid "Please logout and login to complete the update as important security updates have been installed."
 msgstr "Por favor, cierre la sesión y vuelva a registrarse para completar la actualización, ya que se han instalado actualizaciones de seguridad importantes."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid "Extected package name, actually got file. Try using 'pkcon install-local %s' instead."
 msgstr "Nombre de paquete esperado, actualmente tiene archivo. Trate de usar 'pkcon install-local %s' en su lugar."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Esta herramienta no pudo encontrar ningún paquete disponible: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Esta herramienta no pudo encontrar el paquete instalado: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915
-#: ../client/pk-console.c:943
+#: ../client/pk-console.c:916
+#: ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Esta herramienta no pudo encontrar el paquete: %s"
@@ -353,185 +353,190 @@ msgstr "Esta herramienta no pudo encontrar el paquete: %s"
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971
-#: ../client/pk-console.c:999
-#: ../client/pk-console.c:1027
-#: ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972
+#: ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028
+#: ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Esta herramienta no pudo encontrar todos los paquetes: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "El demonio se colgó en medio de una transacción."
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Interfaz de consola de PackageKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Subcomandos:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr "Falló al obtener la hora de la última vez que se completó esta acción"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263
-#: ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267
+#: ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Mostrar la versión del programa y salir"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Establecer el filtro, ej. instalado"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Salir sin esperar que las acciones se completen"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Instalar los paquetes sin confirmación"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr "Corra el comando usando ancho de bando libre y también usando menos potencia"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid "Print to screen a machine readable output, rather than using animated widgets"
 msgstr "Imprimir en la pantalla una salida legible por una máquina, en vez de usar controles animados"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Falló al contactar con PackageKit"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "No se pudo definir el proxy"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "El filtro especificado fue inválido"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Se necesita un tipo de búsqueda, por ejemplo, nombre"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384
-#: ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408
-#: ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403
+#: ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427
+#: ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Se necesita un término de búsqueda"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Tipo de búsqueda inválido"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Se necesita un nombre de paquete a instalar"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Se requiere un nombre de archivo a instalar"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Se necesita un tipo, key_id y package_id"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Necesita un nombre de paquete para eliminar"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr "Se necesita un directorio de destino y los nombres de los paquetes a descargar"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Directorio no encontrado"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Se necesita un identificador de licencia (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Se necesita un identificador de transacción (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Se necesita un nombre de paquete para resolver"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536
-#: ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555
+#: ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Se necesita un nombre de repositorio"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Debe especificar un nombre de repositorio, parámetro y valor"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Debe especificar una acción, por ejemplo, «update-system»"
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Se necesita un rol correcto"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592
-#: ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616
-#: ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645
+#: ../client/pk-console.c:1611
+#: ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635
+#: ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664
 #: ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Se necesita un nombre de paquete"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Se necesita la cadena de lo que proporciona el paquete"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "La opción «%s» no está soportada"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Falló el comando"
 
@@ -640,12 +645,12 @@ msgstr "Paquete de servicio «%s» creado"
 msgid "Failed to create '%s': %s"
 msgstr "Falló al crear «%s»: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Falló al obtener el estado del demonio"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "Monitor de PackageKit"
 
@@ -704,42 +709,42 @@ msgid "Installing..."
 msgstr "Instalando..."
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Descargando detalles acerca de las fuentes de software"
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr "Descargando listas de archivo (esto podría tardar un tiempo en completarse)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Esperando bloqueo del administrador de paquetes."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Cargando listas de paquetes"
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Falló al buscar el archivo"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Falló al iniciar:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "No se han podido instalar los paquetes"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "No se encontró el comando PackageKit"
 
@@ -749,51 +754,51 @@ msgid "Command not found."
 msgstr "Comando no encontrado."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Un comando similar es:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Ejecutar un comando similar:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Los comandos similares son:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Elija un comando para ejecutar"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "El paquete que proporciona este archivo es:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "¿Instalar el paquete «%s» para proporcionar el comando «%s»?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Los paquetes que proporcionan este archivo son:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Los posibles paquetes son:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Elija un paquete para instalar"
 
@@ -961,7 +966,7 @@ msgstr "No se instalan paquetes en modo de simulación"
 #. TRANSLATORS: we are now installing the debuginfo packages we found earlier
 #. TRANSLATORS: transaction state, installing packages
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:862
-#: ../lib/packagekit-glib2/pk-console-shared.c:282
+#: ../lib/packagekit-glib2/pk-console-shared.c:283
 #, c-format
 msgid "Installing packages"
 msgstr "Instalando paquetes"
@@ -1098,7 +1103,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Introduzca un número de 1 a %i: "
 
 #. TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:183
+#: ../lib/packagekit-glib2/pk-console-shared.c:185
 msgid "More than one package matches:"
 msgstr "Coincide más de un paquete:"
 
@@ -1108,448 +1113,448 @@ msgid "Please choose the correct package: "
 msgstr "Elija el paquete correcto: "
 
 #. TRANSLATORS: This is when the transaction status is not known
-#: ../lib/packagekit-glib2/pk-console-shared.c:250
+#: ../lib/packagekit-glib2/pk-console-shared.c:251
 msgid "Unknown state"
 msgstr "Estado desconocido"
 
 #. TRANSLATORS: transaction state, the daemon is in the process of starting
-#: ../lib/packagekit-glib2/pk-console-shared.c:254
+#: ../lib/packagekit-glib2/pk-console-shared.c:255
 msgid "Starting"
 msgstr "Comenzando"
 
 #. TRANSLATORS: transaction state, the transaction is waiting for another to complete
-#: ../lib/packagekit-glib2/pk-console-shared.c:258
+#: ../lib/packagekit-glib2/pk-console-shared.c:259
 msgid "Waiting in queue"
 msgstr "Esperando en cola"
 
 #. TRANSLATORS: transaction state, just started
-#: ../lib/packagekit-glib2/pk-console-shared.c:262
+#: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
 msgstr "Corriendo"
 
 #. TRANSLATORS: transaction state, is querying data
-#: ../lib/packagekit-glib2/pk-console-shared.c:266
+#: ../lib/packagekit-glib2/pk-console-shared.c:267
 msgid "Querying"
 msgstr "Consultando"
 
 #. TRANSLATORS: transaction state, getting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:270
+#: ../lib/packagekit-glib2/pk-console-shared.c:271
 msgid "Getting information"
 msgstr "Obteniendo.información"
 
 #. TRANSLATORS: transaction state, removing packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:274
+#: ../lib/packagekit-glib2/pk-console-shared.c:275
 msgid "Removing packages"
 msgstr "Eliminando paquetes"
 
 #. TRANSLATORS: transaction state, downloading package files
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:278
-#: ../lib/packagekit-glib2/pk-console-shared.c:656
+#: ../lib/packagekit-glib2/pk-console-shared.c:279
+#: ../lib/packagekit-glib2/pk-console-shared.c:657
 msgid "Downloading packages"
 msgstr "Descargando paquetes"
 
 #. TRANSLATORS: transaction state, refreshing internal lists
-#: ../lib/packagekit-glib2/pk-console-shared.c:286
+#: ../lib/packagekit-glib2/pk-console-shared.c:287
 msgid "Refreshing software list"
 msgstr "Refrescando listado de software"
 
 #. TRANSLATORS: transaction state, installing updates
-#: ../lib/packagekit-glib2/pk-console-shared.c:290
+#: ../lib/packagekit-glib2/pk-console-shared.c:291
 msgid "Installing updates"
 msgstr "Instalando actualizaciones"
 
 #. TRANSLATORS: transaction state, removing old packages, and cleaning config files
-#: ../lib/packagekit-glib2/pk-console-shared.c:294
+#: ../lib/packagekit-glib2/pk-console-shared.c:295
 msgid "Cleaning up packages"
 msgstr "Limpiando paquetes"
 
 #. TRANSLATORS: transaction state, obsoleting old packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:298
+#: ../lib/packagekit-glib2/pk-console-shared.c:299
 msgid "Obsoleting packages"
 msgstr "Paquetes obsoletos"
 
 #. TRANSLATORS: transaction state, checking the transaction before we do it
-#: ../lib/packagekit-glib2/pk-console-shared.c:302
+#: ../lib/packagekit-glib2/pk-console-shared.c:303
 msgid "Resolving dependencies"
 msgstr "Resolviendo dependencias"
 
 #. TRANSLATORS: transaction state, checking if we have all the security keys for the operation
-#: ../lib/packagekit-glib2/pk-console-shared.c:306
+#: ../lib/packagekit-glib2/pk-console-shared.c:307
 msgid "Checking signatures"
 msgstr "Comprobando firmas"
 
 #. TRANSLATORS: transaction state, when we return to a previous system state
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:310
-#: ../lib/packagekit-glib2/pk-console-shared.c:616
+#: ../lib/packagekit-glib2/pk-console-shared.c:311
+#: ../lib/packagekit-glib2/pk-console-shared.c:617
 msgid "Rolling back"
 msgstr "Retrocediendo"
 
 #. TRANSLATORS: transaction state, when we're doing a test transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:314
+#: ../lib/packagekit-glib2/pk-console-shared.c:315
 msgid "Testing changes"
 msgstr "Comprobando cambios"
 
 #. TRANSLATORS: transaction state, when we're writing to the system package database
-#: ../lib/packagekit-glib2/pk-console-shared.c:318
+#: ../lib/packagekit-glib2/pk-console-shared.c:319
 msgid "Committing changes"
 msgstr "Realizando cambios"
 
 #. TRANSLATORS: transaction state, requesting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:322
+#: ../lib/packagekit-glib2/pk-console-shared.c:323
 msgid "Requesting data"
 msgstr "Solicitando datos"
 
 #. TRANSLATORS: transaction state, all done!
-#: ../lib/packagekit-glib2/pk-console-shared.c:326
+#: ../lib/packagekit-glib2/pk-console-shared.c:327
 msgid "Finished"
 msgstr "Finalizado"
 
 #. TRANSLATORS: transaction state, in the process of cancelling
-#: ../lib/packagekit-glib2/pk-console-shared.c:330
+#: ../lib/packagekit-glib2/pk-console-shared.c:331
 msgid "Cancelling"
 msgstr "Cancelado"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:334
+#: ../lib/packagekit-glib2/pk-console-shared.c:335
 msgid "Downloading repository information"
 msgstr "Descargando información del repositorio"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:338
+#: ../lib/packagekit-glib2/pk-console-shared.c:339
 msgid "Downloading list of packages"
 msgstr "Descargando listas de paquetes"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:342
+#: ../lib/packagekit-glib2/pk-console-shared.c:343
 msgid "Downloading file lists"
 msgstr "Descargando listados de archivos"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:346
+#: ../lib/packagekit-glib2/pk-console-shared.c:347
 msgid "Downloading lists of changes"
 msgstr "Descargando listas de cambios"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:350
+#: ../lib/packagekit-glib2/pk-console-shared.c:351
 msgid "Downloading groups"
 msgstr "Descargando grupos"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:354
+#: ../lib/packagekit-glib2/pk-console-shared.c:355
 msgid "Downloading update information"
 msgstr "Descargando información de la actualización"
 
 #. TRANSLATORS: transaction state, repackaging delta files
-#: ../lib/packagekit-glib2/pk-console-shared.c:358
+#: ../lib/packagekit-glib2/pk-console-shared.c:359
 msgid "Repackaging files"
 msgstr "Empaquetando archivos"
 
 #. TRANSLATORS: transaction state, loading databases
-#: ../lib/packagekit-glib2/pk-console-shared.c:362
+#: ../lib/packagekit-glib2/pk-console-shared.c:363
 msgid "Loading cache"
 msgstr "Cargando caché"
 
 #. TRANSLATORS: transaction state, scanning for running processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:366
+#: ../lib/packagekit-glib2/pk-console-shared.c:367
 msgid "Scanning applications"
 msgstr "Escaneando aplicaciones"
 
 #. TRANSLATORS: transaction state, generating a list of packages installed on the system
-#: ../lib/packagekit-glib2/pk-console-shared.c:370
+#: ../lib/packagekit-glib2/pk-console-shared.c:371
 msgid "Generating package lists"
 msgstr "Generando la lista de paquetes"
 
 #. TRANSLATORS: transaction state, when we're waiting for the native tools to exit
-#: ../lib/packagekit-glib2/pk-console-shared.c:374
+#: ../lib/packagekit-glib2/pk-console-shared.c:375
 msgid "Waiting for package manager lock"
 msgstr "Esperando bloqueo del administrador de paquetes"
 
 #. TRANSLATORS: transaction state, waiting for user to type in a password
-#: ../lib/packagekit-glib2/pk-console-shared.c:378
+#: ../lib/packagekit-glib2/pk-console-shared.c:379
 msgid "Waiting for authentication"
 msgstr "Esperando por la autentificación"
 
 #. TRANSLATORS: transaction state, we are updating the list of processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:382
+#: ../lib/packagekit-glib2/pk-console-shared.c:383
 msgid "Updating running applications"
 msgstr "Actualizando aplicaciones ejecutadas"
 
 #. TRANSLATORS: transaction state, we are checking executable files currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:386
+#: ../lib/packagekit-glib2/pk-console-shared.c:387
 msgid "Checking applications in use"
 msgstr "Comprobando aplicaciones en uso"
 
 #. TRANSLATORS: transaction state, we are checking for libraries currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:390
+#: ../lib/packagekit-glib2/pk-console-shared.c:391
 msgid "Checking libraries in use"
 msgstr "Comprobando Librerías en uso"
 
 #. TRANSLATORS: transaction state, we are copying package files before or after the transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:394
+#: ../lib/packagekit-glib2/pk-console-shared.c:395
 msgid "Copying files"
 msgstr "Copiando archivos"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:412
+#: ../lib/packagekit-glib2/pk-console-shared.c:413
 msgid "Trivial"
 msgstr "Trivial"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:416
+#: ../lib/packagekit-glib2/pk-console-shared.c:417
 msgid "Normal"
 msgstr "Normal"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:420
+#: ../lib/packagekit-glib2/pk-console-shared.c:421
 msgid "Important"
 msgstr "Importante"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:424
+#: ../lib/packagekit-glib2/pk-console-shared.c:425
 msgid "Security"
 msgstr "Seguridad"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:428
+#: ../lib/packagekit-glib2/pk-console-shared.c:429
 msgid "Bug fix "
 msgstr "Corrijiendo error"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:432
+#: ../lib/packagekit-glib2/pk-console-shared.c:433
 msgid "Enhancement"
 msgstr "Mejora"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:436
+#: ../lib/packagekit-glib2/pk-console-shared.c:437
 msgid "Blocked"
 msgstr "Bloqueado"
 
 #. TRANSLATORS: The state of a package
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:441
-#: ../lib/packagekit-glib2/pk-console-shared.c:514
+#: ../lib/packagekit-glib2/pk-console-shared.c:442
+#: ../lib/packagekit-glib2/pk-console-shared.c:515
 msgid "Installed"
 msgstr "Instalado"
 
 #. TRANSLATORS: The state of a package, i.e. not installed
-#: ../lib/packagekit-glib2/pk-console-shared.c:446
+#: ../lib/packagekit-glib2/pk-console-shared.c:447
 msgid "Available"
 msgstr "Disponible"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:464
+#: ../lib/packagekit-glib2/pk-console-shared.c:465
 msgid "Downloading"
 msgstr "Descargando"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:468
+#: ../lib/packagekit-glib2/pk-console-shared.c:469
 msgid "Updating"
 msgstr "Actualizando"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:472
-#: ../lib/packagekit-glib2/pk-console-shared.c:592
+#: ../lib/packagekit-glib2/pk-console-shared.c:473
+#: ../lib/packagekit-glib2/pk-console-shared.c:593
 msgid "Installing"
 msgstr "Instalando"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:476
-#: ../lib/packagekit-glib2/pk-console-shared.c:588
+#: ../lib/packagekit-glib2/pk-console-shared.c:477
+#: ../lib/packagekit-glib2/pk-console-shared.c:589
 msgid "Removing"
 msgstr "Eliminando"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:480
+#: ../lib/packagekit-glib2/pk-console-shared.c:481
 msgid "Cleaning up"
 msgstr "Limpiando"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:484
+#: ../lib/packagekit-glib2/pk-console-shared.c:485
 msgid "Obsoleting"
 msgstr "Obsoleto"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:488
+#: ../lib/packagekit-glib2/pk-console-shared.c:489
 msgid "Reinstalling"
 msgstr "Reinstalando"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:506
+#: ../lib/packagekit-glib2/pk-console-shared.c:507
 msgid "Downloaded"
 msgstr "Descargado"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:518
+#: ../lib/packagekit-glib2/pk-console-shared.c:519
 msgid "Removed"
 msgstr "Eliminados"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:522
+#: ../lib/packagekit-glib2/pk-console-shared.c:523
 msgid "Cleaned up"
 msgstr "Limpiados"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:526
+#: ../lib/packagekit-glib2/pk-console-shared.c:527
 msgid "Obsoleted"
 msgstr "Obsoleto"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:530
+#: ../lib/packagekit-glib2/pk-console-shared.c:531
 msgid "Reinstalled"
 msgstr "Reinstalado"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:548
+#: ../lib/packagekit-glib2/pk-console-shared.c:549
 msgid "Unknown role type"
 msgstr "Tipo de rol desconocido"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:552
+#: ../lib/packagekit-glib2/pk-console-shared.c:553
 msgid "Getting dependencies"
 msgstr "Obteniendo dependencias"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:556
+#: ../lib/packagekit-glib2/pk-console-shared.c:557
 msgid "Getting update details"
 msgstr "Obteniendo detalles de la actualización"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:560
+#: ../lib/packagekit-glib2/pk-console-shared.c:561
 msgid "Getting details"
 msgstr "Obteniendo detalles"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:564
+#: ../lib/packagekit-glib2/pk-console-shared.c:565
 msgid "Getting requires"
 msgstr "Obteniendo lo que requiere"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:568
+#: ../lib/packagekit-glib2/pk-console-shared.c:569
 msgid "Getting updates"
 msgstr "Obteniendo actualizaciones"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:572
+#: ../lib/packagekit-glib2/pk-console-shared.c:573
 msgid "Searching by details"
 msgstr "Buscando por detalles"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:576
+#: ../lib/packagekit-glib2/pk-console-shared.c:577
 msgid "Searching by file"
 msgstr "Buscando por archivos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:580
+#: ../lib/packagekit-glib2/pk-console-shared.c:581
 msgid "Searching groups"
 msgstr "Buscando grupos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:584
+#: ../lib/packagekit-glib2/pk-console-shared.c:585
 msgid "Searching by name"
 msgstr "Buscando por nombre"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:596
+#: ../lib/packagekit-glib2/pk-console-shared.c:597
 msgid "Installing files"
 msgstr "Instalando archivos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:600
+#: ../lib/packagekit-glib2/pk-console-shared.c:601
 msgid "Refreshing cache"
 msgstr "Refrescando caché"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:604
+#: ../lib/packagekit-glib2/pk-console-shared.c:605
 msgid "Updating packages"
 msgstr "Actualizando paquetes"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:608
+#: ../lib/packagekit-glib2/pk-console-shared.c:609
 msgid "Updating system"
 msgstr "Actualizando sistema"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:612
+#: ../lib/packagekit-glib2/pk-console-shared.c:613
 msgid "Canceling"
 msgstr "Cancelando"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:620
+#: ../lib/packagekit-glib2/pk-console-shared.c:621
 msgid "Getting repositories"
 msgstr "Obteniendo repositorios"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:624
+#: ../lib/packagekit-glib2/pk-console-shared.c:625
 msgid "Enabling repository"
 msgstr "Habilitando repositorio"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:628
+#: ../lib/packagekit-glib2/pk-console-shared.c:629
 msgid "Setting data"
 msgstr "Poniendo datos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:632
+#: ../lib/packagekit-glib2/pk-console-shared.c:633
 msgid "Resolving"
 msgstr "Resolviendo"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:636
+#: ../lib/packagekit-glib2/pk-console-shared.c:637
 msgid "Getting file list"
 msgstr "Obteniendo lista de archivos"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:640
+#: ../lib/packagekit-glib2/pk-console-shared.c:641
 msgid "Getting provides"
 msgstr "Obteniendo lo que provee"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:644
+#: ../lib/packagekit-glib2/pk-console-shared.c:645
 msgid "Installing signature"
 msgstr "Instalando firma"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:648
+#: ../lib/packagekit-glib2/pk-console-shared.c:649
 msgid "Getting packages"
 msgstr "Obteniendo paquetes"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:652
+#: ../lib/packagekit-glib2/pk-console-shared.c:653
 msgid "Accepting EULA"
 msgstr "Aceptando EULA"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:660
+#: ../lib/packagekit-glib2/pk-console-shared.c:661
 msgid "Getting upgrades"
 msgstr "Obteniendo actualizaciones"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:664
+#: ../lib/packagekit-glib2/pk-console-shared.c:665
 msgid "Getting categories"
 msgstr "Obteniendo categorías"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:668
+#: ../lib/packagekit-glib2/pk-console-shared.c:669
 msgid "Getting transactions"
 msgstr "Obteniendo transacciones"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:672
-#: ../lib/packagekit-glib2/pk-console-shared.c:676
+#: ../lib/packagekit-glib2/pk-console-shared.c:673
+#: ../lib/packagekit-glib2/pk-console-shared.c:677
 msgid "Simulating install"
 msgstr "Simulando la instalación"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:680
+#: ../lib/packagekit-glib2/pk-console-shared.c:681
 msgid "Simulating remove"
 msgstr "Simulando eliminación"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:684
+#: ../lib/packagekit-glib2/pk-console-shared.c:685
 msgid "Simulating update"
 msgstr "Sumulando la actualización"
 
@@ -1966,25 +1971,25 @@ msgid "Show debugging information for all files"
 msgstr "Mostrar información de depuración para todos los archivos"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Depurar estos módulos específicos"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Depurar estas funciones específicas"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Registrar en un archivo los datos de la depuración "
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Opciones de depuración"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Mostrar información extra de depuración"
 
@@ -1992,228 +1997,316 @@ msgstr "Mostrar información extra de depuración"
 #~ msgstr ""
 #~ "Un software considerado maligno puede provocar diferentes clases de daño, "
 #~ "por ejemplo, podría dañar su computadora. "
+
 #~ msgid "Transaction failed with no error"
 #~ msgstr "La transacción fallida sin error"
+
 #~ msgid "Failed to get transaction list"
 #~ msgstr "Falló al obtener la lista de transacciones"
+
 #~ msgid "Please restart the application as it is being used."
 #~ msgstr "Reinicie la aplicación que está usando."
+
 #~ msgid "The package %s is already installed"
 #~ msgstr "El paquete %s ya está instalado"
+
 #~ msgid "The package %s could not be installed: %s"
 #~ msgstr "No se pudo instalar el paquete %s: %s"
+
 #~ msgid "The package install was canceled!"
 #~ msgstr "¡Se canceló la instalación del paquete!"
+
 #~ msgid "This tool could not install the packages: %s"
 #~ msgstr "Esta herramienta no pudo instalar los paquetes: %s"
+
 #~ msgid "This tool could not install the files: %s"
 #~ msgstr "Esta herramienta no pudo instalar los archivos: %s"
+
 #~ msgid "This tool could not remove %s: %s"
 #~ msgstr "Esta herramienta no pudo eliminar %s: %s"
+
 #~ msgid "This tool could not remove the packages: %s"
 #~ msgstr "Esta herramienta no pudo eliminar los paquetes: %s"
+
 #~ msgid "Proceed with additional packages?"
 #~ msgstr "¿Proceder con los paquetes adicionales?"
+
 #~ msgid "The package removal was canceled!"
 #~ msgstr "Se canceló la eliminación de paquetes"
+
 #~ msgid "This tool could not download the package %s as it could not be found"
 #~ msgstr ""
 #~ "Esta herramienta no pudo descargar el paquete %s debido a que no se "
 #~ "encontró"
+
 #~ msgid "This tool could not download the packages: %s"
 #~ msgstr "Esta herramienta no pudo descargar los paquetes: %s"
+
 #~ msgid "This tool could not update %s: %s"
 #~ msgstr "Esta herramienta no pudo actualizar %s: %s"
+
 #~ msgid "The package update was canceled!"
 #~ msgstr "¡Se canceló la actualización del paquete!"
+
 #~ msgid "This tool could not get the requirements for %s: %s"
 #~ msgstr "Esta herramienta no pudo obtener los requerimientos de %s: %s"
+
 #~ msgid "This tool could not get the dependencies for %s: %s"
 #~ msgstr "Esta herramienta no pudo obtener las dependencias de %s: %s"
+
 #~ msgid "This tool could not get package details for %s: %s"
 #~ msgstr "Esta herramienta no pudo obtener los detalles del paquete %s: %s"
+
 #~ msgid "This tool could not find the files for %s: %s"
 #~ msgstr "Esta herramienta no pudo encontrar los archivos de %s: %s"
+
 #~ msgid "This tool could not get the file list for %s: %s"
 #~ msgstr "Esta herramienta no pudo obtener la lista de archivos de %s: %s"
+
 #~ msgid "File already exists: %s"
 #~ msgstr "El archivo ya existe: %s"
+
 #~ msgid "This tool could not get package list: %s"
 #~ msgstr "Esta herramienta no pudo obtener la lista de paquetes: %s"
+
 #~ msgid "Failed to save to disk"
 #~ msgstr "Falló al guardar en el disco"
+
 #~ msgid "File does not exist: %s"
 #~ msgstr "El archivo no existe: %s"
+
 #~ msgid "Packages to add"
 #~ msgstr "Paquetes para añadir"
+
 #~ msgid "Packages to remove"
 #~ msgstr "Paquetes para eliminar"
+
 #~ msgid "No new packages need to be installed"
 #~ msgstr "No hay paquetes nuevos para instalar"
+
 #~ msgid "not found."
 #~ msgstr "no encontrado."
+
 #~ msgid "No packages can be found to install"
 #~ msgstr "No se encontró ningún paquete para instalar"
+
 #~ msgid "This tool could not find the update details for %s: %s"
 #~ msgstr ""
 #~ "Esta herramienta no pudo encontrar los detalles de actualización de %s: %s"
+
 #~ msgid "This tool could not get the update details for %s: %s"
 #~ msgstr ""
 #~ "Esta herramienta no pudo obtener los detalles de actualización de %s: %s"
+
 #~ msgid "Error:"
 #~ msgstr "Error:"
+
 #~ msgid "Repository signature required"
 #~ msgstr "Se requiere la firma del repositorio"
+
 #~ msgid "End user license agreement required"
 #~ msgstr "Se requiere un acuerdo de licencia de usuario final"
+
 #~ msgid "Do you agree to this license?"
 #~ msgstr "¿Está de acuerdo con esta licencia?"
+
 #~ msgid "The license was refused."
 #~ msgstr "Se rechazó la licencia."
+
 #~ msgid "This tool could not connect to system DBUS."
 #~ msgstr "Esta herramienta no se pudo conectar al DBUS del sistema."
+
 #~ msgid "A package name or filename to install is required"
 #~ msgstr "Se requiere un nombre de paquete o nombre de archivo para instalar"
+
 #~ msgid "A list file name to create is required"
 #~ msgstr "Se necesita un nombre de archivo de la lista"
+
 #~ msgid "A list file to open is required"
 #~ msgstr "Se necesita un archivo de lista para abrir"
+
 #~ msgid "Incorrect privileges for this operation"
 #~ msgstr "Privilegios incorrectos para esta operación"
+
 #~ msgid "Cannot show the list of transactions"
 #~ msgstr "No es posible mostrar la lista de transacciones"
-#~ msgid "The package could not be found"
-#~ msgstr "No se pudo encontrar el paquete"
+
 #~ msgid "EULA ID"
 #~ msgstr "ID del acuerdo de licencia de usuario final (EULA) "
+
 #~ msgid "Media ID"
 #~ msgstr "ID de medio"
+
 #~ msgid "Main cache file to use (if not specififed, default is used)"
 #~ msgstr ""
 #~ "Archivo caché principal a usar (si no se especifica, se usará el "
 #~ "predeterminado)"
+
 #~ msgid "Source cache file to add to the main database"
 #~ msgstr "Archivo caché fuente para agregar a la base de datos principal"
+
 #~ msgid "Icon directory"
 #~ msgstr "Directorio de Iconos"
+
 #~ msgid "Name of the remote repo"
 #~ msgstr "Nombre del repo remoto"
+
 #~ msgid "PackageKit Application Database Installer"
 #~ msgstr "Instalador de la Base de Datos de Aplicaciones de PackageKit"
+
 #~ msgid "Main database file to use (if not specififed, default is used)"
 #~ msgstr ""
 #~ "Base de datos principal a usar (si no se especifica se usará el "
 #~ "predeterminado)"
+
 #~ msgid "You need to specify a search type, e.g. name"
 #~ msgstr "Debe especificar el tipo de búsqueda, por ejemplo, nombre"
+
 #~ msgid "You need to specify a search term"
 #~ msgstr "Debe especificar un término de búsqueda"
+
 #~ msgid "You need to specify a package to remove"
 #~ msgstr "Debe especificar un paquete a eliminar"
+
 #~ msgid "You need to specify a package name to resolve"
 #~ msgstr "Debe especificar un nombre de paquete a resolver"
+
 #~ msgid "You need to specify a repository name"
 #~ msgstr "Debe especificar un nombre de repositorio"
+
 #~ msgid "You need to specify a correct role"
 #~ msgstr "Debe especificar un rol correcto"
+
 #~ msgid "You need to specify a package to find the details for"
 #~ msgstr "Debe especificar un paquete para el que buscar la descripción"
+
 #~ msgid "You need to specify a package to find the files for"
 #~ msgstr "Debe especificar un paquete para el que buscar los archivos"
+
 #~ msgid "You need to specify a list file to open"
 #~ msgstr "Debe especificar un archivo de lista a abrir"
+
 #~ msgid "This tool could not remove the packages: '%s'"
 #~ msgstr "Esta herramienta no pudo eliminar los paquetes: '%s'"
+
 #~ msgid "Install local file"
 #~ msgstr "Instalar archivo local"
+
 #~ msgid "Okay to import key?"
 #~ msgstr "¿De acuerto con importer la clave?"
+
 #~ msgid "Did not import key"
 #~ msgstr "No se importó la clave"
+
 #~ msgid "Do you agree?"
 #~ msgstr "¿Está de acuerdo?"
+
 #~ msgid "Could not find package to remove"
 #~ msgstr "No se pudo encontrar el paquete a eliminar"
+
 #~ msgid "Could not find package to update"
 #~ msgstr "No se pudo encontrar el paquete a actualizar"
+
 #~ msgid "Could not find what packages require"
 #~ msgstr "No se pudo encontrar cuales paquetes requiere este paquete"
+
 #~ msgid "Could not find details for"
 #~ msgstr "No se pudieron obtener los detalles de "
 
 #, fuzzy
 #~ msgid "Could not set database readonly"
 #~ msgstr "No se pudo abrir la base de datos: %s"
+
 #~ msgid "Could not open database: %s"
 #~ msgstr "No se pudo abrir la base de datos: %s"
+
 #~ msgid "You probably need to run this program as the root user"
 #~ msgstr "Probablemente necesita ejecutar este programa como el usuario root"
+
 #~ msgid "<span color='#%06x' underline='single' size='larger'>Run %s</span>"
 #~ msgstr ""
 #~ "<span color='#%06x' underline='single' size='larger'>Ejecutar %s</span>"
+
 #~ msgid "<big>%s</big>"
 #~ msgstr "<big>%s</big>"
+
 #~ msgid ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Run version %s now</span>"
 #~ msgstr ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Ejecutar versión %s ahora</span>"
+
 #~ msgid ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Run now</span>"
 #~ msgstr ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Ejecutar ahora</span>"
+
 #~ msgid ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Upgrade to version %s</span>"
 #~ msgstr ""
 #~ "\n"
 #~ "<span color='#%06x' underline='single'>Actualizar a la versión %s</span>"
+
 #~ msgid ""
 #~ "<span color='#%06x' underline='single' size='larger'>Install %s Now</span>"
 #~ msgstr ""
 #~ "<span color='#%06x' underline='single' size='larger'>Instalar %s Ahora</"
 #~ "span>"
+
 #~ msgid ""
 #~ "\n"
 #~ "<small>Version: %s</small>"
 #~ msgstr ""
 #~ "\n"
 #~ "<small>Versión: %s</small>"
+
 #~ msgid "failed to download: invalid package_id and/or directory"
 #~ msgstr "falló la descarga: id de paquete inválido y/o directorio"
+
 #~ msgid "Could not find a valid metadata file"
 #~ msgstr "No se pudo encontrar un archivo de metadatos válido"
+
 #~ msgid "Okay to download the additional packages"
 #~ msgstr "Listo para descargar los paquetes adicionales"
+
 #~ msgid "You need to specify the pack name and packages to be packed\n"
 #~ msgstr "Debe especificar el nombre de grupo y los paquetes a agrupar\n"
+
 #~ msgid ""
 #~ "Invalid name for the service pack, Specify a name with .servicepack "
 #~ "extension\n"
 #~ msgstr ""
 #~ "Nombre inválido para el paquete de servicio. Especifique un nombre con la "
 #~ "extensión .servicepack\n"
+
 #~ msgid "Authentication is required to install a local file"
 #~ msgstr "Se requiere autenticación para instalar un archivo local"
+
 #~ msgid "Authentication is required to install a security signature"
 #~ msgstr "Se requiere autenticación para instalar una firma de seguridad"
+
 #~ msgid "Authentication is required to update all packages"
 #~ msgstr "Se requiere autenticación para actualizar todos los paquetes"
+
 #~ msgid "Update all packages"
 #~ msgstr "Actualizar todos los paquetes"
+
 #~ msgid ""
 #~ "Could not find a package with that name to install, or package already "
 #~ "installed"
 #~ msgstr ""
 #~ "No se pudo encontrar un paquete con ese nombre para instalar, o el "
 #~ "paquete ya está instalado"
+
 #~ msgid "Could not find a package with that name to update"
 #~ msgstr "No se pudo encontrar un paquete con ese nombre para actualizar"
+
 #~ msgid "Could not find a description for this package"
 #~ msgstr "No se pudo encontrar una descripcion para este paquete"
+
 #~ msgid "You need to specify a package to find the description for"
 #~ msgstr "Debe especificar un paquete para el que buscar la descripción"
-
commit df4039e0898a72c199e449a07f9da5beb3e95864
Author: raven <raven at fedoraproject.org>
Date:   Fri Apr 2 10:55:04 2010 +0000

    l10n: Updates to Polish (pl) translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pl.po b/po/pl.po
index 740e7d7..d9d426f 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-03-10 09:00+0000\n"
-"PO-Revision-Date: 2010-03-10 11:15+0100\n"
+"POT-Creation-Date: 2010-04-02 10:29+0000\n"
+"PO-Revision-Date: 2010-04-02 12:54+0200\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <trans-pl at lists.fedoraproject.org>\n"
 "MIME-Version: 1.0\n"
@@ -17,115 +17,115 @@ msgstr ""
 
 #. TRANSLATORS: this is an atomic transaction
 #. TRANSLATORS: the role is the point of the transaction, e.g. update-system
-#: ../client/pk-console.c:175 ../client/pk-console.c:597
+#: ../client/pk-console.c:176 ../client/pk-console.c:598
 msgid "Transaction"
 msgstr "Transakcja"
 
 #. TRANSLATORS: this is the time the transaction was started in system timezone
-#: ../client/pk-console.c:177
+#: ../client/pk-console.c:178
 msgid "System time"
 msgstr "Czas systemowy"
 
 #. TRANSLATORS: this is if the transaction succeeded or not
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "Succeeded"
 msgstr "Powodzenie"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "True"
 msgstr "Prawda"
 
-#: ../client/pk-console.c:179
+#: ../client/pk-console.c:180
 msgid "False"
 msgstr "Fałsz"
 
 #. TRANSLATORS: this is the transactions role, e.g. "update-system"
 #. TRANSLATORS: the trasaction role, e.g. update-system
-#: ../client/pk-console.c:181 ../src/pk-polkit-action-lookup.c:332
+#: ../client/pk-console.c:182 ../src/pk-polkit-action-lookup.c:332
 msgid "Role"
 msgstr "Rola"
 
 #. TRANSLATORS: this is The duration of the transaction
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "Duration"
 msgstr "Czas trwania"
 
-#: ../client/pk-console.c:186
+#: ../client/pk-console.c:187
 msgid "(seconds)"
 msgstr "(sekundy)"
 
 #. TRANSLATORS: this is The command line used to do the action
 #. TRANSLATORS: the command line of the thing that wants the authentication
-#: ../client/pk-console.c:190 ../src/pk-polkit-action-lookup.c:346
+#: ../client/pk-console.c:191 ../src/pk-polkit-action-lookup.c:346
 msgid "Command line"
 msgstr "Wiersz poleceń"
 
 #. TRANSLATORS: this is the user ID of the user that started the action
-#: ../client/pk-console.c:192
+#: ../client/pk-console.c:193
 msgid "User ID"
 msgstr "Identyfikator użytkownika"
 
 #. TRANSLATORS: this is the username, e.g. hughsie
-#: ../client/pk-console.c:199
+#: ../client/pk-console.c:200
 msgid "Username"
 msgstr "Nazwa użytkownika"
 
 #. TRANSLATORS: this is the users real name, e.g. "Richard Hughes"
-#: ../client/pk-console.c:203
+#: ../client/pk-console.c:204
 msgid "Real name"
 msgstr "ImiÄ™ i nazwisko"
 
-#: ../client/pk-console.c:211
+#: ../client/pk-console.c:212
 msgid "Affected packages:"
 msgstr "Dotyczy pakietów:"
 
-#: ../client/pk-console.c:213
+#: ../client/pk-console.c:214
 msgid "Affected packages: None"
 msgstr "Dotyczy pakietów: żadnych"
 
 #. TRANSLATORS: this is the distro, e.g. Fedora 10
-#: ../client/pk-console.c:248
+#: ../client/pk-console.c:249
 msgid "Distribution"
 msgstr "Dystrybucja"
 
 #. TRANSLATORS: this is type of update, stable or testing
-#: ../client/pk-console.c:250
+#: ../client/pk-console.c:251
 msgid "Type"
 msgstr "Typ"
 
 #. TRANSLATORS: this is any summary text describing the upgrade
 #. TRANSLATORS: this is the summary of the group
-#: ../client/pk-console.c:252 ../client/pk-console.c:291
+#: ../client/pk-console.c:253 ../client/pk-console.c:292
 msgid "Summary"
 msgstr "Podsumowanie"
 
 #. TRANSLATORS: this is the group category name
-#: ../client/pk-console.c:280
+#: ../client/pk-console.c:281
 msgid "Category"
 msgstr "Kategoria"
 
 #. TRANSLATORS: this is group identifier
-#: ../client/pk-console.c:282
+#: ../client/pk-console.c:283
 msgid "ID"
 msgstr "Identyfikator"
 
 #. TRANSLATORS: this is the parent group
-#: ../client/pk-console.c:285
+#: ../client/pk-console.c:286
 msgid "Parent"
 msgstr "Nadrzędna"
 
 #. TRANSLATORS: this is the name of the parent group
-#: ../client/pk-console.c:288
+#: ../client/pk-console.c:289
 msgid "Name"
 msgstr "Nazwa"
 
 #. TRANSLATORS: this is preferred icon for the group
-#: ../client/pk-console.c:294
+#: ../client/pk-console.c:295
 msgid "Icon"
 msgstr "Ikona"
 
 #. TRANSLATORS: this is a header for the package that can be updated
-#: ../client/pk-console.c:340
+#: ../client/pk-console.c:341
 msgid "Details about the update:"
 msgstr "Szczegóły aktualizacji:"
 
@@ -134,7 +134,7 @@ msgstr "Szczegóły aktualizacji:"
 #. TRANSLATORS: the package that is not signed by a known key
 #. TRANSLATORS: the package name that was trying to be installed
 #. TRANSLATORS: title, the names of the packages that the method is processing
-#: ../client/pk-console.c:346 ../client/pk-console.c:616
+#: ../client/pk-console.c:347 ../client/pk-console.c:617
 #: ../lib/packagekit-glib2/pk-task-text.c:126
 #: ../lib/packagekit-glib2/pk-task-text.c:208
 #: ../src/pk-polkit-action-lookup.c:357
@@ -145,165 +145,165 @@ msgstr[1] "Pakiety"
 msgstr[2] "Pakietów"
 
 #. TRANSLATORS: details about the update, any packages that this update updates
-#: ../client/pk-console.c:349
+#: ../client/pk-console.c:350
 msgid "Updates"
 msgstr "Aktualizuje"
 
 #. TRANSLATORS: details about the update, any packages that this update obsoletes
-#: ../client/pk-console.c:353
+#: ../client/pk-console.c:354
 msgid "Obsoletes"
 msgstr "Zastępuje"
 
 #. TRANSLATORS: details about the update, the vendor URLs
 #. TRANSLATORS: the vendor (e.g. vmware) that is providing the EULA
-#: ../client/pk-console.c:357 ../lib/packagekit-glib2/pk-task-text.c:211
+#: ../client/pk-console.c:358 ../lib/packagekit-glib2/pk-task-text.c:211
 msgid "Vendor"
 msgstr "Producent"
 
 #. TRANSLATORS: details about the update, the bugzilla URLs
-#: ../client/pk-console.c:361
+#: ../client/pk-console.c:362
 msgid "Bugzilla"
 msgstr "Bugzilla"
 
 #. TRANSLATORS: details about the update, the CVE URLs
-#: ../client/pk-console.c:365
+#: ../client/pk-console.c:366
 msgid "CVE"
 msgstr "CVE"
 
 #. TRANSLATORS: details about the update, if the package requires a restart
-#: ../client/pk-console.c:369
+#: ../client/pk-console.c:370
 msgid "Restart"
 msgstr "Uruchom ponownie"
 
 #. TRANSLATORS: details about the update, any description of the update
-#: ../client/pk-console.c:373
+#: ../client/pk-console.c:374
 msgid "Update text"
 msgstr "Tekst aktualizacji"
 
 #. TRANSLATORS: details about the update, the changelog for the package
-#: ../client/pk-console.c:377
+#: ../client/pk-console.c:378
 msgid "Changes"
 msgstr "Zmiany"
 
 #. TRANSLATORS: details about the update, the ongoing state of the update
-#: ../client/pk-console.c:381
+#: ../client/pk-console.c:382
 msgid "State"
 msgstr "Stan"
 
 #. TRANSLATORS: details about the update, date the update was issued
-#: ../client/pk-console.c:385
+#: ../client/pk-console.c:386
 msgid "Issued"
 msgstr "Wydano"
 
 #. TRANSLATORS: details about the update, date the update was updated
 #. TRANSLATORS: The action of the package, in past tense
-#: ../client/pk-console.c:389 ../lib/packagekit-glib2/pk-console-shared.c:510
+#: ../client/pk-console.c:390 ../lib/packagekit-glib2/pk-console-shared.c:511
 msgid "Updated"
 msgstr "Zaktualizowano"
 
 #. TRANSLATORS: if the repo is enabled
-#: ../client/pk-console.c:425
+#: ../client/pk-console.c:426
 msgid "Enabled"
 msgstr "WÅ‚Ä…czone"
 
 #. TRANSLATORS: if the repo is disabled
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:429
 msgid "Disabled"
 msgstr "Wyłączone"
 
 #. TRANSLATORS: a package requires the system to be restarted
-#: ../client/pk-console.c:460
+#: ../client/pk-console.c:461
 msgid "System restart required by:"
 msgstr "Ponowne uruchomienie systemu jest wymagane przez:"
 
 #. TRANSLATORS: a package requires the session to be restarted
-#: ../client/pk-console.c:463
+#: ../client/pk-console.c:464
 msgid "Session restart required:"
 msgstr "Wymagane jest ponowne uruchomienie sesji:"
 
 #. TRANSLATORS: a package requires the system to be restarted due to a security update
-#: ../client/pk-console.c:466
+#: ../client/pk-console.c:467
 msgid "System restart (security) required by:"
 msgstr "Ponowne uruchomienie systemu jest wymagane przez:"
 
 #. TRANSLATORS: a package requires the session to be restarted due to a security update
-#: ../client/pk-console.c:469
+#: ../client/pk-console.c:470
 msgid "Session restart (security) required:"
 msgstr "Wymagane jest ponowne uruchomienie sesji (z powodu bezpieczeństwa):"
 
 #. TRANSLATORS: a package requires the application to be restarted
-#: ../client/pk-console.c:472
+#: ../client/pk-console.c:473
 msgid "Application restart required by:"
 msgstr "Ponowne uruchomienie programu jest wymagane przez:"
 
 #. TRANSLATORS: This a list of details about the package
-#: ../client/pk-console.c:507
+#: ../client/pk-console.c:508
 msgid "Package description"
 msgstr "Opis pakietu"
 
 #. TRANSLATORS: This a message (like a little note that may be of interest) from the transaction
-#: ../client/pk-console.c:538
+#: ../client/pk-console.c:539
 msgid "Message:"
 msgstr "Komunikat:"
 
 #. TRANSLATORS: This where the package has no files
-#: ../client/pk-console.c:559
+#: ../client/pk-console.c:560
 msgid "No files"
 msgstr "Brak plików"
 
 #. TRANSLATORS: This a list files contained in the package
-#: ../client/pk-console.c:564
+#: ../client/pk-console.c:565
 msgid "Package files"
 msgstr "Pliki pakietu"
 
 #. TRANSLATORS: the percentage complete of the transaction
-#: ../client/pk-console.c:632
+#: ../client/pk-console.c:633
 msgid "Percentage"
 msgstr "Procentowo"
 
 #. TRANSLATORS: the status of the transaction (e.g. downloading)
-#: ../client/pk-console.c:650
+#: ../client/pk-console.c:651
 msgid "Status"
 msgstr "Stan"
 
 #. TRANSLATORS: the results from the transaction
-#: ../client/pk-console.c:679
+#: ../client/pk-console.c:680
 msgid "Results:"
 msgstr "Wyniki:"
 
 #. TRANSLATORS: we failed to get any results, which is pretty fatal in my book
-#: ../client/pk-console.c:686
+#: ../client/pk-console.c:687
 msgid "Fatal error"
 msgstr "Krytyczny błąd"
 
 #. TRANSLATORS: the transaction failed in a way we could not expect
-#: ../client/pk-console.c:695
-#: ../contrib/command-not-found/pk-command-not-found.c:432
-#: ../contrib/command-not-found/pk-command-not-found.c:603
+#: ../client/pk-console.c:696
+#: ../contrib/command-not-found/pk-command-not-found.c:433
+#: ../contrib/command-not-found/pk-command-not-found.c:606
 msgid "The transaction failed"
 msgstr "Transakcja nie powiodła się"
 
 #. TRANSLATORS: print a message when there are no updates
-#: ../client/pk-console.c:726
+#: ../client/pk-console.c:727
 msgid "There are no updates available at this time."
 msgstr "Brak dostępnych aktualizacji w tej chwili."
 
-#: ../client/pk-console.c:749
+#: ../client/pk-console.c:750
 msgid "There are no upgrades available at this time."
 msgstr "Brak dostępnych aktualizacji w tej chwili."
 
 #. TRANSLATORS: a package needs to restart their system
-#: ../client/pk-console.c:816
+#: ../client/pk-console.c:817
 msgid "Please restart the computer to complete the update."
 msgstr "Proszę uruchomić ponownie komputer, aby zakończyć aktualizację."
 
 #. TRANSLATORS: a package needs to restart the session
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:820
 msgid "Please logout and login to complete the update."
 msgstr "Proszę wylogować się i zalogować, aby zakończyć aktualizację."
 
 #. TRANSLATORS: a package needs to restart their system (due to security)
-#: ../client/pk-console.c:822
+#: ../client/pk-console.c:823
 msgid ""
 "Please restart the computer to complete the update as important security "
 "updates have been installed."
@@ -312,7 +312,7 @@ msgstr ""
 "zainstalowano aktualizacje bezpieczeństwa."
 
 #. TRANSLATORS: a package needs to restart the session (due to security)
-#: ../client/pk-console.c:825
+#: ../client/pk-console.c:826
 msgid ""
 "Please logout and login to complete the update as important security updates "
 "have been installed."
@@ -321,7 +321,7 @@ msgstr ""
 "zainstalowano aktualizacje bezpieczeństwa."
 
 #. TRANSLATORS: The user used 'pkcon install dave.rpm' rather than 'pkcon install-local dave.rpm'
-#: ../client/pk-console.c:851
+#: ../client/pk-console.c:852
 #, c-format
 msgid ""
 "Extected package name, actually got file. Try using 'pkcon install-local %s' "
@@ -331,19 +331,19 @@ msgstr ""
 "wykonać polecenie \"pkcon install-local %s\"."
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:859
+#: ../client/pk-console.c:860
 #, c-format
 msgid "This tool could not find any available package: %s"
 msgstr "Te narzędzie nie może odnaleźć dostępnych pakietów: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:887
+#: ../client/pk-console.c:888
 #, c-format
 msgid "This tool could not find the installed package: %s"
 msgstr "Te narzędzie nie może odnaleźć zainstalowanego pakietu: %s"
 
 #. TRANSLATORS: There was an error getting the list of files for the package. The detailed error follows
-#: ../client/pk-console.c:915 ../client/pk-console.c:943
+#: ../client/pk-console.c:916 ../client/pk-console.c:944
 #, c-format
 msgid "This tool could not find the package: %s"
 msgstr "Te narzędzie nie może odnaleźć pakietu: %s"
@@ -352,64 +352,64 @@ msgstr "Te narzędzie nie może odnaleźć pakietu: %s"
 #. TRANSLATORS: There was an error getting the dependencies for the package. The detailed error follows
 #. TRANSLATORS: There was an error getting the details about the package. The detailed error follows
 #. TRANSLATORS: The package name was not found in any software sources. The detailed error follows
-#: ../client/pk-console.c:971 ../client/pk-console.c:999
-#: ../client/pk-console.c:1027 ../client/pk-console.c:1055
-#: ../client/pk-console.c:1083
+#: ../client/pk-console.c:972 ../client/pk-console.c:1000
+#: ../client/pk-console.c:1028 ../client/pk-console.c:1056
+#: ../client/pk-console.c:1084
 #, c-format
 msgid "This tool could not find all the packages: %s"
 msgstr "Te narzędzie nie może odnaleźć wszystkich pakietów: %s"
 
 #. TRANSLATORS: This is when the daemon crashed, and we are up shit creek without a paddle
-#: ../client/pk-console.c:1112
+#: ../client/pk-console.c:1113
 msgid "The daemon crashed mid-transaction!"
 msgstr "Demon zawiesił się w połowie transakcji!"
 
 #. TRANSLATORS: This is the header to the --help menu
-#: ../client/pk-console.c:1146
+#: ../client/pk-console.c:1147
 msgid "PackageKit Console Interface"
 msgstr "Interfejs konsoli PackageKit"
 
 #. these are commands we can use with pkcon
-#: ../client/pk-console.c:1148
+#: ../client/pk-console.c:1149
 msgid "Subcommands:"
 msgstr "Podpolecenia:"
 
 #. TRANSLATORS: we keep a database updated with the time that an action was last executed
-#: ../client/pk-console.c:1227
+#: ../client/pk-console.c:1228
 msgid "Failed to get the time since this action was last completed"
 msgstr ""
 "Uzyskanie czasu od ostatniego zakończenia tego działania nie powiodło się"
 
 #. TRANSLATORS: command line argument, just show the version string
-#: ../client/pk-console.c:1263 ../client/pk-monitor.c:306
+#: ../client/pk-console.c:1267 ../client/pk-monitor.c:326
 msgid "Show the program version and exit"
 msgstr "Wyświetla wersję programu i wyłącza"
 
 #. TRANSLATORS: command line argument, use a filter to narrow down results
-#: ../client/pk-console.c:1266
+#: ../client/pk-console.c:1270
 msgid "Set the filter, e.g. installed"
 msgstr "Ustawia filtr, np. zainstalowane"
 
 #. TRANSLATORS: command line argument, work asynchronously
-#: ../client/pk-console.c:1269
+#: ../client/pk-console.c:1273
 msgid "Exit without waiting for actions to complete"
 msgstr "Wyłącza bez oczekiwania na zakończenie działań"
 
 #. command line argument, do we ask questions
-#: ../client/pk-console.c:1272
+#: ../client/pk-console.c:1276
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:527
 msgid "Install the packages without asking for confirmation"
 msgstr "Instaluje pakiety bez prośby o potwierdzenie"
 
 #. TRANSLATORS: command line argument, this command is not a priority
-#: ../client/pk-console.c:1275
+#: ../client/pk-console.c:1279
 msgid "Run the command using idle network bandwidth and also using less power"
 msgstr ""
 "Wykonuje polecenie używając bezczynnego połączenia sieciowego, a także "
 "zużywając mniej energii"
 
 #. TRANSLATORS: command line argument, just output without fancy formatting
-#: ../client/pk-console.c:1278
+#: ../client/pk-console.c:1282
 msgid ""
 "Print to screen a machine readable output, rather than using animated widgets"
 msgstr ""
@@ -417,117 +417,122 @@ msgstr ""
 "widgetów"
 
 #. TRANSLATORS: we failed to contact the daemon
-#: ../client/pk-console.c:1300
+#: ../client/pk-console.c:1304
 msgid "Failed to contact PackageKit"
 msgstr "Skontaktowanie się z usługą PackageKit nie powiodło się"
 
 #. TRANSLATORS: The user specified an incorrect filter
-#: ../client/pk-console.c:1358
+#: ../client/pk-console.c:1365
+msgid "The proxy could not be set"
+msgstr "Nie można ustawić pośrednika"
+
+#. TRANSLATORS: The user specified an incorrect filter
+#: ../client/pk-console.c:1377
 msgid "The filter specified was invalid"
 msgstr "Podany filtr jest nieprawidłowy"
 
 #. TRANSLATORS: a search type can be name, details, file, etc
-#: ../client/pk-console.c:1377
+#: ../client/pk-console.c:1396
 msgid "A search type is required, e.g. name"
 msgstr "Wymagany jest typ wyszukiwania, np. nazwa"
 
 #. TRANSLATORS: the user needs to provide a search term
-#: ../client/pk-console.c:1384 ../client/pk-console.c:1396
-#: ../client/pk-console.c:1408 ../client/pk-console.c:1420
+#: ../client/pk-console.c:1403 ../client/pk-console.c:1415
+#: ../client/pk-console.c:1427 ../client/pk-console.c:1439
 msgid "A search term is required"
 msgstr "Wymagany jest wyszukiwany termin"
 
 #. TRANSLATORS: the search type was provided, but invalid
-#: ../client/pk-console.c:1430
+#: ../client/pk-console.c:1449
 msgid "Invalid search type"
 msgstr "Nieprawidłowy typ wyszukiwania"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1436
+#: ../client/pk-console.c:1455
 msgid "A package name to install is required"
 msgstr "Wymagana jest nazwa pakietu do zainstalowania"
 
 #. TRANSLATORS: the user did not specify what they wanted to install
-#: ../client/pk-console.c:1445
+#: ../client/pk-console.c:1464
 msgid "A filename to install is required"
 msgstr "Wymagana jest nazwa pliku do zainstalowania"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1457
+#: ../client/pk-console.c:1476
 msgid "A type, key_id and package_id are required"
 msgstr "Wymagany jest typ, key_id i package_id"
 
 #. TRANSLATORS: the user did not specify what they wanted to remove
-#: ../client/pk-console.c:1468
+#: ../client/pk-console.c:1487
 msgid "A package name to remove is required"
 msgstr "Wymagana jest nazwa pakietu do usunięcia"
 
 #. TRANSLATORS: the user did not specify anything about what to download or where
-#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1496
 msgid "A destination directory and the package names to download are required"
 msgstr "Wymagany jest katalog docelowy i nazwy pakietów do pobrania"
 
 #. TRANSLATORS: the directory does not exist, so we can't continue
-#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1503
 msgid "Directory not found"
 msgstr "Nie odnaleziono katalogu"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1493
+#: ../client/pk-console.c:1512
 msgid "A licence identifier (eula-id) is required"
 msgstr "Wymagany jest identyfikator licencji (eula-id)"
 
 #. TRANSLATORS: geeky error, 99.9999% of users won't see this
-#: ../client/pk-console.c:1504
+#: ../client/pk-console.c:1523
 msgid "A transaction identifier (tid) is required"
 msgstr "Wymagany jest identyfikator transakcji (tid)"
 
 #. TRANSLATORS: The user did not specify a package name
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1544
 msgid "A package name to resolve is required"
 msgstr "Wymagana jest nazwa pakietu do rozwiÄ…zania"
 
 #. TRANSLATORS: The user did not specify a repository (software source) name
-#: ../client/pk-console.c:1536 ../client/pk-console.c:1547
+#: ../client/pk-console.c:1555 ../client/pk-console.c:1566
 msgid "A repository name is required"
 msgstr "Wymagana jest nazwa repozytorium"
 
 #. TRANSLATORS: The user didn't provide any data
-#: ../client/pk-console.c:1558
+#: ../client/pk-console.c:1577
 msgid "A repo name, parameter and value are required"
 msgstr "Wymagana jest nazwa, parametr i wartość repozytorium"
 
 #. TRANSLATORS: The user didn't specify what action to use
-#: ../client/pk-console.c:1575
+#: ../client/pk-console.c:1594
 msgid "An action, e.g. 'update-system' is required"
 msgstr "Wymagane jest działanie, np. \"update-system\""
 
 #. TRANSLATORS: The user specified an invalid action
-#: ../client/pk-console.c:1582
+#: ../client/pk-console.c:1601
 msgid "A correct role is required"
 msgstr "Wymagana jest bieżąca rola"
 
 #. TRANSLATORS: The user did not provide a package name
 #. TRANSLATORS: This is when the user fails to supply the package name
-#: ../client/pk-console.c:1592 ../client/pk-console.c:1607
-#: ../client/pk-console.c:1616 ../client/pk-console.c:1636
-#: ../client/pk-console.c:1645 ../client/pk-generate-pack.c:316
+#: ../client/pk-console.c:1611 ../client/pk-console.c:1626
+#: ../client/pk-console.c:1635 ../client/pk-console.c:1655
+#: ../client/pk-console.c:1664 ../client/pk-generate-pack.c:316
 msgid "A package name is required"
 msgstr "Wymagana jest nazwa pakietu"
 
 #. TRANSLATORS: each package "provides" certain things, e.g. mime(gstreamer-decoder-mp3), the user didn't specify it
-#: ../client/pk-console.c:1625
+#: ../client/pk-console.c:1644
 msgid "A package provide string is required"
 msgstr "Wymagany jest łańcuch dostarczania pakietu"
 
 #. TRANSLATORS: The user tried to use an unsupported option on the command line
-#: ../client/pk-console.c:1705
+#: ../client/pk-console.c:1724
 #, c-format
 msgid "Option '%s' is not supported"
 msgstr "Opcja \"%s\" nie jest obsługiwana"
 
 #. TRANSLATORS: Generic failure of what they asked to do
-#: ../client/pk-console.c:1715
+#: ../client/pk-console.c:1734
 msgid "Command failed"
 msgstr "Polecenie nie powiodło się"
 
@@ -623,7 +628,7 @@ msgstr "Wyszukiwanie nazwy pakietu."
 #: ../client/pk-generate-pack.c:434
 #, c-format
 msgid "Failed to find package '%s': %s"
-msgstr "Nie można odnaleźć pakietu \"%s\": %s"
+msgstr "Odnalezienie pakietu \"%s\" nie powiodło się: %s"
 
 #. TRANSLATORS: This is telling the user we are in the process of making the pack
 #: ../client/pk-generate-pack.c:442
@@ -642,12 +647,12 @@ msgstr "Utworzono pakiet serwisowy \"%s\""
 msgid "Failed to create '%s': %s"
 msgstr "Utworzenie \"%s\" nie powiodło się: %s"
 
-#: ../client/pk-monitor.c:236
+#: ../client/pk-monitor.c:256
 msgid "Failed to get daemon state"
 msgstr "Uzyskanie stanu demona nie powiodło się"
 
 #. TRANSLATORS: this is a program that monitors PackageKit
-#: ../client/pk-monitor.c:322
+#: ../client/pk-monitor.c:342
 msgid "PackageKit Monitor"
 msgstr "Monitor PackageKit"
 
@@ -706,42 +711,42 @@ msgid "Installing..."
 msgstr "Instalowanie..."
 
 #. TRANSLATORS: downloading repo data so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:365
+#: ../contrib/command-not-found/pk-command-not-found.c:366
 msgid "Downloading details about the software sources."
 msgstr "Pobieranie szczegółów o źródłach oprogramowania."
 
 #. TRANSLATORS: downloading file lists so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:369
+#: ../contrib/command-not-found/pk-command-not-found.c:370
 msgid "Downloading filelists (this may take some time to complete)."
 msgstr "Pobieranie list plików (może to zająć trochę czasu)."
 
 #. TRANSLATORS: waiting for native lock
-#: ../contrib/command-not-found/pk-command-not-found.c:373
+#: ../contrib/command-not-found/pk-command-not-found.c:374
 msgid "Waiting for package manager lock."
 msgstr "Oczekiwanie na blokadę menedżera pakietów."
 
 #. TRANSLATORS: loading package cache so we can search
-#: ../contrib/command-not-found/pk-command-not-found.c:377
+#: ../contrib/command-not-found/pk-command-not-found.c:378
 msgid "Loading list of packages."
 msgstr "Wczytywanie listy pakietów."
 
 #. TRANSLATORS: we failed to find the package, this shouldn't happen
-#: ../contrib/command-not-found/pk-command-not-found.c:423
+#: ../contrib/command-not-found/pk-command-not-found.c:424
 msgid "Failed to search for file"
 msgstr "Odnalezienie pliku nie powiodło się"
 
 #. TRANSLATORS: we failed to launch the executable, the error follows
-#: ../contrib/command-not-found/pk-command-not-found.c:566
+#: ../contrib/command-not-found/pk-command-not-found.c:569
 msgid "Failed to launch:"
 msgstr "Uruchomienie nie powiodło się:"
 
 #. TRANSLATORS: we failed to install the package
-#: ../contrib/command-not-found/pk-command-not-found.c:594
+#: ../contrib/command-not-found/pk-command-not-found.c:597
 msgid "Failed to install packages"
 msgstr "Zainstalowanie pakietów nie powiodło się"
 
 #. TRANSLATORS: tool that gets called when the command is not found
-#: ../contrib/command-not-found/pk-command-not-found.c:670
+#: ../contrib/command-not-found/pk-command-not-found.c:673
 msgid "PackageKit Command Not Found"
 msgstr "Nie odnaleziono polecenia PackageKit"
 
@@ -751,51 +756,51 @@ msgid "Command not found."
 msgstr "Nie odnaleziono polecenia."
 
 #. TRANSLATORS: tell the user what we think the command is
-#: ../contrib/command-not-found/pk-command-not-found.c:706
+#: ../contrib/command-not-found/pk-command-not-found.c:717
 msgid "Similar command is:"
 msgstr "Podobne polecenie:"
 
 #. TRANSLATORS: Ask the user if we should run the similar command
-#: ../contrib/command-not-found/pk-command-not-found.c:716
+#: ../contrib/command-not-found/pk-command-not-found.c:727
 msgid "Run similar command:"
 msgstr "Wykonaj podobne polecenie:"
 
 #. TRANSLATORS: show the user a list of commands that they could have meant
 #. TRANSLATORS: show the user a list of commands we could run
-#: ../contrib/command-not-found/pk-command-not-found.c:730
-#: ../contrib/command-not-found/pk-command-not-found.c:739
+#: ../contrib/command-not-found/pk-command-not-found.c:741
+#: ../contrib/command-not-found/pk-command-not-found.c:750
 msgid "Similar commands are:"
 msgstr "Podobne polecenia:"
 
 #. TRANSLATORS: ask the user to choose a file to run
-#: ../contrib/command-not-found/pk-command-not-found.c:746
+#: ../contrib/command-not-found/pk-command-not-found.c:757
 msgid "Please choose a command to run"
 msgstr "Proszę wybrać polecenie do wykonania"
 
 #. TRANSLATORS: tell the user what package provides the command
-#: ../contrib/command-not-found/pk-command-not-found.c:764
+#: ../contrib/command-not-found/pk-command-not-found.c:775
 msgid "The package providing this file is:"
 msgstr "Pakiet dostarczajÄ…cy ten plik:"
 
 #. TRANSLATORS: as the user if we want to install a package to provide the command
-#: ../contrib/command-not-found/pk-command-not-found.c:769
+#: ../contrib/command-not-found/pk-command-not-found.c:780
 #, c-format
 msgid "Install package '%s' to provide command '%s'?"
 msgstr "Zainstalować pakiet \"%s\", aby dostarczyć polecenie \"%s\"?"
 
 #. TRANSLATORS: Show the user a list of packages that provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:793
+#: ../contrib/command-not-found/pk-command-not-found.c:804
 msgid "Packages providing this file are:"
 msgstr "Pakiety dostarczajÄ…ce ten plik:"
 
 #. TRANSLATORS: Show the user a list of packages that they can install to provide this command
-#: ../contrib/command-not-found/pk-command-not-found.c:803
+#: ../contrib/command-not-found/pk-command-not-found.c:814
 msgid "Suitable packages are:"
 msgstr "Odpowiednie pakiety:"
 
 #. get selection
 #. TRANSLATORS: ask the user to choose a file to install
-#: ../contrib/command-not-found/pk-command-not-found.c:812
+#: ../contrib/command-not-found/pk-command-not-found.c:823
 msgid "Please choose a package to install"
 msgstr "Proszę wybrać pakiet do zainstalowania"
 
@@ -965,7 +970,7 @@ msgstr "Pakiety nie zostanÄ… zainstalowane w trybie symulacji"
 #. TRANSLATORS: we are now installing the debuginfo packages we found earlier
 #. TRANSLATORS: transaction state, installing packages
 #: ../contrib/debuginfo-install/pk-debuginfo-install.c:862
-#: ../lib/packagekit-glib2/pk-console-shared.c:282
+#: ../lib/packagekit-glib2/pk-console-shared.c:283
 #, c-format
 msgid "Installing packages"
 msgstr "Instalowanie pakietów"
@@ -1102,7 +1107,7 @@ msgid "Please enter a number from 1 to %i: "
 msgstr "Proszę podać numer od 1 do %i: "
 
 #. TRANSLATORS: more than one package could be found that matched, to follow is a list of possible packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:183
+#: ../lib/packagekit-glib2/pk-console-shared.c:185
 msgid "More than one package matches:"
 msgstr "Pasuje więcej niż jeden pakiet:"
 
@@ -1112,448 +1117,448 @@ msgid "Please choose the correct package: "
 msgstr "Proszę wybrać poprawny pakiet: "
 
 #. TRANSLATORS: This is when the transaction status is not known
-#: ../lib/packagekit-glib2/pk-console-shared.c:250
+#: ../lib/packagekit-glib2/pk-console-shared.c:251
 msgid "Unknown state"
 msgstr "Nieznany stan"
 
 #. TRANSLATORS: transaction state, the daemon is in the process of starting
-#: ../lib/packagekit-glib2/pk-console-shared.c:254
+#: ../lib/packagekit-glib2/pk-console-shared.c:255
 msgid "Starting"
 msgstr "Rozpoczynanie"
 
 #. TRANSLATORS: transaction state, the transaction is waiting for another to complete
-#: ../lib/packagekit-glib2/pk-console-shared.c:258
+#: ../lib/packagekit-glib2/pk-console-shared.c:259
 msgid "Waiting in queue"
 msgstr "Oczekiwanie w kolejce"
 
 #. TRANSLATORS: transaction state, just started
-#: ../lib/packagekit-glib2/pk-console-shared.c:262
+#: ../lib/packagekit-glib2/pk-console-shared.c:263
 msgid "Running"
 msgstr "Wykonywanie"
 
 #. TRANSLATORS: transaction state, is querying data
-#: ../lib/packagekit-glib2/pk-console-shared.c:266
+#: ../lib/packagekit-glib2/pk-console-shared.c:267
 msgid "Querying"
 msgstr "Odpytywanie"
 
 #. TRANSLATORS: transaction state, getting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:270
+#: ../lib/packagekit-glib2/pk-console-shared.c:271
 msgid "Getting information"
 msgstr "Pobieranie informacji"
 
 #. TRANSLATORS: transaction state, removing packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:274
+#: ../lib/packagekit-glib2/pk-console-shared.c:275
 msgid "Removing packages"
 msgstr "Usuwanie pakietu"
 
 #. TRANSLATORS: transaction state, downloading package files
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:278
-#: ../lib/packagekit-glib2/pk-console-shared.c:656
+#: ../lib/packagekit-glib2/pk-console-shared.c:279
+#: ../lib/packagekit-glib2/pk-console-shared.c:657
 msgid "Downloading packages"
 msgstr "Pobieranie pakietów"
 
 #. TRANSLATORS: transaction state, refreshing internal lists
-#: ../lib/packagekit-glib2/pk-console-shared.c:286
+#: ../lib/packagekit-glib2/pk-console-shared.c:287
 msgid "Refreshing software list"
 msgstr "Odświeżanie listy oprogramowania"
 
 #. TRANSLATORS: transaction state, installing updates
-#: ../lib/packagekit-glib2/pk-console-shared.c:290
+#: ../lib/packagekit-glib2/pk-console-shared.c:291
 msgid "Installing updates"
 msgstr "Instalowanie aktualizacji"
 
 #. TRANSLATORS: transaction state, removing old packages, and cleaning config files
-#: ../lib/packagekit-glib2/pk-console-shared.c:294
+#: ../lib/packagekit-glib2/pk-console-shared.c:295
 msgid "Cleaning up packages"
 msgstr "Czyszczenie pakietów"
 
 #. TRANSLATORS: transaction state, obsoleting old packages
-#: ../lib/packagekit-glib2/pk-console-shared.c:298
+#: ../lib/packagekit-glib2/pk-console-shared.c:299
 msgid "Obsoleting packages"
 msgstr "Zastępowanie pakietów"
 
 #. TRANSLATORS: transaction state, checking the transaction before we do it
-#: ../lib/packagekit-glib2/pk-console-shared.c:302
+#: ../lib/packagekit-glib2/pk-console-shared.c:303
 msgid "Resolving dependencies"
 msgstr "Rozwiązywanie zależności"
 
 #. TRANSLATORS: transaction state, checking if we have all the security keys for the operation
-#: ../lib/packagekit-glib2/pk-console-shared.c:306
+#: ../lib/packagekit-glib2/pk-console-shared.c:307
 msgid "Checking signatures"
 msgstr "Sprawdzanie podpisów"
 
 #. TRANSLATORS: transaction state, when we return to a previous system state
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:310
-#: ../lib/packagekit-glib2/pk-console-shared.c:616
+#: ../lib/packagekit-glib2/pk-console-shared.c:311
+#: ../lib/packagekit-glib2/pk-console-shared.c:617
 msgid "Rolling back"
 msgstr "Przywracanie"
 
 #. TRANSLATORS: transaction state, when we're doing a test transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:314
+#: ../lib/packagekit-glib2/pk-console-shared.c:315
 msgid "Testing changes"
 msgstr "Testowanie zmian"
 
 #. TRANSLATORS: transaction state, when we're writing to the system package database
-#: ../lib/packagekit-glib2/pk-console-shared.c:318
+#: ../lib/packagekit-glib2/pk-console-shared.c:319
 msgid "Committing changes"
 msgstr "Wprowadzanie zmian"
 
 #. TRANSLATORS: transaction state, requesting data from a server
-#: ../lib/packagekit-glib2/pk-console-shared.c:322
+#: ../lib/packagekit-glib2/pk-console-shared.c:323
 msgid "Requesting data"
 msgstr "Żądanie danych"
 
 #. TRANSLATORS: transaction state, all done!
-#: ../lib/packagekit-glib2/pk-console-shared.c:326
+#: ../lib/packagekit-glib2/pk-console-shared.c:327
 msgid "Finished"
 msgstr "Ukończono"
 
 #. TRANSLATORS: transaction state, in the process of cancelling
-#: ../lib/packagekit-glib2/pk-console-shared.c:330
+#: ../lib/packagekit-glib2/pk-console-shared.c:331
 msgid "Cancelling"
 msgstr "Anulowanie"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:334
+#: ../lib/packagekit-glib2/pk-console-shared.c:335
 msgid "Downloading repository information"
 msgstr "Pobieranie informacji o repozytorium"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:338
+#: ../lib/packagekit-glib2/pk-console-shared.c:339
 msgid "Downloading list of packages"
 msgstr "Pobieranie listy pakietów"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:342
+#: ../lib/packagekit-glib2/pk-console-shared.c:343
 msgid "Downloading file lists"
 msgstr "Pobieranie list plików"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:346
+#: ../lib/packagekit-glib2/pk-console-shared.c:347
 msgid "Downloading lists of changes"
 msgstr "Pobieranie listy zmian"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:350
+#: ../lib/packagekit-glib2/pk-console-shared.c:351
 msgid "Downloading groups"
 msgstr "Pobieranie grup"
 
 #. TRANSLATORS: transaction state, downloading metadata
-#: ../lib/packagekit-glib2/pk-console-shared.c:354
+#: ../lib/packagekit-glib2/pk-console-shared.c:355
 msgid "Downloading update information"
 msgstr "Pobieranie informacji o aktualizacji"
 
 #. TRANSLATORS: transaction state, repackaging delta files
-#: ../lib/packagekit-glib2/pk-console-shared.c:358
+#: ../lib/packagekit-glib2/pk-console-shared.c:359
 msgid "Repackaging files"
 msgstr "Ponowne umieszczanie plików w pakietach"
 
 #. TRANSLATORS: transaction state, loading databases
-#: ../lib/packagekit-glib2/pk-console-shared.c:362
+#: ../lib/packagekit-glib2/pk-console-shared.c:363
 msgid "Loading cache"
 msgstr "Wczytywanie pamięci podręcznej"
 
 #. TRANSLATORS: transaction state, scanning for running processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:366
+#: ../lib/packagekit-glib2/pk-console-shared.c:367
 msgid "Scanning applications"
 msgstr "Skanowanie programów"
 
 #. TRANSLATORS: transaction state, generating a list of packages installed on the system
-#: ../lib/packagekit-glib2/pk-console-shared.c:370
+#: ../lib/packagekit-glib2/pk-console-shared.c:371
 msgid "Generating package lists"
 msgstr "Tworzenie list pakietów"
 
 #. TRANSLATORS: transaction state, when we're waiting for the native tools to exit
-#: ../lib/packagekit-glib2/pk-console-shared.c:374
+#: ../lib/packagekit-glib2/pk-console-shared.c:375
 msgid "Waiting for package manager lock"
 msgstr "Oczekiwanie na blokadę menedżera pakietów"
 
 #. TRANSLATORS: transaction state, waiting for user to type in a password
-#: ../lib/packagekit-glib2/pk-console-shared.c:378
+#: ../lib/packagekit-glib2/pk-console-shared.c:379
 msgid "Waiting for authentication"
 msgstr "Oczekiwanie na uwierzytelnienie"
 
 #. TRANSLATORS: transaction state, we are updating the list of processes
-#: ../lib/packagekit-glib2/pk-console-shared.c:382
+#: ../lib/packagekit-glib2/pk-console-shared.c:383
 msgid "Updating running applications"
 msgstr "Aktualizowanie uruchomionych programów"
 
 #. TRANSLATORS: transaction state, we are checking executable files currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:386
+#: ../lib/packagekit-glib2/pk-console-shared.c:387
 msgid "Checking applications in use"
 msgstr "Sprawdzanie używanych programów"
 
 #. TRANSLATORS: transaction state, we are checking for libraries currently in use
-#: ../lib/packagekit-glib2/pk-console-shared.c:390
+#: ../lib/packagekit-glib2/pk-console-shared.c:391
 msgid "Checking libraries in use"
 msgstr "Sprawdzanie używanych bibliotek"
 
 #. TRANSLATORS: transaction state, we are copying package files before or after the transaction
-#: ../lib/packagekit-glib2/pk-console-shared.c:394
+#: ../lib/packagekit-glib2/pk-console-shared.c:395
 msgid "Copying files"
 msgstr "Kopiowanie plików"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:412
+#: ../lib/packagekit-glib2/pk-console-shared.c:413
 msgid "Trivial"
 msgstr "Drobna"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:416
+#: ../lib/packagekit-glib2/pk-console-shared.c:417
 msgid "Normal"
 msgstr "Normalna"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:420
+#: ../lib/packagekit-glib2/pk-console-shared.c:421
 msgid "Important"
 msgstr "Ważna"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:424
+#: ../lib/packagekit-glib2/pk-console-shared.c:425
 msgid "Security"
 msgstr "Bezpieczeństwa"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:428
+#: ../lib/packagekit-glib2/pk-console-shared.c:429
 msgid "Bug fix "
 msgstr "Naprawiająca błędy"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:432
+#: ../lib/packagekit-glib2/pk-console-shared.c:433
 msgid "Enhancement"
 msgstr "Ulepszenie"
 
 #. TRANSLATORS: The type of update
-#: ../lib/packagekit-glib2/pk-console-shared.c:436
+#: ../lib/packagekit-glib2/pk-console-shared.c:437
 msgid "Blocked"
 msgstr "Zablokowana"
 
 #. TRANSLATORS: The state of a package
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:441
-#: ../lib/packagekit-glib2/pk-console-shared.c:514
+#: ../lib/packagekit-glib2/pk-console-shared.c:442
+#: ../lib/packagekit-glib2/pk-console-shared.c:515
 msgid "Installed"
 msgstr "Zainstalowana"
 
 #. TRANSLATORS: The state of a package, i.e. not installed
-#: ../lib/packagekit-glib2/pk-console-shared.c:446
+#: ../lib/packagekit-glib2/pk-console-shared.c:447
 msgid "Available"
 msgstr "Dostępna"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:464
+#: ../lib/packagekit-glib2/pk-console-shared.c:465
 msgid "Downloading"
 msgstr "Pobieranie"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:468
+#: ../lib/packagekit-glib2/pk-console-shared.c:469
 msgid "Updating"
 msgstr "Aktualizowanie"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:472
-#: ../lib/packagekit-glib2/pk-console-shared.c:592
+#: ../lib/packagekit-glib2/pk-console-shared.c:473
+#: ../lib/packagekit-glib2/pk-console-shared.c:593
 msgid "Installing"
 msgstr "Instalowanie"
 
 #. TRANSLATORS: The action of the package, in present tense
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:476
-#: ../lib/packagekit-glib2/pk-console-shared.c:588
+#: ../lib/packagekit-glib2/pk-console-shared.c:477
+#: ../lib/packagekit-glib2/pk-console-shared.c:589
 msgid "Removing"
 msgstr "Usuwanie"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:480
+#: ../lib/packagekit-glib2/pk-console-shared.c:481
 msgid "Cleaning up"
 msgstr "Czyszczenie"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:484
+#: ../lib/packagekit-glib2/pk-console-shared.c:485
 msgid "Obsoleting"
 msgstr "Zastępowanie"
 
 #. TRANSLATORS: The action of the package, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:488
+#: ../lib/packagekit-glib2/pk-console-shared.c:489
 msgid "Reinstalling"
 msgstr "Ponowne instalowanie"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:506
+#: ../lib/packagekit-glib2/pk-console-shared.c:507
 msgid "Downloaded"
 msgstr "Pobierano"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:518
+#: ../lib/packagekit-glib2/pk-console-shared.c:519
 msgid "Removed"
 msgstr "Usunięto"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:522
+#: ../lib/packagekit-glib2/pk-console-shared.c:523
 msgid "Cleaned up"
 msgstr "Wyczyszczono"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:526
+#: ../lib/packagekit-glib2/pk-console-shared.c:527
 msgid "Obsoleted"
 msgstr "ZastÄ…piono"
 
 #. TRANSLATORS: The action of the package, in past tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:530
+#: ../lib/packagekit-glib2/pk-console-shared.c:531
 msgid "Reinstalled"
 msgstr "Zainstalowano ponownie"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:548
+#: ../lib/packagekit-glib2/pk-console-shared.c:549
 msgid "Unknown role type"
 msgstr "Nieznany typ roli"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:552
+#: ../lib/packagekit-glib2/pk-console-shared.c:553
 msgid "Getting dependencies"
 msgstr "Pobieranie zależności"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:556
+#: ../lib/packagekit-glib2/pk-console-shared.c:557
 msgid "Getting update details"
 msgstr "Pobieranie szczegółów aktualizacji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:560
+#: ../lib/packagekit-glib2/pk-console-shared.c:561
 msgid "Getting details"
 msgstr "Pobieranie szczegółów"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:564
+#: ../lib/packagekit-glib2/pk-console-shared.c:565
 msgid "Getting requires"
 msgstr "Pobieranie wymagań"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:568
+#: ../lib/packagekit-glib2/pk-console-shared.c:569
 msgid "Getting updates"
 msgstr "Pobieranie aktualizacji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:572
+#: ../lib/packagekit-glib2/pk-console-shared.c:573
 msgid "Searching by details"
 msgstr "Wyszukiwanie według szczegółów"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:576
+#: ../lib/packagekit-glib2/pk-console-shared.c:577
 msgid "Searching by file"
 msgstr "Wyszukiwanie według plików"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:580
+#: ../lib/packagekit-glib2/pk-console-shared.c:581
 msgid "Searching groups"
 msgstr "Wyszukiwanie grup"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:584
+#: ../lib/packagekit-glib2/pk-console-shared.c:585
 msgid "Searching by name"
 msgstr "Wyszukiwanie według nazw"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:596
+#: ../lib/packagekit-glib2/pk-console-shared.c:597
 msgid "Installing files"
 msgstr "Instalowanie plików"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:600
+#: ../lib/packagekit-glib2/pk-console-shared.c:601
 msgid "Refreshing cache"
 msgstr "Odświeżanie pamięci podręcznej"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:604
+#: ../lib/packagekit-glib2/pk-console-shared.c:605
 msgid "Updating packages"
 msgstr "Aktualizowanie pakietów"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:608
+#: ../lib/packagekit-glib2/pk-console-shared.c:609
 msgid "Updating system"
 msgstr "Aktualizowanie systemu"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:612
+#: ../lib/packagekit-glib2/pk-console-shared.c:613
 msgid "Canceling"
 msgstr "Anulowanie"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:620
+#: ../lib/packagekit-glib2/pk-console-shared.c:621
 msgid "Getting repositories"
 msgstr "Pobieranie repozytoriów"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:624
+#: ../lib/packagekit-glib2/pk-console-shared.c:625
 msgid "Enabling repository"
 msgstr "WÅ‚Ä…czanie repozytorium"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:628
+#: ../lib/packagekit-glib2/pk-console-shared.c:629
 msgid "Setting data"
 msgstr "Ustawianie danych"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:632
+#: ../lib/packagekit-glib2/pk-console-shared.c:633
 msgid "Resolving"
 msgstr "RozwiÄ…zywanie"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:636
+#: ../lib/packagekit-glib2/pk-console-shared.c:637
 msgid "Getting file list"
 msgstr "Pobieranie listy plików"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:640
+#: ../lib/packagekit-glib2/pk-console-shared.c:641
 msgid "Getting provides"
 msgstr "Pobieranie dostarczanych"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:644
+#: ../lib/packagekit-glib2/pk-console-shared.c:645
 msgid "Installing signature"
 msgstr "Instalowanie podpisu"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:648
+#: ../lib/packagekit-glib2/pk-console-shared.c:649
 msgid "Getting packages"
 msgstr "Pobieranie pakietów"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:652
+#: ../lib/packagekit-glib2/pk-console-shared.c:653
 msgid "Accepting EULA"
 msgstr "Akceptowanie licencji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:660
+#: ../lib/packagekit-glib2/pk-console-shared.c:661
 msgid "Getting upgrades"
 msgstr "Pobieranie aktualizacji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:664
+#: ../lib/packagekit-glib2/pk-console-shared.c:665
 msgid "Getting categories"
 msgstr "Pobieranie kategorii"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:668
+#: ../lib/packagekit-glib2/pk-console-shared.c:669
 msgid "Getting transactions"
 msgstr "Pobieranie transakcji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:672
-#: ../lib/packagekit-glib2/pk-console-shared.c:676
+#: ../lib/packagekit-glib2/pk-console-shared.c:673
+#: ../lib/packagekit-glib2/pk-console-shared.c:677
 msgid "Simulating install"
 msgstr "Symulowanie instalacji"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:680
+#: ../lib/packagekit-glib2/pk-console-shared.c:681
 msgid "Simulating remove"
 msgstr "Symulowanie usunięcia"
 
 #. TRANSLATORS: The role of the transaction, in present tense
-#: ../lib/packagekit-glib2/pk-console-shared.c:684
+#: ../lib/packagekit-glib2/pk-console-shared.c:685
 msgid "Simulating update"
 msgstr "Symulowanie aktualizacji"
 
@@ -1997,24 +2002,24 @@ msgid "Show debugging information for all files"
 msgstr "Wyświetla informacje o debugowaniu dla wszystkich plików"
 
 #. TRANSLATORS: a list of modules to debug
-#: ../src/egg-debug.c:459
+#: ../src/egg-debug.c:458
 msgid "Debug these specific modules"
 msgstr "Debuguje podane moduły"
 
 #. TRANSLATORS: a list of functions to debug
-#: ../src/egg-debug.c:462
+#: ../src/egg-debug.c:461
 msgid "Debug these specific functions"
 msgstr "Debuguje podane funkcje"
 
 #. TRANSLATORS: save to a log
-#: ../src/egg-debug.c:465
+#: ../src/egg-debug.c:464
 msgid "Log debugging data to a file"
 msgstr "Zapisuje dane debugowania do pliku"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Debugging Options"
 msgstr "Opcje debugowania"
 
-#: ../src/egg-debug.c:469
+#: ../src/egg-debug.c:468
 msgid "Show debugging options"
 msgstr "Wyświetla opcje debugowania"
commit 9bdd05966612891eb744b290558ceb2bd9943bd6
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 1 22:09:19 2010 +0100

    Add support for the 'frontend-socket' hint and pass it to backends

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 81751cd..25a5534 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -93,6 +93,7 @@ struct _PkBackendPrivate
 	gboolean		 use_threads;
 	gchar			*transaction_id;
 	gchar			*locale;
+	gchar			*frontend_socket;
 	gchar			*name;
 	gchar			*proxy_ftp;
 	gchar			*proxy_http;
@@ -1314,6 +1315,34 @@ pk_backend_set_locale (PkBackend *backend, const gchar *code)
 }
 
 /**
+ * pk_backend_get_frontend_socket:
+ *
+ * Return value: session frontend_socket, e.g. /tmp/socket.345
+ **/
+gchar *
+pk_backend_get_frontend_socket (PkBackend *backend)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
+	return g_strdup (backend->priv->frontend_socket);
+}
+
+/**
+ * pk_backend_set_frontend_socket:
+ **/
+gboolean
+pk_backend_set_frontend_socket (PkBackend *backend, const gchar *frontend_socket)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
+	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
+
+	egg_debug ("frontend_socket changed to %s", frontend_socket);
+	g_free (backend->priv->frontend_socket);
+	backend->priv->frontend_socket = g_strdup (frontend_socket);
+
+	return TRUE;
+}
+
+/**
  * pk_backend_details:
  **/
 gboolean
@@ -2404,6 +2433,7 @@ pk_backend_finalize (GObject *object)
 	g_free (backend->priv->proxy_ftp);
 	g_free (backend->priv->name);
 	g_free (backend->priv->locale);
+	g_free (backend->priv->frontend_socket);
 	g_free (backend->priv->transaction_id);
 	g_object_unref (backend->priv->results);
 	g_object_unref (backend->priv->time);
@@ -3043,6 +3073,7 @@ pk_backend_init (PkBackend *backend)
 	backend->priv->handle = NULL;
 	backend->priv->name = NULL;
 	backend->priv->locale = NULL;
+	backend->priv->frontend_socket = NULL;
 	backend->priv->transaction_id = NULL;
 	backend->priv->proxy_http = NULL;
 	backend->priv->proxy_ftp = NULL;
diff --git a/src/pk-backend.h b/src/pk-backend.h
index 923b36f..48d083e 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -72,6 +72,8 @@ gboolean	 pk_backend_set_simultaneous_mode	(PkBackend	*backend,
 							 gboolean	 simultaneous);
 gboolean	 pk_backend_set_locale			(PkBackend	*backend,
 							 const gchar	*code);
+gboolean	 pk_backend_set_frontend_socket		(PkBackend	*backend,
+							 const gchar	*frontend_socket);
 
 /* get the state */
 gboolean	 pk_backend_get_allow_cancel		(PkBackend	*backend);
@@ -84,6 +86,7 @@ guint		 pk_backend_get_runtime			(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_ftp		(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_http		(PkBackend	*backend);
 gchar		*pk_backend_get_locale			(PkBackend	*backend);
+gchar		*pk_backend_get_frontend_socket		(PkBackend	*backend);
 
 /* signal helpers */
 gboolean	 pk_backend_finished			(PkBackend	*backend);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 5b51e30..c78f2db 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -103,6 +103,7 @@ struct PkTransactionPrivate
 	PkHintEnum		 background;
 	PkHintEnum		 interactive;
 	gchar			*locale;
+	gchar			*frontend_socket;
 	guint			 uid;
 	EggDbusMonitor		*monitor;
 	PkBackend		*backend;
@@ -1624,6 +1625,9 @@ pk_transaction_set_running (PkTransaction *transaction)
 	else
 		pk_backend_set_locale (priv->backend, priv->locale);
 
+	/* set the frontend socket if it exists */
+	pk_backend_set_frontend_socket (priv->backend, priv->frontend_socket);
+
 	/* set the role */
 	pk_backend_set_role (priv->backend, priv->role);
 	egg_debug ("setting role for %s to %s", priv->tid, pk_role_enum_to_string (priv->role));
@@ -4487,6 +4491,46 @@ pk_transaction_set_hint (PkTransaction *transaction, const gchar *key, const gch
 		goto out;
 	}
 
+	/* frontend_socket=/tmp/socket.3456 */
+	if (g_strcmp0 (key, "frontend-socket") == 0) {
+
+		/* already set */
+		if (priv->frontend_socket != NULL) {
+			g_set_error (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
+				     "Already set frontend-socket to %s", priv->frontend_socket);
+			ret = FALSE;
+			goto out;
+		}
+
+		/* nothing provided */
+		if (value == NULL || value[0] == '\0') {
+			g_set_error_literal (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
+					     "Could not set frontend-socket to nothing");
+			ret = FALSE;
+			goto out;
+		}
+
+		/* nothing provided */
+		if (value[0] != '/') {
+			g_set_error_literal (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
+					     "frontend-socket has to be an absolute path");
+			ret = FALSE;
+			goto out;
+		}
+
+		/* socket does not exist */
+		if (!g_file_test (value, G_FILE_TEST_EXISTS)) {
+			g_set_error_literal (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
+					     "frontend-socket does not exist");
+			ret = FALSE;
+			goto out;
+		}
+
+		/* success */
+		priv->frontend_socket = g_strdup (value);
+		goto out;
+	}
+
 	/* background=true */
 	if (g_strcmp0 (key, "background") == 0) {
 		priv->background = pk_hint_enum_from_string (value);
@@ -5407,6 +5451,7 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->tid = NULL;
 	transaction->priv->sender = NULL;
 	transaction->priv->locale = NULL;
+	transaction->priv->frontend_socket = NULL;
 #ifdef USE_SECURITY_POLKIT
 	transaction->priv->subject = NULL;
 #endif
@@ -5498,6 +5543,7 @@ pk_transaction_finalize (GObject *object)
 #endif
 	g_free (transaction->priv->last_package_id);
 	g_free (transaction->priv->locale);
+	g_free (transaction->priv->frontend_socket);
 	g_free (transaction->priv->cached_package_id);
 	g_free (transaction->priv->cached_key_id);
 	g_strfreev (transaction->priv->cached_package_ids);
commit 26eb4321e30fa5fb4f843e43a1e28547acd2e898
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 1 21:07:32 2010 +0100

    Don't return from SetProxy() before we've got the authentication result

diff --git a/client/pk-console.c b/client/pk-console.c
index 0cb1c71..d9c1317 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1359,7 +1359,7 @@ main (int argc, char *argv[])
 	ftp_proxy = g_getenv ("ftp_proxy");
 	if (http_proxy != NULL ||
 	    ftp_proxy != NULL) {
-		ret = pk_control_set_proxy (control, http_proxy, http_proxy, NULL, &error_local);
+		ret = pk_control_set_proxy (control, http_proxy, ftp_proxy, NULL, &error_local);
 		if (!ret) {
 			/* TRANSLATORS: The user specified an incorrect filter */
 			error = g_error_new (1, 0, "%s: %s", _("The proxy could not be set"), error_local->message);
diff --git a/src/pk-engine.c b/src/pk-engine.c
index fcd8c87..022c82e 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -691,7 +691,7 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
  * pk_engine_set_proxy_internal:
  **/
 static gboolean
-pk_engine_set_proxy_internal (PkEngine *engine)
+pk_engine_set_proxy_internal (PkEngine *engine, const gchar *sender)
 {
 	gboolean ret;
 	guint uid;
@@ -705,14 +705,14 @@ pk_engine_set_proxy_internal (PkEngine *engine)
 	}
 
 	/* get uid */
-	uid = pk_dbus_get_uid (engine->priv->dbus, engine->priv->sender);
+	uid = pk_dbus_get_uid (engine->priv->dbus, sender);
 	if (uid == G_MAXUINT) {
 		egg_warning ("failed to get the uid");
 		goto out;
 	}
 
 	/* get session */
-	session = pk_dbus_get_session (engine->priv->dbus, engine->priv->sender);
+	session = pk_dbus_get_session (engine->priv->dbus, sender);
 	if (session == NULL) {
 		egg_warning ("failed to get the session");
 		goto out;
@@ -731,41 +731,64 @@ out:
 }
 
 #ifdef USE_SECURITY_POLKIT
+typedef struct {
+	DBusGMethodInvocation	*context;
+	PkEngine		*engine;
+	gchar			*sender;
+} PkEngineDbusState;
+#endif
+
+#ifdef USE_SECURITY_POLKIT
 /**
  * pk_engine_action_obtain_authorization:
  **/
 static void
-pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyncResult *res, PkEngine *engine)
+pk_engine_action_obtain_authorization_finished_cb (GObject *source_object, GAsyncResult *res, PkEngineDbusState *state)
 {
 	PolkitAuthorizationResult *result;
-	GError *error = NULL;
+	GError *error_local = NULL;
+	GError *error;
 	gboolean ret;
 
 	/* finish the call */
-	result = polkit_authority_check_authorization_finish (engine->priv->authority, res, &error);
+	result = polkit_authority_check_authorization_finish (state->engine->priv->authority, res, &error_local);
 
 	/* failed */
 	if (result == NULL) {
-		egg_warning ("failed to check for auth: %s", error->message);
-		g_error_free (error);
+		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+				     "setting the proxy failed, could not check for auth: %s", error_local->message);
+		dbus_g_method_return_error (state->context, error);
+		g_error_free (error_local);
 		goto out;
 	}
 
 	/* did not auth */
 	if (!polkit_authorization_result_get_is_authorized (result)) {
-		egg_warning ("failed to obtain auth");
+		error = g_error_new_literal (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+					     "failed to obtain auth");
+		dbus_g_method_return_error (state->context, error);
 		goto out;
 	}
 
 	/* try to set the new proxy and save to database */
-	ret = pk_engine_set_proxy_internal (engine);
+	ret = pk_engine_set_proxy_internal (state->engine, state->sender);
 	if (!ret) {
-		egg_warning ("setting the proxy failed");
+		error = g_error_new_literal (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY,
+					     "setting the proxy failed");
+		dbus_g_method_return_error (state->context, error);
 		goto out;
 	}
+
+	/* all okay */
+	dbus_g_method_return (state->context);
 out:
 	if (result != NULL)
 		g_object_unref (result);
+
+	/* unref state, we're done */
+	g_object_unref (state->engine);
+	g_free (state->sender);
+	g_free (state);
 }
 #endif
 
@@ -773,7 +796,7 @@ out:
  * pk_engine_is_proxy_unchanged:
  **/
 static gboolean
-pk_engine_is_proxy_unchanged (PkEngine *engine, const gchar *proxy_http, const gchar *proxy_ftp)
+pk_engine_is_proxy_unchanged (PkEngine *engine, const gchar *sender, const gchar *proxy_http, const gchar *proxy_ftp)
 {
 	guint uid;
 	gboolean ret = FALSE;
@@ -782,16 +805,16 @@ pk_engine_is_proxy_unchanged (PkEngine *engine, const gchar *proxy_http, const g
 	gchar *proxy_ftp_tmp = NULL;
 
 	/* get uid */
-	uid = pk_dbus_get_uid (engine->priv->dbus, engine->priv->sender);
+	uid = pk_dbus_get_uid (engine->priv->dbus, sender);
 	if (uid == G_MAXUINT) {
-		egg_warning ("failed to get the uid for %s", engine->priv->sender);
+		egg_warning ("failed to get the uid for %s", sender);
 		goto out;
 	}
 
 	/* get session */
-	session = pk_dbus_get_session (engine->priv->dbus, engine->priv->sender);
+	session = pk_dbus_get_session (engine->priv->dbus, sender);
 	if (session == NULL) {
-		egg_warning ("failed to get the session for %s", engine->priv->sender);
+		egg_warning ("failed to get the session for %s", sender);
 		goto out;
 	}
 
@@ -820,9 +843,11 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	guint len;
 	GError *error = NULL;
 	gboolean ret;
+	gchar *sender = NULL;
 #ifdef USE_SECURITY_POLKIT
 	PolkitSubject *subject;
 	PolkitDetails *details;
+	PkEngineDbusState *state;
 #endif
 	g_return_if_fail (PK_IS_ENGINE (engine));
 
@@ -839,7 +864,7 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	if (len == 1024) {
 		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "http proxy was too long");
 		dbus_g_method_return_error (context, error);
-		return;
+		goto out;
 	}
 
 	/* check length of ftp */
@@ -847,19 +872,18 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	if (len == 1024) {
 		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "ftp proxy was too long");
 		dbus_g_method_return_error (context, error);
-		return;
+		goto out;
 	}
 
 	/* save sender */
-	g_free (engine->priv->sender);
-	engine->priv->sender = dbus_g_method_get_sender (context);
+	sender = dbus_g_method_get_sender (context);
 
 	/* is exactly the same proxy? */
-	ret = pk_engine_is_proxy_unchanged (engine, proxy_http, proxy_ftp);
+	ret = pk_engine_is_proxy_unchanged (engine, sender, proxy_http, proxy_ftp);
 	if (ret) {
 		egg_debug ("not changing proxy as the same as before");
 		dbus_g_method_return (context);
-		return;
+		goto out;
 	}
 
 	/* save these so we can set them after the auth success */
@@ -867,17 +891,23 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	g_free (engine->priv->proxy_ftp);
 	engine->priv->proxy_http = g_strdup (proxy_http);
 	engine->priv->proxy_ftp = g_strdup (proxy_ftp);
-	egg_debug ("changing http proxy to %s for %s", proxy_http, engine->priv->sender);
-	egg_debug ("changing ftp proxy to %s for %s", proxy_ftp, engine->priv->sender);
+	egg_debug ("changing http proxy to %s for %s", proxy_http, sender);
+	egg_debug ("changing ftp proxy to %s for %s", proxy_ftp, sender);
 
 #ifdef USE_SECURITY_POLKIT
 	/* check subject */
-	subject = polkit_system_bus_name_new (engine->priv->sender);
+	subject = polkit_system_bus_name_new (sender);
 
 	/* insert details about the authorization */
 	details = polkit_details_new ();
 	polkit_details_insert (details, "role", pk_role_enum_to_string (PK_ROLE_ENUM_UNKNOWN));
 
+	/* cache state */
+	state = g_new0 (PkEngineDbusState, 1);
+	state->context = context;
+	state->engine = g_object_ref (engine);
+	state->sender = g_strdup (sender);
+
 	/* do authorization async */
 	polkit_authority_check_authorization (engine->priv->authority, subject,
 					      "org.freedesktop.packagekit.system-network-proxy-configure",
@@ -885,7 +915,7 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 					      POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
 					      NULL,
 					      (GAsyncReadyCallback) pk_engine_action_obtain_authorization_finished_cb,
-					      engine);
+					      state);
 
 	/* check_authorization ref's this */
 	g_object_unref (details);
@@ -897,11 +927,12 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 	if (!ret) {
 		error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_CANNOT_SET_PROXY, "%s", "setting the proxy failed");
 		dbus_g_method_return_error (context, error);
-		return;
+		goto out;
 	}
-#endif
+
 	/* all okay */
 	dbus_g_method_return (context);
+#endif
 
 	/* reset the timer */
 	pk_engine_reset_timer (engine);
@@ -909,6 +940,8 @@ pk_engine_set_proxy (PkEngine *engine, const gchar *proxy_http, const gchar *pro
 #ifdef USE_SECURITY_POLKIT
 	g_object_unref (subject);
 #endif
+out:
+	g_free (sender);
 }
 
 /**
@@ -1284,7 +1317,6 @@ pk_engine_init (PkEngine *engine)
 	engine->priv->backend_name = NULL;
 	engine->priv->backend_description = NULL;
 	engine->priv->backend_author = NULL;
-	engine->priv->sender = NULL;
 	engine->priv->locked = FALSE;
 	engine->priv->distro_id = NULL;
 
@@ -1448,7 +1480,6 @@ pk_engine_finalize (GObject *object)
 	g_free (engine->priv->mime_types);
 	g_free (engine->priv->proxy_http);
 	g_free (engine->priv->proxy_ftp);
-	g_free (engine->priv->sender);
 	g_free (engine->priv->backend_name);
 	g_free (engine->priv->backend_description);
 	g_free (engine->priv->backend_author);
commit 28be6ee257f81d9db1fd7ce8b45edf3b5564a610
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Apr 1 20:42:54 2010 +0100

    pkcon: if http_proxy or ftp_proxy are set in the environment, use them

diff --git a/client/pk-console.c b/client/pk-console.c
index a7240dc..0cb1c71 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -38,6 +38,7 @@
 #define PK_EXIT_CODE_SYNTAX_INVALID	3
 #define PK_EXIT_CODE_FILE_NOT_FOUND	4
 #define PK_EXIT_CODE_NOTHING_USEFUL	5
+#define PK_EXIT_CODE_CANNOT_SETUP	6
 
 static GMainLoop *loop = NULL;
 static PkBitfield roles;
@@ -1241,6 +1242,7 @@ main (int argc, char *argv[])
 {
 	gboolean ret;
 	GError *error = NULL;
+	GError *error_local = NULL;
 	gboolean background = FALSE;
 	gboolean noninteractive = FALSE;
 	gboolean plain = FALSE;
@@ -1250,6 +1252,8 @@ main (int argc, char *argv[])
 	gchar *filter = NULL;
 	gchar *summary = NULL;
 	const gchar *mode;
+	const gchar *http_proxy;
+	const gchar *ftp_proxy;
 	const gchar *value = NULL;
 	const gchar *details = NULL;
 	const gchar *parameter = NULL;
@@ -1350,6 +1354,21 @@ main (int argc, char *argv[])
 		      "simulate", !noninteractive,
 		      NULL);
 
+	/* set the proxy */
+	http_proxy = g_getenv ("http_proxy");
+	ftp_proxy = g_getenv ("ftp_proxy");
+	if (http_proxy != NULL ||
+	    ftp_proxy != NULL) {
+		ret = pk_control_set_proxy (control, http_proxy, http_proxy, NULL, &error_local);
+		if (!ret) {
+			/* TRANSLATORS: The user specified an incorrect filter */
+			error = g_error_new (1, 0, "%s: %s", _("The proxy could not be set"), error_local->message);
+			g_error_free (error_local);
+			retval = PK_EXIT_CODE_CANNOT_SETUP;
+			goto out;
+		}
+	}
+
 	/* check filter */
 	if (filter != NULL) {
 		filters = pk_filter_bitfield_from_string (filter);
diff --git a/client/pkcon.xml b/client/pkcon.xml
index 921b23c..9000919 100644
--- a/client/pkcon.xml
+++ b/client/pkcon.xml
@@ -108,6 +108,14 @@ manpage.1: manpage.xml
           <para>Nothing useful was done.</para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term>
+          <option>6</option>
+        </term>
+        <listitem>
+          <para>The initial setup failed, e.g. setting the network proxy.</para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
   <refsect1>
diff --git a/lib/packagekit-glib2/pk-control-sync.c b/lib/packagekit-glib2/pk-control-sync.c
index 7fd3dfe..e7410c4 100644
--- a/lib/packagekit-glib2/pk-control-sync.c
+++ b/lib/packagekit-glib2/pk-control-sync.c
@@ -196,3 +196,58 @@ pk_control_suggest_daemon_quit (PkControl *control, GCancellable *cancellable, G
 	return ret;
 }
 
+/**
+ * pk_control_set_proxy_cb:
+ **/
+static void
+pk_control_set_proxy_cb (PkControl *control, GAsyncResult *res, PkControlHelper *helper)
+{
+	/* get the result */
+	helper->ret = pk_control_set_proxy_finish (control, res, helper->error);
+	g_main_loop_quit (helper->loop);
+}
+
+/**
+ * pk_control_set_proxy:
+ * @control: a valid #PkControl instance
+ * @proxy_http: the HTTP proxy server
+ * @proxy_ftp: the FTP proxy server
+ * @cancellable: a #GCancellable or %NULL
+ * @error: A #GError or %NULL
+ *
+ * Sets the network proxy to use in the daemon.
+ * Warning: this function is synchronous, and may block. Do not use it in GUI
+ * applications.
+ *
+ * Return value: %TRUE if the proxy was set correctly
+ *
+ * Since: 0.6.3
+ **/
+gboolean
+pk_control_set_proxy (PkControl *control, const gchar *proxy_http, const gchar *proxy_ftp, GCancellable *cancellable, GError **error)
+{
+	gboolean ret;
+	PkControlHelper *helper;
+
+	g_return_val_if_fail (PK_IS_CONTROL (control), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	/* create temp object */
+	helper = g_new0 (PkControlHelper, 1);
+	helper->loop = g_main_loop_new (NULL, FALSE);
+	helper->error = error;
+
+	/* run async method */
+	pk_control_set_proxy_async (control, proxy_http, proxy_ftp,
+				    cancellable, (GAsyncReadyCallback) pk_control_set_proxy_cb, helper);
+	g_main_loop_run (helper->loop);
+
+	ret = helper->ret;
+
+	/* free temp object */
+	g_main_loop_unref (helper->loop);
+	g_free (helper);
+
+	return ret;
+}
+
diff --git a/lib/packagekit-glib2/pk-control-sync.h b/lib/packagekit-glib2/pk-control-sync.h
index 73592a4..74be972 100644
--- a/lib/packagekit-glib2/pk-control-sync.h
+++ b/lib/packagekit-glib2/pk-control-sync.h
@@ -36,6 +36,12 @@ gchar		**pk_control_get_transaction_list	(PkControl		*control,
 gboolean	 pk_control_suggest_daemon_quit		(PkControl		*control,
 							 GCancellable		*cancellable,
 							 GError			**error);
+gboolean	 pk_control_set_proxy			(PkControl		*control,
+							 const gchar		*proxy_http,
+							 const gchar		*proxy_ftp,
+							 GCancellable		*cancellable,
+							 GError			**error);
+
 G_END_DECLS
 
 
commit 2f668c94b6895e2cba2f98ffc25d36a9a834495d
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Mar 31 22:15:42 2010 +0100

    trivial: update the spec file to the latest from fedora

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index d6b3b16..293f899 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -1,9 +1,8 @@
-%define glib2_version			2.16.1
-%define dbus_version			1.1.1
-%define dbus_glib_version		0.74
-%define polkit_version			0.92
-%define libnm_glib_version		0.6.4
-%define alphatag			#ALPHATAG#
+%define glib2_version                   2.16.1
+%define dbus_version                    1.1.1
+%define dbus_glib_version               0.74
+%define polkit_version                  0.92
+%define alphatag                        #ALPHATAG#
 
 %{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
 
commit 8bf6bbe200f11abe4c527c7cf0aeb270aaec19f5
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Mar 30 17:07:25 2010 +0100

    yum: Do not abort if the package-id is not unique in the reposet
    
    This can happen if you do 'ln -s newpackage oldpackage' and then run
    createrepo. Fixes rh#569460

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 42dc70c..0d608ed 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -1008,16 +1008,16 @@ class PackageKitYumBackend(PackageKitBaseBackend, PackagekitPackage):
         except Exception, e:
             raise PkError(ERROR_INTERNAL_ERROR, _format_str(traceback.format_exc()))
 
-    # multiple entries
-        if len(pkgs) > 1:
-            raise PkError(ERROR_INTERNAL_ERROR, "more than one package match for %s" % _format_package_id(package_id))
+        # nothing found
+        if len(pkgs) == 0:
+            return None, False
 
-        # one NEVRA in a single repo
-        if len(pkgs) == 1:
-            return pkgs[0], False
+        # multiple entries
+        if len(pkgs) > 1:
+            self.message(MESSAGE_COULD_NOT_FIND_PACKAGE, "more than one package match for %s" % _format_package_id(package_id))
 
-        # nothing found
-        return None, False
+        # return first entry
+        return pkgs[0], False
 
     def get_requires(self, filters, package_ids, recursive):
         '''
commit 174d14e2ba500de41d5ddc58ee7dcc42a2c4a32a
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Mar 29 12:59:01 2010 +0100

    trivial: post release version bump

diff --git a/RELEASE b/RELEASE
index c83e911..a7ba2e0 100644
--- a/RELEASE
+++ b/RELEASE
@@ -2,7 +2,7 @@ PackageKit Release Notes
 
 1. Write NEWS entries for PackageKit in the same format as usual.
 
-git shortlog PACKAGEKIT_0_6_2.. | grep -i -v trivial | grep -v Merge > NEWS.new
+git shortlog PACKAGEKIT_0_6_3.. | grep -i -v trivial | grep -v Merge > NEWS.new
 
 --------------------------------------------------------------------------------
 Version 0.6.x
@@ -28,8 +28,8 @@ Bugfixes:
 
 4. Commit changes in PackageKit git:
 
-git commit -a -m "Release version 0.6.3"
-git tag -s -f -m "Release 0.6.3" PACKAGEKIT_0_6_3
+git commit -a -m "Release version 0.6.4"
+git tag -s -f -m "Release 0.6.4" PACKAGEKIT_0_6_4
 <gpg password>
 git push --tags
 git push
diff --git a/configure.ac b/configure.ac
index b69c230..c681855 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@ AC_PREREQ(2.65)
 
 m4_define([pk_major_version], [0])
 m4_define([pk_minor_version], [6])
-m4_define([pk_micro_version], [3])
+m4_define([pk_micro_version], [4])
 m4_define([pk_version],
           [pk_major_version.pk_minor_version.pk_micro_version])
 


More information about the PackageKit-commit mailing list